sync SVN r18218
This commit is contained in:
365
utile/Teste/test_ramburs_grup_nume.prg
Normal file
365
utile/Teste/test_ramburs_grup_nume.prg
Normal file
@@ -0,0 +1,365 @@
|
||||
* 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
|
||||
Reference in New Issue
Block a user