From 3a4029cc6e73a7a87a12af8002bdcb787b764d98 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Tue, 9 Sep 2025 21:21:09 +0300 Subject: [PATCH] Fix PACK_IMPORT_PARTENERI compilation errors and update logging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix pack_def procedure calls with correct parameter signatures - Change from function calls to procedure calls with OUT parameters - Remove diacritics from all Romanian text in package - Simplify NULL comparisons to use IS NULL only - Update logging to use INFO table instead of system_log - Rename package to PACK_IMPORT_PARTENERI for consistency 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- api/database-scripts/02_import_parteneri.sql | 365 +++++++++---------- 1 file changed, 177 insertions(+), 188 deletions(-) diff --git a/api/database-scripts/02_import_parteneri.sql b/api/database-scripts/02_import_parteneri.sql index 33c4f68..b25e497 100644 --- a/api/database-scripts/02_import_parteneri.sql +++ b/api/database-scripts/02_import_parteneri.sql @@ -1,38 +1,37 @@ -- ==================================================================== --- P1-002: Package IMPORT_PARTENERI pentru căutare și creare parteneri --- Sistem Import Comenzi Web → ROA +-- Package IMPORT_PARTENERI pentru cautare si creare parteneri -- ==================================================================== -- --- Implementare completă package pentru gestionarea partenerilor din comenzi web --- Integrare cu pack_def existent pentru creare parteneri și adrese +-- Implementare completa package pentru gestionarea partenerilor din comenzi web +-- Integrare cu pack_def existent pentru creare parteneri si adrese -- --- Funcționalități: --- - Căutare parteneri după cod_fiscal și denumire --- - Creare parteneri noi cu validări +-- Functionalitati: +-- - Cautare parteneri dupa cod_fiscal si denumire +-- - Creare parteneri noi cu validari -- - Parsare adrese format semicolon -- - Separare nume/prenume pentru persoane fizice --- - Error handling și logging complet +-- - Error handling si logging complet -- -- Author: Generated with Claude Code -- Date: 09 septembrie 2025 -- ==================================================================== -- Creare package specification -CREATE OR REPLACE PACKAGE IMPORT_PARTENERI AS +CREATE OR REPLACE PACKAGE PACK_IMPORT_PARTENERI AS -- ==================================================================== -- CONSTANTS -- ==================================================================== - -- ID utilizator sistem pentru toate operațiile + -- ID utilizator sistem pentru toate operatiile C_ID_UTIL_SISTEM CONSTANT NUMBER := -3; -- Valori default pentru adrese incomplete - C_JUD_DEFAULT CONSTANT VARCHAR2(50) := 'București'; + C_JUD_DEFAULT CONSTANT VARCHAR2(50) := 'Bucuresti'; C_LOCALITATE_DEFAULT CONSTANT VARCHAR2(50) := 'BUCURESTI'; C_SECTOR_DEFAULT CONSTANT VARCHAR2(50) := 'Sectorul 1'; - -- Lungimi maxime pentru validări + -- Lungimi maxime pentru validari C_MIN_COD_FISCAL CONSTANT NUMBER := 3; C_CUI_PERS_FIZICA CONSTANT NUMBER := 13; -- CNP are 13 cifre @@ -54,20 +53,20 @@ CREATE OR REPLACE PACKAGE IMPORT_PARTENERI AS -- ==================================================================== /** - * Funcția principală pentru căutarea sau crearea unui partener + * Functia principala pentru cautarea sau crearea unui partener * * Algoritm: - * 1. Caută după cod_fiscal (dacă > 3 caractere) - * 2. Caută după denumire exactă - * 3. Creează partener nou cu pack_def.adauga_partener() - * 4. Adaugă adresa cu pack_def.adauga_adresa_partener2() + * 1. Cauta dupa cod_fiscal (daca > 3 caractere) + * 2. Cauta dupa denumire exacta + * 3. Creeaza partener nou cu pack_def.adauga_partener() + * 4. Adauga adresa cu pack_def.adauga_adresa_partener2() * * @param p_cod_fiscal Cod fiscal/CUI/CNP partener * @param p_denumire Denumirea partenerului (companie sau nume complet) - * @param p_adresa Adresa în format: "JUD:București;BUCURESTI;Str.Victoriei;10" - * @param p_telefon Număr de telefon + * @param p_adresa Adresa in format: "JUD:Bucuresti;BUCURESTI;Str.Victoriei;10" + * @param p_telefon Numar de telefon * @param p_email Adresa de email - * @return ID_PART al partenerului găsit sau creat + * @return ID_PART al partenerului gasit sau creat */ FUNCTION cauta_sau_creeaza_partener( p_cod_fiscal IN VARCHAR2, @@ -78,16 +77,16 @@ CREATE OR REPLACE PACKAGE IMPORT_PARTENERI AS ) RETURN NUMBER; /** - * Parsează o adresă din format semicolon în componentele individuale + * Parseaza o adresa din format semicolon in componentele individuale * - * Format input: "JUD:București;BUCURESTI;Str.Victoriei;10" + * Format input: "JUD:Bucuresti;BUCURESTI;Str.Victoriei;10" * sau: "BUCURESTI;Str.Victoriei;10" * sau: "Str.Victoriei;10" * * @param p_adresa_text Textul adresei de parseat - * @param p_judet OUT Județul extras (default: București) - * @param p_localitate OUT Localitatea extrasă (default: BUCURESTI) - * @param p_strada OUT Strada și numărul + * @param p_judet OUT Judetul extras (default: Bucuresti) + * @param p_localitate OUT Localitatea extrasa (default: BUCURESTI) + * @param p_strada OUT Strada si numarul * @param p_sector OUT Sectorul (default: Sectorul 1) */ PROCEDURE parseaza_adresa_semicolon( @@ -103,28 +102,28 @@ CREATE OR REPLACE PACKAGE IMPORT_PARTENERI AS -- ==================================================================== /** - * Caută partener după cod fiscal - * @param p_cod_fiscal Codul fiscal de căutat - * @return ID_PART sau NULL dacă nu găsește + * Cauta partener dupa cod fiscal + * @param p_cod_fiscal Codul fiscal de cautat + * @return ID_PART sau NULL daca nu gaseste */ FUNCTION cauta_partener_dupa_cod_fiscal(p_cod_fiscal IN VARCHAR2) RETURN NUMBER; /** - * Caută partener după denumire exactă - * @param p_denumire Denumirea de căutat - * @return ID_PART sau NULL dacă nu găsește + * Cauta partener dupa denumire exacta + * @param p_denumire Denumirea de cautat + * @return ID_PART sau NULL daca nu gaseste */ FUNCTION cauta_partener_dupa_denumire(p_denumire IN VARCHAR2) RETURN NUMBER; /** - * Verifică dacă un cod fiscal aparține unei persoane fizice (CNP) + * Verifica daca un cod fiscal apartine unei persoane fizice (CNP) * @param p_cod_fiscal Codul fiscal de verificat - * @return 1 dacă este persoană fizică, 0 dacă este companie + * @return 1 daca este persoana fizica, 0 daca este companie */ FUNCTION este_persoana_fizica(p_cod_fiscal IN VARCHAR2) RETURN NUMBER; /** - * Separă numele complet în nume și prenume pentru persoane fizice + * Separa numele complet in nume si prenume pentru persoane fizice * @param p_denumire_completa Numele complet * @param p_nume OUT Numele de familie * @param p_prenume OUT Prenumele @@ -136,7 +135,7 @@ CREATE OR REPLACE PACKAGE IMPORT_PARTENERI AS ); /** - * Scrie în log operațiile executate + * Scrie in log operatiile executate * @param p_mesaj Mesajul de logat * @param p_nivel Nivelul: INFO, WARN, ERROR */ @@ -145,36 +144,36 @@ CREATE OR REPLACE PACKAGE IMPORT_PARTENERI AS p_nivel IN VARCHAR2 DEFAULT 'INFO' ); -END IMPORT_PARTENERI; +END PACK_IMPORT_PARTENERI; / -- ==================================================================== -- PACKAGE BODY IMPLEMENTATION -- ==================================================================== -CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS +CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS -- ==================================================================== -- PRIVATE FUNCTIONS -- ==================================================================== /** - * Validează datele unui partener înainte de creare + * Valideaza datele unui partener inainte de creare */ FUNCTION valideaza_date_partener( p_cod_fiscal IN VARCHAR2, p_denumire IN VARCHAR2 ) RETURN BOOLEAN IS BEGIN - -- Verificări obligatorii - IF p_denumire IS NULL OR TRIM(p_denumire) = '' THEN - RAISE_APPLICATION_ERROR(-20001, 'Denumirea partenerului nu poate fi goală'); + -- Verificari obligatorii + IF p_denumire IS NULL THEN + RAISE_APPLICATION_ERROR(-20001, 'Denumirea partenerului nu poate fi goala'); END IF; - -- Cod fiscal opțional, dar dacă există trebuie să aibă minim 3 caractere + -- Cod fiscal optional, dar daca exista trebuie sa aiba minim 3 caractere IF p_cod_fiscal IS NOT NULL AND LENGTH(TRIM(p_cod_fiscal)) > 0 THEN IF LENGTH(TRIM(p_cod_fiscal)) < C_MIN_COD_FISCAL THEN - RAISE_APPLICATION_ERROR(-20001, 'Codul fiscal trebuie să aibă minim ' || C_MIN_COD_FISCAL || ' caractere'); + RAISE_APPLICATION_ERROR(-20001, 'Codul fiscal trebuie sa aiba minim ' || C_MIN_COD_FISCAL || ' caractere'); END IF; END IF; @@ -182,12 +181,12 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS EXCEPTION WHEN OTHERS THEN - log_operatie('ERROR în valideaza_date_partener: ' || SQLERRM, 'ERROR'); + log_operatie('ERROR in valideaza_date_partener: ' || SQLERRM, 'ERROR'); RAISE; END valideaza_date_partener; /** - * Curăță și standardizează textul pentru căutare + * Curata si standardizeaza textul pentru cautare */ FUNCTION curata_text_cautare(p_text IN VARCHAR2) RETURN VARCHAR2 IS BEGIN @@ -213,26 +212,26 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS v_cod_fiscal_curat := curata_text_cautare(p_cod_fiscal); - log_operatie('Căutare partener după cod_fiscal: ' || v_cod_fiscal_curat); + log_operatie('Cautare partener dupa cod_fiscal: ' || v_cod_fiscal_curat); - -- Căutare în NOM_PARTENERI + -- Cautare in NOM_PARTENERI BEGIN SELECT id_part INTO v_id_part FROM nom_parteneri WHERE UPPER(TRIM(cod_fiscal)) = v_cod_fiscal_curat - AND ROWNUM = 1; -- În caz de duplicate, luăm primul + AND ROWNUM = 1; -- În caz de duplicate, luam primul - log_operatie('Găsit partener cu cod_fiscal ' || v_cod_fiscal_curat || ': ID_PART=' || v_id_part); + log_operatie('Gasit partener cu cod_fiscal ' || v_cod_fiscal_curat || ': ID_PART=' || v_id_part); RETURN v_id_part; EXCEPTION WHEN NO_DATA_FOUND THEN - log_operatie('Nu s-a găsit partener cu cod_fiscal: ' || v_cod_fiscal_curat); + log_operatie('Nu s-a gasit partener cu cod_fiscal: ' || v_cod_fiscal_curat); RETURN NULL; WHEN TOO_MANY_ROWS THEN - -- Luăm primul găsit + -- Luam primul gasit SELECT id_part INTO v_id_part FROM ( @@ -243,14 +242,14 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS ) WHERE ROWNUM = 1; - log_operatie('WARNING: Multiple parteneri cu același cod_fiscal ' || v_cod_fiscal_curat || + log_operatie('WARNING: Multiple parteneri cu acelasi cod_fiscal ' || v_cod_fiscal_curat || '. Selectat ID_PART=' || v_id_part, 'WARN'); RETURN v_id_part; END; EXCEPTION WHEN OTHERS THEN - log_operatie('ERROR în cauta_partener_dupa_cod_fiscal: ' || SQLERRM, 'ERROR'); + log_operatie('ERROR in cauta_partener_dupa_cod_fiscal: ' || SQLERRM, 'ERROR'); RAISE; END cauta_partener_dupa_cod_fiscal; @@ -259,32 +258,32 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS v_denumire_curata VARCHAR2(200); BEGIN -- Validare input - IF p_denumire IS NULL OR TRIM(p_denumire) = '' THEN + IF p_denumire IS NULL THEN RETURN NULL; END IF; v_denumire_curata := curata_text_cautare(p_denumire); - log_operatie('Căutare partener după denumire: ' || v_denumire_curata); + log_operatie('Cautare partener dupa denumire: ' || v_denumire_curata); - -- Căutare în NOM_PARTENERI + -- Cautare in NOM_PARTENERI BEGIN SELECT id_part INTO v_id_part FROM nom_parteneri WHERE UPPER(TRIM(denumire)) = v_denumire_curata - AND ROWNUM = 1; -- În caz de duplicate, luăm primul + AND ROWNUM = 1; -- În caz de duplicate, luam primul - log_operatie('Găsit partener cu denumirea ' || v_denumire_curata || ': ID_PART=' || v_id_part); + log_operatie('Gasit partener cu denumirea ' || v_denumire_curata || ': ID_PART=' || v_id_part); RETURN v_id_part; EXCEPTION WHEN NO_DATA_FOUND THEN - log_operatie('Nu s-a găsit partener cu denumirea: ' || v_denumire_curata); + log_operatie('Nu s-a gasit partener cu denumirea: ' || v_denumire_curata); RETURN NULL; WHEN TOO_MANY_ROWS THEN - -- Luăm primul găsit + -- Luam primul gasit SELECT id_part INTO v_id_part FROM ( @@ -295,14 +294,14 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS ) WHERE ROWNUM = 1; - log_operatie('WARNING: Multiple parteneri cu aceeași denumire ' || v_denumire_curata || + log_operatie('WARNING: Multiple parteneri cu aceeasi denumire ' || v_denumire_curata || '. Selectat ID_PART=' || v_id_part, 'WARN'); RETURN v_id_part; END; EXCEPTION WHEN OTHERS THEN - log_operatie('ERROR în cauta_partener_dupa_denumire: ' || SQLERRM, 'ERROR'); + log_operatie('ERROR in cauta_partener_dupa_denumire: ' || SQLERRM, 'ERROR'); RAISE; END cauta_partener_dupa_denumire; @@ -325,7 +324,7 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS EXCEPTION WHEN OTHERS THEN - log_operatie('ERROR în este_persoana_fizica: ' || SQLERRM, 'ERROR'); + log_operatie('ERROR in este_persoana_fizica: ' || SQLERRM, 'ERROR'); RETURN 0; END este_persoana_fizica; @@ -337,7 +336,7 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS v_pozitie_spatiu NUMBER; v_denumire_curata VARCHAR2(200); BEGIN - IF p_denumire_completa IS NULL OR TRIM(p_denumire_completa) = '' THEN + IF p_denumire_completa IS NULL THEN p_nume := NULL; p_prenume := NULL; RETURN; @@ -345,7 +344,7 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS v_denumire_curata := TRIM(p_denumire_completa); - -- Caută primul spațiu + -- Cauta primul spatiu v_pozitie_spatiu := INSTR(v_denumire_curata, ' '); IF v_pozitie_spatiu > 0 THEN @@ -354,12 +353,12 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS -- Prenumele = restul p_prenume := TRIM(SUBSTR(v_denumire_curata, v_pozitie_spatiu + 1)); ELSE - -- Nu există spațiu, totul este nume + -- Nu exista spatiu, totul este nume p_nume := v_denumire_curata; p_prenume := NULL; END IF; - -- Validare lungimi maxime (să nu depășească limitele tabelei) + -- Validare lungimi maxime (sa nu depaseasca limitele tabelei) IF LENGTH(p_nume) > 50 THEN p_nume := SUBSTR(p_nume, 1, 50); END IF; @@ -370,7 +369,7 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS EXCEPTION WHEN OTHERS THEN - log_operatie('ERROR în separa_nume_prenume: ' || SQLERRM, 'ERROR'); + log_operatie('ERROR in separa_nume_prenume: ' || SQLERRM, 'ERROR'); p_nume := SUBSTR(p_denumire_completa, 1, 50); -- fallback p_prenume := NULL; END separa_nume_prenume; @@ -387,23 +386,23 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS v_count NUMBER; v_temp_judet VARCHAR2(100); BEGIN - -- Inițializare cu valori default + -- Initializare cu valori default p_judet := C_JUD_DEFAULT; p_localitate := C_LOCALITATE_DEFAULT; p_strada := NULL; p_sector := C_SECTOR_DEFAULT; -- Validare input - IF p_adresa_text IS NULL OR TRIM(p_adresa_text) = '' THEN - log_operatie('Adresă goală, se folosesc valorile default', 'WARN'); + IF p_adresa_text IS NULL THEN + log_operatie('Adresa goala, se folosesc valorile default', 'WARN'); RETURN; END IF; v_adresa_curata := TRIM(p_adresa_text); - log_operatie('Parsare adresă: ' || v_adresa_curata); + log_operatie('Parsare adresa: ' || v_adresa_curata); - -- Split după semicolon + -- Split dupa semicolon SELECT TRIM(REGEXP_SUBSTR(v_adresa_curata, '[^;]+', 1, LEVEL)) BULK COLLECT INTO v_componente FROM DUAL @@ -412,11 +411,11 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS v_count := v_componente.COUNT; IF v_count = 0 THEN - log_operatie('Nu s-au găsit componente în adresă', 'WARN'); + log_operatie('Nu s-au gasit componente in adresa', 'WARN'); RETURN; END IF; - -- Parsare în funcție de numărul de componente + -- Parsare in functie de numarul de componente IF v_count = 1 THEN -- Doar strada p_strada := SUBSTR(v_componente(1), 1, 100); @@ -427,20 +426,20 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS p_strada := SUBSTR(v_componente(2), 1, 100); ELSIF v_count = 3 THEN - -- Localitate;Strada;Număr (combinate în strada) + -- Localitate;Strada;Numar (combinate in strada) p_localitate := SUBSTR(v_componente(1), 1, 50); p_strada := SUBSTR(v_componente(2) || ' ' || v_componente(3), 1, 100); ELSIF v_count >= 4 THEN - -- Verifică dacă prima componentă conține "JUD:" + -- Verifica daca prima componenta contine "JUD:" v_temp_judet := v_componente(1); IF UPPER(v_temp_judet) LIKE 'JUD:%' THEN - -- Format: JUD:București;BUCURESTI;Strada;Număr + -- Format: JUD:Bucuresti;BUCURESTI;Strada;Numar p_judet := SUBSTR(REPLACE(v_temp_judet, 'JUD:', ''), 1, 50); p_localitate := SUBSTR(v_componente(2), 1, 50); - -- Combină strada și numărul + -- Combina strada si numarul IF v_count >= 4 THEN p_strada := SUBSTR(v_componente(3) || CASE WHEN v_count >= 4 THEN ' ' || v_componente(4) END, 1, 100); ELSE @@ -448,38 +447,38 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS END IF; ELSE - -- Format: Localitate;Strada;Număr;AlteCeva + -- Format: Localitate;Strada;Numar;AlteCeva p_localitate := SUBSTR(v_componente(1), 1, 50); p_strada := SUBSTR(v_componente(2) || ' ' || v_componente(3), 1, 100); END IF; END IF; - -- Curățare finală + -- Curatare finala p_judet := TRIM(p_judet); p_localitate := TRIM(p_localitate); p_strada := TRIM(p_strada); p_sector := TRIM(p_sector); - -- Fallback pentru câmpuri goale - IF p_judet IS NULL OR p_judet = '' THEN + -- Fallback pentru campuri goale + IF p_judet IS NULL THEN p_judet := C_JUD_DEFAULT; END IF; - IF p_localitate IS NULL OR p_localitate = '' THEN + IF p_localitate IS NULL THEN p_localitate := C_LOCALITATE_DEFAULT; END IF; - IF p_sector IS NULL OR p_sector = '' THEN + IF p_sector IS NULL THEN p_sector := C_SECTOR_DEFAULT; END IF; - log_operatie('Adresă parsată: JUD=' || p_judet || ', LOC=' || p_localitate || + log_operatie('Adresa parsata: JUD=' || p_judet || ', LOC=' || p_localitate || ', STRADA=' || NVL(p_strada, 'NULL') || ', SECTOR=' || p_sector); EXCEPTION WHEN OTHERS THEN - log_operatie('ERROR în parseaza_adresa_semicolon: ' || SQLERRM, 'ERROR'); - -- Păstrăm valorile default în caz de eroare + log_operatie('ERROR in parseaza_adresa_semicolon: ' || SQLERRM, 'ERROR'); + -- Pastram valorile default in caz de eroare p_judet := C_JUD_DEFAULT; p_localitate := C_LOCALITATE_DEFAULT; p_sector := C_SECTOR_DEFAULT; @@ -499,7 +498,7 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS v_nume VARCHAR2(50); v_prenume VARCHAR2(50); - -- Componente adresă + -- Componente adresa v_judet VARCHAR2(50); v_localitate VARCHAR2(50); v_strada VARCHAR2(100); @@ -523,34 +522,34 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS v_cod_fiscal_curat := TRIM(p_cod_fiscal); v_denumire_curata := TRIM(p_denumire); - -- STEP 1: Căutare după cod fiscal (prioritate 1) + -- STEP 1: Cautare dupa cod fiscal (prioritate 1) IF v_cod_fiscal_curat IS NOT NULL AND LENGTH(v_cod_fiscal_curat) >= C_MIN_COD_FISCAL THEN v_id_part := cauta_partener_dupa_cod_fiscal(v_cod_fiscal_curat); IF v_id_part IS NOT NULL THEN - log_operatie('Partener găsit după cod_fiscal. ID_PART=' || v_id_part); + log_operatie('Partener gasit dupa cod_fiscal. ID_PART=' || v_id_part); log_operatie('=== SFÂRȘIT cauta_sau_creeaza_partener ==='); RETURN v_id_part; END IF; END IF; - -- STEP 2: Căutare după denumire exactă (prioritate 2) + -- STEP 2: Cautare dupa denumire exacta (prioritate 2) v_id_part := cauta_partener_dupa_denumire(v_denumire_curata); IF v_id_part IS NOT NULL THEN - log_operatie('Partener găsit după denumire. ID_PART=' || v_id_part); + log_operatie('Partener gasit dupa denumire. ID_PART=' || v_id_part); log_operatie('=== SFÂRȘIT cauta_sau_creeaza_partener ==='); RETURN v_id_part; END IF; -- STEP 3: Creare partener nou - log_operatie('Nu s-a găsit partener existent. Se creează unul nou...'); + log_operatie('Nu s-a gasit partener existent. Se creeaza unul nou...'); - -- Verifică tipul partenerului + -- Verifica tipul partenerului v_este_persoana_fizica := este_persoana_fizica(v_cod_fiscal_curat); IF v_este_persoana_fizica = 1 THEN - log_operatie('Detectată persoană fizică (CUI 13 cifre)'); + log_operatie('Detectata persoana fizica (CUI 13 cifre)'); separa_nume_prenume(v_denumire_curata, v_nume, v_prenume); log_operatie('Nume separat: NUME=' || NVL(v_nume, 'NULL') || ', PRENUME=' || NVL(v_prenume, 'NULL')); END IF; @@ -559,22 +558,47 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS BEGIN IF v_este_persoana_fizica = 1 THEN -- Pentru persoane fizice - v_id_part := pack_def.adauga_partener( - p_denumire => v_nume, -- nume de familie - p_prenume => v_prenume, - p_cod_fiscal => v_cod_fiscal_curat, - p_telefon => p_telefon, - p_email => p_email, - p_id_util => C_ID_UTIL_SISTEM + pack_def.adauga_partener( + tcDenumire => v_nume, -- nume de familie pentru persoane fizice + tcNume => v_nume, + tcPrenume => v_prenume, + tcCod_fiscal => v_cod_fiscal_curat, + tcReg_comert => '', + tnId_loc => NULL, + tnId_categorie_entitate => NULL, + tcPrefix => '', + tcSufix => '', + tnTip_persoana => 2, -- persoana fizica + tcBanca => '', -- nu avem info bancara + tcCont_banca => '', -- nu avem info bancara + tnInactiv => 0, + tcMotiv_inactiv => '', + tnId_util => C_ID_UTIL_SISTEM, + tcSir_id_tipPart => '16;17', + tcSir_id_part_del => '', + tnId_Part => v_id_part ); ELSE -- Pentru companii - v_id_part := pack_def.adauga_partener( - p_denumire => v_denumire_curata, - p_cod_fiscal => v_cod_fiscal_curat, - p_telefon => p_telefon, - p_email => p_email, - p_id_util => C_ID_UTIL_SISTEM + pack_def.adauga_partener( + tcDenumire => v_denumire_curata, + tcNume => v_denumire_curata, + tcPrenume => '', + tcCod_fiscal => v_cod_fiscal_curat, + tcReg_comert => '', + tnId_loc => NULL, + tnId_categorie_entitate => NULL, + tcPrefix => '', + tcSufix => '', + tnTip_persoana => 1, -- persoana juridica + tcBanca => '', -- nu avem info bancara + tcCont_banca => '', -- nu avem info bancara + tnInactiv => 0, + tcMotiv_inactiv => '', + tnId_util => C_ID_UTIL_SISTEM, + tcSir_id_tipPart => '16;17', + tcSir_id_part_del => '', + tnId_Part => v_id_part ); END IF; @@ -590,38 +614,55 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS RAISE integrare_pack_def_exception; END; - -- STEP 4: Adăugare adresă (dacă există) - IF p_adresa IS NOT NULL AND TRIM(p_adresa) != '' THEN - log_operatie('Se adaugă adresa pentru partenerul nou creat...'); + -- STEP 4: Adaugare adresa (daca exista) + IF p_adresa IS NOT NULL THEN + log_operatie('Se adauga adresa pentru partenerul nou creat...'); - -- Parsează adresa + -- Parseaza adresa parseaza_adresa_semicolon(p_adresa, v_judet, v_localitate, v_strada, v_sector); - -- Adaugă adresa prin pack_def + -- Adauga adresa prin pack_def BEGIN - v_id_adresa := pack_def.adauga_adresa_partener2( - p_id_part => v_id_part, - p_judet => v_judet, - p_localitate => v_localitate, - p_strada => v_strada, - p_sector => v_sector, - p_id_util => C_ID_UTIL_SISTEM + pack_def.adauga_adresa_partener2( + tnId_part => v_id_part, + tcDenumire_adresa => '', + tnDA_apare => 0, + tcStrada => NVL(v_strada, ''), + tcNumar => '', + tcBloc => '', + tcScara => '', + tcApart => '', + tnEtaj => '', + tnId_loc => 1759, -- ID default pentru Bucuresti Sectorul 1 + tcLocalitate => v_localitate, + tnId_judet => 10, -- ID default pentru Bucuresti + tnCodpostal => NULL, + tnId_tara => 1, -- Romania + tcTelefon1 => NVL(p_telefon, ''), + tcTelefon2 => '', + tcFax => '', + tcEmail => NVL(p_email, ''), + tcWeb => '', + tnPrincipala => '1', -- adresa principala + tnInactiv => 0, + tnId_util => C_ID_UTIL_SISTEM, + tnIdAdresa => v_id_adresa ); IF v_id_adresa IS NOT NULL AND v_id_adresa > 0 THEN - log_operatie('Adresă adăugată cu succes. ID_ADRESA=' || v_id_adresa); + log_operatie('Adresa adaugata cu succes. ID_ADRESA=' || v_id_adresa); ELSE log_operatie('WARNING: pack_def.adauga_adresa_partener2 a returnat ID invalid: ' || NVL(TO_CHAR(v_id_adresa), 'NULL'), 'WARN'); END IF; EXCEPTION WHEN OTHERS THEN - log_operatie('ERROR la adăugarea adresei prin pack_def: ' || SQLERRM, 'ERROR'); - -- Nu raisăm excepția pentru adresă, partenerii pot exista fără adresă - log_operatie('Partenerul a fost creat, dar adresa nu a putut fi adăugată', 'WARN'); + log_operatie('ERROR la adaugarea adresei prin pack_def: ' || SQLERRM, 'ERROR'); + -- Nu raisam exceptia pentru adresa, partenerii pot exista fara adresa + log_operatie('Partenerul a fost creat, dar adresa nu a putut fi adaugata', 'WARN'); END; ELSE - log_operatie('Nu s-a furnizat adresă pentru partenerul nou'); + log_operatie('Nu s-a furnizat adresa pentru partenerul nou'); END IF; log_operatie('Partener creat complet. ID_PART=' || v_id_part); @@ -635,12 +676,12 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS RAISE_APPLICATION_ERROR(-20001, 'Date partener invalide: ' || SQLERRM); WHEN integrare_pack_def_exception THEN - log_operatie('ERROR: Problemă la integrarea cu pack_def', 'ERROR'); + log_operatie('ERROR: Problema la integrarea cu pack_def', 'ERROR'); RAISE_APPLICATION_ERROR(-20003, 'Eroare la integrarea cu pack_def: ' || SQLERRM); WHEN OTHERS THEN - log_operatie('ERROR NEAȘTEPTAT în cauta_sau_creeaza_partener: ' || SQLERRM, 'ERROR'); - RAISE_APPLICATION_ERROR(-20099, 'Eroare neașteptată la crearea partenerului: ' || SQLERRM); + log_operatie('ERROR NEAȘTEPTAT in cauta_sau_creeaza_partener: ' || SQLERRM, 'ERROR'); + RAISE_APPLICATION_ERROR(-20099, 'Eroare neasteptata la crearea partenerului: ' || SQLERRM); END cauta_sau_creeaza_partener; @@ -655,78 +696,26 @@ CREATE OR REPLACE PACKAGE BODY IMPORT_PARTENERI AS v_timestamp := TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'); v_mesaj_complet := v_timestamp || ' | ' || RPAD(p_nivel, 5) || ' | IMPORT_PARTENERI | ' || p_mesaj; - -- Output în server log (DBMS_OUTPUT pentru sesiuni interactive) + -- Output in server log (DBMS_OUTPUT pentru sesiuni interactive) DBMS_OUTPUT.PUT_LINE(v_mesaj_complet); - -- Încearcă să scrie în audit_trail sau altă tabelă de logging dacă există + -- Scrie in tabela INFO pentru logging BEGIN - -- Această instrucțiune va reuși doar dacă există o tabelă de logging - EXECUTE IMMEDIATE ' - INSERT INTO system_log (timestamp, nivel, modul, mesaj, id_util) - VALUES (:1, :2, :3, :4, :5)' - USING SYSDATE, p_nivel, 'IMPORT_PARTENERI', p_mesaj, C_ID_UTIL_SISTEM; + INSERT INTO INFO (info, locatia) + VALUES (v_mesaj_complet, 'IMPORT_PARTENERI'); COMMIT; EXCEPTION WHEN OTHERS THEN - -- Ignoră erorile de logging - nu vrem să întrerupă procesul principal + -- Ignora erorile de logging - nu vrem sa intrerupa procesul principal NULL; END; EXCEPTION WHEN OTHERS THEN - -- Nu lăsăm logging-ul să întrerupă procesul principal + -- Nu lasam logging-ul sa intrerupa procesul principal NULL; END log_operatie; -END IMPORT_PARTENERI; +END PACK_IMPORT_PARTENERI; / - --- ==================================================================== --- VALIDARE COMPILARE --- ==================================================================== - --- Verifică dacă package-ul s-a compilat corect -SELECT object_name, object_type, status -FROM user_objects -WHERE object_name = 'IMPORT_PARTENERI' - AND object_type IN ('PACKAGE', 'PACKAGE BODY'); - --- ==================================================================== --- TESTE RAPIDE (opțional) --- ==================================================================== - --- Exemplu de utilizare: --- SELECT IMPORT_PARTENERI.cauta_sau_creeaza_partener('1234567890123', 'Ion Popescu', 'BUCURESTI;Calea Victoriei;10') FROM dual; - --- Exemplu de parsare adresă: --- DECLARE --- v_jud VARCHAR2(50); --- v_loc VARCHAR2(50); --- v_str VARCHAR2(100); --- v_sec VARCHAR2(50); --- BEGIN --- IMPORT_PARTENERI.parseaza_adresa_semicolon('JUD:București;BUCURESTI;Str.Victoriei;10', v_jud, v_loc, v_str, v_sec); --- DBMS_OUTPUT.PUT_LINE('JUD: ' || v_jud || ', LOC: ' || v_loc || ', STR: ' || v_str || ', SEC: ' || v_sec); --- END; --- / - --- ==================================================================== --- SFÂRȘIT FIȘIER --- ==================================================================== - --- Package implementat complet cu: --- ✓ Căutare parteneri după cod_fiscal (prioritate 1) --- ✓ Căutare parteneri după denumire exactă (prioritate 2) --- ✓ Creare partener nou cu pack_def.adauga_partener() --- ✓ Adăugare adresă cu pack_def.adauga_adresa_partener2() --- ✓ Separare nume/prenume pentru persoane fizice (CUI 13 cifre) --- ✓ Default București Sectorul 1 pentru adrese incomplete --- ✓ Error handling complet cu custom exceptions --- ✓ Logging comprehensive cu AUTONOMOUS_TRANSACTION --- ✓ Toate partenerele create cu ID_UTIL = -3 (sistem) --- ✓ Parsare adresă format semicolon flexibilă --- ✓ Validări complete pentru toate inputurile --- ✓ Integrare cu pack_def existent --- --- Implementare production-ready cu documentație completă. \ No newline at end of file