Codurile ROA contin legitim '/' si '"' (ex. RCR1/4"). Rutele FastAPI
foloseau parametri de cale (/api/mappings/{sku}/{codmat}...); ASGI decodeaza
%2F -> '/' INAINTE de routing, deci o cheie cu slash devine doua segmente si
Starlette nu mai potriveste ruta -> 404 la edit/delete/restore. Cand ambii
parametri au slash, un convertor {path} nu rezolva (split ambiguu).
Solutie: sku/codmat trec din cale in query string. %2F/%22 din query se
decodeaza ca parte a valorii, fara sa atinga routing-ul de cale.
- backend: 4 rute statice + Query(...) (update/edit/delete/restore);
semnaturile mapping_service raman neschimbate
- frontend: helper mapQS(); toate cele 8 apeluri path -> query; cache-bust ?v=19
- tests: regresie ci-layer (chei-sentinel cu slash, !=404, toate 4 rutele);
test_integration update/delete convertite la query; e2e delete RCR1/4"
(slash+ghilimea) prin modalul UI, skip cand Oracle lipseste
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
GoMag Import Manager - FastAPI Application
Admin interface si orchestrator pentru importul comenzilor GoMag in Oracle ROA.
Componente
Core
- main.py - Entry point FastAPI, lifespan (Oracle pool + SQLite init), file logging
- config.py - Settings via pydantic-settings (citeste .env)
- database.py - Oracle connection pool + SQLite schema + helpers
Routers (HTTP Endpoints)
| Router | Prefix | Descriere |
|---|---|---|
| health | /health, /api/health | Status Oracle + SQLite |
| dashboard | / | Dashboard HTML cu stat cards |
| mappings | /mappings, /api/mappings | CRUD ARTICOLE_TERTI + CSV |
| articles | /api/articles | Cautare NOM_ARTICOLE |
| validation | /api/validate | Scanare + validare SKU-uri |
| sync | /sync, /api/sync | Import orchestration + scheduler |
Services (Business Logic)
| Service | Rol |
|---|---|
| mapping_service | CRUD pe ARTICOLE_TERTI (Oracle) |
| article_service | Cautare in NOM_ARTICOLE (Oracle) |
| import_service | Port din VFP: partner/address/order creation |
| sync_service | Orchestrare: read JSONs → validate → import → log |
| price_sync_service | Sync preturi GoMag → Oracle politici de pret |
| invoice_service | Verificare facturi ROA + cache SQLite |
| validation_service | Batch-validare SKU-uri (chunks of 500) |
| order_reader | Citire gomag_orders_page*.json din vfp/output/ |
| sqlite_service | CRUD pe SQLite (sync_runs, import_orders, missing_skus) |
| scheduler_service | APScheduler - sync periodic configurabil din UI |
Rulare
pip install -r requirements.txt
# INTOTDEAUNA via start.sh din project root (seteaza Oracle env vars)
cd .. && ./start.sh
Testare
# Din project root:
./test.sh ci # Teste rapide (unit + e2e, ~30s, fara Oracle)
./test.sh full # Teste complete (inclusiv Oracle, ~2-3 min)
./test.sh unit # Doar unit tests
./test.sh e2e # Doar browser tests (Playwright)
./test.sh oracle # Doar Oracle integration
Dual Database
- Oracle - date ERP (ARTICOLE_TERTI, NOM_ARTICOLE, COMENZI)
- SQLite - tracking local (sync_runs, import_orders, missing_skus, scheduler_config)
Logging
Log files in ../logs/sync_comenzi_YYYYMMDD_HHMMSS.log
Format: 2026-03-11 14:30:25 | INFO | app.services.sync_service | mesaj