feat: add expenses module, restaurant mode, and dynamic sales filters

- Gastos (Expenses): Added `/gastos` route, auto-creation of `expenses` DB table, and `gastos.html` to track net profit with split month/year dropdowns.
- Sales & Filters: Overhauled `/sales` backend to use pagination. Top summary cards now accurately reflect the selected payment method filter.
- Checkout Improvements:
  - Added "Transferencia" as a payment option with numpad shortcuts.
  - Built a "Pinned Products" quick-access grid using localStorage.
  - Implemented a global processing lock to prevent duplicate sales on double-clicks.
  - Burned the default HTML number arrows with custom CSS.
- Global Settings & Receipts:
  - Created a global settings modal accessible from the navbar.
  - Added localStorage toggles for custom business name and auto-print.
  - Added "Restaurant Mode" toggle to prompt for Client Name and Pickup Time, which now dynamically prints on the receipt.
- Bug Fixes: Resolved Jinja `TemplateSyntaxError` crash and removed the duplicate search bar in the checkout view.
This commit is contained in:
2026-04-15 22:58:12 -04:00
parent b2bc0801f5
commit 47cc480cf5
7 changed files with 753 additions and 102 deletions

View File

@@ -1,7 +1,7 @@
<nav class="navbar navbar-expand-md sticky-top px-3 mb-3">
<span class="navbar-brand">
SekiPOS
<small class="text-muted fw-normal" style="font-size:0.65rem;">v2.1</small>
<small class="text-muted fw-normal" style="font-size:0.65rem;">v2.2</small>
</span>
<div class="ms-3 gap-2 d-flex">
@@ -15,6 +15,9 @@
<a href="/sales" class="btn btn-sm {{ 'btn-primary' if active_page == 'sales' else 'btn-outline-primary' }}">
<i class="bi bi-receipt me-1"></i>Ventas
</a>
<a href="/gastos" class="btn btn-sm {{ 'btn-warning' if active_page == 'gastos' else 'btn-outline-warning' }}">
<i class="bi bi-wallet2 me-1"></i>Gastos
</a>
<a href="/dicom" class="btn btn-sm {{ 'btn-danger' if active_page == 'dicom' else 'btn-outline-danger' }}">
<i class="bi bi-journal-x me-1"></i>Dicom
</a>
@@ -32,6 +35,11 @@
<i class="bi bi-moon-stars me-2"></i>Modo Oscuro
</button>
</li>
<li>
<button class="dropdown-item" onclick="bootstrap.Modal.getOrCreateInstance(document.getElementById('settingsModal')).show()">
<i class="bi bi-gear-fill me-2"></i>Configuración
</button>
</li>
<li>
<a class="dropdown-item" href="/export/db">
<i class="bi bi-database-down me-2"></i>Descargar DB