From a8ad54a604dc4edb29b428e67a4f9d21af27f3db Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Mon, 6 Apr 2026 20:15:44 +0000 Subject: [PATCH] fix(plsql): encoding-safe strip_diacritics + localitate match in address lookup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TRANSLATE with UTF-8 literals was silently corrupted when compiled via Windows sqlplus (ĂăÂâÎî→����, ȘșȚț→????). Replaced with REPLACE/UNISTR for comma-below→cedilla normalization + CONVERT US7ASCII. Also applied strip_diacritics to localitate/judet in TIER 1 lookup and locality search (was only on strada), fixing 'FĂLTICENI' vs 'FALTICENI' BINARY mismatch. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../05_pack_import_parteneri.pck | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/api/database-scripts/05_pack_import_parteneri.pck b/api/database-scripts/05_pack_import_parteneri.pck index 6fe66a2..28b94c9 100644 --- a/api/database-scripts/05_pack_import_parteneri.pck +++ b/api/database-scripts/05_pack_import_parteneri.pck @@ -7,6 +7,8 @@ CREATE OR REPLACE PACKAGE PACK_IMPORT_PARTENERI AS -- 02.04.2026 - parser adrese: extrage APARTAMENT/SCARA/ETAJ embedded in strada (fix "Nr17 apartament 8") -- 02.04.2026 - fallback cautare PF cu permutari nume (evita duplicate la swap firstname/lastname) -- 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) -- ==================================================================== -- CONSTANTS @@ -160,15 +162,23 @@ END PACK_IMPORT_PARTENERI; CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS -- 01.04.2026 - strip_diacritics la stocare adrese si parteneri + -- 06.04.2026 - fix: UNISTR encoding-safe (TRANSLATE cu UTF-8 literal se corupea pe Windows sqlplus) + -- Hybrid: REPLACE comma-below Ș/Ț → cedilla Ş/Ţ, apoi CONVERT US7ASCII (strips Ă/Â/Î/Ş/Ţ) FUNCTION strip_diacritics(p_text IN VARCHAR2) RETURN VARCHAR2 IS BEGIN IF p_text IS NULL THEN RETURN NULL; END IF; - RETURN TRANSLATE( - UPPER(TRIM(p_text)), - 'ĂăÂâÎîȘșȚțŞşŢţ', - 'AAAAIISSTTSSTT' + RETURN CONVERT( + UPPER(TRIM( + REPLACE(REPLACE(REPLACE(REPLACE( + p_text, + UNISTR('\0218'), UNISTR('\015E')), -- Ș → Ş (comma-below → cedilla) + UNISTR('\0219'), UNISTR('\015F')), -- ș → ş + UNISTR('\021A'), UNISTR('\0162')), -- Ț → Ţ + UNISTR('\021B'), UNISTR('\0163')) -- ț → ţ + )), + 'US7ASCII', 'AL32UTF8' ); END strip_diacritics; @@ -933,14 +943,15 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS v_etaj); -- 01.04.2026 - cautare adresa pe strada + diacritics + id_loc validation - -- TIER 1: county + city + street (diacritics normalized) + valid id_loc + -- 06.04.2026 - strip_diacritics si pe localitate (fix: 'FĂLTICENI' vs 'FALTICENI') + -- TIER 1: county + city + street (all diacritics normalized) + valid id_loc begin select id_adresa into p_id_adresa from ( select id_adresa from vadrese_parteneri where id_part = p_id_part - and judet = v_judet - and localitate = v_localitate + and strip_diacritics(judet) = strip_diacritics(v_judet) + and strip_diacritics(localitate) = strip_diacritics(v_localitate) and strip_diacritics(strada) = strip_diacritics(v_strada) and id_loc IS NOT NULL order by principala desc, id_adresa desc @@ -963,14 +974,14 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS v_id_judet := N_ID_JUD_DEFAULT; end; - -- caut localitatea + -- caut localitatea (strip_diacritics pe ambele parti — fix encoding mismatch) begin select id_loc, id_judet, id_tara into v_id_localitate, v_id_judet, v_id_tara from (select id_loc, id_judet, id_tara, rownum rn from syn_nom_localitati l where id_judet = v_id_judet - and localitate = v_localitate + and strip_diacritics(localitate) = strip_diacritics(v_localitate) and inactiv = 0 and sters = 0 order by localitate)