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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user