fix(address): numar overflow split, SAT → localitate

In parseaza_adresa_semicolon, text după NR ("5 la non stop", "21 sat
Grozavesti corbii mari") era împins în p_numar și trunchiat brutal la
10 chars ("5 LA NON S", "21 SAT GRO").

Fix: când p_numar > 10 chars, prima componentă rămâne numar; restul se
clasifică:
- "SAT X ..." → p_localitate := "X ..." (satul = localitate, TIER
  L1/L2/L3 existent rezolvă id_loc)
- "COM/ORAS/MUN X" → aruncat (deja în p_localitate din GoMag city)
- altceva (landmark ex "LA NON STOP") → concatenat în p_strada

Semnătura parseaza_adresa_semicolon neschimbată. Zero callers afectați.

Teste: landmark → strada, SAT → localitate, numar normal neschimbat.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-04-22 06:13:08 +00:00
parent d15f8b085d
commit b8a9480784
2 changed files with 53 additions and 1 deletions

View File

@@ -18,6 +18,9 @@ CREATE OR REPLACE PACKAGE PACK_IMPORT_PARTENERI AS
-- IN-set foloseste v_ro_cui (canonic) in loc de v_cod_fiscal_curat. Regula business platitor/
-- neplatitor pastrata. Bug anterior: input "RO 34963277" cadea pe branch neplatitor, rata partener
-- existent "RO34963277" → duplicat FG COFFE #485065210.
-- 22.04.2026 - fix numar overflow: prima componenta ramane numar; "SAT X" → p_localitate (satul
-- = localitate, TIER L1/L2/L3 existent rezolva id_loc); landmark → strada;
-- COM/ORAS/MUN ignorate (deja in p_localitate din GoMag city)
-- ====================================================================
-- CONSTANTS
@@ -683,7 +686,32 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
END IF;
-- Truncare de siguranta (limita coloanelor Oracle)
-- 22.04.2026 - numar overflow fix:
-- prima componenta ramane numar
-- "SAT X ..." → X ... devine p_localitate (satul = localitate, TIER L1/L2/L3 rezolva)
-- "COM X"/"ORAS X"/"MUN X" → ignorat (deja in p_localitate din GoMag)
-- altceva (landmark) → strada
IF LENGTH(p_numar) > 10 THEN
v_pozitie := INSTR(p_numar, ' ');
IF v_pozitie > 1 THEN
v_rest_parts := TRIM(SUBSTR(p_numar, v_pozitie + 1));
p_numar := SUBSTR(p_numar, 1, v_pozitie - 1);
IF v_rest_parts IS NOT NULL THEN
IF UPPER(v_rest_parts) LIKE 'SAT %' THEN
-- Satul = localitate → overwrite p_localitate cu tot ce urmeaza dupa "SAT "
p_localitate := UPPER(TRIM(REGEXP_REPLACE(v_rest_parts, '^SAT\s+', '', 1, 1, 'i')));
ELSIF UPPER(v_rest_parts) NOT LIKE 'COM %'
AND UPPER(v_rest_parts) NOT LIKE 'ORAS %'
AND UPPER(v_rest_parts) NOT LIKE 'MUN %' THEN
-- Landmark (ex: "LA NON STOP") → strada
p_strada := SUBSTR(TRIM(p_strada || ' ' || v_rest_parts), 1, 100);
END IF;
-- COM/ORAS/MUN aruncat (deja in p_localitate din GoMag)
END IF;
ELSE
p_numar := SUBSTR(p_numar, 1, 10);
END IF;
END IF;
p_bloc := SUBSTR(p_bloc, 1, 30);
p_scara := SUBSTR(p_scara, 1, 10);
p_apart := SUBSTR(p_apart, 1, 10);

View File

@@ -370,6 +370,30 @@ class TestAddressComponentParsing:
assert "MODARZAU BLOCURI" in (result.get("strada") or ""), f"strada should contain MODARZAU BLOCURI, got {result}"
assert result.get("bloc") is None, f"bloc should be NULL for neighborhood name, got {result.get('bloc')}"
def test_numar_overflow_with_landmark(self, oracle_pool):
"""'nr 5 la non stop' — numar=5, landmark overflow muta in strada."""
addr = self._parse_address(oracle_pool, "Str zorilor nr 5 la non stop", "Brasov", "Brasov")
assert addr["numar"] == "5", f"numar={addr['numar']!r} (asteptat '5')"
assert "ZORILOR" in (addr["strada"] or ""), f"strada={addr['strada']!r}"
assert "NON" in (addr["strada"] or ""), f"landmark lipsa din strada: {addr['strada']!r}"
def test_numar_overflow_with_sat_localitate(self, oracle_pool):
"""'nr21 sat Grozavesti corbii mari' — numar=21, SAT overwrite p_localitate (satul = localitate)."""
addr = self._parse_address(oracle_pool, "Pe deal nr21 sat Grozavesti corbii mari", "Corbii Mari", "Dambovita")
assert addr["numar"] == "21", f"numar={addr['numar']!r} (asteptat '21')"
assert "DEAL" in (addr["strada"] or ""), f"strada={addr['strada']!r}"
assert "GROZAVESTI" not in (addr["strada"] or ""), f"SAT in strada: {addr['strada']!r}"
# SAT ... a fost mutat in p_localitate (override din GoMag "CORBII MARI")
assert "GROZAVESTI" in (addr["localitate"] or "").upper(), (
f"localitate={addr['localitate']!r} (astept sa contina GROZAVESTI)"
)
def test_numar_normal_not_affected(self, oracle_pool):
"""Numar normal (<= 10 chars) nu e atins de overflow fix."""
addr = self._parse_address(oracle_pool, "Str Mihai Viteazu nr 10", "Cluj-Napoca", "Cluj")
assert addr["numar"] == "10", f"numar={addr['numar']!r}"
assert "VITEAZU" in (addr["strada"] or ""), f"strada={addr['strada']!r}"
# ---------------------------------------------------------------------------
# Test regresie: comenzi existente în SQLite