366 lines
14 KiB
Plaintext
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
|