OPCIÓN A: A2 Virtual Scroll + A3 Celery + A4 asyncpg PoC + A5 particionamiento

A2 — Virtual scroll en tablas grandes:
- Nuevo helper VirtualScroll en pos/static/js/virtual-scroll.js
- inventory.js: tabla de productos con virtual scroll
- customers.js: tabla de clientes con virtual scroll
- fleet.js: renderMaintenance() y renderHistory() con virtual scroll
- Templates envueltos en .vs-container para scroll

A3 — Celery worker queue:
- pos/celery_app.py + pos/tasks.py (warm cache, bulk import, reports)
- Blueprint tasks_bp.py con endpoints /pos/api/tasks/*
- Script scripts/start_celery.sh

A4 — asyncpg + Quart PoC:
- pos/async_catalog.py: endpoint /pos/api/catalog/async-search
- scripts/benchmark_async_catalog.py: benchmark Flask vs Quart

A5 — Particionar vehicle_parts:
- scripts/partition_vehicle_parts.py: migración segura por hash (16 particiones)
- Soporta --dry-run, --skip-swap, --skip-drop

Tests: 36/36 pasando
This commit is contained in:
2026-04-27 09:53:36 +00:00
parent 042acd6207
commit a1be8dd0ea
15 changed files with 998 additions and 145 deletions

View File

@@ -78,42 +78,46 @@
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-4);">
<h2 style="font-family:var(--font-heading);font-size:var(--text-h4);font-weight:var(--font-weight-bold);letter-spacing:var(--tracking-wide);text-transform:uppercase;">Programas de Mantenimiento</h2>
</div>
<table class="data-table" id="maintTable">
<thead>
<tr>
<th>Vehiculo</th>
<th>Tipo</th>
<th>Intervalo</th>
<th>Ultimo</th>
<th>Proximo</th>
<th>Estado</th>
<th></th>
</tr>
</thead>
<tbody id="maintBody">
<tr><td colspan="7" style="text-align:center;padding:var(--space-6);color:var(--color-text-muted);">Cargando...</td></tr>
</tbody>
</table>
<div class="vs-container" style="max-height:60vh;overflow-y:auto;">
<table class="data-table" id="maintTable">
<thead>
<tr>
<th>Vehiculo</th>
<th>Tipo</th>
<th>Intervalo</th>
<th>Ultimo</th>
<th>Proximo</th>
<th>Estado</th>
<th></th>
</tr>
</thead>
<tbody id="maintBody">
<tr><td colspan="7" style="text-align:center;padding:var(--space-6);color:var(--color-text-muted);">Cargando...</td></tr>
</tbody>
</table>
</div>
</div>
<!-- Tab: History -->
<div class="tab-panel" id="tab-history">
<table class="data-table">
<thead>
<tr>
<th>Fecha</th>
<th>Vehiculo</th>
<th>Tipo</th>
<th>Km</th>
<th>Costo</th>
<th>Empleado</th>
<th>Notas</th>
</tr>
</thead>
<tbody id="historyBody">
<tr><td colspan="7" style="text-align:center;padding:var(--space-6);color:var(--color-text-muted);">Cargando...</td></tr>
</tbody>
</table>
<div class="vs-container" style="max-height:60vh;overflow-y:auto;">
<table class="data-table">
<thead>
<tr>
<th>Fecha</th>
<th>Vehiculo</th>
<th>Tipo</th>
<th>Km</th>
<th>Costo</th>
<th>Empleado</th>
<th>Notas</th>
</tr>
</thead>
<tbody id="historyBody">
<tr><td colspan="7" style="text-align:center;padding:var(--space-6);color:var(--color-text-muted);">Cargando...</td></tr>
</tbody>
</table>
</div>
</div>
<!-- Tab: Alerts -->