feat(pos): add plate lookup (#8), 326 translations (#12), bulk image import (#11)

- Plate lookup: new plate_vehicles table (v1.7 migration), plate_lookup
  service with Mexican plate validation, GET/POST endpoints on catalog_bp,
  plate search UI in catalog vehicle selector
- Translations: extend PART_TRANSLATIONS from ~80 to 326 entries covering
  brake, engine, fuel, cooling, electrical, drivetrain, suspension, steering,
  exhaust, A/C, lighting, body, interior, fluids, and category translations
- Bulk images: image_scraper service with download+resize+placeholder
  generation, bulk-images and auto-image endpoints on inventory_bp

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-05 04:17:55 +00:00
parent 1bea31e83f
commit 4cc2c66208
8 changed files with 917 additions and 43 deletions

View File

@@ -635,6 +635,17 @@
</div>
<button class="vs-clear" id="vsClear" onclick="CatalogApp.vsClear()" title="Limpiar seleccion" style="display:none;"></button>
<span class="vs-vin-divider" style="color:var(--color-text-disabled);padding-bottom:6px;flex-shrink:0;">|</span>
<div class="vs-group" id="plateGroup" style="position:relative;">
<a class="vs-label" id="plateToggle" href="#" onclick="event.preventDefault();CatalogApp.togglePlate();" style="color:var(--color-primary);cursor:pointer;text-decoration:underline;white-space:nowrap;">Tienes las placas?</a>
<div id="plateInputWrap" style="display:none;">
<div style="display:flex;gap:4px;">
<input type="text" class="vs-select" id="plateInput" placeholder="Ej: ABC-1234" maxlength="12" style="text-transform:uppercase;font-family:var(--font-mono,monospace);letter-spacing:0.05em;flex:1;" />
<button class="btn btn-primary" id="plateLookupBtn" onclick="CatalogApp.lookupPlate()" style="height:auto;padding:var(--space-2) var(--space-3);font-size:var(--text-body-sm);">Buscar</button>
</div>
<div id="plateStatus" style="font-size:var(--text-caption);margin-top:4px;color:var(--color-text-muted);display:none;"></div>
</div>
</div>
<span class="vs-vin-divider" style="color:var(--color-text-disabled);padding-bottom:6px;flex-shrink:0;">|</span>
<div class="vs-group" id="vinGroup" style="position:relative;">
<a class="vs-label" id="vinToggle" href="#" onclick="event.preventDefault();CatalogApp.toggleVin();" style="color:var(--color-primary);cursor:pointer;text-decoration:underline;white-space:nowrap;">Tienes el VIN?</a>
<div id="vinInputWrap" style="display:none;">
@@ -738,6 +749,7 @@
</div>
<script src="/pos/static/js/i18n.js"></script>
<script src="/pos/static/js/kiosk.js"></script>
<script src="/pos/static/js/app-init.js"></script>
<script src="/pos/static/js/sidebar.js"></script>
<script src="/pos/static/js/catalog.js"></script>