51 lines
2.4 KiB
Markdown
51 lines
2.4 KiB
Markdown
# Claude Learn: backend
|
|
<!-- paths: backend/**/*.py, backend/modules/**/*, requirements.txt -->
|
|
|
|
## P: ProfileRegistry cu Hot-Reload pentru Store Profiles
|
|
@2026-01-06 #registry-pattern #hot-reload #decorator | inferred:med
|
|
Sistem de înregistrare profile OCR folosind decorator `@ProfileRegistry.register` cu hot-reload via `importlib.reload()`. Permite adăugarea/modificarea profilelor fără restart server.
|
|
```python
|
|
@ProfileRegistry.register
|
|
class LidlProfile(BaseStoreProfile):
|
|
CUI_LIST = ["22891860"]
|
|
STORE_NAME = "LIDL DISCOUNT S.R.L."
|
|
|
|
# Lookup
|
|
profile = ProfileRegistry.get_profile("22891860")
|
|
|
|
# Hot-reload endpoint: POST /api/data-entry/ocr/profiles/reload
|
|
```
|
|
|
|
## P: Script generare cod Python din analiză PDF
|
|
@2026-01-06 #code-generation #ocr #automation | inferred:med
|
|
Script care analizează PDF-uri via OCR API, detectează pattern-uri (TVA format, date format, payment) și generează automat cod Python pentru profile noi. Include JWT auth, async polling, și verificare sintaxă.
|
|
```bash
|
|
# Dry-run pentru preview
|
|
python scripts/generate_store_profile.py \
|
|
--name "Magazin Nou" --cui "12345678" \
|
|
--receipts "docs/data-entry/MagazinNou*.pdf" --dry-run
|
|
|
|
# Generează și salvează
|
|
python scripts/generate_store_profile.py \
|
|
--name "Magazin Nou" --cui "12345678" \
|
|
--receipts "docs/data-entry/MagazinNou*.pdf" \
|
|
--output backend/.../profiles/magazin_nou.py
|
|
```
|
|
|
|
## G: OCR Worker Pool rulează în procese separate - restart complet necesar
|
|
@2026-01-07 #ocr #worker-pool #hot-reload | inferred:med
|
|
**P**: Modificările în fișierele de profile OCR nu sunt încărcate automat de uvicorn --reload pentru că OCR worker pool rulează în procese separate (multiprocessing).
|
|
**S**: Trebuie restart COMPLET al backend-ului cu `./start-backend.sh restart`. Hot-reload-ul uvicorn nu reîncarcă procesele worker separate.
|
|
|
|
## G: TOTAL_PATTERNS în profile OCR trebuie să aibă grupuri de captură
|
|
@2026-01-07 #ocr #regex #profiles | inferred:high
|
|
**P**: Pattern-uri regex în `TOTAL_PATTERNS` fără grupuri `()` cauzează `IndexError: no such group` când `super().extract_total()` încearcă `match.group(1)`.
|
|
**S**: TOTAL_PATTERNS din subclase TREBUIE să includă grupuri de captură pentru compatibilitate cu `BaseStoreProfile.extract_total()`:
|
|
```python
|
|
# GREȘIT - fără grup de captură
|
|
TOTAL_PATTERNS = [(r'SUMA\s+TOTALA\s*:', 0.98)]
|
|
|
|
# CORECT - cu grup de captură
|
|
TOTAL_PATTERNS = [(r'SUMA\s+TOTALA\s*:\s*([\d\s.,]+)', 0.98)]
|
|
```
|