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
504 lines
23 KiB
Plaintext
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
|