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
446 lines
19 KiB
Plaintext
446 lines
19 KiB
Plaintext
* test_decizia7_plafon_grid.prg
|
|
* Headless: decizia 7 - plafonul Rol B (tipurile 1,22,29,23) validat la editarea cantitatii
|
|
* in grid, frm_facturare_articole2 (v2), eveniment grd_factura.cCantitate.Text1.Valid
|
|
* (COMUN\clase\ofacturare.vc2, dupa grd_factura.cCodMat.cboCodmat.LostFocus).
|
|
*
|
|
* Executa direct METODA REALA (nu recalcul in paralel): instantiaza frm_facturare_articole2,
|
|
* seteaza cantitatea veche pe randul din crsfactura si This.Value (cantitatea noua) pe
|
|
* controlul real din grid, apoi apeleaza loForm.grd_factura.cCantitate.Text1.Valid() ca functie.
|
|
* NU se foloseste This.OldValue: sub -A -T (si, s-a verificat, si pe un textbox obisnuit,
|
|
* non-grid) PEMSTATUS/AMEMBERS nu-l listeaza si scrierea directa arunca eroare 1734 - This.OldValue
|
|
* nu e o proprietate reflectabila/setabila din afara ciclului real de focus. Garda din cod
|
|
* foloseste de aceea crsfactura.cantitate (valoarea veche, inca nescrisa la momentul Valid, cf.
|
|
* deciziei orchestratorului) pentru comparatia "s-a schimbat cantitatea?", nu This.OldValue.
|
|
* Plafonul e citit LIVE din Oracle (pack_facturare.plafon_disponibil_articol, id_articol=315554536)
|
|
* chiar de metoda testata - testul NU recalculeaza plafonul separat, doar il citeste o data la
|
|
* inceput ca sa aleaga cantitati sigur sub / sigur peste (marja 100, impotriva driftului intre
|
|
* citiri - vezi docs\raport_s4_2.md §6.3 vs. valoarea gasita live aici, deja diferita cu +3).
|
|
*
|
|
* CAPCANA platita: setarea directa a This.Value pe un control legat prin ControlSource face
|
|
* write-through IMEDIAT in crsfactura.cantitate (verificat cu un probe dedicat - nu exista sesiune
|
|
* reala de editare in afara unui ciclu real de focus tastat, deci nu exista buffer amanat). Fara
|
|
* corectie, garda vedea mereu This.Value = crsfactura.cantitate (ambele = valoarea noua) si nu se
|
|
* declansa niciodata. Ordinea corecta, aplicata mai jos: seteaza This.Value (noua cantitate), APOI
|
|
* REPLACE cantitate WITH <valoarea veche> IN crsfactura - reface exact starea din Valid() real
|
|
* (This.Value = nou, crsfactura.cantitate = vechi), fara sa atinga This.Value.
|
|
*
|
|
* Sase cazuri (C1-C4 initiale + C5/C6 adaugate la review-ul codului comis, care a gasit doi
|
|
* defecti reali - vezi docs\raport_decizia_7_implementare.md §9):
|
|
* C1. Sub plafon (tip=1, gestionabil=1): Valid() nu refuza (rezultat <> .F.), nicio caseta de
|
|
* mesaj, gnErr=0; simuleaza commit-ul cadrului (REPLACE cu This.Value) si verifica
|
|
* crsfactura.cantitate = valoarea noua; verifica si ca pointerul ramane pe randul editat.
|
|
* C2. Peste plafon (tip=1, gestionabil=1): Valid() intoarce exact .F., crsfactura.cantitate
|
|
* RAMANE valoarea veche (nescrisa), caseta afisata cu Thisform.cmesaj_cantitate; verifica
|
|
* si ca pointerul ramane pe randul editat.
|
|
* C3. Neregresie tip disjunct (tip=3, in afara {1,22,29,23}): cantitate uriasa (peste orice
|
|
* plafon plauzibil) trece neconditionat, fara nicio caseta de mesaj (dovada ca garda nu
|
|
* s-a declansat deloc, deci nici apelul Oracle).
|
|
* C4. Neregresie gestionabil=0 (tip=1): aceeasi cantitate uriasa trece neconditionat, fara
|
|
* caseta de mesaj (garda gestionabil=1 nu se declanseaza).
|
|
* C5. Doua articole DIFERITE pe aceeasi factura: editarea articolului A la o cantitate mica
|
|
* nu trebuie sa refuze desi articolul B (needitat) are o cantitate uriasa - prinde
|
|
* tautologia "id_articol = crsfactura.id_articol" din FOR-ul CALCULATE original.
|
|
* C6. Acelasi articol pe doua linii: suma celor doua linii peste plafon refuza (C6a), sub
|
|
* plafon trece (C6b), fara sa numere randul editat de doua ori; verifica in ambele
|
|
* subcazuri ca pointerul ramane pe randul editat dupa Valid().
|
|
*
|
|
* Sablon urmat: test_s4c_discount_grid.prg (harness identic, acelasi env auto). mock_amessagebox.prg
|
|
* incarcat PRIMUL in SET PROCEDURE (la nume duplicat castiga primul fisier din lista).
|
|
*
|
|
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_decizia7_plafon_grid.prg"
|
|
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_decizia7_plafon_grid.log
|
|
* Mediu: ROA_CENTRAL / MARIUSM_AUTO (schema/instanta CONTAFIN_ORACLE); gnIdUtil = 8, gnIdSucursala = 167,
|
|
* gnScadereStoc = 1. id_articol=315554536 (acelasi din raport_s4_2.md §6), plafon citit live la rulare.
|
|
|
|
SET SAFETY OFF
|
|
SET TALK OFF
|
|
SET NOTIFY OFF
|
|
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
|
|
PUBLIC gnScadereStoc, gcMockUltimMesaj, gnMockUltimTip, gnIdArticolTest, gnPlafonLive
|
|
gnScadereStoc = 1
|
|
gnIdArticolTest = 315554536
|
|
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_decizia7_plafon_grid.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
|
|
gnErr = 0
|
|
gcCaz = ""
|
|
gcErr = ""
|
|
gcMockUltimMesaj = ""
|
|
gnMockUltimTip = 0
|
|
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\mock_amessagebox.prg", &lcProc
|
|
gnIdUtil = 8
|
|
gnIdSucursala = 167
|
|
goExecutor.oExecute([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
|
|
gnScadereStoc = 1
|
|
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala)
|
|
|
|
*-- plafon live, citit o singura data - alege cantitatile de test, nu recalculeaza rezultatul Valid()
|
|
LOCAL lcSqlPlafon
|
|
lcSqlPlafon = [SELECT pack_facturare.plafon_disponibil_articol(] + Alltrim(Str(gnIdArticolTest)) + [,] + ;
|
|
Alltrim(Str(gnLuna)) + [,] + Alltrim(Str(gnAn)) + [,8,167,NULL,NULL) AS plafon FROM dual]
|
|
IF goExecutor.oExecute(lcSqlPlafon, 'crsplafonlive') < 0
|
|
DO AfLog WITH "FAIL: plafon live " + goExecutor.oPrelucrareEroare()
|
|
DO Final
|
|
ENDIF
|
|
gnPlafonLive = crsplafonlive.plafon
|
|
Use In (Select('crsplafonlive'))
|
|
DO AfLog WITH "plafon live pentru id_articol=" + Transform(gnIdArticolTest) + " = " + Transform(gnPlafonLive)
|
|
|
|
PRIVATE poDate
|
|
poDate = NULL
|
|
|
|
DO TestC1
|
|
DO TestC2
|
|
DO TestC3
|
|
DO TestC4
|
|
DO TestC5
|
|
DO TestC6
|
|
|
|
DO Final
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
* C1: sub plafon - Valid() nu refuza, nicio caseta, commit-ul simulat scrie noua cantitate.
|
|
PROCEDURE TestC1
|
|
LOCAL loForm, lnVechi, lnNou, llRezultat
|
|
|
|
gcCaz = "[C1: sub plafon] "
|
|
DO AfLog WITH "PAS: " + gcCaz
|
|
DO Reseteaza WITH 1
|
|
|
|
lnVechi = 1
|
|
lnNou = Int(gnPlafonLive / 2)
|
|
|
|
SELECT crsfactura
|
|
APPEND BLANK
|
|
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL PLAFON", ;
|
|
cantitate WITH lnVechi, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
|
|
|
|
loForm = CREATEOBJECT('frm_facturare_articole2')
|
|
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1)"
|
|
|
|
loForm.grd_factura.cCantitate.Text1.Value = lnNou
|
|
*-- setarea directa a lui .Value scrie imediat in crsfactura (write-through, fara sesiune
|
|
*-- reala de editare) - restaureaza campul la valoarea veche ca sa reproduca exact starea
|
|
*-- din Valid() real (This.Value = nou, crsfactura.cantitate = vechi)
|
|
SELECT crsfactura
|
|
REPLACE cantitate WITH lnVechi IN crsfactura
|
|
gcMockUltimMesaj = ""
|
|
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
|
|
|
|
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
|
|
DO Assert WITH llRezultat <> .F., "Valid() nu refuza sub plafon (plafon=" + Transform(gnPlafonLive) + ", cerut=" + Transform(lnNou) + ")"
|
|
DO Assert WITH Empty(gcMockUltimMesaj), "nicio caseta de mesaj sub plafon (primit: [" + gcMockUltimMesaj + "])"
|
|
DO Assert WITH Recno('crsfactura') = 1, "pointerul ramane pe randul editat dupa Valid() cu succes (obtinut: " + Transform(Recno('crsfactura')) + ")"
|
|
|
|
SELECT crsfactura
|
|
GO TOP IN crsfactura
|
|
REPLACE cantitate WITH lnNou IN crsfactura
|
|
DO Assert WITH crsfactura.cantitate = lnNou, "cantitate scrisa dupa commit simulat (obtinut: " + Transform(crsfactura.cantitate) + ")"
|
|
|
|
loForm.Release()
|
|
RELEASE loForm
|
|
ENDPROC
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
* C2: peste plafon - Valid() refuza (.F. exact), crsfactura.cantitate ramane valoarea veche,
|
|
* caseta afisata cu Thisform.cmesaj_cantitate.
|
|
PROCEDURE TestC2
|
|
LOCAL loForm, lnVechi, lnNou, llRezultat
|
|
|
|
gcCaz = "[C2: peste plafon] "
|
|
DO AfLog WITH "PAS: " + gcCaz
|
|
DO Reseteaza WITH 1
|
|
|
|
lnVechi = 1
|
|
lnNou = gnPlafonLive + 100
|
|
|
|
SELECT crsfactura
|
|
APPEND BLANK
|
|
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL PLAFON", ;
|
|
cantitate WITH lnVechi, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
|
|
|
|
loForm = CREATEOBJECT('frm_facturare_articole2')
|
|
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1)"
|
|
|
|
loForm.grd_factura.cCantitate.Text1.Value = lnNou
|
|
SELECT crsfactura
|
|
REPLACE cantitate WITH lnVechi IN crsfactura
|
|
gcMockUltimMesaj = ""
|
|
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
|
|
|
|
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
|
|
DO Assert WITH llRezultat = .F., "Valid() refuza peste plafon (plafon=" + Transform(gnPlafonLive) + ", cerut=" + Transform(lnNou) + ")"
|
|
DO Assert WITH 'Acest articol nu este pe stoc!' $ gcMockUltimMesaj, "caseta cu Thisform.cmesaj_cantitate (primit: [" + gcMockUltimMesaj + "])"
|
|
DO Assert WITH Recno('crsfactura') = 1, "pointerul ramane pe randul editat dupa Valid() cu refuz (obtinut: " + Transform(Recno('crsfactura')) + ")"
|
|
|
|
SELECT crsfactura
|
|
GO TOP IN crsfactura
|
|
DO Assert WITH crsfactura.cantitate = lnVechi, "cantitate NESCHIMBATA la refuz (obtinut: " + Transform(crsfactura.cantitate) + ")"
|
|
|
|
loForm.Release()
|
|
RELEASE loForm
|
|
ENDPROC
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
* C3: neregresie tip disjunct (tip=3, Rol A) - cantitate uriasa trece neconditionat, garda
|
|
* nu se declanseaza (nicio caseta de mesaj).
|
|
PROCEDURE TestC3
|
|
LOCAL loForm, lnVechi, lnNou, llRezultat
|
|
|
|
gcCaz = "[C3: neregresie tip=3] "
|
|
DO AfLog WITH "PAS: " + gcCaz
|
|
DO Reseteaza WITH 3
|
|
|
|
lnVechi = 1
|
|
lnNou = gnPlafonLive + 1000000
|
|
|
|
SELECT crsfactura
|
|
APPEND BLANK
|
|
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL PLAFON", ;
|
|
cantitate WITH lnVechi, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
|
|
|
|
loForm = CREATEOBJECT('frm_facturare_articole2')
|
|
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=3)"
|
|
|
|
loForm.grd_factura.cCantitate.Text1.Value = lnNou
|
|
SELECT crsfactura
|
|
REPLACE cantitate WITH lnVechi IN crsfactura
|
|
gcMockUltimMesaj = ""
|
|
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
|
|
|
|
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
|
|
DO Assert WITH llRezultat <> .F., "Valid() nu refuza pe tip disjunct (tip=3)"
|
|
DO Assert WITH Empty(gcMockUltimMesaj), "garda plafon nu s-a declansat pe tip=3 (primit: [" + gcMockUltimMesaj + "])"
|
|
|
|
loForm.Release()
|
|
RELEASE loForm
|
|
ENDPROC
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
* C4: neregresie gestionabil=0 (tip=1) - cantitate uriasa trece neconditionat, garda
|
|
* gestionabil=1 nu se declanseaza (nicio caseta de mesaj).
|
|
PROCEDURE TestC4
|
|
LOCAL loForm, lnVechi, lnNou, llRezultat
|
|
|
|
gcCaz = "[C4: neregresie gestionabil=0] "
|
|
DO AfLog WITH "PAS: " + gcCaz
|
|
DO Reseteaza WITH 1
|
|
|
|
lnVechi = 1
|
|
lnNou = gnPlafonLive + 1000000
|
|
|
|
SELECT crsfactura
|
|
APPEND BLANK
|
|
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL PLAFON", ;
|
|
cantitate WITH lnVechi, gestionabil WITH 0, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
|
|
|
|
loForm = CREATEOBJECT('frm_facturare_articole2')
|
|
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1, gestionabil=0)"
|
|
|
|
loForm.grd_factura.cCantitate.Text1.Value = lnNou
|
|
SELECT crsfactura
|
|
REPLACE cantitate WITH lnVechi IN crsfactura
|
|
gcMockUltimMesaj = ""
|
|
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
|
|
|
|
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
|
|
DO Assert WITH llRezultat <> .F., "Valid() nu refuza pe gestionabil=0"
|
|
DO Assert WITH Empty(gcMockUltimMesaj), "garda plafon nu s-a declansat pe gestionabil=0 (primit: [" + gcMockUltimMesaj + "])"
|
|
|
|
loForm.Release()
|
|
RELEASE loForm
|
|
ENDPROC
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
* C5: doua articole DIFERITE pe aceeasi factura - articolul B (alt id_articol, cantitate uriasa,
|
|
* needitat) nu trebuie sa intre in suma articolului A (cel editat). Prinde tautologia
|
|
* "id_articol = crsfactura.id_articol" din FOR-ul CALCULATE (mereu .T. in scanul CALCULATE).
|
|
PROCEDURE TestC5
|
|
LOCAL loForm, lnNou, llRezultat
|
|
|
|
gcCaz = "[C5: doua articole diferite] "
|
|
DO AfLog WITH "PAS: " + gcCaz
|
|
DO Reseteaza WITH 1
|
|
|
|
lnNou = 5
|
|
|
|
SELECT crsfactura
|
|
APPEND BLANK
|
|
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A", ;
|
|
cantitate WITH 1, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
|
|
APPEND BLANK
|
|
REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 888888888, denumire WITH "ARTICOL B", ;
|
|
cantitate WITH 50000, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
|
|
|
|
loForm = CREATEOBJECT('frm_facturare_articole2')
|
|
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1, 2 articole)"
|
|
|
|
SELECT crsfactura
|
|
GO 1 IN crsfactura
|
|
loForm.grd_factura.cCantitate.Text1.Value = lnNou
|
|
SELECT crsfactura
|
|
GO 1 IN crsfactura
|
|
REPLACE cantitate WITH 1 IN crsfactura
|
|
gcMockUltimMesaj = ""
|
|
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
|
|
|
|
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
|
|
DO Assert WITH llRezultat <> .F., "Valid() nu refuza A (5, mult sub plafonul " + Transform(gnPlafonLive) + ") desi B are 50000 pe alt articol"
|
|
DO Assert WITH Empty(gcMockUltimMesaj), "nicio caseta - suma NU trebuie sa includa articolul B (primit: [" + gcMockUltimMesaj + "])"
|
|
|
|
loForm.Release()
|
|
RELEASE loForm
|
|
ENDPROC
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
* C6: acelasi articol pe doua linii - randul needitat (100) plus randul editat trebuie sa
|
|
* refuze peste plafon si sa treaca sub plafon, fara sa numere randul editat de doua ori
|
|
* (verifica excluderea Recno() <> lnRecnoCrt cu filtrul de id_articol corect).
|
|
PROCEDURE TestC6
|
|
LOCAL loForm, lnNou, llRezultat
|
|
|
|
gcCaz = "[C6a: acelasi articol, 2 linii, peste plafon] "
|
|
DO AfLog WITH "PAS: " + gcCaz
|
|
DO Reseteaza WITH 1
|
|
|
|
SELECT crsfactura
|
|
APPEND BLANK
|
|
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A linia 1", ;
|
|
cantitate WITH 100, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
|
|
APPEND BLANK
|
|
REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A linia 2", ;
|
|
cantitate WITH 1, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
|
|
|
|
loForm = CREATEOBJECT('frm_facturare_articole2')
|
|
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1, acelasi articol pe 2 linii)"
|
|
|
|
*-- C6a: editez linia 2 la o valoare care duce totalul (100 + noua) peste plafon
|
|
lnNou = gnPlafonLive + 100
|
|
SELECT crsfactura
|
|
GO 2 IN crsfactura
|
|
loForm.grd_factura.cCantitate.Text1.Value = lnNou
|
|
SELECT crsfactura
|
|
GO 2 IN crsfactura
|
|
REPLACE cantitate WITH 1 IN crsfactura
|
|
gcMockUltimMesaj = ""
|
|
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
|
|
|
|
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
|
|
DO Assert WITH llRezultat = .F., "Valid() refuza cand suma celor 2 linii (100+" + Transform(lnNou) + ") depaseste plafonul " + Transform(gnPlafonLive)
|
|
DO Assert WITH Recno('crsfactura') = 2, "pointerul ramane pe linia 2 dupa refuz (obtinut: " + Transform(Recno('crsfactura')) + ")"
|
|
|
|
loForm.Release()
|
|
RELEASE loForm
|
|
|
|
gcCaz = "[C6b: acelasi articol, 2 linii, sub plafon] "
|
|
DO AfLog WITH "PAS: " + gcCaz
|
|
DO Reseteaza WITH 1
|
|
|
|
SELECT crsfactura
|
|
APPEND BLANK
|
|
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A linia 1", ;
|
|
cantitate WITH 100, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
|
|
APPEND BLANK
|
|
REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A linia 2", ;
|
|
cantitate WITH 1, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
|
|
|
|
loForm = CREATEOBJECT('frm_facturare_articole2')
|
|
|
|
*-- C6b: editez linia 2 la o valoare care lasa totalul (100 + noua) sub plafon
|
|
lnNou = 5000
|
|
SELECT crsfactura
|
|
GO 2 IN crsfactura
|
|
loForm.grd_factura.cCantitate.Text1.Value = lnNou
|
|
SELECT crsfactura
|
|
GO 2 IN crsfactura
|
|
REPLACE cantitate WITH 1 IN crsfactura
|
|
gcMockUltimMesaj = ""
|
|
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
|
|
|
|
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
|
|
DO Assert WITH llRezultat <> .F., "Valid() nu refuza cand suma celor 2 linii (100+" + Transform(lnNou) + ") ramane sub plafonul " + Transform(gnPlafonLive)
|
|
DO Assert WITH Recno('crsfactura') = 2, "pointerul ramane pe linia 2 dupa succes (obtinut: " + Transform(Recno('crsfactura')) + ")"
|
|
|
|
loForm.Release()
|
|
RELEASE loForm
|
|
ENDPROC
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
PROCEDURE Reseteaza
|
|
LPARAMETERS tnTip
|
|
LOCAL lnIdSet
|
|
|
|
DO Inchide WITH 'crsfactura'
|
|
SELECT 0
|
|
DO creeaza_facturacrs WITH 'crsfactura'
|
|
|
|
gcErr = ""
|
|
gnErr = 0
|
|
gcMockUltimMesaj = ""
|
|
gnMockUltimTip = 0
|
|
|
|
lnIdSet = 29000 + tnTip
|
|
poDate = NULL
|
|
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
|
|
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 = 79
|
|
poDate.serie_act = "TST"
|
|
poDate.id_client = 1
|
|
poDate.id_furnizor = 1
|
|
poDate.id_valuta = 1
|
|
poDate.in_valuta = 0
|
|
ENDPROC
|
|
|
|
PROCEDURE Inchide
|
|
LPARAMETERS tcAlias
|
|
IF USED(tcAlias)
|
|
USE IN (tcAlias)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
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)
|
|
gnErr = gnErr + 1
|
|
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
|
|
ENDPROC
|
|
|
|
PROCEDURE Final
|
|
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
|
|
DO AfLog WITH "END " + TTOC(DATETIME())
|
|
QUIT
|
|
ENDPROC
|