Mejoras de sesion: estabilizacion, IA, Nexus Yonke y marketplace B2B
Some checks failed
CI / lint-and-test (3.11) (push) Has been cancelled
CI / lint-and-test (3.13) (push) Has been cancelled

- F0 blindaje: Redis/Celery, pg_hba sin trust LAN, secretos a env 600, backups, webhook auth, jobs muertos
- F1 caja: bugs POS, reembolsos al corte, apartados, CFDI, topes de descuento en cotizacion/apartado
- F2/F7 IA de catalogo: autocategorizacion, dedup de SKUs con embeddings, OCR de facturas, descripciones, claves SAT, limpieza de fitment
- F3 IA en el flujo: vision Yonke, preguntas MeLi, venta cruzada, anomalias, sinonimos, busqueda semantica (rerank/embeddings)
- F4/F8 escala y cartera: /metrics+Prometheus+Grafana, pool, score de credito, churn, metricas multi-tenant
- Nexus Yonke (M1-M6): modelo de datos 1-de-1, alta por donador, vitrina publica, MeLi usado, consignacion, garantia por dias, reportes, etiquetas
- Marketplace B2B entre yonkes (catalogo + pedidos cross-tenant)
- Seguridad: auth en /api/admin/* (35 endpoints), alertas por tenant
- Migraciones v4.27/v4.28; timers expire-demos y rollup-metrics
This commit is contained in:
2026-10-12 00:57:31 +00:00
parent f2d4558b80
commit a386ca5b4a
165 changed files with 31313 additions and 2203 deletions

View File

@@ -417,7 +417,23 @@
</div>
</div>
<!-- Credit Info -->
<!-- CRM & Loyalty -->
<div class="detail-section" id="crmSection">
<div class="detail-section__title">CRM &amp; Lealtad</div>
<div style="display:flex;align-items:center;gap:var(--space-3);margin-bottom:var(--space-2);">
<div style="font-size:var(--text-h4);font-weight:700;" id="crmLoyaltyBalance">—</div>
<span style="color:var(--color-text-muted);font-size:var(--text-caption);">puntos</span>
<div style="flex:1;"></div>
<button class="btn btn-sm btn-ghost" onclick="Customers.crmRedeem()">Canjear</button>
<button class="btn btn-sm btn-ghost" onclick="Customers.crmAddNote()">Nota</button>
</div>
<div id="crmActivities" style="max-height:180px;overflow-y:auto;display:flex;flex-direction:column;gap:var(--space-2);">
<span style="color:var(--color-text-muted);font-size:var(--text-caption);">Cargando actividad...</span>
</div>
</div>
<!-- Credit Info -->
<div class="detail-section">
<div class="detail-section__title">Crédito</div>
<div class="credit-block">
@@ -651,12 +667,12 @@
</div>
<script src="/pos/static/js/i18n.js?v=39" defer></script>
<script src="/pos/static/js/app-init.js?v=8" defer></script>
<script src="/pos/static/js/app-init.js?v=9" defer></script>
<script src="/pos/static/js/splash-loader.js?v=33" defer></script>
<script src="/pos/static/js/pos-utils.js?v=33" defer></script>
<script src="/pos/static/js/sidebar.js?v=46" defer></script>
<script src="/pos/static/js/virtual-scroll.js" defer></script>
<script src="/pos/static/js/customers.js?v=35" defer></script>
<script src="/pos/static/js/customers.js?v=38" defer></script>
<script src="/pos/static/js/offline-banner.js" defer></script>
<script src="/pos/static/js/sync-engine.js" defer></script>
<script>if('serviceWorker' in navigator){navigator.serviceWorker.register('/pos/sw.js',{scope:'/pos/'});}</script>