Phase 2 implementation: VFP Integration with Oracle synchronization

Major architectural changes:
- Convert Oracle IMPORT_PARTENERI.cauta_sau_creeaza_partener from FUNCTION to PROCEDURE with OUT parameter for VFP compatibility
- Add IS_PERSOANA_JURIDICA parameter to support individual vs company detection
- Implement sync-comenzi-web.prg orchestrator for generic web order processing with 5-minute timer automation
- Create ApplicationSetup class for proper object-oriented configuration management
- Add comprehensive Oracle connection and sync settings via settings.ini configuration system
- Implement generic web order processing functions (ProcessWebOrder, ValidateWebOrder, CleanWebText, ConvertWebDate)
- Add proper VFP-Oracle integration with correct procedure call syntax using OUT parameters
- Rename gomag-vending.prg to gomag-adapter.prg for clarity and platform-specific functionality
- Move CheckIniFile function to utils.prg for better code organization
- Add settings.ini.example template and update .gitignore to exclude actual settings files
- Implement comprehensive logging system with rotation and error handling
- Add connection validation and retry logic for robust Oracle integration

Technical improvements:
- Proper JSON processing integration with existing nfjson library
- Comprehensive error handling with categorized logging (INFO, ERROR, WARN)
- Timer-based automation with configurable intervals
- Settings validation and default value creation
- Generic function naming for multi-platform support
- Class-based setup system replacing procedural approach

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-09-10 16:01:42 +03:00
parent 86e9d32b76
commit d1858f86b6
10 changed files with 962 additions and 125 deletions

View File

@@ -56,7 +56,8 @@ CREATE OR REPLACE PACKAGE PACK_IMPORT_PARTENERI AS
-- ====================================================================
/**
* Functia principala pentru cautarea sau crearea unui partener
* Procedura principala pentru cautarea sau crearea unui partener
* SCHIMBAT din FUNCTION in PROCEDURE pentru compatibilitate cu DML operations
*
* Algoritm:
* 1. Cauta dupa cod_fiscal (daca > 3 caractere)
@@ -70,16 +71,17 @@ CREATE OR REPLACE PACKAGE PACK_IMPORT_PARTENERI AS
* @param p_telefon Numar de telefon
* @param p_email Adresa de email
* @param p_is_persoana_juridica 1=persoana juridica, 0=persoana fizica, NULL=auto-detect prin CNP
* @return ID_PART al partenerului gasit sau creat
* @param p_id_partener OUT ID_PART al partenerului gasit sau creat
*/
FUNCTION cauta_sau_creeaza_partener(
PROCEDURE cauta_sau_creeaza_partener(
p_cod_fiscal IN VARCHAR2,
p_denumire IN VARCHAR2,
p_adresa IN VARCHAR2 DEFAULT NULL,
p_telefon IN VARCHAR2 DEFAULT NULL,
p_email IN VARCHAR2 DEFAULT NULL,
p_is_persoana_juridica IN NUMBER DEFAULT NULL
) RETURN NUMBER;
p_is_persoana_juridica IN NUMBER DEFAULT NULL,
p_id_partener OUT NUMBER
);
/**
* Parseaza o adresa din format semicolon in componentele individuale
@@ -509,14 +511,15 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
p_sector := C_SECTOR_DEFAULT;
END parseaza_adresa_semicolon;
FUNCTION cauta_sau_creeaza_partener(
PROCEDURE cauta_sau_creeaza_partener(
p_cod_fiscal IN VARCHAR2,
p_denumire IN VARCHAR2,
p_adresa IN VARCHAR2 DEFAULT NULL,
p_telefon IN VARCHAR2 DEFAULT NULL,
p_email IN VARCHAR2 DEFAULT NULL,
p_is_persoana_juridica IN NUMBER DEFAULT NULL
) RETURN NUMBER IS
p_is_persoana_juridica IN NUMBER DEFAULT NULL,
p_id_partener OUT NUMBER
) IS
v_id_part NUMBER;
v_id_adresa NUMBER;
@@ -546,7 +549,8 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
-- Validare date input
IF NOT valideaza_date_partener(p_cod_fiscal, p_denumire) THEN
g_last_error := 'Date partener invalide - validare esuata';
RETURN -1;
p_id_partener := -1;
RETURN;
END IF;
v_cod_fiscal_curat := TRIM(p_cod_fiscal);
@@ -559,7 +563,8 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
IF v_id_part IS NOT NULL THEN
-- pINFO('Partener gasit dupa cod_fiscal. ID_PART=' || v_id_part, 'IMPORT_PARTENERI');
-- pINFO('=== SFARSIT cauta_sau_creeaza_partener ===', 'IMPORT_PARTENERI');
RETURN v_id_part;
p_id_partener := v_id_part;
RETURN;
END IF;
END IF;
@@ -569,7 +574,8 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
IF v_id_part IS NOT NULL THEN
-- pINFO('Partener gasit dupa denumire. ID_PART=' || v_id_part, 'IMPORT_PARTENERI');
-- pINFO('=== SFARSIT cauta_sau_creeaza_partener ===', 'IMPORT_PARTENERI');
RETURN v_id_part;
p_id_partener := v_id_part;
RETURN;
END IF;
-- STEP 3: Creare partener nou
@@ -641,7 +647,8 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
IF v_id_part IS NULL OR v_id_part <= 0 THEN
g_last_error := 'pack_def.adauga_partener a returnat ID invalid';
RETURN -1;
p_id_partener := -1;
RETURN;
END IF;
-- pINFO('Partener creat cu succes. ID_PART=' || v_id_part, 'IMPORT_PARTENERI');
@@ -649,7 +656,8 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
EXCEPTION
WHEN OTHERS THEN
g_last_error := 'ERROR la crearea partenerului prin pack_def: ' || SQLERRM;
RETURN -1;
p_id_partener := -1;
RETURN;
END;
-- STEP 4: Adaugare adresa (daca exista)
@@ -708,12 +716,12 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
-- pINFO('Partener creat complet. ID_PART=' || v_id_part, 'IMPORT_PARTENERI');
-- pINFO('=== SFARSIT cauta_sau_creeaza_partener ===', 'IMPORT_PARTENERI');
RETURN v_id_part;
p_id_partener := v_id_part;
EXCEPTION
WHEN OTHERS THEN
g_last_error := 'ERROR NEASTEPTAT in cauta_sau_creeaza_partener: ' || SQLERRM;
RETURN -1;
p_id_partener := -1;
END cauta_sau_creeaza_partener;