diff --git a/Asset-Label-Matching.md b/Asset-Label-Matching.md new file mode 100644 index 0000000..ec1fdd0 --- /dev/null +++ b/Asset-Label-Matching.md @@ -0,0 +1,46 @@ +# Asset Label Photo Matching + +**Added:** 2026-05-29 + +New system for matching label photos (serial numbers, barcodes, QR codes) against the assets database. + +## Normalization + +`classify_makes.py` contains `normalize_identifier()` which: + +- Strips label prefixes (`S/N:`, `ID#`, `Machine ID:`, `Monyx ID`, etc.) +- Removes dots, dashes, spaces, slashes, colons +- Uppercases, keeps alphanumeric only + +Examples: +- `"2500.0100.0025534"` → `"2500010000255534"` +- `"S/N: 2500.0100.0025534"` → `"2500010000255534"` +- `"RY10006338"` → `"RY10006338"` + +## DB Matching + +`find_asset_by_normalized_id()` searches across `serial_number`, `connect_id`, `equipment_id`, `machine_id`, and `barcode` columns — normalizing all before comparing. + +## API Endpoints + +### `POST /api/ocr` +Existing photo upload endpoint enhanced. Now returns `matched_assets` in addition to the legacy `machine_id` field. Uses Tesseract OCR. Falls through gracefully when OCR produces garbage. + +### `POST /api/match-text` +New endpoint for client-side processing: +``` +curl -sk https://canteen.ourpad.casa:8901/api/match-text \ + -d "text=2500.0100.0025534" +``` +Returns `{raw_text, matched_assets[], match_count}`. + +## CLI Tool + +``` +python3 scripts/match_label_photo.py photo.jpg +python3 scripts/match_label_photo.py --text "S/N: 2500.0100.0025534" +``` + +## Vision Fallback + +The vision model at opencode.ai (`mimo-v2-omni`) is used when Tesseract fails on dark-background or complex labels. The app can accept text from client-side vision processing via `/api/match-text`.