Files
comun/utile/Teste/facturare_unificat/test_s3_4b_incarca_articole.prg
Marius Mutu 8e022d332e #13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
2026-09-09 21:38:25 +03:00

504 lines
23 KiB
Plaintext

* test_s3_4b_incarca_articole.prg
* Headless: do_incarca_articole pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) - metoda
* noua, inerta pana la S3-4c, care valideaza antetul si apeleaza incarca_cursor_articole (S3-4a)
* direct din scope-ul formularului, unde poDate/poGeneratorNumere sunt Private-urile lui factureaza.
*
* Spre deosebire de testele S3-1..S3-3, crsfactura NU e populat dinainte - doar structura goala
* (creeaza_facturacrs), pentru ca grd_factura.Column1.ControlSource e calificat ("crsFactura.denumire"),
* legat la Createobject: fara alias-ul deschis (macar gol), Createobject arunca eroarea 13 "Alias
* 'CRSFACTURA' is not found" - constatare pe cod, nu presupunere. do_incarca_articole e cel care
* (re)populeaza cursorul.
*
* Cazuri:
* A. antet valid (tip 30, aviz din NIR - singura ramura in care incarca_cursor_articole populeaza
* crsfactura direct, nu doar structura goala) -> Return .T., Reccount('crsfactura')>0,
* o.lArticoleIncarcate=.T., but_incarca_articole.Visible=.F., grd_factura.RecordSource='crsfactura'.
* B. antet invalid (dataireg gol) -> Return .F., crsfactura ramane gol, lArticoleIncarcate=.F.
* C. incarca_cursor_articole esueaza (executor mock cu eroare) -> Return .F., crsfactura ramane gol,
* lArticoleIncarcate=.F., but_incarca_articole.Visible ramane .T.
* D. antet valid, document in valuta (tip 5 -> poDate.in_valuta=1 in Init) -> dupa succes, butonul
* but_cursuri (care a inlocuit gridul de cursuri, mutat in frm_cursuri_valutare) devine Enabled,
* pe crscursuri populat exclusiv din crsarticole mockuit (determinist).
* Pentru toate cazurile, but_cursuri exista dar porneste dezactivat la Createobject (Init,
* crscursuri inca inexistent). B/C se opresc devreme (Return .F. inaintea liniei care
* recalculeaza Enabled) -> ramane dezactivat determinist. A (tip 30, fara valuta) nu forteaza
* in_valuta, dar citeste_cursuri_zi merge pe Oracle real (necontrolabil in test) - se verifica
* invariantul Enabled==(Used si Reccount(crscursuri)>0), nu o valoare fixa.
*
* S3-4d (bug #16 pe calea plFacturareNoua, docs\nota_executie_s3_4.md:320-367) - PROCEDURE CazReincercare,
* pe ACEEASI instanta de formular, antet cu valori distincte (tip 30/AVIZ, ca la C):
* E. esecul executorului (ca la C) nu distruge antetul: dupa Return .F., aceeasi instanta (amprenta
* SYS(1272,loForm) neschimbata) si toate campurile de antet capturate inainte raman identice,
* lArticoleIncarcate=.F., but_incarca_articole.Visible=.T. (se poate reincerca).
* F. comutare mock pe succes si reincercare pe ACEEASI instanta -> Return .T., crsfactura populat,
* lArticoleIncarcate=.T., butonul ascuns, antetul tot neschimbat fata de valorile initiale.
* G. numarul nu se arde a doua oara: do_incarca_articole apeleaza necondiotionat poGeneratorNumere.verifica_numar
* inaintea lui incarca_cursor_articole (ofacturare.vc2:18058-18060) - pe cod, nici verifica_numar
* (oserii_numere.prg:227, doar dezaloca daca numarul nu se potriveste cu paPlaje) nici incarca_cursor_articole
* (ofacturare.prg:513-519, doar dezaloca pe eroare/cursor gol) nu apeleaza aloca_numar - pe tot
* traseul E+F se asearta 0 apeluri aloca_numar in gcMockApeluri (ContaLinii); dezaloca_numar se observa
* 1 data (din ramura de eroare a lui E, mostenita neschimbata din codul vechi) - fapt masurat, nu defect
* (niciun numar nou nu s-a alocat la reincercare).
*
* fix do_sterge (docs\verif_referinte_moarte_articole2.md, ofacturare.vc2:18894-18968) - PROCEDURE
* CazSterge, pe o instanta cu crsfactura populat (2 randuri, cazul A):
* H1. do_sterge() pe primul rand (raman randuri) -> fara ERROR, Reccount('crsfactura') scade cu 1.
* H2. do_sterge() pe ultimul rand ramas -> fara ERROR, Reccount('crsfactura') = 0. Inainte de fix,
* ambele ramuri de focus final loveau Thisform.txtArticoleLista/txtArticole/grd_contracte -
* controale absente pe frm_facturare_articole2.
*
* Oracle NU se atinge pe calea articolelor/generatorului: goExecutor -> oExecutorMock, poGeneratorNumere
* -> oGeneratorMock (mock_cursor_articole.prg / mock_generator_numere.prg, ca in test_s3_4_cursor_articole).
* amessagebox/facturi_duplicate -> mock_validare_antet.prg (oAntetFacturare.valideaza_antet ruleaza REAL).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_4b_incarca_articole.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_4b_incarca_articole.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs
PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_4b_incarca_articole.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gnFail = 0
gnPass = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gcMockSql = ""
gnMockSucces = 1
gnMockEroare = 0
gcMockMod = "PLIN"
gcMockCurs = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ;
&lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg"
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
* seriile de facturi/avize sunt pe utilizator in MARIUSM_AUTO: utilizatorul 8 are plaja activa
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* gridextras.vcx / _cb_base.vcx sunt referite din ofacturare.vcx cu cale relativa sau cu clasa
* rezolvata doar din exe/IDE (grd_factura.cCodMat.cboCodmat) - trebuie inregistrate explicit headless
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
* jtva_coloane_temp, ca in factureaza / test_s3_4_cursor_articole - ramura tnTip = 30 din
* incarca_cursor_articole foloseste update_jtva_coloane
update_jtva_coloane([JV], [jtva_coloane_temp])
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
poDate = NULL
goExecutorReal = goExecutor
goExecutor = CREATEOBJECT("oExecutorMock")
goExecutor.oReal = goExecutorReal
DO Caz WITH "A_ANTET_VALID"
DO Caz WITH "B_ANTET_INVALID"
DO Caz WITH "C_CURSOR_ESUEAZA"
DO Caz WITH "D_ANTET_VALID_VALUTA"
DO CazReincercare
DO CazSterge
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Caz
LPARAMETERS tcCaz
LOCAL loForm, llRezultat
gcCaz = "[" + tcCaz + "] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH tcCaz
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO Assert WITH PEMSTATUS(loForm, 'lArticoleIncarcate', 5), "lArticoleIncarcate materializata"
DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate = .F. la Createobject"
DO Assert WITH ObjExists(loForm, 'but_incarca_articole'), "but_incarca_articole prezent"
DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole vizibil la Createobject"
* crscursuri nu exista inca la Init - but_cursuri exista in Objects, dar porneste dezactivat;
* PEMSTATUS ramane .T. si dupa RemoveObject, deci proba reala de prezenta e ObjExists
DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent la Createobject"
DO Assert WITH !loForm.but_cursuri.Enabled, "but_cursuri dezactivat la Createobject"
* grd_factura.Column1.ControlSource e calificat ("crsFactura.denumire") - crsfactura trebuie sa
* existe (structura goala, creeaza_facturacrs) chiar la Createobject, altfel eroare 13 la legare;
* "fara articole incarcate" se verifica prin Reccount = 0, nu prin alias inchis
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura deschis dar gol inainte de do_incarca_articole"
llRezultat = loForm.do_incarca_articole()
DO CASE
CASE tcCaz == "A_ANTET_VALID"
DO Assert WITH llRezultat, "Return .T. pe antet valid"
DO Assert WITH USED('crsfactura'), "crsfactura deschis dupa succes"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, "crsfactura populat dupa succes"
DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa succes"
DO Assert WITH !loForm.but_incarca_articole.Visible, "but_incarca_articole invizibil dupa succes"
DO Assert WITH UPPER(loForm.grd_factura.RecordSource) == 'CRSFACTURA', "grd_factura.RecordSource = crsfactura"
* tip 30 nu forteaza poDate.in_valuta=1 - starea butonului de cursuri trebuie sa ramana in
* acord cu starea reala a lui crscursuri (populat sau nu de citeste_cursuri_zi), nu presupusa
* fix pe .F.
DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent dupa succes (fara valuta)"
DO Assert WITH loForm.but_cursuri.Enabled == (USED('crscursuri') AND RECCOUNT('crscursuri') > 0), "but_cursuri.Enabled in acord cu starea lui crscursuri"
CASE tcCaz == "B_ANTET_INVALID"
DO Assert WITH !llRezultat, "Return .F. pe antet invalid"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura tot gol dupa antet invalid"
DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate tot .F. dupa antet invalid"
DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole tot vizibil dupa antet invalid"
DO Assert WITH "Nu ati completat data inregistrarii!" $ gcMockApeluri, "mesajul de validare a fost dat"
* Return .F. e devreme, inaintea liniei care recalculeaza Enabled - butonul ramane dezactivat
DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent dupa antet invalid"
DO Assert WITH !loForm.but_cursuri.Enabled, "but_cursuri tot dezactivat dupa antet invalid"
CASE tcCaz == "C_CURSOR_ESUEAZA"
DO Assert WITH !llRezultat, "Return .F. pe esec cursor articole"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura tot gol dupa esec cursor"
DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate tot .F. dupa esec cursor"
DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole tot vizibil dupa esec cursor"
DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent dupa esec cursor"
DO Assert WITH !loForm.but_cursuri.Enabled, "but_cursuri tot dezactivat dupa esec cursor"
CASE tcCaz == "D_ANTET_VALID_VALUTA"
DO Assert WITH llRezultat, "Return .T. pe antet valid, document in valuta"
DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa succes (valuta)"
DO Assert WITH USED('crscursuri') AND RECCOUNT('crscursuri') > 0, "crscursuri populat dupa succes (valuta)"
DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent dupa succes (valuta)"
DO Assert WITH loForm.but_cursuri.Enabled, "but_cursuri activat dupa succes (valuta)"
ENDCASE
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* S3-4d, E+F+G: acelasi formular, doua apeluri do_incarca_articole (esec apoi reincercare cu succes) -
* nu foloseste Reseteaza/Caz (care recreeaza poDate/loForm la fiecare caz) ca sa dovedeasca persistenta
* aceleiasi instante si a antetului intre cele doua apeluri.
PROCEDURE CazReincercare
LOCAL loForm, llR1, llR2, lcAmprenta
LOCAL ldDataIreg, ldZiCurs, lnIdClient, lnIdFurnizor, lcSerieAct, lnNract, lnIdValuta, lnNrFactAchi, lcFdoc, lnIdFdoc
LOCAL lnAlocaNumar, lnDezalocaNumar
gcCaz = "[E_ANTET_SUPRAVIETUIESTE] "
DO AfLog WITH "PAS: " + gcCaz
* Reseteaza pe un tcCaz oarecare (cade pe OTHERWISE -> tip 30, mod PLIN) - antetul si mock-ul de
* eroare se suprascriu imediat mai jos, cu valori distincte fata de A/B/C/D
DO Reseteaza WITH "E_ANTET_SUPRAVIETUIESTE"
poDate.dataireg = DATE(gnAn, gnLuna, 15)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_client = 42
poDate.id_furnizor = 7
poDate.serie_act = "EFG"
poDate.nract = 555
poDate.id_valuta = 3
poDate.nrfactachi = 9
poDate.fdoc = "NOTA HANDOFF"
poDate.id_fdoc = 2
* fortez esecul cursorului de articole, ca la C_CURSOR_ESUEAZA
gcMockMod = "FARA"
gnMockSucces = -1
gnMockEroare = 1400
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
lcAmprenta = SYS(1272, loForm)
ldDataIreg = poDate.dataireg
ldZiCurs = poDate.zi_curs
lnIdClient = poDate.id_client
lnIdFurnizor = poDate.id_furnizor
lcSerieAct = poDate.serie_act
lnNract = poDate.nract
lnIdValuta = poDate.id_valuta
lnNrFactAchi = poDate.nrfactachi
lcFdoc = poDate.fdoc
lnIdFdoc = poDate.id_fdoc
* marcheaza inceputul ferestrei de masurare pentru G (apelurile generatorului pe tot traseul E+F)
gcMockApeluri = ""
llR1 = loForm.do_incarca_articole()
DO Assert WITH !llR1, "Return .F. pe esecul executorului"
DO Assert WITH SYS(1272, loForm) == lcAmprenta, "aceeasi instanta de formular dupa esec (amprenta neschimbata)"
DO Assert WITH poDate.dataireg == ldDataIreg, "dataireg neschimbata dupa esec"
DO Assert WITH poDate.zi_curs == ldZiCurs, "zi_curs neschimbata dupa esec"
DO Assert WITH poDate.id_client == lnIdClient, "id_client neschimbat dupa esec"
DO Assert WITH poDate.id_furnizor == lnIdFurnizor, "id_furnizor neschimbat dupa esec"
DO Assert WITH poDate.serie_act == lcSerieAct, "serie_act neschimbata dupa esec"
DO Assert WITH poDate.nract == lnNract, "nract neschimbat dupa esec"
DO Assert WITH poDate.id_valuta == lnIdValuta, "id_valuta neschimbat dupa esec"
DO Assert WITH poDate.nrfactachi == lnNrFactAchi, "nrfactachi neschimbat dupa esec"
DO Assert WITH poDate.fdoc == lcFdoc, "fdoc neschimbat dupa esec"
DO Assert WITH poDate.id_fdoc == lnIdFdoc, "id_fdoc neschimbat dupa esec"
DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate = .F. dupa esec"
DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole vizibil dupa esec (se poate reincerca)"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura tot gol dupa esec"
gcCaz = "[F_REINCERCARE_REUSESTE] "
DO AfLog WITH "PAS: " + gcCaz
gcMockMod = "PLIN"
gnMockSucces = 1
gnMockEroare = 0
llR2 = loForm.do_incarca_articole()
DO Assert WITH llR2, "Return .T. la reincercare"
DO Assert WITH SYS(1272, loForm) == lcAmprenta, "aceeasi instanta de formular dupa reincercare (amprenta neschimbata)"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, "crsfactura populat dupa reincercare"
DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa reincercare"
DO Assert WITH !loForm.but_incarca_articole.Visible, "but_incarca_articole ascuns dupa reincercare"
DO Assert WITH poDate.dataireg == ldDataIreg, "dataireg neschimbata dupa reincercare"
DO Assert WITH poDate.zi_curs == ldZiCurs, "zi_curs neschimbata dupa reincercare"
DO Assert WITH poDate.id_client == lnIdClient, "id_client neschimbat dupa reincercare"
DO Assert WITH poDate.id_furnizor == lnIdFurnizor, "id_furnizor neschimbat dupa reincercare"
DO Assert WITH poDate.serie_act == lcSerieAct, "serie_act neschimbata dupa reincercare"
DO Assert WITH poDate.nract == lnNract, "nract neschimbat dupa reincercare"
DO Assert WITH poDate.id_valuta == lnIdValuta, "id_valuta neschimbat dupa reincercare"
DO Assert WITH poDate.nrfactachi == lnNrFactAchi, "nrfactachi neschimbat dupa reincercare"
DO Assert WITH poDate.fdoc == lcFdoc, "fdoc neschimbat dupa reincercare"
DO Assert WITH poDate.id_fdoc == lnIdFdoc, "id_fdoc neschimbat dupa reincercare"
gcCaz = "[G_NUMAR_NU_SE_ARDE] "
DO AfLog WITH "PAS: " + gcCaz
lnAlocaNumar = ContaLinii(gcMockApeluri, "aloca_numar(")
lnDezalocaNumar = ContaLinii(gcMockApeluri, "dezaloca_numar(")
DO AfLog WITH gcCaz + "apeluri generator pe traseul E+F: " + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), " | ")
DO Assert WITH lnAlocaNumar = 0, "aloca_numar NU e apelat pe traseul E+F (niciun numar nou la reincercare) - observat " + TRANSFORM(lnAlocaNumar)
DO AfLog WITH gcCaz + "dezaloca_numar observat de " + TRANSFORM(lnDezalocaNumar) + " ori pe traseul E+F (din ramura de eroare a lui incarca_cursor_articole la E, neschimbata de S3-4a/b - comportament curent, nu defect)"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* fix do_sterge (docs\verif_referinte_moarte_articole2.md): metoda incheia focusul pe
* Thisform.txtArticoleLista/txtArticole/grd_contracte - controale absente pe frm_facturare_articole2,
* deci orice stergere de articol arunca "membru inexistent" (ON ERROR global marcheaza gnFail, nu
* trece tacut). Proba centrala: EMPTY(gcErr) dupa fiecare apel. Doua sub-cazuri, pe aceeasi instanta,
* populata cu 2 randuri (mock PLIN din mock_cursor_articole.prg): stergerea unui rand cu randuri
* ramase (Reccount('crsfactura')>0) si stergerea ultimului rand (Reccount ajunge la 0).
PROCEDURE CazSterge
LOCAL loForm
gcCaz = "[H_STERGE]"
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH "A_ANTET_VALID"
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO Assert WITH loForm.do_incarca_articole(), "do_incarca_articole reuseste (precondimtie do_sterge)"
DO Assert WITH RECCOUNT('crsfactura') = 2, "crsfactura are 2 randuri dupa incarcare (precondimtie)"
gnMockRaspuns = 6
gcErr = ""
SELECT crsfactura
GO TOP
loForm.do_sterge()
DO Assert WITH EMPTY(gcErr), "H1: do_sterge nu arunca eroare cu randuri ramase - " + gcErr
DO Assert WITH RECCOUNT('crsfactura') = 1, "H1: un rand a fost sters (ramane 1 din 2)"
gcErr = ""
SELECT crsfactura
GO TOP
loForm.do_sterge()
DO Assert WITH EMPTY(gcErr), "H2: do_sterge nu arunca eroare la ultimul rand (Reccount ajunge la 0) - " + gcErr
DO Assert WITH RECCOUNT('crsfactura') = 0, "H2: ultimul rand a fost sters (Reccount = 0)"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* numara liniile din tcTexto (jurnalul gcMockApeluri, separat pe linii CHR(13)+CHR(10)) care incep
* efectiv cu tcPrefix - simplul "$" ar confunda "aloca_numar(" cu "dezaloca_numar(" (substring)
FUNCTION ContaLinii
LPARAMETERS tcTexto, tcPrefix
LOCAL ARRAY laLinii[1]
LOCAL lnI, lnN, lnCont
lnCont = 0
IF EMPTY(tcTexto)
RETURN 0
ENDIF
lnN = ALINES(laLinii, tcTexto)
FOR lnI = 1 TO lnN
IF LEFT(ALLTRIM(laLinii[lnI]), LEN(tcPrefix)) == tcPrefix
lnCont = lnCont + 1
ENDIF
ENDFOR
RETURN lnCont
ENDFUNC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tcCaz
LOCAL lnIdSet, lnTip
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
SELECT 0
* grd_factura.Column1.ControlSource e calificat ("crsFactura.denumire", nu "denumire") - Createobject
* leaga acest control chiar la instantiere si arunca eroarea 13 daca alias-ul nu exista inca; se
* creeaza structura GOALA (0 randuri), la fel ca first pasul din incarca_cursor_articole
DO creeaza_facturacrs WITH 'crsfactura'
* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs
* (are nume_gestiune) - ca in test_s3_controale.prg
SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE
USE IN crsfactura
SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE
USE IN crsfact_tmp
gcMockApeluri = ""
gcMockSql = ""
gcMockCurs = ""
gcErr = ""
gnMockNumar = 100
gnMockRaspuns = 6
gcMockDuplicat = ""
DO CASE
CASE tcCaz == "C_CURSOR_ESUEAZA"
gcMockMod = "FARA"
gnMockSucces = -1
gnMockEroare = 1400
OTHERWISE
gcMockMod = "PLIN"
gnMockSucces = 1
gnMockEroare = 0
ENDCASE
* tip 5 (lista de preturi) forteaza poDate.in_valuta=1 in oDateFactura::Init (ofacturare_comun.prg:248)
* - singurul mod headless, fara mock suplimentar, de a obtine cazul "document in valuta"
lnTip = IIF(tcCaz == "D_ANTET_VALID_VALUTA", 5, 30)
lnIdSet = 25000 + lnTip - 1 + gnScadereStoc * 10
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, lnTip)
IF lnTip = 30
poDate.nIdTipDoc = 6 && AVIZ, ca in factureaza pentru tnTip = 30
ENDIF
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 77
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
* valideaza_antet (ofacturare_antet.prg:787) cere id_valuta cand !llAviz si in_valuta=1 - doar
* cazul D (tip 5) intra pe aceasta ramura, dar setarea e inofensiva si pentru celelalte cazuri
poDate.id_valuta = 1
IF tcCaz == "B_ANTET_INVALID"
poDate.dataireg = {}
ENDIF
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
FUNCTION ObjExists
* prezenta reala in colectia Objects (nu doar PEMSTATUS, care ramane .T. si dupa RemoveObject
* pe o proprietate mostenita din parinte)
LPARAMETERS toForm, tcName
LOCAL i
FOR i = 1 TO toForm.Objects.Count
IF UPPER(toForm.Objects(i).Name) == UPPER(tcName)
RETURN .T.
ENDIF
ENDFOR
RETURN .F.
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC