Files
comun/utile/Teste/test_ramburs_grup_nume.prg
2026-09-28 16:01:35 +03:00

366 lines
14 KiB
Plaintext

* 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" "<cale\oproceduri_import.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