fix(audit): corrige errores criticos y mayores, mejora UX/accesibilidad y optimiza rendimiento
- Arregla @require_auth, permisos, race conditions, locks de caja/stock - Elimina N+1 en layaway, flotilla, dashboard y global_invoice - Asegura folios atomicos para CFDI, ordenes de servicio y polizas - Protege client_secret de MercadoLibre en backend - Conecta botones/filtros de config, customers, accounting e invoicing - Mejora accesibilidad (labels/aria-label) y estados de carga/vacio - Limpia accounting.js obsoleto y consolida accounting.v9.js - Actualiza cache busting a v32 y Service Worker a v32 - Documenta todo en docs/AUDIT_Y_MEJORAS_2026-06-15.md Tests: 35 passed
This commit is contained in:
@@ -8,14 +8,14 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/accounting.css">
|
||||
<link rel="stylesheet" href="/pos/static/css/accounting.css?v=32">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -228,19 +228,18 @@
|
||||
<svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
<input type="text" placeholder="Buscar cliente o factura..." />
|
||||
</div>
|
||||
<select class="select-filter">
|
||||
<option>Todos los estados</option>
|
||||
<option>Vigente</option>
|
||||
<option>Vencida</option>
|
||||
<option>Parcial</option>
|
||||
<select id="cxc-status-filter" class="select-filter" onchange="Accounting.loadAging()">
|
||||
<option value="all">Todos los estados</option>
|
||||
<option value="pending">Vigente</option>
|
||||
<option value="overdue">Vencida</option>
|
||||
<option value="partial">Parcial</option>
|
||||
<option value="ok">Pagada</option>
|
||||
</select>
|
||||
<select class="select-filter">
|
||||
<select class="select-filter" title="Filtro de sucursal (próximamente)">
|
||||
<option>Todas las sucursales</option>
|
||||
<option>Matriz</option>
|
||||
<option>Sucursal Norte</option>
|
||||
</select>
|
||||
<div class="toolbar__spacer"></div>
|
||||
<button class="btn btn--ghost btn--sm">
|
||||
<button class="btn btn--ghost btn--sm" onclick="window.exportarCuentasPorCobrar()">
|
||||
<svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
|
||||
Exportar
|
||||
</button>
|
||||
@@ -281,13 +280,15 @@
|
||||
<svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
<input type="text" placeholder="Buscar proveedor o factura..." />
|
||||
</div>
|
||||
<select class="select-filter">
|
||||
<option>Todos los estados</option>
|
||||
<option>Vigente</option>
|
||||
<option>Vencida</option>
|
||||
<select id="cxp-status-filter" class="select-filter" onchange="Accounting.loadAccountsPayable()">
|
||||
<option value="all">Todos los estados</option>
|
||||
<option value="pending">Vigente</option>
|
||||
<option value="overdue">Vencida</option>
|
||||
<option value="partial">Parcial</option>
|
||||
<option value="ok">Pagada</option>
|
||||
</select>
|
||||
<div class="toolbar__spacer"></div>
|
||||
<button class="btn btn--primary btn--sm">
|
||||
<button id="cxp-register-payment" class="btn btn--primary btn--sm" onclick="Accounting.registerPayablePayment()">
|
||||
<svg viewBox="0 0 24 24"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
|
||||
Registrar Pago
|
||||
</button>
|
||||
@@ -424,13 +425,11 @@
|
||||
=============================================================== -->
|
||||
<div class="tab-panel" id="panel-cierre">
|
||||
<div class="toolbar">
|
||||
<select class="select-filter">
|
||||
<option>Marzo 2026</option>
|
||||
<option>Febrero 2026 (cerrado)</option>
|
||||
<option>Enero 2026 (cerrado)</option>
|
||||
<select id="cierre-period-filter" class="select-filter" title="Período a cerrar (próximamente)">
|
||||
<option>Seleccionar período</option>
|
||||
</select>
|
||||
<div class="toolbar__spacer"></div>
|
||||
<button class="btn btn--primary">
|
||||
<button id="cierre-run-btn" class="btn btn--primary" onclick="Accounting.runPeriodClose()">
|
||||
<svg viewBox="0 0 24 24"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg>
|
||||
Ejecutar Cierre
|
||||
</button>
|
||||
@@ -478,7 +477,7 @@
|
||||
</div>
|
||||
<div id="entryLines">
|
||||
<div class="entry-line" style="display:grid;grid-template-columns:2fr 1fr 1fr auto;gap:var(--space-2);margin-bottom:var(--space-2);align-items:center;">
|
||||
<input type="text" placeholder="Cuenta contable" class="entry-account" style="padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface-2);color:var(--color-text-primary);font-size:var(--text-body-sm);" />
|
||||
<select class="entry-account" style="padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface-2);color:var(--color-text-primary);font-size:var(--text-body-sm);"><option value="">Cargando cuentas...</option></select>
|
||||
<input type="number" placeholder="Debe" class="entry-debit" step="0.01" style="padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface-2);color:var(--color-text-primary);font-size:var(--text-body-sm);" />
|
||||
<input type="number" placeholder="Haber" class="entry-credit" step="0.01" style="padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface-2);color:var(--color-text-primary);font-size:var(--text-body-sm);" />
|
||||
<button class="btn btn--ghost btn--sm" onclick="this.closest('.entry-line').remove()">×</button>
|
||||
@@ -496,10 +495,10 @@
|
||||
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/accounting.js?v=3" defer></script>
|
||||
<script src="/pos/static/js/accounting.v9.js?v=32" 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>
|
||||
<script src="/pos/static/js/pwa-install.js" defer></script>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<title>Catalogo — Nexus Autoparts POS</title>
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
@@ -124,7 +124,7 @@
|
||||
</div>
|
||||
<div class="search-bar" id="searchBar">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>
|
||||
<input type="text" id="searchInput" placeholder="Buscar por numero de parte o nombre... (F1)" autocomplete="off" />
|
||||
<input type="text" id="searchInput" placeholder="Buscar por numero de parte o nombre... (F1)" autocomplete="off" aria-label="Buscar productos" />
|
||||
<button type="button" id="btnScanBarcode" title="Escanear codigo de barras" style="background:none;border:none;cursor:pointer;padding:4px 8px;color:var(--color-text-muted);display:flex;align-items:center;" onclick="CatalogApp.startBarcodeScan()">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 7V5a2 2 0 012-2h2"/><path d="M17 3h2a2 2 0 012 2v2"/><path d="M21 17v2a2 2 0 01-2 2h-2"/><path d="M7 21H5a2 2 0 01-2-2v-2"/><line x1="7" y1="12" x2="17" y2="12"/><line x1="7" y1="8" x2="17" y2="8"/><line x1="7" y1="16" x2="17" y2="16"/></svg>
|
||||
</button>
|
||||
@@ -195,7 +195,7 @@
|
||||
<!-- Level title + optional filter -->
|
||||
<div style="display:flex; align-items:center; justify-content:space-between; gap:var(--space-4); flex-wrap:wrap;">
|
||||
<h2 class="level-title" id="levelTitle">Selecciona una marca</h2>
|
||||
<input type="text" class="level-filter" id="levelFilter" placeholder="Filtrar..." style="display:none;" />
|
||||
<input type="text" class="level-filter" id="levelFilter" placeholder="Filtrar..." style="display:none;" aria-label="Filtrar niveles de catalogo" />
|
||||
</div>
|
||||
|
||||
<!-- Loading spinner -->
|
||||
@@ -318,14 +318,14 @@
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/kiosk.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/catalog.js?v=8" defer></script>
|
||||
<script src="/pos/static/js/catalog.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/offline-banner.js" defer></script>
|
||||
<script src="/pos/static/js/chat.js" defer></script>
|
||||
<script src="/pos/static/js/sync-engine.js" defer></script>
|
||||
<script src="/pos/static/js/onboarding.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/onboarding.js?v=32" defer></script>
|
||||
<script>
|
||||
if('serviceWorker' in navigator){
|
||||
navigator.serviceWorker.register('/pos/sw.js',{scope:'/pos/'}).then(function(reg){
|
||||
@@ -341,6 +341,6 @@
|
||||
}
|
||||
</script>
|
||||
<script src="/pos/static/js/pwa-install.js" defer></script>
|
||||
<script src="/pos/static/js/brand-catalog.js?v=10" defer></script>
|
||||
<script src="/pos/static/js/brand-catalog.js?v=32" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/config.css?v=2">
|
||||
<link rel="stylesheet" href="/pos/static/css/config.css?v=32">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -130,7 +130,7 @@
|
||||
<h1 class="page-header__title">Configuración</h1>
|
||||
</div>
|
||||
<div class="page-header__actions">
|
||||
<button class="btn btn--primary">
|
||||
<button id="btn-save-all" class="btn btn--primary" type="button">
|
||||
<svg viewBox="0 0 24 24"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"/><polyline points="17 21 17 13 7 13 7 21"/><polyline points="7 3 7 8 15 8"/></svg>
|
||||
Guardar Cambios
|
||||
</button>
|
||||
@@ -851,11 +851,11 @@
|
||||
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/kiosk.js" defer></script>
|
||||
<script src="/pos/static/js/config.js?v=3" defer></script>
|
||||
<script src="/pos/static/js/config.js?v=32" 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>
|
||||
<script src="/pos/static/js/pwa-install.js" defer></script>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
||||
@@ -298,15 +298,15 @@
|
||||
<circle cx="7" cy="7" r="4.5"/><path d="M10.5 10.5L14 14"/>
|
||||
</svg>
|
||||
</span>
|
||||
<input type="text" class="search-input" placeholder="Buscar por nombre, RFC, teléfono…" id="searchInput" oninput="filterCustomers()" />
|
||||
<input type="text" class="search-input" placeholder="Buscar por nombre, RFC, teléfono…" id="searchInput" oninput="filterCustomers()" aria-label="Buscar clientes" />
|
||||
</div>
|
||||
<select class="filter-select" onchange="filterCustomers()" id="tipoFilter">
|
||||
<select class="filter-select" onchange="filterCustomers()" id="tipoFilter" aria-label="Filtrar por tipo de cliente">
|
||||
<option value="">Todos los tipos</option>
|
||||
<option value="Taller">Taller</option>
|
||||
<option value="Mostrador">Mostrador</option>
|
||||
<option value="Mayoreo">Mayoreo</option>
|
||||
</select>
|
||||
<select class="filter-select" onchange="filterCustomers()" id="estadoFilter">
|
||||
<select class="filter-select" onchange="filterCustomers()" id="estadoFilter" aria-label="Filtrar por estado de cliente">
|
||||
<option value="">Todos los estados</option>
|
||||
<option value="Activo">Activo</option>
|
||||
<option value="Inactivo">Inactivo</option>
|
||||
@@ -342,15 +342,7 @@
|
||||
<!-- Pagination -->
|
||||
<div class="table-footer">
|
||||
<div class="table-footer__info" id="tableInfo"></div>
|
||||
<div class="pagination">
|
||||
<button class="page-btn">‹</button>
|
||||
<button class="page-btn active">1</button>
|
||||
<button class="page-btn">2</button>
|
||||
<button class="page-btn">3</button>
|
||||
<span style="color:var(--color-text-muted);font-size:var(--text-caption);padding:0 4px;">…</span>
|
||||
<button class="page-btn">86</button>
|
||||
<button class="page-btn">›</button>
|
||||
</div>
|
||||
<div class="pagination" id="customersPagination"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -375,12 +367,12 @@
|
||||
|
||||
<!-- Header -->
|
||||
<div class="detail-header">
|
||||
<div class="customer-avatar" id="detailAvatar">MA</div>
|
||||
<div class="customer-avatar" id="detailAvatar">—</div>
|
||||
<div class="detail-header__info">
|
||||
<div class="detail-header__name" id="detailName">MIGUEL ÁNGEL TORRES</div>
|
||||
<div class="detail-header__rfc" id="detailRFC">TOAM820115HDF</div>
|
||||
<div class="detail-header__name" id="detailName">—</div>
|
||||
<div class="detail-header__rfc" id="detailRFC">—</div>
|
||||
<div class="detail-header__meta">
|
||||
<span class="tipo-chip tipo-chip--taller" id="detailTipo">Taller</span>
|
||||
<span class="tipo-chip tipo-chip--taller" id="detailTipo">—</span>
|
||||
<span class="badge badge--active" id="detailStatus"><span class="badge-dot"></span>Activo</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -401,7 +393,7 @@
|
||||
</div>
|
||||
<div class="info-row info-row--full">
|
||||
<span class="info-label">Dirección</span>
|
||||
<span class="info-value" id="detailAddress">Av. Insurgentes Sur 1602, Col. Crédito Constructor, CDMX</span>
|
||||
<span class="info-value" id="detailAddress">—</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="info-label">CP</span>
|
||||
@@ -644,11 +636,11 @@
|
||||
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/virtual-scroll.js" defer></script>
|
||||
<script src="/pos/static/js/customers.js?v=3" defer></script>
|
||||
<script src="/pos/static/js/customers.js?v=32" 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>
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/dashboard.css?v=3">
|
||||
<link rel="stylesheet" href="/pos/static/css/dashboard.css?v=32">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -511,6 +511,40 @@
|
||||
</div><!-- end alerts-grid -->
|
||||
</section>
|
||||
|
||||
<!-- =================================================================
|
||||
CRÉDITOS POR VENCER
|
||||
================================================================= -->
|
||||
|
||||
<section>
|
||||
<div class="table-card">
|
||||
<div class="table-header">
|
||||
<div>
|
||||
<div class="section-title">Créditos por Cobrar</div>
|
||||
<div style="font-size:var(--text-caption);color:var(--color-text-muted);margin-top:2px;" id="credit-alerts-meta">Vencidos: -- / Por vencer: --</div>
|
||||
</div>
|
||||
<a href="/pos/accounting" class="section-action" style="text-decoration:none;color:inherit;">Ir a contabilidad →</a>
|
||||
</div>
|
||||
<div class="table-wrap themed-scrollbar">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Cliente</th>
|
||||
<th>Folio</th>
|
||||
<th>Vencimiento</th>
|
||||
<th>Días</th>
|
||||
<th class="align-right">Saldo</th>
|
||||
<th>Estado</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="credit-alerts-tbody">
|
||||
<tr><td colspan="6"><div class="skeleton skeleton--text" style="width:100%;"></div></td></tr>
|
||||
<tr><td colspan="6"><div class="skeleton skeleton--text" style="width:80%;"></div></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- =================================================================
|
||||
RECENT SALES TABLE
|
||||
================================================================= -->
|
||||
@@ -564,11 +598,11 @@
|
||||
<script src="/pos/static/js/chart.umd.min.js" defer></script>
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/dashboard-stats.js?v=3" defer></script>
|
||||
<script src="/pos/static/js/dashboard.js?v=7" defer></script>
|
||||
<script src="/pos/static/js/dashboard-stats.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/dashboard.js?v=32" 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>
|
||||
<script src="/pos/static/js/pwa-install.js" defer></script>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/onboarding.css" />
|
||||
@@ -152,8 +152,8 @@
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/kiosk.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/diagrams.js" defer></script>
|
||||
<script>if('serviceWorker' in navigator){navigator.serviceWorker.register('/pos/sw.js',{scope:'/pos/'});}</script>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
||||
@@ -305,8 +305,8 @@
|
||||
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/fleet.js" defer></script>
|
||||
<script src="/pos/static/js/offline-banner.js" defer></script>
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/inventory.css?v=8">
|
||||
<link rel="stylesheet" href="/pos/static/css/inventory.css?v=32">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -1055,11 +1055,11 @@
|
||||
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/virtual-scroll.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/inventory.js?v=19" defer></script>
|
||||
<script src="/pos/static/js/virtual-scroll.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/inventory.js?v=32" 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>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
||||
@@ -339,25 +339,14 @@
|
||||
<circle cx="11" cy="11" r="8"/>
|
||||
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
|
||||
</svg>
|
||||
<input type="text" placeholder="Buscar folio, RFC, cliente…" />
|
||||
<input id="facturas-search" type="text" placeholder="Buscar folio, RFC, cliente…" oninput="Invoicing.filterFacturas()" aria-label="Buscar facturas" />
|
||||
</div>
|
||||
|
||||
<div class="date-range">
|
||||
<svg viewBox="0 0 24 24">
|
||||
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"/>
|
||||
<line x1="16" y1="2" x2="16" y2="6"/>
|
||||
<line x1="8" y1="2" x2="8" y2="6"/>
|
||||
<line x1="3" y1="10" x2="21" y2="10"/>
|
||||
</svg>
|
||||
01 Mar 2026 — 31 Mar 2026
|
||||
</div>
|
||||
|
||||
<select class="select-filter" aria-label="Filtrar por estatus">
|
||||
<select id="facturas-status-filter" class="select-filter" aria-label="Filtrar por estatus" onchange="Invoicing.loadFacturas()">
|
||||
<option value="">Todas</option>
|
||||
<option value="timbrada">Timbradas</option>
|
||||
<option value="pendiente">Pendientes</option>
|
||||
<option value="cancelada">Canceladas</option>
|
||||
<option value="ppd">PPD</option>
|
||||
<option value="stamped">Timbradas</option>
|
||||
<option value="pending">Pendientes</option>
|
||||
<option value="cancelled">Canceladas</option>
|
||||
</select>
|
||||
|
||||
<div class="toolbar__spacer"></div>
|
||||
@@ -372,7 +361,7 @@
|
||||
Factura Global
|
||||
</button>
|
||||
|
||||
<button class="btn btn--ghost">
|
||||
<button id="facturas-export-csv" class="btn btn--ghost" onclick="Invoicing.exportFacturasCSV()">
|
||||
<svg viewBox="0 0 24 24">
|
||||
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/>
|
||||
<polyline points="7 10 12 15 17 10"/>
|
||||
@@ -422,10 +411,10 @@
|
||||
<circle cx="11" cy="11" r="8"/>
|
||||
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
|
||||
</svg>
|
||||
<input type="text" placeholder="Buscar nota de crédito…" />
|
||||
<input type="text" placeholder="Buscar nota de crédito…" aria-label="Buscar notas de credito" />
|
||||
</div>
|
||||
<div class="toolbar__spacer"></div>
|
||||
<button class="btn btn--ghost">
|
||||
<button id="notas-export-csv" class="btn btn--ghost" onclick="Invoicing.exportNotasCSV()">
|
||||
<svg viewBox="0 0 24 24">
|
||||
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/>
|
||||
<polyline points="7 10 12 15 17 10"/>
|
||||
@@ -433,7 +422,7 @@
|
||||
</svg>
|
||||
Exportar
|
||||
</button>
|
||||
<button class="btn btn--primary">
|
||||
<button id="notas-new" class="btn btn--primary" onclick="Invoicing.newCreditNote()">
|
||||
<svg viewBox="0 0 24 24">
|
||||
<line x1="12" y1="5" x2="12" y2="19"/>
|
||||
<line x1="5" y1="12" x2="19" y2="12"/>
|
||||
@@ -478,9 +467,9 @@
|
||||
<circle cx="11" cy="11" r="8"/>
|
||||
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
|
||||
</svg>
|
||||
<input type="text" placeholder="Buscar complemento de pago…" />
|
||||
<input type="text" placeholder="Buscar complemento de pago…" aria-label="Buscar complementos de pago" />
|
||||
</div>
|
||||
<select class="select-filter" aria-label="Método de pago">
|
||||
<select id="complementos-method-filter" class="select-filter" aria-label="Método de pago" onchange="Invoicing.loadComplementos()">
|
||||
<option value="">Todos los métodos</option>
|
||||
<option value="03">03 Transferencia electrónica</option>
|
||||
<option value="04">04 Tarjeta de crédito</option>
|
||||
@@ -489,7 +478,7 @@
|
||||
<option value="99">99 Por definir</option>
|
||||
</select>
|
||||
<div class="toolbar__spacer"></div>
|
||||
<button class="btn btn--primary">
|
||||
<button id="complementos-new" class="btn btn--primary" onclick="Invoicing.newPaymentComplement()">
|
||||
<svg viewBox="0 0 24 24">
|
||||
<line x1="12" y1="5" x2="12" y2="19"/>
|
||||
<line x1="5" y1="12" x2="19" y2="12"/>
|
||||
@@ -519,17 +508,7 @@
|
||||
|
||||
<div class="table-footer">
|
||||
<span></span>
|
||||
<div class="pagination">
|
||||
<button class="page-btn" aria-label="Anterior">
|
||||
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="15 18 9 12 15 6"/></svg>
|
||||
</button>
|
||||
<button class="page-btn is-active">1</button>
|
||||
<button class="page-btn">2</button>
|
||||
<button class="page-btn">3</button>
|
||||
<button class="page-btn" aria-label="Siguiente">
|
||||
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"/></svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="pagination" id="complementos-pagination"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- /panel-complementos -->
|
||||
@@ -1087,10 +1066,10 @@
|
||||
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/invoicing.js?v=3" defer></script>
|
||||
<script src="/pos/static/js/invoicing.js?v=32" 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>
|
||||
<script src="/pos/static/js/pwa-install.js" defer></script>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/inventory.css" />
|
||||
@@ -345,10 +345,10 @@
|
||||
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/marketplace_external.js?v=4" defer></script>
|
||||
<script src="/pos/static/js/marketplace_external.js?v=32" defer></script>
|
||||
<script>if('serviceWorker' in navigator){navigator.serviceWorker.register('/pos/sw.js',{scope:'/pos/'});}</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<title>Nexus Autoparts — Punto de Venta</title>
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
@@ -16,7 +16,7 @@
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
<script src="/pos/static/js/native-bridge.js" defer></script>
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/pos.css?v=4">
|
||||
<link rel="stylesheet" href="/pos/static/css/pos.css?v=32">
|
||||
</head>
|
||||
|
||||
<body class="pos-shell" id="appBody">
|
||||
@@ -86,7 +86,7 @@
|
||||
<div class="cart-header">
|
||||
<div class="cart-header__top">
|
||||
<div class="cart-header__sale-id">Venta Activa</div>
|
||||
<button class="cost-toggle" id="costToggle" title="Mostrar costo/margen (Admin)" style="display:none;">C/M</button>
|
||||
<button class="cost-toggle" id="costToggle" title="Mostrar costo/margen (Admin)" aria-label="Mostrar costo y margen" style="display:none;">C/M</button>
|
||||
<span class="cart-header__status">Activa</span>
|
||||
</div>
|
||||
|
||||
@@ -209,6 +209,8 @@
|
||||
<div class="secondary-actions" role="toolbar" aria-label="Acciones secundarias">
|
||||
<button class="btn-secondary-action" onclick="POS.modifyPrice()" title="Modificar precio">Mod.Precio</button>
|
||||
<button class="btn-secondary-action" onclick="POS.saveQuotation()" title="Cotizacion (F4)">Cotizar</button>
|
||||
<button class="btn-secondary-action" onclick="POS.createLayaway()" title="Apartado (requiere cliente)">Apartado</button>
|
||||
<button class="btn-secondary-action" onclick="POS.createServiceOrder()" title="Orden de servicio (F7)">Orden Taller</button>
|
||||
<button class="btn-secondary-action" onclick="POS.showLastSale()" title="Ultima venta (F5)">Ult.Venta</button>
|
||||
<button class="btn-secondary-action" onclick="POS.showCutZModal()" title="Corte Z - Cerrar caja">Corte Z</button>
|
||||
<button class="btn-secondary-action danger" id="btnCancelSale" onclick="POS.openCancelModal()" title="Cancelar (Esc)">Cancelar</button>
|
||||
@@ -240,6 +242,9 @@
|
||||
<div class="fkey" onclick="POS.openDrawer()" title="Abrir cajon">
|
||||
<span class="fkey-key">F6</span><span class="fkey-label">Cajon</span>
|
||||
</div>
|
||||
<div class="fkey" onclick="POS.createServiceOrder()" title="Orden de servicio">
|
||||
<span class="fkey-key">F7</span><span class="fkey-label">Orden Taller</span>
|
||||
</div>
|
||||
<div class="fkey-sep"></div>
|
||||
<div class="fkey" onclick="POS.changeQuantity()" title="Cantidad +/-">
|
||||
<span class="fkey-key">+/-</span><span class="fkey-label">Cantidad</span>
|
||||
@@ -326,26 +331,26 @@
|
||||
<div class="tab-content" id="mixedPayment">
|
||||
<div class="mixed-row" style="margin-bottom:var(--space-3);">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Metodo 1</label>
|
||||
<select class="form-input" style="margin-bottom:var(--space-2);">
|
||||
<label class="form-label" id="label-method-1">Método 1</label>
|
||||
<select id="mixed-method-1" class="form-input" style="margin-bottom:var(--space-2);" aria-label="Método de pago 1">
|
||||
<option value="efectivo">Efectivo</option>
|
||||
<option value="tarjeta">Tarjeta</option>
|
||||
<option value="transferencia">Transferencia</option>
|
||||
</select>
|
||||
<input type="number" class="form-input mixed-amount" placeholder="0.00" step="0.01" oninput="POS.updateMixedTotal()" />
|
||||
<input type="text" class="form-input" placeholder="Referencia (si aplica)" style="margin-top:var(--space-2);" />
|
||||
<input id="mixed-amount-1" type="number" class="form-input mixed-amount" placeholder="0.00" step="0.01" oninput="POS.updateMixedTotal()" aria-label="Monto método de pago 1" />
|
||||
<input id="mixed-ref-1" type="text" class="form-input" placeholder="Referencia (si aplica)" style="margin-top:var(--space-2);" aria-label="Referencia método de pago 1" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="mixed-row" style="margin-bottom:var(--space-3);">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Metodo 2</label>
|
||||
<select class="form-input" style="margin-bottom:var(--space-2);">
|
||||
<label class="form-label" id="label-method-2">Método 2</label>
|
||||
<select id="mixed-method-2" class="form-input" style="margin-bottom:var(--space-2);" aria-label="Método de pago 2">
|
||||
<option value="tarjeta">Tarjeta</option>
|
||||
<option value="efectivo">Efectivo</option>
|
||||
<option value="transferencia">Transferencia</option>
|
||||
</select>
|
||||
<input type="number" class="form-input mixed-amount" placeholder="0.00" step="0.01" oninput="POS.updateMixedTotal()" />
|
||||
<input type="text" class="form-input" placeholder="Referencia (si aplica)" style="margin-top:var(--space-2);" />
|
||||
<input id="mixed-amount-2" type="number" class="form-input mixed-amount" placeholder="0.00" step="0.01" oninput="POS.updateMixedTotal()" aria-label="Monto método de pago 2" />
|
||||
<input id="mixed-ref-2" type="text" class="form-input" placeholder="Referencia (si aplica)" style="margin-top:var(--space-2);" aria-label="Referencia método de pago 2" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="split-remaining">
|
||||
@@ -485,10 +490,10 @@
|
||||
<div style="margin-top:var(--space-4);border-top:1px solid var(--color-border);padding-top:var(--space-4);">
|
||||
<div class="form-label" style="margin-bottom:var(--space-3);">Vehiculo (opcional)</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3);">
|
||||
<div class="form-group"><input type="text" class="form-input" id="ncVehMake" placeholder="Marca" /></div>
|
||||
<div class="form-group"><input type="text" class="form-input" id="ncVehModel" placeholder="Modelo" /></div>
|
||||
<div class="form-group"><input type="text" class="form-input" id="ncVehYear" placeholder="Ano" /></div>
|
||||
<div class="form-group"><input type="text" class="form-input" id="ncVehPlates" placeholder="Placas" /></div>
|
||||
<div class="form-group"><label class="form-label">Marca</label><input type="text" class="form-input" id="ncVehMake" placeholder="Marca" aria-label="Marca del vehiculo" /></div>
|
||||
<div class="form-group"><label class="form-label">Modelo</label><input type="text" class="form-input" id="ncVehModel" placeholder="Modelo" aria-label="Modelo del vehiculo" /></div>
|
||||
<div class="form-group"><label class="form-label">Año</label><input type="text" class="form-input" id="ncVehYear" placeholder="Ano" aria-label="Ano del vehiculo" /></div>
|
||||
<div class="form-group"><label class="form-label">Placas</label><input type="text" class="form-input" id="ncVehPlates" placeholder="Placas" aria-label="Placas del vehiculo" /></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -562,17 +567,61 @@
|
||||
================================================================ -->
|
||||
<div class="toast-container" id="toastContainer" aria-live="assertive" aria-atomic="true"></div>
|
||||
|
||||
<!-- ================================================================
|
||||
SERVICE ORDER MODAL
|
||||
================================================================ -->
|
||||
<div class="modal-overlay" id="serviceOrderModal">
|
||||
<div class="modal-pago" style="width:480px;">
|
||||
<div class="modal-header">
|
||||
<h3>Orden de servicio desde POS</h3>
|
||||
<button class="modal-close" onclick="POS.closeServiceOrderModal()">✕</button>
|
||||
</div>
|
||||
<div style="padding:var(--space-6);">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Cliente</label>
|
||||
<input type="text" class="form-input" id="soCustomer" readonly />
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3);">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Vehículo</label>
|
||||
<input type="text" class="form-input" id="soVehicle" placeholder="Marca / Modelo / Placas" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Vía de entrega</label>
|
||||
<select class="form-input" id="soDelivery">
|
||||
<option value="">—</option>
|
||||
<option value="pickup">Pasa cliente</option>
|
||||
<option value="delivery">Envío a domicilio</option>
|
||||
<option value="courier">Motociclista</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Notas de recepción</label>
|
||||
<textarea class="form-input" id="soNotes" rows="3" placeholder="Falla reportada, observaciones..."></textarea>
|
||||
</div>
|
||||
<label style="display:flex;align-items:center;gap:var(--space-2);color:var(--color-text-primary);font-size:var(--text-body-sm);">
|
||||
<input type="checkbox" id="soDirect" /> Orden directa
|
||||
</label>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-ghost" onclick="POS.closeServiceOrderModal()">Cancelar</button>
|
||||
<button class="btn btn-primary" onclick="POS.confirmServiceOrder()">Crear orden e imprimir</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ================================================================
|
||||
JAVASCRIPT
|
||||
================================================================ -->
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/kiosk.js" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/push.js" defer></script>
|
||||
<script src="/pos/static/js/printer.js" defer></script>
|
||||
<script src="/pos/static/js/pos.js?v=7" defer></script>
|
||||
<script src="/pos/static/js/pos.js?v=32" defer></script>
|
||||
|
||||
<script>
|
||||
// Cancel sale button wiring
|
||||
|
||||
@@ -8,16 +8,16 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/quotations.css">
|
||||
</head>
|
||||
<body>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
|
||||
<div class="page">
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
||||
@@ -368,10 +368,10 @@
|
||||
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/reports.js?v=4" defer></script>
|
||||
<script src="/pos/static/js/reports.js?v=32" 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>
|
||||
<script src="/pos/static/js/pwa-install.js" defer></script>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<title>Catalogo de Proveedores — Nexus Autoparts POS</title>
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
||||
@@ -129,7 +129,7 @@
|
||||
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/supplier_catalog.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/supplier_catalog.js?v=32" defer></script>
|
||||
<script>if('serviceWorker' in navigator){navigator.serviceWorker.register('/pos/sw.js',{scope:'/pos/'});}</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
||||
@@ -134,9 +134,9 @@ function posLogout(){localStorage.removeItem('pos_token');window.location.href='
|
||||
<!-- Sidebar -->
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/whatsapp2.js?v=5" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/whatsapp2.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
|
||||
<script src="/pos/static/js/chat.js" defer></script>
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=2" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=32" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/workshop.css?v=2">
|
||||
<link rel="stylesheet" href="/pos/static/css/workshop.css?v=32">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -28,13 +28,13 @@
|
||||
|
||||
<div class="page-header">
|
||||
<div class="page-header__title-group">
|
||||
<span class="page-header__eyebrow">Operación · Taller</span>
|
||||
<span class="page-header__eyebrow">Operación · Taller</span>
|
||||
<h1 class="page-header__title">Taller</h1>
|
||||
</div>
|
||||
<div class="page-header__actions">
|
||||
<button class="btn btn--ghost" id="btnCatalog" onclick="Workshop.openCatalogModal()">
|
||||
<svg viewBox="0 0 24 24"><path d="M4 6h16M4 10h16M4 14h16M4 18h16"/></svg>
|
||||
Catálogo de servicios
|
||||
Catálogo de servicios
|
||||
</button>
|
||||
<button class="btn btn--primary" id="btnNewOrder" onclick="Workshop.openNewOrderModal()">
|
||||
<svg viewBox="0 0 24 24"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
|
||||
@@ -59,7 +59,7 @@
|
||||
<svg viewBox="0 0 24 24"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg>
|
||||
</div>
|
||||
<div class="summary-card__body">
|
||||
<div class="summary-card__label">En reparación</div>
|
||||
<div class="summary-card__label">En reparación</div>
|
||||
<div class="summary-card__value" id="statRepair">--</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -83,8 +83,72 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Toolbar: filters + view switch -->
|
||||
<div class="workshop-toolbar">
|
||||
<div class="workshop-filters">
|
||||
<select class="form-input" id="filterBranch">
|
||||
<option value="">Todas las sucursales</option>
|
||||
</select>
|
||||
<select class="form-input" id="filterStatus">
|
||||
<option value="">Todos los estatus</option>
|
||||
<option value="received">Recibido</option>
|
||||
<option value="diagnosis">Diagnóstico</option>
|
||||
<option value="waiting_parts">Espera refacciones</option>
|
||||
<option value="repair">En reparación</option>
|
||||
<option value="quality_check">Control calidad</option>
|
||||
<option value="ready">Listo</option>
|
||||
<option value="delivered">Entregado</option>
|
||||
<option value="cancelled">Cancelado</option>
|
||||
</select>
|
||||
<select class="form-input" id="filterDelivery">
|
||||
<option value="">Todas las vías de entrega</option>
|
||||
<option value="pickup">Pasa cliente</option>
|
||||
<option value="delivery">Envío a domicilio</option>
|
||||
<option value="courier">Motociclista</option>
|
||||
</select>
|
||||
<label class="toolbar-toggle">
|
||||
<input type="checkbox" id="filterDirect" />
|
||||
<span>Orden directa</span>
|
||||
</label>
|
||||
<input class="form-input" id="filterSearch" placeholder="Buscar orden, cliente o placas" />
|
||||
</div>
|
||||
<div class="view-switch" id="viewSwitch">
|
||||
<button class="view-switch__btn is-active" data-view="list" onclick="Workshop.setView('list')">
|
||||
<svg viewBox="0 0 24 24"><line x1="8" y1="6" x2="21" y2="6"/><line x1="8" y1="12" x2="21" y2="12"/><line x1="8" y1="18" x2="21" y2="18"/><line x1="3" y1="6" x2="3.01" y2="6"/><line x1="3" y1="12" x2="3.01" y2="12"/><line x1="3" y1="18" x2="3.01" y2="18"/></svg>
|
||||
Lista
|
||||
</button>
|
||||
<button class="view-switch__btn" data-view="kanban" onclick="Workshop.setView('kanban')">
|
||||
<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/></svg>
|
||||
Kanban
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- List view -->
|
||||
<div class="workshop-list" id="listView">
|
||||
<div class="table-wrapper">
|
||||
<table class="data-table workshop-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Sucursal</th>
|
||||
<th>Orden</th>
|
||||
<th>Cliente</th>
|
||||
<th>Vehículo</th>
|
||||
<th>Estatus</th>
|
||||
<th class="price-col">Total</th>
|
||||
<th>Acciones</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="listBody">
|
||||
<tr><td colspan="7" style="text-align:center;padding:var(--space-4);">Cargando...</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="list-pagination" id="listPagination"></div>
|
||||
</div>
|
||||
|
||||
<!-- Kanban board -->
|
||||
<div class="kanban-board" id="kanbanBoard">
|
||||
<div class="kanban-board" id="kanbanBoard" style="display:none;">
|
||||
<!-- Columns injected by JS -->
|
||||
</div>
|
||||
</main>
|
||||
@@ -120,11 +184,11 @@
|
||||
<select class="form-input" id="noCustomer" required></select>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<label class="form-label" for="noVehicle">Vehículo</label>
|
||||
<label class="form-label" for="noVehicle">Vehículo</label>
|
||||
<select class="form-input" id="noVehicle"></select>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<label class="form-label" for="noMechanic">Mecánico asignado</label>
|
||||
<label class="form-label" for="noMechanic">Mecánico asignado</label>
|
||||
<select class="form-input" id="noMechanic"></select>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
@@ -135,6 +199,19 @@
|
||||
<option value="urgent">Urgente</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<label class="form-label" for="noDelivery">Vía de entrega</label>
|
||||
<select class="form-input" id="noDelivery">
|
||||
<option value="">—</option>
|
||||
<option value="pickup">Pasa cliente</option>
|
||||
<option value="delivery">Envío a domicilio</option>
|
||||
<option value="courier">Motociclista</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-field" id="courierField" style="display:none;">
|
||||
<label class="form-label" for="noCourier">Motociclista</label>
|
||||
<select class="form-input" id="noCourier"></select>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<label class="form-label" for="noEstimatedCompletion">Entrega estimada</label>
|
||||
<input class="form-input" type="datetime-local" id="noEstimatedCompletion" />
|
||||
@@ -144,7 +221,13 @@
|
||||
<input class="form-input" type="number" id="noMileage" placeholder="Ej. 45200" />
|
||||
</div>
|
||||
<div class="form-field form-field--span2">
|
||||
<label class="form-label" for="noNotes">Notas de recepción</label>
|
||||
<label class="toolbar-toggle">
|
||||
<input type="checkbox" id="noDirect" />
|
||||
<span>Orden directa (sin inventario)</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-field form-field--span2">
|
||||
<label class="form-label" for="noNotes">Notas de recepción</label>
|
||||
<textarea class="form-input" id="noNotes" rows="3" placeholder="Falla reportada, observaciones..."></textarea>
|
||||
</div>
|
||||
</form>
|
||||
@@ -160,7 +243,7 @@
|
||||
<div class="modal-overlay" id="catalogModal">
|
||||
<div class="modal modal--lg">
|
||||
<div class="modal__header">
|
||||
<h2 class="modal__title">Catálogo de servicios</h2>
|
||||
<h2 class="modal__title">Catálogo de servicios</h2>
|
||||
<button class="modal__close" onclick="Workshop.closeCatalogModal()">×</button>
|
||||
</div>
|
||||
<div class="modal__body">
|
||||
@@ -175,7 +258,7 @@
|
||||
<input class="form-input" id="catRate" type="number" step="0.01" placeholder="Precio/hora" />
|
||||
</div>
|
||||
<div class="form-field form-field--span3">
|
||||
<input class="form-input" id="catDesc" placeholder="Descripción" />
|
||||
<input class="form-input" id="catDesc" placeholder="Descripción" />
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<button class="btn btn--primary" onclick="Workshop.addCatalogItem()">Agregar</button>
|
||||
@@ -200,16 +283,19 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal__footer">
|
||||
<button class="btn btn--ghost" onclick="Workshop.closeCatalogModal()">Cerrar</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
<script src="/pos/static/js/app-init.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=1" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js" defer></script>
|
||||
<script src="/pos/static/js/splash-loader.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/pos-utils.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/sidebar.js?v=32" defer></script>
|
||||
<script src="/pos/static/js/offline-banner.js" defer></script>
|
||||
<script src="/pos/static/js/workshop.js?v=2" defer></script>
|
||||
<script src="/pos/static/js/workshop.js?v=32" defer></script>
|
||||
<script>if('serviceWorker' in navigator){navigator.serviceWorker.register('/pos/sw.js',{scope:'/pos/'});}</script>
|
||||
<script src="/pos/static/js/pwa-install.js" defer></script>
|
||||
<script src="/pos/static/js/chat.js" defer></script>
|
||||
|
||||
Reference in New Issue
Block a user