feat(address): ROA address cache refresh — 8-field format + manual refresh endpoint
Phase 5 address format upgrade (pre-existing working tree changes):
- import_service: extend vadrese_parteneri query to 8 fields (strada/numar/bloc/scara/apart/etaj/localitate/judet); strip trailing city name from address string passed to Oracle
- sync_service: extend _addr_match to compare bloc/scara/apart in addition to strada/numar
- 05_pack_import_parteneri.pck: updated PL/SQL package
New: address cache refresh mechanism:
- sqlite_service: add get_order_address_ids(), update_order_address_cache() (targeted 3-column update, no ANAF fields touched), get_orders_with_address_ids()
- sync.py: POST /api/orders/{order_number}/refresh-address endpoint (404/422/503/200); batch Oracle address refresh in refresh_invoices (single IN roundtrip, per-order mismatch recomputed)
- UI: refresh button (⟳) in ADRESE modal header (base.html); refreshOrderAddress() with loading state + toast (dashboard.js v43); window._detailOrderNumber global (shared.js v32)
- tests: TestRefreshOrderAddress — 4 tests (404, 422, 503, 200 with 8-field assert)
Oracle prod fix applied directly: ADRESE_PARTENERI id_adresa=4116 STRADA VASILE→VASILE GOLDIS
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -57,6 +57,14 @@ def format_address_for_oracle(address: str, city: str, region: str) -> str:
|
||||
region_clean = clean_web_text(region)
|
||||
city_clean = clean_web_text(city)
|
||||
address_clean = clean_web_text(address)
|
||||
# Strip city name from end of address (users often type it)
|
||||
if city_clean:
|
||||
addr_upper = address_clean.upper().rstrip()
|
||||
city_upper = city_clean.upper().strip()
|
||||
if addr_upper.endswith(city_upper):
|
||||
stripped = address_clean[:len(address_clean.rstrip()) - len(city_upper)].rstrip()
|
||||
if stripped: # don't strip if nothing remains
|
||||
address_clean = stripped
|
||||
return f"JUD:{region_clean};{city_clean};{address_clean}"
|
||||
|
||||
|
||||
@@ -360,13 +368,21 @@ def import_single_order(order, id_pol: int = None, id_sectie: int = None, app_se
|
||||
|
||||
# Query address details from Oracle for sync back to SQLite
|
||||
if addr_livr_id:
|
||||
cur.execute("SELECT strada, numar, localitate, judet FROM vadrese_parteneri WHERE id_adresa = :1", [int(addr_livr_id)])
|
||||
cur.execute("""SELECT strada, numar, bloc, scara, apart, etaj, localitate, judet
|
||||
FROM vadrese_parteneri WHERE id_adresa = :1""", [int(addr_livr_id)])
|
||||
row = cur.fetchone()
|
||||
result["adresa_livrare_roa"] = {"strada": row[0], "numar": row[1], "localitate": row[2], "judet": row[3]} if row else None
|
||||
result["adresa_livrare_roa"] = {
|
||||
"strada": row[0], "numar": row[1], "bloc": row[2], "scara": row[3],
|
||||
"apart": row[4], "etaj": row[5], "localitate": row[6], "judet": row[7]
|
||||
} if row else None
|
||||
if addr_fact_id and addr_fact_id != addr_livr_id:
|
||||
cur.execute("SELECT strada, numar, localitate, judet FROM vadrese_parteneri WHERE id_adresa = :1", [int(addr_fact_id)])
|
||||
cur.execute("""SELECT strada, numar, bloc, scara, apart, etaj, localitate, judet
|
||||
FROM vadrese_parteneri WHERE id_adresa = :1""", [int(addr_fact_id)])
|
||||
row = cur.fetchone()
|
||||
result["adresa_facturare_roa"] = {"strada": row[0], "numar": row[1], "localitate": row[2], "judet": row[3]} if row else None
|
||||
result["adresa_facturare_roa"] = {
|
||||
"strada": row[0], "numar": row[1], "bloc": row[2], "scara": row[3],
|
||||
"apart": row[4], "etaj": row[5], "localitate": row[6], "judet": row[7]
|
||||
} if row else None
|
||||
elif addr_fact_id and addr_fact_id == addr_livr_id:
|
||||
result["adresa_facturare_roa"] = result.get("adresa_livrare_roa")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user