* test_ramburs_grup_nume.prg * Test headless pentru alocarea rambursurilor de curier pe grupul de nume (oproceduri_import.prg). * Construieste manual cursoarele pe care le citeste AlocaFacturiRand si o apeleaza direct, fara UI; * A-D fara Oracle, E (AdaugaGrupNume) pe MARIUSM_AUTO doar SELECT. Primeste optional calea fisierului * de testat (pentru baseline vs editat). * * Rulare: * vfp9.exe -A -T "COMUN\utile\Teste\test_ramburs_grup_nume.prg" * vfp9.exe -A -T "COMUN\utile\Teste\test_ramburs_grup_nume.prg" "" LPARAMETERS tcFisierImport LOCAL lcFisierImport SET SAFETY OFF SET TALK OFF SET DELETED ON SET EXACT ON SET CENTURY ON SET DATE DMY SET NULLDISPLAY TO '' * parametrul nu poate fi pasat prin watchdog -> il citesc dintr-un fisier de config opt-in * (_ramburs_fisier.txt), ca sa pot rula acelasi test pe baseline si pe fisierul editat PUBLIC gcLogRamburs, gnPass, gnFail, gcFisierImport, gnAn, gnLuna gcLogRamburs = "D:\ROA\ROACONT\COMUN\utile\Teste\_test_ramburs_out.txt" IF !EMPTY(tcFisierImport) gcFisierImport = ALLTRIM(tcFisierImport) ELSE IF FILE("D:\ROA\ROACONT\COMUN\utile\Teste\_ramburs_fisier.txt") gcFisierImport = ALLTRIM(FILETOSTR("D:\ROA\ROACONT\COMUN\utile\Teste\_ramburs_fisier.txt")) ELSE gcFisierImport = "D:\ROA\ROACONT\Programe\oproceduri_import.prg" ENDIF ENDIF gnAn = YEAR(DATE()) gnLuna = MONTH(DATE()) gnPass = 0 gnFail = 0 * versiunea fisierului testat: daca are parametrul nou tlCurier, apelez cu 5 parametri * (baseline-ul are 4 - apelul cu 5 da eroarea 94 si ascunde comportamentul real) PUBLIC glCuCurier glCuCurier = (ATC("tlCurier", FILETOSTR(gcFisierImport)) > 0) STRTOFILE("RUN " + TTOC(DATETIME()) + " fisier=" + gcFisierImport + CHR(13)+CHR(10), gcLogRamburs) ON ERROR DO log_eroare_ramburs WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() * fara Oracle: functiile de alocare nu ating baza; goExecutor exista doar ca sa nu lipseasca simbolul IF TYPE('goExecutor') = 'U' PUBLIC goExecutor goExecutor = CREATEOBJECT('dummy_executor_ramburs') ENDIF * regula. ExtractieNumereFacturi foloseste strtranx/GetRegExpAll din regex.prg SET PROCEDURE TO (ADDBS("D:\ROA\ROACONT\COMUN\programe") + "regex.prg") ADDITIVE * incarc fisierul testat ca PROCEDURE (functiile AlocaFacturiRand etc. devin apelabile) SET PROCEDURE TO (gcFisierImport) ADDITIVE DO log_txt WITH "SET PROCEDURE OK: " + gcFisierImport DO caz_A DO caz_B DO caz_C DO caz_D DO caz_E DO log_txt WITH "=== SUMAR: PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail) + " ===" QUIT * apeleaza AlocaFacturiRand cu 4 sau 5 parametri, dupa versiunea fisierului testat FUNCTION apeleaza_aloca LPARAMETERS tlCurier IF glCuCurier RETURN AlocaFacturiRand("C", "4111", 16117, "TOMONESCU GEORGE", m.tlCurier) ELSE RETURN AlocaFacturiRand("C", "4111", 16117, "TOMONESCU GEORGE") ENDIF ENDFUNC * ============================================================ * CAZ A: Tomescu, curier, ales 16117, grup {2156,16117,22423} * factura 15634 (22423) = 710,08; rand 710,08 -> o singura alocare S, partener mutat pe 22423 PROCEDURE caz_A DO pregateste_act WITH 710.08, "C" DO pregateste_solduri INSERT INTO cSolduriFact (id_part, Cont, acont, id_fact, nract, dataact, id_valuta, ramas) ; VALUES (16117, "4111", "", 5428, 5428, DATE(2026,4,1), 0, 32.42) INSERT INTO cSolduriFact (id_part, Cont, acont, id_fact, nract, dataact, id_valuta, ramas) ; VALUES (22423, "4111", "", 15634, 15634, DATE(2026,9,21), 0, 710.08) DO pregateste_grup WITH "2156,16117,22423" DO pregateste_avans LOCAL llAlocat llAlocat = apeleaza_aloca(.T.) LOCAL lnNpoz, lcSursa, lnIdFact, lnIdPartRand, lnSumaAloc lcSursa = "" lnIdFact = 0 lnSumaAloc = 0 lnNpoz = 0 SELECT cAlocTemp COUNT TO lnNpoz IF lnNpoz > 0 SELECT cAlocTemp GO TOP lcSursa = ALLTRIM(csursa) lnIdFact = id_fact lnSumaAloc = suma ENDIF SELECT cActTemp lnIdPartRand = NVL(id_partc, 0) DO verifica WITH "A_curier_o_alocare_S", ; (m.llAlocat AND m.lnNpoz = 1 AND m.lcSursa = "S" AND m.lnIdFact = 15634 AND m.lnIdPartRand = 22423 AND ABS(m.lnSumaAloc - 710.08) < 0.01), ; "alocat=" + TRANSFORM(m.llAlocat) + " nrpoz=" + TRANSFORM(m.lnNpoz) + " sursa=" + m.lcSursa + " idfact=" + TRANSFORM(m.lnIdFact) + " idpartrand=" + TRANSFORM(m.lnIdPartRand) + " suma=" + TRANSFORM(m.lnSumaAloc) ENDPROC * ============================================================ * CAZ B: curier, nicio factura cu suma exacta in grup (doar 32,42 vechi) -> nimic alocat, rand intreg PROCEDURE caz_B DO pregateste_act WITH 710.08, "C" DO pregateste_solduri INSERT INTO cSolduriFact (id_part, Cont, acont, id_fact, nract, dataact, id_valuta, ramas) ; VALUES (16117, "4111", "", 5428, 5428, DATE(2026,4,1), 0, 32.42) DO pregateste_grup WITH "2156,16117,22423" DO pregateste_avans LOCAL llAlocat, lnNpoz llAlocat = apeleaza_aloca(.T.) SELECT cAlocTemp COUNT TO lnNpoz DO verifica WITH "B_curier_fara_suma_exacta", (NOT m.llAlocat AND m.lnNpoz = 0), ; "alocat=" + TRANSFORM(m.llAlocat) + " nrpoz=" + TRANSFORM(m.lnNpoz) ENDPROC * ============================================================ * CAZ C: curier, doua facturi 150,00 in grup pe parteneri diferiti -> nimic alocat PROCEDURE caz_C DO pregateste_act WITH 150.00, "C" DO pregateste_solduri INSERT INTO cSolduriFact (id_part, Cont, acont, id_fact, nract, dataact, id_valuta, ramas) ; VALUES (16117, "4111", "", 7001, 7001, DATE(2026,8,1), 0, 150.00) INSERT INTO cSolduriFact (id_part, Cont, acont, id_fact, nract, dataact, id_valuta, ramas) ; VALUES (22423, "4111", "", 7002, 7002, DATE(2026,8,2), 0, 150.00) DO pregateste_grup WITH "2156,16117,22423" DO pregateste_avans LOCAL llAlocat, lnNpoz llAlocat = apeleaza_aloca(.T.) SELECT cAlocTemp COUNT TO lnNpoz DO verifica WITH "C_curier_doua_facturi_egale", (NOT m.llAlocat AND m.lnNpoz = 0), ; "alocat=" + TRANSFORM(m.llAlocat) + " nrpoz=" + TRANSFORM(m.lnNpoz) ENDPROC * ============================================================ * CAZ D: acelasi ca A, dar import BANCAR (tlFaraFifoAvans = .F.) -> comportamentul vechi F + A PROCEDURE caz_D DO pregateste_act WITH 710.08, "C" DO pregateste_solduri INSERT INTO cSolduriFact (id_part, Cont, acont, id_fact, nract, dataact, id_valuta, ramas) ; VALUES (16117, "4111", "", 5428, 5428, DATE(2026,4,1), 0, 32.42) INSERT INTO cSolduriFact (id_part, Cont, acont, id_fact, nract, dataact, id_valuta, ramas) ; VALUES (22423, "4111", "", 15634, 15634, DATE(2026,9,21), 0, 710.08) DO pregateste_grup WITH "2156,16117,22423" DO pregateste_avans LOCAL llAlocat, lnNpoz, lcSursa1, lcSursa2, lnSumaTotala llAlocat = apeleaza_aloca(.F.) lcSursa1 = "" lcSursa2 = "" lnNpoz = 0 lnSumaTotala = 0 SELECT cAlocTemp COUNT TO lnNpoz IF lnNpoz >= 1 GO TOP lcSursa1 = ALLTRIM(csursa) lnSumaTotala = suma ENDIF IF lnNpoz >= 2 SKIP lcSursa2 = ALLTRIM(csursa) lnSumaTotala = m.lnSumaTotala + suma ENDIF * bancar (ales 16117): F pe 32,42 (5428), apoi avans A pe 419 cu 677,66 DO verifica WITH "D_bancar_F_plus_A", ; (m.llAlocat AND m.lnNpoz = 2 AND m.lcSursa1 = "F" AND m.lcSursa2 = "A" AND ABS(m.lnSumaTotala - 710.08) < 0.01), ; "alocat=" + TRANSFORM(m.llAlocat) + " nrpoz=" + TRANSFORM(m.lnNpoz) + " sursa1=" + m.lcSursa1 + " sursa2=" + m.lcSursa2 + " suma=" + TRANSFORM(m.lnSumaTotala) ENDPROC * ============================================================ * CAZ E: AdaugaGrupNume pe MARIUSM_AUTO, doar SELECT: un nume din 2 cuvinte si unul dintr-un cuvant * -> interogarea nu da eroare SQL, cGrupParteneriCui fara dubluri si fara partenerul ales PROCEDURE caz_E LOCAL lnIdAles, lcDenAles, llSqlOk, lnNume, lnDistinct, lnAles, lnDup IF NOT glCuCurier RETURN ENDIF DO (ADDBS("D:\ROA\ROACONT\COMUN\utile\Teste") + "test_init_env_auto.prg") WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' IF gnHandle <= 0 DO verifica WITH "E_adauga_grup_nume_2cuv", .F., "nu m-am conectat la MARIUSM_AUTO" RETURN ENDIF IF USED('cGrupParteneriCui') USE IN cGrupParteneriCui ENDIF CREATE CURSOR cGrupParteneriCui (id_part_ales N(10), id_part N(10), denumire C(100)) INDEX ON id_part TAG id_part * nume din 2 cuvinte lnIdAles = 0 lcDenAles = "" IF goExecutor.oExecuta([select id_part, denumire from nom_parteneri where sters = 0 and inactiv = 0 and (length(trim(denumire)) - length(replace(trim(denumire), ' ', ''))) = 1 and rownum = 1], "cNumeGrupTest") SELECT cNumeGrupTest lnIdAles = id_part lcDenAles = ALLTRIM(denumire) USE IN cNumeGrupTest ENDIF AdaugaGrupNume(m.lnIdAles, m.lcDenAles) llSqlOk = sql_verif_grup(m.lcDenAles) SELECT cGrupParteneriCui COUNT TO lnNume FOR id_part_ales = m.lnIdAles COUNT TO lnAles FOR id_part = m.lnIdAles SELECT DISTINCT id_part FROM cGrupParteneriCui WHERE id_part_ales = m.lnIdAles INTO CURSOR cDistinctGrupa lnDistinct = RECCOUNT('cDistinctGrupa') USE IN cDistinctGrupa lnDup = m.lnNume - m.lnDistinct DO verifica WITH "E_adauga_grup_nume_2cuv", (m.llSqlOk AND m.lnDup = 0 AND m.lnAles = 0), ; "sqlOk=" + TRANSFORM(m.llSqlOk) + " randuri=" + TRANSFORM(m.lnNume) + " dubluri=" + TRANSFORM(m.lnDup) + " ales=" + TRANSFORM(m.lnAles) + " den=" + m.lcDenAles * nume dintr-un singur cuvant (fara permutari) IF USED('cGrupParteneriCui') USE IN cGrupParteneriCui ENDIF CREATE CURSOR cGrupParteneriCui (id_part_ales N(10), id_part N(10), denumire C(100)) INDEX ON id_part TAG id_part lnIdAles = 0 lcDenAles = "" IF goExecutor.oExecuta([select id_part, denumire from nom_parteneri where sters = 0 and inactiv = 0 and (length(trim(denumire)) - length(replace(trim(denumire), ' ', ''))) = 0 and rownum = 1], "cNumeGrupTest") SELECT cNumeGrupTest lnIdAles = id_part lcDenAles = ALLTRIM(denumire) USE IN cNumeGrupTest ENDIF AdaugaGrupNume(m.lnIdAles, m.lcDenAles) llSqlOk = sql_verif_grup(m.lcDenAles) SELECT cGrupParteneriCui COUNT TO lnNume FOR id_part_ales = m.lnIdAles COUNT TO lnAles FOR id_part = m.lnIdAles DO verifica WITH "E_adauga_grup_nume_1cuv", (m.llSqlOk AND m.lnAles = 0), ; "sqlOk=" + TRANSFORM(m.llSqlOk) + " randuri=" + TRANSFORM(m.lnNume) + " ales=" + TRANSFORM(m.lnAles) + " den=" + m.lcDenAles IF USED('cGrupParteneriCui') USE IN cGrupParteneriCui ENDIF ENDPROC * Reface SQL-ul construit de AdaugaGrupNume, ca sa dovedeasca faptul ca nu da eroare FUNCTION sql_verif_grup LPARAMETERS tcDenumire LOCAL lcVariante, lcLista, lnI, lcSql, llOk lcVariante = m.tcDenumire + ';' + GetNamePermutations(m.tcDenumire, .T.) lcLista = '' FOR lnI = 1 TO GETWORDCOUNT(m.lcVariante, ';') lcLista = m.lcLista + IIF(EMPTY(m.lcLista), '', ',') + "'" + STRTRAN(ALLTRIM(GETWORDNUM(m.lcVariante, m.lnI, ';')), "'", "''") + "'" ENDFOR lcSql = [select id_part, denumire from nom_parteneri where sters = 0 and inactiv = 0 and trim(upper(denumire)) in (] + m.lcLista + [)] llOk = goExecutor.oExecuta(m.lcSql, 'cVerifGrup') IF USED('cVerifGrup') USE IN cVerifGrup ENDIF RETURN m.llOk ENDFUNC * ============================================================ * Constructor de cursoare cu structura reala PROCEDURE pregateste_act LPARAMETERS tnSuma, tcTip IF USED('cActTemp') USE IN cActTemp ENDIF CREATE CURSOR cActTemp (nr N(14), Data D, suma N(15,2), suma_val N(15,2), Curs N(15,4), nume_val C(20), id_valuta I, ; explicatie C(100), iban C(24), denumire C(60), cod_fiscal C(13), tip C(2), tip_2 C(3), documente C(250), comenzi C(250), ; scd C(4), scc C(4), ascd C(4), ascc C(4), id_partd N(10), id_partc N(10), partd C(100), partc C(100), ; id_part N(10), partener C(100), id_factd I, id_factc I, pereched N(20), perechec N(20), ; id_fdoc I, fdoc C(50), listoric L, ngrupa I, npoz I, csursa_f C(1), nordine I) INSERT INTO cActTemp (suma, tip, scc, id_partc, partc, csursa_f, nordine) ; VALUES (m.tnSuma, m.tcTip, "4111", 16117, "TOMONESCU GEORGE", "", 100) GO TOP ENDPROC PROCEDURE pregateste_solduri IF USED('cSolduriFact') USE IN cSolduriFact ENDIF CREATE CURSOR cSolduriFact (id_part N(10), Cont C(4), acont C(20), id_fact I, nract N(20), dataact D, id_valuta I, ramas N(15,2)) INDEX ON id_part TAG id_part * cAlocTemp se creeaza in CreeazaNote, inainte de apelul alocarii (structura reala) IF USED('cAlocTemp') USE IN cAlocTemp ENDIF CREATE CURSOR cAlocTemp (nrec I, npoz I, id_fact I, nract N(20), cont C(4) Null, acont C(20) Null, suma N(15,2), csursa C(1)) ENDPROC PROCEDURE pregateste_grup LPARAMETERS tcLista IF USED('cGrupParteneriCui') USE IN cGrupParteneriCui ENDIF CREATE CURSOR cGrupParteneriCui (id_part_ales N(10), id_part N(10), denumire C(100)) INDEX ON id_part TAG id_part LOCAL lnI, lnId FOR lnI = 1 TO GETWORDCOUNT(m.tcLista, ",") lnId = VAL(GETWORDNUM(m.tcLista, m.lnI, ",")) INSERT INTO cGrupParteneriCui (id_part_ales, id_part, denumire) VALUES (16117, m.lnId, "P" + TRANSFORM(m.lnId)) ENDFOR ENDPROC PROCEDURE pregateste_avans IF USED('cAvansExistent') USE IN cAvansExistent ENDIF CREATE CURSOR cAvansExistent (id_part N(10)) INDEX ON id_part TAG id_part ENDPROC * ============================================================ PROCEDURE verifica LPARAMETERS tcLabel, tlOk, tcDetaliu IF m.tlOk gnPass = gnPass + 1 DO log_txt WITH "PASS " + m.tcLabel + " :: " + m.tcDetaliu ELSE gnFail = gnFail + 1 DO log_txt WITH "FAIL " + m.tcLabel + " :: " + m.tcDetaliu ENDIF ENDPROC PROCEDURE log_txt LPARAMETERS tcTxt STRTOFILE(TRANSFORM(m.tcTxt) + CHR(13) + CHR(10), gcLogRamburs, 1) ENDPROC PROCEDURE log_eroare_ramburs LPARAMETERS tnErr, tcMsg, tcProg, tnLine DO log_txt WITH " [ON ERROR] " + TRANSFORM(m.tnErr) + " " + TRANSFORM(m.tcMsg) + " in " + TRANSFORM(m.tcProg) + " linia " + TRANSFORM(m.tnLine) ENDPROC DEFINE CLASS dummy_executor_ramburs AS Custom PROCEDURE oExecuta LPARAMETERS tcSql, tcCursor RETURN .T. ENDPROC PROCEDURE oExecute LPARAMETERS tcSql, tcCursor RETURN 1 ENDPROC ENDDEFINE