feat: connect-id suffix matching for OCR + bump SW cache to v10

This commit is contained in:
2026-06-02 18:32:41 -04:00
parent 3fa76cc74b
commit c8ffab2c06
2 changed files with 25 additions and 4 deletions
+24 -3
View File
@@ -66,6 +66,12 @@ def find_asset_by_normalized_id(db_path: str, normalized: str) -> list:
Search assets.db for any asset whose serial_number, machine_id, connect_id, Search assets.db for any asset whose serial_number, machine_id, connect_id,
equipment_id, or barcode matches the given normalized identifier. equipment_id, or barcode matches the given normalized identifier.
Supports:
- Exact match: normalized string equals the DB field (after normalization)
- Suffix match: if the normalized value is all digits and >= 7 chars,
match against the last N digits of connect_id and equipment_id (for
partial OCR reads that capture only the numeric tail of a longer ID).
Returns a list of matching rows (dicts). Returns a list of matching rows (dicts).
""" """
if not normalized or len(normalized) < 3: if not normalized or len(normalized) < 3:
@@ -74,7 +80,22 @@ def find_asset_by_normalized_id(db_path: str, normalized: str) -> list:
import sqlite3 import sqlite3
conn = sqlite3.connect(db_path) conn = sqlite3.connect(db_path)
conn.row_factory = sqlite3.Row conn.row_factory = sqlite3.Row
rows = conn.execute("""
# Suffix matching: if the scanned text is purely numeric and >= 7 chars,
# search for assets whose connect_id or equipment_id ends with those digits.
# Connect IDs often look like VM-05064-0000099387; OCR might only read "0000099387".
suffix_conditions = ''
suffix_params = []
if len(normalized) >= 7 and normalized.isdigit():
# Match against the last N digits of connect_id and equipment_id.
# Use LIKE with rightmost-anchored pattern: %<digits>
suffix_conditions = """
OR replace(replace(replace(replace(upper(connect_id), '-', ''), '.', ''), ' ', ''), '/', '') LIKE ?
OR replace(replace(replace(replace(upper(equipment_id), '-', ''), '.', ''), ' ', ''), '/', '') LIKE ?
"""
suffix_params = ['%' + normalized, '%' + normalized]
rows = conn.execute(f"""
SELECT id, machine_id, name, serial_number, connect_id, equipment_id, SELECT id, machine_id, name, serial_number, connect_id, equipment_id,
barcode, make, model, category barcode, make, model, category
FROM assets FROM assets
@@ -83,8 +104,8 @@ def find_asset_by_normalized_id(db_path: str, normalized: str) -> list:
OR replace(replace(replace(replace(upper(equipment_id), '-', ''), '.', ''), ' ', ''), '/', '') = ? OR replace(replace(replace(replace(upper(equipment_id), '-', ''), '.', ''), ' ', ''), '/', '') = ?
OR replace(replace(replace(replace(upper(machine_id), '-', ''), '.', ''), ' ', ''), '/', '') = ? OR replace(replace(replace(replace(upper(machine_id), '-', ''), '.', ''), ' ', ''), '/', '') = ?
OR replace(replace(replace(replace(upper(barcode), '-', ''), '.', ''), ' ', ''), '/', '') = ? OR replace(replace(replace(replace(upper(barcode), '-', ''), '.', ''), ' ', ''), '/', '') = ?
-- Connect-ID suffix match (last 7+ digits → equipment_id suffix) {suffix_conditions}
""", (normalized, normalized, normalized, normalized, normalized)).fetchall() """, (normalized, normalized, normalized, normalized, normalized, *suffix_params)).fetchall()
conn.close() conn.close()
return [dict(r) for r in rows] return [dict(r) for r in rows]
+1 -1
View File
@@ -3,7 +3,7 @@
// Caches app shell + CDN deps. Network-first for API, cache fallback for static. // Caches app shell + CDN deps. Network-first for API, cache fallback for static.
// ═══════════════════════════════════════════════════════════════════════════ // ═══════════════════════════════════════════════════════════════════════════
const CACHE_NAME = 'canteen-v9'; const CACHE_NAME = 'canteen-v10';
// App shell — core resources needed to boot the PWA // App shell — core resources needed to boot the PWA
const APP_SHELL = [ const APP_SHELL = [