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:
@@ -9,6 +9,7 @@ CREATE OR REPLACE PACKAGE PACK_IMPORT_PARTENERI AS
|
||||
-- 06.04.2026 - eliminat TIER 2 cautare adresa (judet+loc fara strada) — creeaza adresa noua cand strada difera
|
||||
-- 06.04.2026 - fix strip_diacritics: UNISTR encoding-safe (TRANSLATE cu UTF-8 literal se corupea pe Windows)
|
||||
-- 06.04.2026 - fix TIER 1: strip_diacritics si pe localitate (nu doar strada)
|
||||
-- 07.04.2026 - fix parser adrese: inserare virgule inaintea keywords, tokeni lipiti (Ap78), strip localitate din strada
|
||||
|
||||
-- ====================================================================
|
||||
-- CONSTANTS
|
||||
@@ -585,6 +586,15 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
-- Tokenii sunt separati prin virgula
|
||||
-- Patterns: NR/NUMAR, BL/BLOC, SC/SCARA, AP/APART, ET/ETAJ
|
||||
-- ================================================================
|
||||
-- Insert commas before address keywords to create proper tokens
|
||||
-- No guard on existing commas — double commas produce empty tokens (harmless)
|
||||
IF v_raw_numar IS NOT NULL THEN
|
||||
v_raw_numar := REGEXP_REPLACE(v_raw_numar,
|
||||
'(\s)(BLOC|BL|SCARA|SC|APARTAMENT|APART|AP|ETAJ|ET|NUMARUL|NUMAR|NR)(\s|\.|\d)',
|
||||
',\2\3', 1, 0, 'i');
|
||||
v_raw_numar := LTRIM(v_raw_numar, ', ');
|
||||
END IF;
|
||||
|
||||
IF v_raw_numar IS NOT NULL THEN
|
||||
-- Loop prin tokeni separati de virgula (fara BULK COLLECT — compatibil Oracle 11)
|
||||
v_rest_parts := NULL;
|
||||
@@ -616,6 +626,17 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
p_etaj := TRIM(REGEXP_REPLACE(v_token, '^(ETAJ|ET\.?)(\s|\.)*', '', 1, 1, 'i'));
|
||||
ELSIF REGEXP_LIKE(v_token_upper, '^(NUMARUL|NUMAR|NR\.?)(\s|\.)') THEN
|
||||
p_numar := TRIM(REGEXP_REPLACE(v_token, '^(NUMARUL|NUMAR|NR\.?)(\s|\.)*', '', 1, 1, 'i'));
|
||||
-- Glued tokens: Ap78, BL30, SC2, ET3, NR15 (no separator between keyword and digit)
|
||||
ELSIF REGEXP_LIKE(v_token_upper, '^(BLOC|BL)(\d)') THEN
|
||||
p_bloc := TRIM(REGEXP_REPLACE(v_token, '^(BLOC|BL)', '', 1, 1, 'i'));
|
||||
ELSIF REGEXP_LIKE(v_token_upper, '^(SCARA|SC)(\d)') THEN
|
||||
p_scara := TRIM(REGEXP_REPLACE(v_token, '^(SCARA|SC)', '', 1, 1, 'i'));
|
||||
ELSIF REGEXP_LIKE(v_token_upper, '^(APARTAMENT|APART|AP)(\d)') THEN
|
||||
p_apart := TRIM(REGEXP_REPLACE(v_token, '^(APARTAMENT|APART|AP)', '', 1, 1, 'i'));
|
||||
ELSIF REGEXP_LIKE(v_token_upper, '^(ETAJ|ET)(\d)') THEN
|
||||
p_etaj := TRIM(REGEXP_REPLACE(v_token, '^(ETAJ|ET)', '', 1, 1, 'i'));
|
||||
ELSIF REGEXP_LIKE(v_token_upper, '^(NUMARUL|NUMAR|NR)(\d)') THEN
|
||||
p_numar := TRIM(REGEXP_REPLACE(v_token, '^(NUMARUL|NUMAR|NR)', '', 1, 1, 'i'));
|
||||
ELSE
|
||||
-- Primul token necunoscut devine numar (daca numar e inca gol)
|
||||
IF p_numar IS NULL AND v_tok_idx = 1 THEN
|
||||
@@ -648,6 +669,16 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
p_apart := UPPER(TRIM(p_apart));
|
||||
p_etaj := UPPER(TRIM(p_etaj));
|
||||
|
||||
-- Strip localitate from end of strada (users type city into address)
|
||||
IF p_strada IS NOT NULL AND p_localitate IS NOT NULL THEN
|
||||
IF p_strada LIKE '%' || p_localitate THEN
|
||||
v_token := RTRIM(SUBSTR(p_strada, 1, LENGTH(p_strada) - LENGTH(p_localitate)));
|
||||
IF v_token IS NOT NULL THEN
|
||||
p_strada := v_token;
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
-- Truncare de siguranta (limita coloanelor Oracle)
|
||||
p_numar := SUBSTR(p_numar, 1, 10);
|
||||
p_bloc := SUBSTR(p_bloc, 1, 30);
|
||||
|
||||
Reference in New Issue
Block a user