fix(plsql): encoding-safe strip_diacritics + localitate match in address lookup

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) <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-04-06 20:15:44 +00:00
parent 51910148ef
commit a8ad54a604

View File

@@ -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)