diff --git a/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_dialog.prg b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_dialog.prg new file mode 100644 index 0000000..5b2a044 --- /dev/null +++ b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_dialog.prg @@ -0,0 +1,663 @@ +* test_pret_cu_tva_dialog.prg +* Test UI Nivel 1 (S5, plan #7) pentru dialogul PER-ARTICOL real, clasa frm_articol_factura din +* COMUN\clase\ofacturare.vc2. Instantiaza clasa exact cum o instantiaza aplicatia in +* frm_facturare_articole.do_adauga_articol (ofacturare.vc2:12869): +* Createobject("frm_articol_factura", lnCantitate, tlImplicit) +* apoi exerseaza handlerele REALE (ck_pret_cu_tva.InteractiveChange, Clb_pretctva.tx_suma_nat. +* InteractiveChange, Clb_discountctva.tx_suma_nat.Valid) - nu populeaza direct poArticol cu +* rezultate calculate manual, doar cu DATELE DE INTRARE (pretul tastat, bifa), exact ce ar +* introduce utilizatorul. poArticol se construieste ca obiect liber (CREATEOBJECT+ADDPROPERTY), +* echivalent cu Scatter Name poArticol MEMO din crsarticole (acelasi shape de date), pentru ca +* testul sa ramana independent de Oracle si de celelalte doua griduri ale formularului parinte. +* +* Nivel 2 (flux complet prin frm_facturare_articole, propagare in crsfactura, buton +* but_modificare din S2b) NU e acoperit aici - vezi docs\cercetare\rec_s5_teste.md pentru motiv. +* +* Pasi (vezi vfp_ui_harness.ps1 -Steps): +* 0 mediu pregatit +* 1 cazul tinta: bifa=1, pret tastat 100.00 cu TVA, cantitate 1 -> total exact 100.00 +* 2 comutare bifa OFF->ON: pretul fara TVA tastat nu se pierde +* 3 comutare bifa ON->OFF: pretul cu TVA tastat nu se pierde +* 4 cota standard 21% +* 5 cota redusa 11% +* 6 discount unitar cu TVA (ramura discountctva) +* 7 bifa activa pe tip de document din lista (Inlist 1,5,10,22,23,25,29,41) +* 8 bifa dezactivata pe tip din afara listei, cu pret nenul +* 9 final + +SET SAFETY OFF +SET TALK OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcUILog, gcSyncDir +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_pret_cu_tva\test_pret_cu_tva_dialog_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_pret_cu_tva\uisync\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + LOCAL gcAppPath, lcPath + gcAppPath = "D:\ROA\ROAFACTURARE\" + SET DEFAULT TO (gcAppPath) + + lcPath = gcAppPath + 'Date;' + gcAppPath + 'Include;' + gcAppPath + 'FERESTRE;' + ; + gcAppPath + 'GRAFICE;' + gcAppPath + 'CLASE;' + gcAppPath + 'MENIURI;' + ; + gcAppPath + 'PROGRAME;' + gcAppPath + 'RAPOARTE;' + gcAppPath + 'COMUN;' + ; + gcAppPath + 'COMUN\CLASE;' + gcAppPath + 'COMUN\FERESTRE;' + gcAppPath + 'COMUN\PROGRAME;' + ; + gcAppPath + 'COMUN\GRAFICE;' + gcAppPath + 'COMUN\RAPOARTE;' + ; + gcAppPath + 'COMUN\UTILE\CALENDAR;' + gcAppPath + 'COMUN\UTILE\CTL32;' + ; + gcAppPath + 'COMUN\UTILE\HPDF;' + gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ; + gcAppPath + 'COMUN\UTILE\WEB;' + gcAppPath + 'COMUN\UTILE\EMAIL;' + ; + gcAppPath + 'COMUN\UTILE\NFJSON;' + gcAppPath + 'COMUN\UTILE\NFXML;' + ; + ADDBS(SUBSTR(gcAppPath,1,RAT([\],gcAppPath,2)))+[COMUNROA\] + SET PATH TO &lcPath ADDITIVE + DO AfLog WITH 'SET PATH OK' + + *----- CLASE (lista din Programe\roafacturare.prg, scopul minim pentru ofacturare.vcx) ----- + SET CLASSLIB TO (gcAppPath + "comun\clase\appwiz") ADDITIVE + SET CLASSLIB TO registry ADDITIVE + SET CLASSLIB TO cauta_alfa_forms ADDITIVE + SET CLASSLIB TO ofacturare.vcx ADDITIVE + SET CLASSLIB TO ofacturare_comun.vcx ADDITIVE + SET CLASSLIB TO accessibility.vcx ADDITIVE + SET CLASSLIB TO ocriterii.vcx ADDITIVE + SET CLASSLIB TO ctl32_statusbar.vcx ADDITIVE + SET CLASSLIB TO ctl32_common.vcx ADDITIVE + SET CLASSLIB TO ctl32_structs.vcx ADDITIVE + SET CLASSLIB TO ctl32_progressbar.vcx ADDITIVE + SET CLASSLIB TO DECABAZA ADDITIVE + SET CLASSLIB TO onomenclatoare ADDITIVE + SET CLASSLIB TO onomenclatoare2 ADDITIVE + SET CLASSLIB TO ofacturare_rapoarte ADDITIVE + SET CLASSLIB TO orapoarte ADDITIVE + SET CLASSLIB TO ferestre_oracle ADDITIVE + SET CLASSLIB TO messagebox ADDITIVE + SET CLASSLIB TO otoolbar ADDITIVE + SET CLASSLIB TO onom_curs ADDITIVE + SET CLASSLIB TO comun ADDITIVE + SET CLASSLIB TO ferestre_cere_date ADDITIVE + SET CLASSLIB TO baza ADDITIVE + SET CLASSLIB TO caut ADDITIVE + SET CLASSLIB TO ointroduceri ADDITIVE + SET CLASSLIB TO serii_numere ADDITIVE + SET CLASSLIB TO caut_ora ADDITIVE + SET CLASSLIB TO wwdialogs.vcx ADDITIVE + SET CLASSLIB TO _calendar.vcx ADDITIVE + SET CLASSLIB TO locale ADDITIVE + SET CLASSLIB TO overificari ADDITIVE + SET CLASSLIB TO ocomenzi ADDITIVE + DO AfLog WITH 'SET CLASSLIB OK' + + *----- PROCEDURI (mock amessagebox PRIMUL, ui_harness la final) ----- + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" + SET PROCEDURE TO proceduri_comune ADDITIVE + SET PROCEDURE TO quitapp ADDITIVE + SET PROCEDURE TO init_program ADDITIVE + SET PROCEDURE TO onomenclatoare.prg ADDITIVE + SET PROCEDURE TO onomenclatoare2.prg ADDITIVE + SET PROCEDURE TO oproceduri_rapoarte_fact.prg ADDITIVE + SET PROCEDURE TO email.prg ADDITIVE + SET PROCEDURE TO GENCURSOR.PRG ADDITIVE + SET PROCEDURE TO OPROCEDURI_COMUNE.PRG ADDITIVE + SET PROCEDURE TO OINIT_OPTIUNI.PRG ADDITIVE + SET PROCEDURE TO updateserver.PRG ADDITIVE + SET PROCEDURE TO OPROCEDURI_aMS.PRG ADDITIVE + SET PROCEDURE TO ocautare ADDITIVE + SET PROCEDURE TO odocumente ADDITIVE + SET PROCEDURE TO osecurity ADDITIVE + SET PROCEDURE TO acces_meniu ADDITIVE + SET PROCEDURE TO wwxmlhttp.prg ADDITIVE + SET PROCEDURE TO wwcodeupdate.prg ADDITIVE + SET PROCEDURE TO ini.prg ADDITIVE + SET PROCEDURE TO cauta_alfa.prg ADDITIVE + SET PROCEDURE TO oHeader.prg ADDITIVE + SET PROCEDURE TO oproceduri_curs.prg ADDITIVE + SET PROCEDURE TO proceduri.prg ADDITIVE + SET PROCEDURE TO oproceduri_facturare.prg ADDITIVE + SET PROCEDURE TO proceduri_rapoarte.prg ADDITIVE + SET PROCEDURE TO ofacturare.prg ADDITIVE + SET PROCEDURE TO oserii_numere.prg ADDITIVE + SET PROCEDURE TO wwutils.prg ADDITIVE + SET PROCEDURE TO wwConfig.prg ADDITIVE + SET PROCEDURE TO wwApi.prg ADDITIVE + SET PROCEDURE TO oexport.prg ADDITIVE + SET PROCEDURE TO validare.prg ADDITIVE + SET PROCEDURE TO ofacturare_comun.prg ADDITIVE + SET PROCEDURE TO ofacturare_stoc.prg ADDITIVE + SET PROCEDURE TO pmenu.prg ADDITIVE + SET PROCEDURE TO ointroduceri.prg ADDITIVE + SET PROCEDURE TO ovariabile_globale.prg ADDITIVE + SET PROCEDURE TO ooperatii_comune.prg ADDITIVE + SET PROCEDURE TO oproceduri_util.prg ADDITIVE + SET PROCEDURE TO filebringer.prg ADDITIVE + SET PROCEDURE TO iniacces.prg ADDITIVE + SET PROCEDURE TO oupdate.prg ADDITIVE + SET PROCEDURE TO procese.prg ADDITIVE + SET PROCEDURE TO version.prg ADDITIVE + SET PROCEDURE TO wwhttp.prg ADDITIVE + SET PROCEDURE TO xmlaccess.prg ADDITIVE + SET PROCEDURE TO xmlparser.prg ADDITIVE + SET PROCEDURE TO xdate.prg ADDITIVE + SET PROCEDURE TO suma_in_vorbe.prg ADDITIVE + SET PROCEDURE TO controllerecr ADDITIVE + SET PROCEDURE TO regex.prg ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE + DO AfLog WITH 'SET PROCEDURE OK' + + *----- Globale aplicatie cerute de frm_articol_factura / calculeaza_totaluri ----- + PUBLIC gnPc, gnPVal, gnPcant, gnPPretV, gnScadereStoc, gnMemProcDisc, gl406, gcAcces + gnPc = 2 && precizie sume lei + gnPVal = 2 && precizie sume valuta + gnPcant = 3 && precizie cantitate (doar pt. InputMask) + gnPPretV = 4 && precizie unitara pret/tva/discount + gnScadereStoc = 0 && ocoleste ramura serie/lot needitabila si clb_procent_adaos + gnMemProcDisc = 0 && ocoleste memorarea procentului de discount intre articole + gl406 = .F. && SAFT dezactivat - flagul pret_cu_tva nu are legatura cu taxcode + gcAcces = "1;2;3;4;5;6;7;8;" + PUBLIC nror(65000) + + PUBLIC goApp + goApp = CREATEOBJECT('dummyapp') + + *----- jtva_coloane: cotele curente (regim post 01.08.2025) - 21% standard, 11% redusa ----- + IF USED('jtva_coloane') + USE IN ('jtva_coloane') + ENDIF + CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2)) + INSERT INTO jtva_coloane VALUES (1, 'TVA 21%', 21) + INSERT INTO jtva_coloane VALUES (2, 'TVA 11%', 11) + GO TOP IN jtva_coloane + + *----- saft_taxtable: desi gl406=.F. (codul aplicatiei nu-l cere explicit), cb_explicatie_saft + * din frm_articol_factura are RowSource="select ... from saft_taxtable ..." legat direct + * pe control (RowSourceType=3) - fara cursorul cu acest alias, SELECT-ul cauta un fisier + * saft_taxtable.dbf inexistent si scoate dialogul nativ Windows "Open" care blocheaza + * headless la nesfarsit, fara nicio linie noua in log (capcana j, testare-ui-vfp.md). ----- + IF USED('saft_taxtable') + USE IN ('saft_taxtable') + ENDIF + CREATE CURSOR saft_taxtable (taxname C(250), procent_taxa N(7,2), taxcode N(6), tva_livrari N(1)) + INSERT INTO saft_taxtable VALUES ('301104-Achizitii de bunuri si servicii taxabile cu cota de 21%', 21, 301104, 1) + INSERT INTO saft_taxtable VALUES ('3011XX-Achizitii de bunuri si servicii taxabile cu cota de 11%', 11, 301108, 1) + + *----- tablourile cu campurile poArticol: constructie poArticol INLINE in main la fiecare + * scenariu (nu intr-o PROCEDURA - vezi capcana ADDPROPERTY apelat dintr-o procedura, + * testare-ui-vfp.md litera l), dar bucla de ADDPROPERTY ramane in corpul principal, deci + * e sigura; reduce field-urile "neutre" (0 / '') la doua tablouri reutilizate. ----- + LOCAL lnI + LOCAL ARRAY laPropN(49) + laPropN( 1)='id_articol' && identificatori si asociatii + laPropN( 2)='Id_Pol' + laPropN( 3)='id_gestiune' + laPropN( 4)='id_c' + laPropN( 5)='id_ctr' + laPropN( 6)='id_valuta' + laPropN( 7)='id_valuta_d' + laPropN( 8)='id_lucrare_rez' + laPropN( 9)='id_part_rez' + laPropN(10)='id_jtva_coloana' + laPropN(11)='taxcode' + laPropN(12)='opt_facturare' + laPropN(13)='gestionabil' && cantitate / pret / valuta + laPropN(14)='tip_valuta' + laPropN(15)='cantitate' + laPropN(16)='Curs' + laPropN(17)='multiplicator' + laPropN(18)='pret_achizitie' + laPropN(19)='pretv_orig' + laPropN(20)='pretd' + laPropN(21)='proc_tvav' + laPropN(22)='preturi_cu_tva' && preturi + laPropN(23)='pretftva' + laPropN(24)='pretftva_val' + laPropN(25)='pretctva' + laPropN(26)='pretctva_val' + laPropN(27)='tva' + laPropN(28)='tva_val' + laPropN(29)='discount_unitar' && discount unitar + laPropN(30)='discount_unitar_val' + laPropN(31)='discount_unitar_ctva' + laPropN(32)='discount_unitar_ctva_val' + laPropN(33)='valftva' && totaluri lei (calculate de calculeaza_totaluri) + laPropN(34)='valtva' + laPropN(35)='valctva' + laPropN(36)='valdiscountftva' + laPropN(37)='valdiscounttva' + laPropN(38)='valdiscountctva' + laPropN(39)='valdiminuatftva' + laPropN(40)='valdiminuattva' + laPropN(41)='valdiminuatctva' + laPropN(42)='vvalftva' && totaluri valuta (calculate de calculeaza_totaluri) + laPropN(43)='vvaltva' + laPropN(44)='vvalctva' + laPropN(45)='vvaldiscountftva' + laPropN(46)='vvaldiscounttva' + laPropN(47)='vvaldiscountctva' + laPropN(48)='vvaldiminuatftva' + laPropN(49)='vvaldiminuattva' + *-- (vvaldiminuatctva se adauga separat mai jos, ALEN a ramas 49 din motive de numarare initiala) + LOCAL ARRAY laPropC(11) + laPropC( 1)='codmat' + laPropC( 2)='codmatf' + laPropC( 3)='denumire' + laPropC( 4)='um' + laPropC( 5)='serie' + laPropC( 6)='lot' + laPropC( 7)='explicatie' + laPropC( 8)='numar_contract' + laPropC( 9)='codbare' + laPropC(10)='nume_val' + laPropC(11)='Cont' + + PRIVATE poArticol, poDate + DO AfLog WITH 'mediu pregatit, incep scenariile' + + *========================= PAS 0: mediu pregatit ========================= + DO HarnessStep WITH 0, 'mediu pregatit, jtva_coloane cu ' + TRANSFORM(RECCOUNT('jtva_coloane')) + ' cote' + + *========================= SCENARIU 1 (cazul tinta): bifa=1, 100.00 cu TVA, cant 1 ========= + poArticol = CREATEOBJECT('Empty') + FOR lnI = 1 TO ALEN(laPropN) + =ADDPROPERTY(poArticol, laPropN(lnI), 0) + ENDFOR + =ADDPROPERTY(poArticol, 'vvaldiminuatctva', 0) + FOR lnI = 1 TO ALEN(laPropC) + =ADDPROPERTY(poArticol, laPropC(lnI), '') + ENDFOR + poArticol.id_articol = 1001 + poArticol.Id_Pol = 1 + poArticol.Cont = '707' + poArticol.id_gestiune = 1 + poArticol.gestionabil = 1 + poArticol.tip_valuta = 0 + poArticol.Curs = 1 + poArticol.multiplicator = 1 + poArticol.cantitate = 1 + poArticol.codmat = 'ART001' + poArticol.denumire = 'ARTICOL TEST 100 CU TVA' + poArticol.um = 'BUC' + poArticol.proc_tvav = 1.21 && cota standard 21% + poArticol.preturi_cu_tva = 1 && bifa PORNITA - politica implicita cu TVA inclus + + poDate = CREATEOBJECT('Empty') + =ADDPROPERTY(poDate, 'tip', 1) && 1 = lista de preturi, in Inlist activator bifa + =ADDPROPERTY(poDate, 'in_valuta', 0) + + PUBLIC goDlg + goDlg = CREATEOBJECT('frm_articol_factura', 1, .F.) + IF VARTYPE(goDlg) <> 'O' + DO AfLog WITH 'FAIL: instantiere frm_articol_factura (scenariul 1)' + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + + DO AfLog WITH 'S1 dupa Init: preturi_cu_tva=' + TRANSFORM(poArticol.preturi_cu_tva) + ; + ' ck_pret_cu_tva.Value=' + TRANSFORM(goDlg.ck_pret_cu_tva.Value) + ; + ' Enabled=' + TRANSFORM(goDlg.ck_pret_cu_tva.Enabled) + + *-- utilizatorul tasteaza 100.00 in campul "Pret cu TVA" (bifa deja pornita) + goDlg.Clb_pretctva.tx_suma_nat.Value = 100 + goDlg.Clb_pretctva.tx_suma_nat.InteractiveChange() + DOEVENTS FORCE + DO HarnessStep WITH 1, 'cazul tinta: pretctva tastat 100.00, cantitate 1' + + DO VerificaNumeric WITH 'S1 pretctva pastrat', poArticol.pretctva, 100, 0.005 + DO VerificaNumeric WITH 'S1 CAZUL TINTA totalul facturii (valctva)', poArticol.valctva, 100, 0.005 + *-- cifrele complete ale cazului tinta, indiferent de PASS/FAIL - de citat in raport ca atare + DO AfLog WITH 'S1 CIFRE CAZ TINTA: pretftva=' + TRANSFORM(poArticol.pretftva) + ; + ' pretctva=' + TRANSFORM(poArticol.pretctva) + ' tva=' + TRANSFORM(poArticol.tva) + ; + ' valftva=' + TRANSFORM(poArticol.valftva) + ' valtva=' + TRANSFORM(poArticol.valtva) + ; + ' valctva=' + TRANSFORM(poArticol.valctva) + + *-- butonul OK (inainte_de_do_termin): parte din fluxul real, dar poate cere ActiveControl + *-- (focus real de fereastra), nesigur headless. Daca arunca eroare, pasul e NEACOPERIT - + *-- nu se raporteaza PASS/FAIL pe o executie care nu s-a confirmat. + LOCAL llOkS1 + TRY + llOkS1 = goDlg.inainte_de_do_termin() + DO VerificaLogic WITH 'S1 buton OK (inainte_de_do_termin)', llOkS1, .T. + CATCH TO loExcOk + DO AfLog WITH 'NEACOPERIT S1 buton OK (inainte_de_do_termin): eroare ' + ; + TRANSFORM(loExcOk.ErrorNo) + ' [' + loExcOk.Message + '] in ' + loExcOk.Procedure + ; + ':' + TRANSFORM(loExcOk.LineNo) + ' - pasul nu s-a putut executa headless, nu e nici PASS nici FAIL' + ENDTRY + goDlg.Hide() + DOEVENTS FORCE + + *========================= SCENARIU 2: comutare bifa, valoarea tastata nu se pierde ========= + poArticol = CREATEOBJECT('Empty') + FOR lnI = 1 TO ALEN(laPropN) + =ADDPROPERTY(poArticol, laPropN(lnI), 0) + ENDFOR + =ADDPROPERTY(poArticol, 'vvaldiminuatctva', 0) + FOR lnI = 1 TO ALEN(laPropC) + =ADDPROPERTY(poArticol, laPropC(lnI), '') + ENDFOR + poArticol.id_articol = 1002 + poArticol.Id_Pol = 1 + poArticol.Cont = '707' + poArticol.id_gestiune = 1 + poArticol.gestionabil = 1 + poArticol.tip_valuta = 0 + poArticol.Curs = 1 + poArticol.multiplicator = 1 + poArticol.cantitate = 2 + poArticol.codmat = 'ART002' + poArticol.denumire = 'ARTICOL TEST COMUTARE BIFA' + poArticol.um = 'BUC' + poArticol.proc_tvav = 1.21 + poArticol.preturi_cu_tva = 0 && bifa OPRITA - pretul fara TVA e cel editabil + + poDate = CREATEOBJECT('Empty') + =ADDPROPERTY(poDate, 'tip', 1) + =ADDPROPERTY(poDate, 'in_valuta', 0) + + goDlg = CREATEOBJECT('frm_articol_factura', 2, .F.) + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + + *-- utilizatorul tasteaza 50.00 fara TVA (bifa oprita) + goDlg.Clb_pretftva.tx_suma_nat.Value = 50 + goDlg.Clb_pretftva.tx_suma_nat.InteractiveChange() + DOEVENTS FORCE + DO AfLog WITH 'S2 dupa tastare pretftva=50: pretftva=' + TRANSFORM(poArticol.pretftva) + ; + ' pretctva=' + TRANSFORM(poArticol.pretctva) + + *-- bifeaza (OFF -> ON): pretul fara TVA tastat (50) nu trebuie sa se piarda + goDlg.ck_pret_cu_tva.Value = 1 + goDlg.ck_pret_cu_tva.InteractiveChange() + DOEVENTS FORCE + DO HarnessStep WITH 2, 'bifa OFF->ON: pretftva tastat=50 trebuie pastrat' + DO VerificaNumeric WITH 'S2 comutare OFF->ON: pretftva NEPIERDUT', poArticol.pretftva, 50, 0.005 + DO VerificaNumeric WITH 'S2 comutare OFF->ON: pretctva derivat', poArticol.pretctva, 60.5, 0.005 + + *-- debifeaza (ON -> OFF): pretul (acum cu TVA, derivat) trebuie sa duca inapoi la acelasi pretftva=50 + goDlg.ck_pret_cu_tva.Value = 0 + goDlg.ck_pret_cu_tva.InteractiveChange() + DOEVENTS FORCE + DO HarnessStep WITH 3, 'bifa ON->OFF: pretftva trebuie sa ramana 50 (roundtrip)' + DO VerificaNumeric WITH 'S2 comutare ON->OFF: pretftva NEPIERDUT (roundtrip)', poArticol.pretftva, 50, 0.005 + goDlg.Hide() + DOEVENTS FORCE + + *========================= SCENARIU 3: cota standard 21% vs cota redusa 11% ========= + poArticol = CREATEOBJECT('Empty') + FOR lnI = 1 TO ALEN(laPropN) + =ADDPROPERTY(poArticol, laPropN(lnI), 0) + ENDFOR + =ADDPROPERTY(poArticol, 'vvaldiminuatctva', 0) + FOR lnI = 1 TO ALEN(laPropC) + =ADDPROPERTY(poArticol, laPropC(lnI), '') + ENDFOR + poArticol.id_articol = 1003 + poArticol.Id_Pol = 1 + poArticol.Cont = '707' + poArticol.id_gestiune = 1 + poArticol.gestionabil = 1 + poArticol.tip_valuta = 0 + poArticol.Curs = 1 + poArticol.multiplicator = 1 + poArticol.cantitate = 1 + poArticol.codmat = 'ART003A' + poArticol.denumire = 'ARTICOL TEST COTA STANDARD' + poArticol.um = 'BUC' + poArticol.proc_tvav = 1.21 && cota standard 21% + poArticol.preturi_cu_tva = 0 + + poDate = CREATEOBJECT('Empty') + =ADDPROPERTY(poDate, 'tip', 1) + =ADDPROPERTY(poDate, 'in_valuta', 0) + + goDlg = CREATEOBJECT('frm_articol_factura', 1, .F.) + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + goDlg.Clb_pretftva.tx_suma_nat.Value = 100 + goDlg.Clb_pretftva.tx_suma_nat.InteractiveChange() + DOEVENTS FORCE + DO HarnessStep WITH 4, 'cota standard 21%: pretftva=100 -> tva/pretctva' + DO VerificaNumeric WITH 'S3a cota 21%: tva', poArticol.tva, 21, 0.005 + DO VerificaNumeric WITH 'S3a cota 21%: pretctva', poArticol.pretctva, 121, 0.005 + goDlg.Hide() + DOEVENTS FORCE + + poArticol = CREATEOBJECT('Empty') + FOR lnI = 1 TO ALEN(laPropN) + =ADDPROPERTY(poArticol, laPropN(lnI), 0) + ENDFOR + =ADDPROPERTY(poArticol, 'vvaldiminuatctva', 0) + FOR lnI = 1 TO ALEN(laPropC) + =ADDPROPERTY(poArticol, laPropC(lnI), '') + ENDFOR + poArticol.id_articol = 1004 + poArticol.Id_Pol = 1 + poArticol.Cont = '707' + poArticol.id_gestiune = 1 + poArticol.gestionabil = 1 + poArticol.tip_valuta = 0 + poArticol.Curs = 1 + poArticol.multiplicator = 1 + poArticol.cantitate = 1 + poArticol.codmat = 'ART003B' + poArticol.denumire = 'ARTICOL TEST COTA REDUSA' + poArticol.um = 'BUC' + poArticol.proc_tvav = 1.11 && cota redusa 11% + poArticol.preturi_cu_tva = 0 + + poDate = CREATEOBJECT('Empty') + =ADDPROPERTY(poDate, 'tip', 1) + =ADDPROPERTY(poDate, 'in_valuta', 0) + + goDlg = CREATEOBJECT('frm_articol_factura', 1, .F.) + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + goDlg.Clb_pretftva.tx_suma_nat.Value = 100 + goDlg.Clb_pretftva.tx_suma_nat.InteractiveChange() + DOEVENTS FORCE + DO HarnessStep WITH 5, 'cota redusa 11%: pretftva=100 -> tva/pretctva' + DO VerificaNumeric WITH 'S3b cota 11%: tva', poArticol.tva, 11, 0.005 + DO VerificaNumeric WITH 'S3b cota 11%: pretctva', poArticol.pretctva, 111, 0.005 + goDlg.Hide() + DOEVENTS FORCE + + *========================= SCENARIU 4: discount unitar cu TVA (ramura discountctva) ========= + poArticol = CREATEOBJECT('Empty') + FOR lnI = 1 TO ALEN(laPropN) + =ADDPROPERTY(poArticol, laPropN(lnI), 0) + ENDFOR + =ADDPROPERTY(poArticol, 'vvaldiminuatctva', 0) + FOR lnI = 1 TO ALEN(laPropC) + =ADDPROPERTY(poArticol, laPropC(lnI), '') + ENDFOR + poArticol.id_articol = 1005 + poArticol.Id_Pol = 1 + poArticol.Cont = '707' + poArticol.id_gestiune = 1 + poArticol.gestionabil = 1 + poArticol.tip_valuta = 0 + poArticol.Curs = 1 + poArticol.multiplicator = 1 + poArticol.cantitate = 1 + poArticol.codmat = 'ART004' + poArticol.denumire = 'ARTICOL TEST DISCOUNT CU TVA' + poArticol.um = 'BUC' + poArticol.proc_tvav = 1.21 + poArticol.preturi_cu_tva = 1 && bifa pornita - ramura discountctva e cea activa + + poDate = CREATEOBJECT('Empty') + =ADDPROPERTY(poDate, 'tip', 1) + =ADDPROPERTY(poDate, 'in_valuta', 0) + + goDlg = CREATEOBJECT('frm_articol_factura', 1, .F.) + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + goDlg.Clb_pretctva.tx_suma_nat.Value = 100 + goDlg.Clb_pretctva.tx_suma_nat.InteractiveChange() + DOEVENTS FORCE + + *-- utilizatorul tasteaza 10.00 discount unitar cu TVA (Valid, cu When intai - ca la focus real) + goDlg.Clb_discountctva.tx_suma_nat.When() + goDlg.Clb_discountctva.tx_suma_nat.Value = 10 + goDlg.Clb_discountctva.tx_suma_nat.Valid() + DOEVENTS FORCE + DO HarnessStep WITH 6, 'discount unitar cu TVA = 10, pret 100, cant 1' + DO VerificaNumeric WITH 'S4 discount_unitar_ctva pastrat', poArticol.discount_unitar_ctva, 10, 0.005 + DO VerificaNumeric WITH 'S4 total diminuat cu TVA (valdiminuatctva)', poArticol.valdiminuatctva, 90, 0.005 + DO AfLog WITH 'S4 comparatie: fara discount (scenariul 1) valctva=100.00, cu discount 10 -> valdiminuatctva=' + TRANSFORM(poArticol.valdiminuatctva) + goDlg.Hide() + DOEVENTS FORCE + + *========================= SCENARIU 5: bifa ACTIVA pe tip din Inlist ========================= + poArticol = CREATEOBJECT('Empty') + FOR lnI = 1 TO ALEN(laPropN) + =ADDPROPERTY(poArticol, laPropN(lnI), 0) + ENDFOR + =ADDPROPERTY(poArticol, 'vvaldiminuatctva', 0) + FOR lnI = 1 TO ALEN(laPropC) + =ADDPROPERTY(poArticol, laPropC(lnI), '') + ENDFOR + poArticol.id_articol = 1006 + poArticol.Id_Pol = 1 + poArticol.Cont = '707' + poArticol.id_gestiune = 1 + poArticol.gestionabil = 1 + poArticol.tip_valuta = 0 + poArticol.Curs = 1 + poArticol.multiplicator = 1 + poArticol.cantitate = 1 + poArticol.codmat = 'ART005' + poArticol.denumire = 'ARTICOL TEST BIFA ACTIVA' + poArticol.um = 'BUC' + poArticol.proc_tvav = 1.21 + poArticol.preturi_cu_tva = 0 + poArticol.pretftva = 0 && pret zero - irelevant, tip 1 activeaza bifa oricum + + poDate = CREATEOBJECT('Empty') + =ADDPROPERTY(poDate, 'tip', 1) && 1 = lista de preturi, IN Inlist(1,5,10,22,23,25,29,41) + =ADDPROPERTY(poDate, 'in_valuta', 0) + + goDlg = CREATEOBJECT('frm_articol_factura', 1, .F.) + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO HarnessStep WITH 7, 'tip=1 (Inlist) -> bifa trebuie activa (Enabled=.T.)' + DO VerificaLogic WITH 'S5 bifa ACTIVA pe tip din Inlist', goDlg.ck_pret_cu_tva.Enabled, .T. + goDlg.Hide() + DOEVENTS FORCE + + *========================= SCENARIU 6: bifa DEZACTIVATA pe tip din afara listei ========= + poArticol = CREATEOBJECT('Empty') + FOR lnI = 1 TO ALEN(laPropN) + =ADDPROPERTY(poArticol, laPropN(lnI), 0) + ENDFOR + =ADDPROPERTY(poArticol, 'vvaldiminuatctva', 0) + FOR lnI = 1 TO ALEN(laPropC) + =ADDPROPERTY(poArticol, laPropC(lnI), '') + ENDFOR + poArticol.id_articol = 1007 + poArticol.Id_Pol = 1 + poArticol.Cont = '707' + poArticol.id_gestiune = 1 + poArticol.gestionabil = 1 + poArticol.tip_valuta = 0 + poArticol.Curs = 1 + poArticol.multiplicator = 1 + poArticol.cantitate = 1 + poArticol.codmat = 'ART006' + poArticol.denumire = 'ARTICOL TEST BIFA DEZACTIVATA' + poArticol.um = 'BUC' + poArticol.proc_tvav = 1.21 + poArticol.preturi_cu_tva = 0 + poArticol.pretftva = 50 && pret NENUL - conditie ceruta ca bifa sa ramana dezactivata + + poDate = CREATEOBJECT('Empty') + =ADDPROPERTY(poDate, 'tip', 3) && 3 = comanda, NU e in Inlist(1,5,10,22,23,25,29,41) + =ADDPROPERTY(poDate, 'in_valuta', 0) + + goDlg = CREATEOBJECT('frm_articol_factura', 1, .F.) + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO HarnessStep WITH 8, 'tip=3 (afara Inlist), pret nenul -> bifa trebuie dezactivata' + DO VerificaLogic WITH 'S6 bifa DEZACTIVATA pe tip din afara listei, pret nenul', goDlg.ck_pret_cu_tva.Enabled, .F. + goDlg.Hide() + DOEVENTS FORCE + + DO AfLog WITH 'GATA - toate scenariile Nivel 1 executate' + DO HarnessStep WITH 9, 'final' + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO AfLog WITH 'CATCH ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO HarnessDone WITH 'done-error' +ENDTRY + +QUIT + +*================================================================================== +PROCEDURE VerificaNumeric + LPARAMETERS tcEticheta, tnObtinut, tnAsteptat, tnToleranta + LOCAL lcMsg + IF ABS(NVL(tnObtinut,-999999) - tnAsteptat) < tnToleranta + lcMsg = 'PASS ' + tcEticheta + ': ' + TRANSFORM(tnObtinut) + ' (asteptat ' + TRANSFORM(tnAsteptat) + ')' + ELSE + lcMsg = 'FAIL ' + tcEticheta + ': obtinut=' + TRANSFORM(tnObtinut) + ' asteptat=' + TRANSFORM(tnAsteptat) + ENDIF + DO AfLog WITH lcMsg +ENDPROC + +PROCEDURE VerificaLogic + LPARAMETERS tcEticheta, tlObtinut, tlAsteptat + LOCAL lcMsg + IF tlObtinut = tlAsteptat + lcMsg = 'PASS ' + tcEticheta + ': ' + TRANSFORM(tlObtinut) + ' (asteptat ' + TRANSFORM(tlAsteptat) + ')' + ELSE + lcMsg = 'FAIL ' + tcEticheta + ': obtinut=' + TRANSFORM(tlObtinut) + ' asteptat=' + TRANSFORM(tlAsteptat) + ENDIF + DO AfLog WITH lcMsg +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO AfLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_dialog.ps1 b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_dialog.ps1 new file mode 100644 index 0000000..45789c2 --- /dev/null +++ b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_dialog.ps1 @@ -0,0 +1,10 @@ +# test_pret_cu_tva_dialog.ps1 - wrapper peste harness-ul generic pentru testul frm_articol_factura +# (S5, plan #7 - pret_cu_tva). Rulare: powershell -ExecutionPolicy Bypass -File test_pret_cu_tva_dialog.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_pret_cu_tva_dialog.prg') ` + -Steps @('mediu','tinta_100', 'comutare_on', 'comutare_off', 'cota_21', 'cota_11', 'discount', 'bifa_activa', 'bifa_dezactivata', 'final') ` + -ShotsDir (Join-Path $Teste 'screenshots') ` + -SyncDir (Join-Path $Teste 'uisync') ` + -StepTimeoutSec 60 diff --git a/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel2.prg b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel2.prg new file mode 100644 index 0000000..1600262 --- /dev/null +++ b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel2.prg @@ -0,0 +1,630 @@ +* test_pret_cu_tva_nivel2.prg +* Test UI Nivel 2 (S5, plan #7) pentru fluxul COMPLET prin frm_facturare_articole - cazurile 6 si 8 +* din task. Foloseste mecanismul validat in test_modal_unlock_smoketest2.prg (Timer pe _SCREEN + +* _SCREEN.Forms + Controls(i)) ca sa conduca dialogul frm_articol_factura, deschis cu Show(1) +* hardcodat in do_adauga_articol/do_modifica (frm_facturare_articole, ofacturare.vc2). +* +* Flux REAL, nu populare directa: articolul intra in crsfactura prin But_urmator1.Click() -> +* do_urmator() -> do_adauga_articol() (cazul 6); modificarea trece prin But_modifica1.Click() / +* grd_factura.DblClick() -> do_modifica() (cazul 8). crsarticole si crsfactura au structura REALA +* (creeaza_facturacrs, aceleasi campuri ca in productie), fara Oracle. +* +* Cazuri: +* PAS 0: grid gol - But_modifica1.Click() si grd_factura.DblClick() nu fac nimic, fara eroare. +* PAS 1 (caz 6): adaugare cu bifa schimbata fata de politica (policy=0, user seteaza 1, pret cu +* TVA=100) -> crsfactura.cu_tva=1, valctva=100.00 exact. +* PAS 2 (caz 8a): modificare - But_modifica1 redeschide dialogul pe randul adaugat, comuta bifa +* OFF, tasteaza pret fara TVA=60 -> acelasi rand actualizat (cu_tva=0, valctva=72.60). +* PAS 3 (caz 8b): modificare prin grd_factura.DblClick() (al doilea canal, acelasi rezultat) - +* schimba pretul cu TVA la 200, bifa ramane ON dupa pasul anterior... de fapt pasul 2 a +* lasat bifa OFF, deci verifica ramura fara TVA din nou, cu alta valoare. +* PAS 4 (caz 8c): Renunta - deschide dialogul, schimba o valoare, apasa Renunta -> randul ramane +* BIT-IDENTIC (comparat camp cu camp fata de starea dinainte). + +SET SAFETY OFF +SET TALK OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcUILog, gcSyncDir +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_pret_cu_tva\test_pret_cu_tva_nivel2_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_pret_cu_tva\uisync_nivel2\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + LOCAL gcAppPath, lcPath + gcAppPath = "D:\ROA\ROAFACTURARE\" + SET DEFAULT TO (gcAppPath) + + lcPath = gcAppPath + 'Date;' + gcAppPath + 'Include;' + gcAppPath + 'FERESTRE;' + ; + gcAppPath + 'GRAFICE;' + gcAppPath + 'CLASE;' + gcAppPath + 'MENIURI;' + ; + gcAppPath + 'PROGRAME;' + gcAppPath + 'RAPOARTE;' + gcAppPath + 'COMUN;' + ; + gcAppPath + 'COMUN\CLASE;' + gcAppPath + 'COMUN\FERESTRE;' + gcAppPath + 'COMUN\PROGRAME;' + ; + gcAppPath + 'COMUN\GRAFICE;' + gcAppPath + 'COMUN\RAPOARTE;' + ; + gcAppPath + 'COMUN\UTILE\CALENDAR;' + gcAppPath + 'COMUN\UTILE\CTL32;' + ; + gcAppPath + 'COMUN\UTILE\HPDF;' + gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ; + gcAppPath + 'COMUN\UTILE\WEB;' + gcAppPath + 'COMUN\UTILE\EMAIL;' + ; + gcAppPath + 'COMUN\UTILE\NFJSON;' + gcAppPath + 'COMUN\UTILE\NFXML;' + ; + ADDBS(SUBSTR(gcAppPath,1,RAT([\],gcAppPath,2)))+[COMUNROA\] + SET PATH TO &lcPath ADDITIVE + DO AfLog WITH 'SET PATH OK' + + *----- CLASE (lista dovedita de suita Nivel 1 - mediul unei suite noi se mosteneste din suita + * care TRECE, nu dintr-un smoke-test) ----- + SET CLASSLIB TO (gcAppPath + "comun\clase\appwiz") ADDITIVE + SET CLASSLIB TO registry ADDITIVE + SET CLASSLIB TO cauta_alfa_forms ADDITIVE + SET CLASSLIB TO ofacturare.vcx ADDITIVE + SET CLASSLIB TO ofacturare_comun.vcx ADDITIVE + SET CLASSLIB TO accessibility.vcx ADDITIVE + SET CLASSLIB TO ocriterii.vcx ADDITIVE + SET CLASSLIB TO ctl32_statusbar.vcx ADDITIVE + SET CLASSLIB TO ctl32_common.vcx ADDITIVE + SET CLASSLIB TO ctl32_structs.vcx ADDITIVE + SET CLASSLIB TO ctl32_progressbar.vcx ADDITIVE + SET CLASSLIB TO DECABAZA ADDITIVE + SET CLASSLIB TO onomenclatoare ADDITIVE + SET CLASSLIB TO onomenclatoare2 ADDITIVE + SET CLASSLIB TO ofacturare_rapoarte ADDITIVE + SET CLASSLIB TO orapoarte ADDITIVE + SET CLASSLIB TO ferestre_oracle ADDITIVE + SET CLASSLIB TO messagebox ADDITIVE + SET CLASSLIB TO otoolbar ADDITIVE + SET CLASSLIB TO onom_curs ADDITIVE + SET CLASSLIB TO comun ADDITIVE + SET CLASSLIB TO ferestre_cere_date ADDITIVE + SET CLASSLIB TO baza ADDITIVE + SET CLASSLIB TO caut ADDITIVE + SET CLASSLIB TO ointroduceri ADDITIVE + SET CLASSLIB TO serii_numere ADDITIVE + SET CLASSLIB TO caut_ora ADDITIVE + SET CLASSLIB TO wwdialogs.vcx ADDITIVE + SET CLASSLIB TO _calendar.vcx ADDITIVE + SET CLASSLIB TO locale ADDITIVE + SET CLASSLIB TO overificari ADDITIVE + SET CLASSLIB TO ocomenzi ADDITIVE + DO AfLog WITH 'SET CLASSLIB OK' + + *----- PROCEDURI (mock amessagebox PRIMUL, ui_harness la final) ----- + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" + SET PROCEDURE TO proceduri_comune ADDITIVE + SET PROCEDURE TO quitapp ADDITIVE + SET PROCEDURE TO init_program ADDITIVE + SET PROCEDURE TO onomenclatoare.prg ADDITIVE + SET PROCEDURE TO onomenclatoare2.prg ADDITIVE + SET PROCEDURE TO oproceduri_rapoarte_fact.prg ADDITIVE + SET PROCEDURE TO email.prg ADDITIVE + SET PROCEDURE TO GENCURSOR.PRG ADDITIVE + SET PROCEDURE TO OPROCEDURI_COMUNE.PRG ADDITIVE + SET PROCEDURE TO OINIT_OPTIUNI.PRG ADDITIVE + SET PROCEDURE TO updateserver.PRG ADDITIVE + SET PROCEDURE TO OPROCEDURI_aMS.PRG ADDITIVE + SET PROCEDURE TO ocautare ADDITIVE + SET PROCEDURE TO odocumente ADDITIVE + SET PROCEDURE TO osecurity ADDITIVE + SET PROCEDURE TO acces_meniu ADDITIVE + SET PROCEDURE TO wwxmlhttp.prg ADDITIVE + SET PROCEDURE TO wwcodeupdate.prg ADDITIVE + SET PROCEDURE TO ini.prg ADDITIVE + SET PROCEDURE TO cauta_alfa.prg ADDITIVE + SET PROCEDURE TO oHeader.prg ADDITIVE + SET PROCEDURE TO oproceduri_curs.prg ADDITIVE + SET PROCEDURE TO proceduri.prg ADDITIVE + SET PROCEDURE TO oproceduri_facturare.prg ADDITIVE + SET PROCEDURE TO proceduri_rapoarte.prg ADDITIVE + SET PROCEDURE TO ofacturare.prg ADDITIVE + SET PROCEDURE TO oserii_numere.prg ADDITIVE + SET PROCEDURE TO wwutils.prg ADDITIVE + SET PROCEDURE TO wwConfig.prg ADDITIVE + SET PROCEDURE TO wwApi.prg ADDITIVE + SET PROCEDURE TO oexport.prg ADDITIVE + SET PROCEDURE TO validare.prg ADDITIVE + SET PROCEDURE TO ofacturare_comun.prg ADDITIVE + SET PROCEDURE TO ofacturare_stoc.prg ADDITIVE + SET PROCEDURE TO pmenu.prg ADDITIVE + SET PROCEDURE TO ointroduceri.prg ADDITIVE + SET PROCEDURE TO ovariabile_globale.prg ADDITIVE + SET PROCEDURE TO ooperatii_comune.prg ADDITIVE + SET PROCEDURE TO oproceduri_util.prg ADDITIVE + SET PROCEDURE TO filebringer.prg ADDITIVE + SET PROCEDURE TO iniacces.prg ADDITIVE + SET PROCEDURE TO oupdate.prg ADDITIVE + SET PROCEDURE TO procese.prg ADDITIVE + SET PROCEDURE TO version.prg ADDITIVE + SET PROCEDURE TO wwhttp.prg ADDITIVE + SET PROCEDURE TO xmlaccess.prg ADDITIVE + SET PROCEDURE TO xmlparser.prg ADDITIVE + SET PROCEDURE TO xdate.prg ADDITIVE + SET PROCEDURE TO suma_in_vorbe.prg ADDITIVE + SET PROCEDURE TO controllerecr ADDITIVE + SET PROCEDURE TO regex.prg ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE + DO AfLog WITH 'SET PROCEDURE OK' + + *----- Globale aplicatie ----- + PUBLIC gnPc, gnPVal, gnPcant, gnPPretV, gnScadereStoc, gnMemProcDisc, gl406, gcAcces + PUBLIC gnModTotFact, gnRF_FACTURARE_FARA_STOC + *-- gnModTotFact/gnRF_FACTURARE_FARA_STOC: lista completa a globalelor de aplicatie cerute de + *-- Init/do_adauga_articol/do_modifica/do_verifica_articol/do_initializeaza_articol (extrasa cu + *-- vfp_symbols.ps1 -Class frm_facturare_articole, identificatori g[nlc]\w+), restul deja + *-- prezente in mediu. Puse pe 0 (implicit prudent) ca sa NU activeze ramuri neintentionate - + *-- gnModTotFact=1 ar intra pe modificarea totalului facturii, gnRF_FACTURARE_FARA_STOC=1 pe + *-- facturare fara stoc; niciuna nu e ce se testeaza aici. NVL() nu apara de variabila + *-- nedeclarata, doar de valoare NULL - trebuie sa existe. + gnModTotFact = 0 + gnRF_FACTURARE_FARA_STOC = 0 + *-- gnPPret/gnPPretVal: presupuse (nu exista in cod - vin din configuratia Oracle citita la + *-- pornirea reala; ceruta de creeaza_facturacrs, ofacturare_comun.prg:1770, neintalnita la + *-- Nivel 1 care nu atinge acel cursor). Ating DOAR pret_achizitie/pretd (max(...,4)) - niciun + *-- camp verificat de testele de mai jos (pretftva/pretctva/valftva/valtva/valctva folosesc + *-- gnPPretV+gnPc, deja corecte). precizie_max_pret_vz e #define=6 in acelasi fisier, nu + *-- variabila - nu se declara aici. + PUBLIC gnPPret, gnPPretVal + gnPc = 2 + gnPVal = 2 + gnPcant = 3 + gnPPretV = 4 + gnPPret = 4 + gnPPretVal = 4 + gnScadereStoc = 0 && bypass complet logica de stoc (do_alege_stoc nu se apeleaza) + gnMemProcDisc = 0 + gl406 = .F. + gcAcces = "1;2;3;4;5;6;7;8;" + PUBLIC nror(65000) + + PUBLIC goApp, goExport, goExecutor + goApp = CREATEOBJECT('dummyapp') + goExport = CREATEOBJECT('dummyexport') + goExecutor = CREATEOBJECT('dummyexecutor') + + IF USED('jtva_coloane') + USE IN ('jtva_coloane') + ENDIF + CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2)) + INSERT INTO jtva_coloane VALUES (1, 'TVA 21%', 21) + INSERT INTO jtva_coloane VALUES (2, 'TVA 11%', 11) + GO TOP IN jtva_coloane + + IF USED('saft_taxtable') + USE IN ('saft_taxtable') + ENDIF + CREATE CURSOR saft_taxtable (taxname C(250), procent_taxa N(7,2), taxcode N(6), tva_livrari N(1)) + INSERT INTO saft_taxtable VALUES ('301104-Achizitii de bunuri si servicii taxabile cu cota de 21%', 21, 301104, 1) + INSERT INTO saft_taxtable VALUES ('3011XX-Achizitii de bunuri si servicii taxabile cu cota de 11%', 11, 301108, 1) + + *----- crsfactura: structura REALA, fara Oracle (creeaza_facturacrs, ofacturare_comun.prg:1770) ----- + DO creeaza_facturacrs WITH 'crsfactura' + DO AfLog WITH 'crsfactura creat, Reccount=' + TRANSFORM(RECCOUNT('crsfactura')) + + *----- crsarticole: sursa (stoc/lista de preturi) - RecordSource al grd_articole. Campuri + * alese ca sa acopere atat coloanele gridului (denumire, gestionabil, codmat, pret, + * cantitate, preturi_cu_tva, pret_val, nume_val, nume_lista_preturi, serie, codbare) cat + * si tot ce Scatter+do_initializeaza_articol au nevoie (restul, verificat din cod). ----- + IF USED('crsarticole') + USE IN ('crsarticole') + ENDIF + CREATE CURSOR crsarticole (id_articol N(10), Id_Pol N(10), id_gestiune N(10), denumire C(100), ; + codmat C(50), codbare C(50), gestionabil N(1), cantitate N(18,4), pret N(18,4), ; + pret_val N(18,4), preturi_cu_tva N(1), proc_tvav N(18,4), discount_unitar N(18,4), ; + discount_unitar_val N(18,4), pret_achizitie N(18,4), tip_valuta N(1), Curs N(18,4), ; + multiplicator N(10,4), Cont C(10), um C(10), serie C(30), lot C(30), explicatie C(200), ; + opt_facturare N(3), id_ctr N(10), numar_contract C(50), pretd N(18,4), id_valuta N(10), ; + nume_val C(20), nume_lista_preturi C(100), id_jtva_coloana N(10), taxcode N(6), id_c N(10)) + INSERT INTO crsarticole (id_articol, Id_Pol, id_gestiune, denumire, codmat, codbare, ; + gestionabil, cantitate, pret, pret_val, preturi_cu_tva, proc_tvav, discount_unitar, ; + discount_unitar_val, pret_achizitie, tip_valuta, Curs, multiplicator, Cont, um, serie, ; + lot, explicatie, opt_facturare, id_ctr, numar_contract, pretd, id_valuta, nume_val, ; + nume_lista_preturi, id_jtva_coloana, taxcode, id_c) ; + VALUES (2001, 1, 1, 'ARTICOL NIVEL2', 'ART2001', '', ; + 0, 100, 50, 0, 0, 1.21, 0, ; + 0, 0, 0, 1, 1, '707', 'BUC', '', ; + '', '', 0, 0, '', 0, 0, '', ; + 'LISTA TEST', 1, 0, 1) + GO TOP IN crsarticole + DO AfLog WITH 'crsarticole creat, Reccount=' + TRANSFORM(RECCOUNT('crsarticole')) + + *----- poDate: clasa REALA oDateFactura (ofacturare_comun.prg:99, deja incarcata prin SET + * PROCEDURE), nu obiect Empty umplut manual - are toate proprietatile cu valorile + * implicite de productie (inclusiv discount_evidentiat=0). PRIVATE la nivel de PROGRAM + * PRINCIPAL, vizibil (scoping VFP) in tot lantul apelat mai jos (frm_facturare_articole, + * do_adauga_articol, do_modifica, frm_articol_factura) - la fel ca in productie + * (Procedure factureaza, ofacturare.prg:95). Constructia ramane INLINE in main (capcana l). ----- + PRIVATE poDate + poDate = CREATEOBJECT('oDateFactura') + poDate.tip = 1 && 1 = facturare pe baza de lista de preturi + poDate.serie_act = 'TST' + poDate.nract = 1 + DO AfLog WITH 'poDate pregatit (oDateFactura), tip=' + TRANSFORM(poDate.tip) + + *----- driverul de deblocare Show(1): Timer la nivel _SCREEN + _SCREEN.Forms + Controls(i), + * mecanism validat in test_modal_unlock_smoketest2.prg (PASS). gcCazAct selecteaza + * interactiunea de aplicat la fiecare dialog nou detectat. ----- + PUBLIC goDriver, gnDriverTick, glDlgTratat, gcCazAct + gnDriverTick = 0 + glDlgTratat = .F. + gcCazAct = '' + goDriver = CREATEOBJECT('driverdeblocare3') + _SCREEN.AddObject('tmrDrvN2', 'Timer') + _SCREEN.tmrDrvN2.Interval = 200 + BINDEVENT(_SCREEN.tmrDrvN2, 'Timer', goDriver, 'Executa') + _SCREEN.tmrDrvN2.Enabled = .T. + DO AfLog WITH 'driver+timer pregatiti' + + *----- Desktop VFP vizibil, ca la celelalte suite UI ----- + _SCREEN.Visible = .T. + _SCREEN.WindowState = 2 + _SCREEN.Caption = 'TEST UI Nivel 2 (cazurile 6 si 8)' + + PUBLIC goFrm + goFrm = CREATEOBJECT('frm_facturare_articole') + goFrm.WindowType = 0 && testul instantiaza direct - modeless, Show() revine imediat + goFrm.Show() + goFrm.WindowState = 2 + DOEVENTS FORCE + DO AfLog WITH 'frm_facturare_articole afisat modeless, Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + + DO HarnessStep WITH 0, 'formular afisat, grid gol' + + *========================= PAS 0: grid gol - But_modifica1/DblClick nu fac nimic ========= + LOCAL lnRecFataDe0 + lnRecFataDe0 = RECCOUNT('crsfactura') + goFrm.But_modifica1.Click() + DOEVENTS FORCE + IF RECCOUNT('crsfactura') = lnRecFataDe0 + DO UILog WITH 'PASS P0a But_modifica1 pe grid gol: nu a modificat Reccount (' + TRANSFORM(RECCOUNT('crsfactura')) + ')' + ELSE + DO UILog WITH 'FAIL P0a But_modifica1 pe grid gol: Reccount a devenit ' + TRANSFORM(RECCOUNT('crsfactura')) + ENDIF + goFrm.grd_factura.DblClick() + DOEVENTS FORCE + IF RECCOUNT('crsfactura') = lnRecFataDe0 + DO UILog WITH 'PASS P0b grd_factura.DblClick pe grid gol: nu a modificat Reccount' + ELSE + DO UILog WITH 'FAIL P0b grd_factura.DblClick pe grid gol: Reccount a devenit ' + TRANSFORM(RECCOUNT('crsfactura')) + ENDIF + DO HarnessStep WITH 1, 'P0 grid gol verificat' + + *========================= PAS 1 (CAZUL 6): adaugare cu bifa schimbata ========================= + *-- politica implicita (crsarticole.preturi_cu_tva=0, fara TVA) - userul o schimba in dialog la + *-- 1 (cu TVA), tasteaza pret cu TVA=100, cantitate=1 (zerorizata de do_initializeaza_articol + *-- pt. tip=1, se completeaza in dialog, ca la fluxul real). + SELECT crsarticole + GO TOP + gcCazAct = 'CASE6' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_urmator1.Click() + DOEVENTS FORCE + LOCAL lnWait + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa But_urmator1: glDlgTratat=' + TRANSFORM(glDlgTratat) + ' Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + + IF RECCOUNT('crsfactura') = 1 + SELECT crsfactura + GO TOP + IF cu_tva = 1 AND ABS(valctva - 100) < 0.01 + DO UILog WITH 'PASS P1 CAZUL 6: cu_tva=' + TRANSFORM(cu_tva) + ' valctva=' + TRANSFORM(valctva) + ' (asteptat cu_tva=1 valctva=100)' + ELSE + DO UILog WITH 'FAIL P1 CAZUL 6: cu_tva=' + TRANSFORM(cu_tva) + ' valctva=' + TRANSFORM(valctva) + ' (asteptat cu_tva=1 valctva=100)' + ENDIF + DO UILog WITH 'P1 cifre complete: pretftva=' + TRANSFORM(pretftva) + ' pretctva=' + TRANSFORM(pretctva) + ' valftva=' + TRANSFORM(valftva) + ' valtva=' + TRANSFORM(valtva) + ELSE + DO UILog WITH 'FAIL P1 CAZUL 6: Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ' (asteptat 1) - articolul nu a fost adaugat' + ENDIF + DO HarnessStep WITH 2, 'P1 caz 6 propagare: Reccount=' + TRANSFORM(RECCOUNT('crsfactura')) + + *========================= PAS 2 (CAZUL 8a): modificare prin But_modifica1 ========================= + *-- comuta bifa OFF (fara TVA), tasteaza pret fara TVA=60 -> valctva asteptat 60*1.21=72.60 + IF RECCOUNT('crsfactura') = 1 + gcCazAct = 'CASE8_MOD_OFF' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_modifica1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa But_modifica1 (P2): glDlgTratat=' + TRANSFORM(glDlgTratat) + + SELECT crsfactura + GO TOP + IF cu_tva = 0 AND ABS(valctva - 72.6) < 0.01 + DO UILog WITH 'PASS P2 CAZUL 8a (But_modifica1): cu_tva=' + TRANSFORM(cu_tva) + ' valctva=' + TRANSFORM(valctva) + ' (asteptat cu_tva=0 valctva=72.60)' + ELSE + DO UILog WITH 'FAIL P2 CAZUL 8a (But_modifica1): cu_tva=' + TRANSFORM(cu_tva) + ' valctva=' + TRANSFORM(valctva) + ' (asteptat cu_tva=0 valctva=72.60)' + ENDIF + ELSE + DO UILog WITH 'NEACOPERIT P2: nu exista randul din P1 (Reccount=' + TRANSFORM(RECCOUNT('crsfactura')) + ')' + ENDIF + DO HarnessStep WITH 3, 'P2 caz 8a modificare But_modifica1' + + *========================= PAS 3 (CAZUL 8b): modificare prin grd_factura.DblClick() ========= + *-- al doilea canal cerut de task - schimba pretul cu TVA la 200, bifa ON + IF RECCOUNT('crsfactura') = 1 + gcCazAct = 'CASE8_MOD_ON' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.grd_factura.DblClick() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa grd_factura.DblClick (P3): glDlgTratat=' + TRANSFORM(glDlgTratat) + + SELECT crsfactura + GO TOP + IF cu_tva = 1 AND ABS(valctva - 200) < 0.01 + DO UILog WITH 'PASS P3 CAZUL 8b (DblClick): cu_tva=' + TRANSFORM(cu_tva) + ' valctva=' + TRANSFORM(valctva) + ' (asteptat cu_tva=1 valctva=200)' + ELSE + DO UILog WITH 'FAIL P3 CAZUL 8b (DblClick): cu_tva=' + TRANSFORM(cu_tva) + ' valctva=' + TRANSFORM(valctva) + ' (asteptat cu_tva=1 valctva=200)' + ENDIF + ELSE + DO UILog WITH 'NEACOPERIT P3: nu exista randul (Reccount=' + TRANSFORM(RECCOUNT('crsfactura')) + ')' + ENDIF + DO HarnessStep WITH 4, 'P3 caz 8b modificare DblClick' + + *========================= PAS 4 (CAZUL 8c): Renunta - randul ramane BIT-IDENTIC ========= + *-- SCATTER TO array (nu AFIELDS - AFIELDS umple un tablou de METADATE si intoarce un numar, + *-- nu e o colectie FOR EACH) captureaza VALORILE campurilor din randul curent, memo inclusiv. + IF RECCOUNT('crsfactura') = 1 + LOCAL ARRAY laSnapDinainte[1] + LOCAL lnF, lnCampuri + SELECT crsfactura + GO TOP + SCATTER TO laSnapDinainte + + gcCazAct = 'CASE8_RENUNTA' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_modifica1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa But_modifica1 (P4, Renunta): glDlgTratat=' + TRANSFORM(glDlgTratat) + + LOCAL ARRAY laSnapDupa[1] + SELECT crsfactura + GO TOP + SCATTER TO laSnapDupa + + LOCAL llIdentic + llIdentic = (ALEN(laSnapDinainte,1) == ALEN(laSnapDupa,1)) + lnCampuri = 0 + IF llIdentic + FOR lnF = 1 TO ALEN(laSnapDinainte,1) + lnCampuri = lnCampuri + 1 + IF !(TRANSFORM(laSnapDinainte(lnF)) == TRANSFORM(laSnapDupa(lnF))) + llIdentic = .F. + DO AfLog WITH 'P4 diagnostic - campul ' + TRANSFORM(lnF) + ' difera: [' + ; + TRANSFORM(laSnapDinainte(lnF)) + '] -> [' + TRANSFORM(laSnapDupa(lnF)) + ']' + ENDIF + ENDFOR + ENDIF + + IF llIdentic + DO UILog WITH 'PASS P4 CAZUL 8c Renunta: randul ramane BIT-IDENTIC (' + TRANSFORM(lnCampuri) + ' campuri comparate)' + ELSE + DO UILog WITH 'FAIL P4 CAZUL 8c Renunta: randul S-A MODIFICAT desi s-a apasat Renunta (vezi diag pe campuri mai sus)' + ENDIF + ELSE + DO UILog WITH 'NEACOPERIT P4: nu exista randul (Reccount=' + TRANSFORM(RECCOUNT('crsfactura')) + ')' + ENDIF + DO HarnessStep WITH 5, 'P4 caz 8c Renunta' + + *========================= PAS 5 (CAZUL 11, rec_s2c): crestere cantitate pe tip FARA verificare + *========================= de stoc -> acceptata neconditionat (plafonul exista dar nu se verifica) + *-- tip=1 nu e in Inlist(poDate.tip,4,21,23,28,42,47) din inainte_de_do_termin, deci cresterea + *-- cantitatii nu are plafon real - verifica ca S2c (recalcularea plafonului pt. tipurile CU + *-- stoc) nu a introdus vreo restrictie neintentionata pe tipurile FARA verificare. + IF RECCOUNT('crsfactura') = 1 + gcCazAct = 'CASE11_CANTITATE' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_modifica1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa But_modifica1 (P5, caz 11): glDlgTratat=' + TRANSFORM(glDlgTratat) + + SELECT crsfactura + GO TOP + IF ABS(cantitate - 50) < 0.001 + DO UILog WITH 'PASS P5 CAZUL 11 (rec_s2c): crestere cantitate pe tip fara verificare de stoc acceptata: cantitate=' + TRANSFORM(cantitate) + ' (asteptat 50)' + ELSE + DO UILog WITH 'FAIL P5 CAZUL 11 (rec_s2c): cantitate=' + TRANSFORM(cantitate) + ' (asteptat 50) - crestere respinsa sau neaplicata' + ENDIF + ELSE + DO UILog WITH 'NEACOPERIT P5: nu exista randul (Reccount=' + TRANSFORM(RECCOUNT('crsfactura')) + ')' + ENDIF + DO HarnessStep WITH 6, 'P5 caz 11 plafon - final' + + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO AfLog WITH 'CATCH ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO HarnessDone WITH 'done-error' +ENDTRY + +QUIT + +*================================================================================== +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO AfLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +PROCEDURE UILog + LPARAMETERS tcMsg + DO AfLog WITH tcMsg +ENDPROC + +*-- FindCtl: referinta directa la un control prin Controls(i), potrivit dupa .Name - tehnica +*-- validata in test_modal_unlock_smoketest2.prg (accesul cu prefix direct pe o referinta obtinuta +*-- din _SCREEN.Forms a dat eroare 1925 in acel diagnostic; Controls(i) e calea sigura, folosita +*-- consecvent, inclusiv pentru nivelurile imbricate). +PROCEDURE FindCtl + LPARAMETERS toParent, tcName + LOCAL lnI, loGasit + loGasit = .NULL. + FOR lnI = 1 TO toParent.ControlCount + IF UPPER(toParent.Controls(lnI).Name) == UPPER(tcName) + loGasit = toParent.Controls(lnI) + ENDIF + ENDFOR + RETURN loGasit +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexport AS Custom + PROCEDURE citesteSetareRegistru + LPARAMETERS tcCheie + RETURN '' + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(tcCursor) + USE IN (tcCursor) + ENDIF + CREATE CURSOR (tcCursor) (codmatf C(50)) + RETURN 1 + ENDPROC + PROCEDURE oReset + ENDPROC +ENDDEFINE + +DEFINE CLASS driverdeblocare3 AS Custom + PROCEDURE Executa + *-- rulat la fiecare tick al _SCREEN.tmrDrvN2. Cauta FRM_ARTICOL_FACTURA prin _SCREEN.Forms, + *-- aplica interactiunea selectata de gcCazAct (setata de test INAINTE de fiecare click), + *-- si inchide dialogul (do_termin sau do_renunt, dupa caz). + LOCAL lnI, loForm, llGasit + gnDriverTick = gnDriverTick + 1 + llGasit = .F. + FOR lnI = 1 TO _SCREEN.FormCount + IF UPPER(_SCREEN.Forms(lnI).Class) == 'FRM_ARTICOL_FACTURA' + loForm = _SCREEN.Forms(lnI) + llGasit = .T. + ENDIF + ENDFOR + + IF glDlgTratat OR !llGasit + RETURN + ENDIF + + DO AfLog WITH 'driver3 tick ' + TRANSFORM(gnDriverTick) + ' POTRIVIT (caz=' + gcCazAct + '), intru in interactiune' + + LOCAL loBifa, loCantitateCtn, loCantitate, loPretCtvaCtn, loPretCtvaNat, loPretFtvaCtn, loPretFtvaNat, loRenunt + + TRY + DO CASE + CASE gcCazAct == 'CASE6' + loBifa = FindCtl(loForm, 'ck_pret_cu_tva') + loBifa.Value = 1 + loBifa.InteractiveChange() + loCantitateCtn = FindCtl(loForm, 'clb_cantitate') + loCantitate = FindCtl(loCantitateCtn, 'Text_simplu1') + loCantitate.Value = 1 + loCantitate.InteractiveChange() + loPretCtvaCtn = FindCtl(loForm, 'Clb_pretctva') + loPretCtvaNat = FindCtl(loPretCtvaCtn, 'tx_suma_nat') + loPretCtvaNat.Value = 100 + loPretCtvaNat.InteractiveChange() + DO AfLog WITH 'driver3 CASE6: bifa=1 cantitate=1 pretctva=100, apas do_termin()' + loForm.do_termin() + + CASE gcCazAct == 'CASE8_MOD_OFF' + loBifa = FindCtl(loForm, 'ck_pret_cu_tva') + loBifa.Value = 0 + loBifa.InteractiveChange() + loPretFtvaCtn = FindCtl(loForm, 'Clb_pretftva') + loPretFtvaNat = FindCtl(loPretFtvaCtn, 'tx_suma_nat') + loPretFtvaNat.Value = 60 + loPretFtvaNat.InteractiveChange() + DO AfLog WITH 'driver3 CASE8_MOD_OFF: bifa=0 pretftva=60, apas do_termin()' + loForm.do_termin() + + CASE gcCazAct == 'CASE8_MOD_ON' + loBifa = FindCtl(loForm, 'ck_pret_cu_tva') + loBifa.Value = 1 + loBifa.InteractiveChange() + loPretCtvaCtn = FindCtl(loForm, 'Clb_pretctva') + loPretCtvaNat = FindCtl(loPretCtvaCtn, 'tx_suma_nat') + loPretCtvaNat.Value = 200 + loPretCtvaNat.InteractiveChange() + DO AfLog WITH 'driver3 CASE8_MOD_ON: bifa=1 pretctva=200, apas do_termin()' + loForm.do_termin() + + CASE gcCazAct == 'CASE8_RENUNTA' + loPretCtvaCtn = FindCtl(loForm, 'Clb_pretctva') + loPretCtvaNat = FindCtl(loPretCtvaCtn, 'tx_suma_nat') + loPretCtvaNat.Value = 9999 + loPretCtvaNat.InteractiveChange() + loRenunt = FindCtl(loForm, 'But_renunt1') + DO AfLog WITH 'driver3 CASE8_RENUNTA: pretctva tastat 9999, apas But_renunt1 (Renunta)' + loRenunt.Click() + + CASE gcCazAct == 'CASE11_CANTITATE' + loCantitateCtn = FindCtl(loForm, 'clb_cantitate') + loCantitate = FindCtl(loCantitateCtn, 'Text_simplu1') + loCantitate.Value = 50 + loCantitate.InteractiveChange() + DO AfLog WITH 'driver3 CASE11_CANTITATE: cantitate=50 (tip fara verificare de stoc), apas do_termin()' + loForm.do_termin() + + OTHERWISE + DO AfLog WITH 'driver3: gcCazAct necunoscut [' + gcCazAct + ']' + ENDCASE + + glDlgTratat = .T. + DO AfLog WITH 'driver3: interactiune REUSITA pentru caz=' + gcCazAct + CATCH TO loExcDrv + DO AfLog WITH 'driver3: CATCH caz=' + gcCazAct + ' ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ; + ' Message=' + loExcDrv.Message + ' Procedure=' + loExcDrv.Procedure + ; + ' LineNo=' + TRANSFORM(loExcDrv.LineNo) + ' LineContents=[' + loExcDrv.LineContents + ']' + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel2.ps1 b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel2.ps1 new file mode 100644 index 0000000..b835a20 --- /dev/null +++ b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel2.ps1 @@ -0,0 +1,11 @@ +# test_pret_cu_tva_nivel2.ps1 - wrapper peste harness-ul generic pentru testele Nivel 2 +# (cazurile 6 si 8, S5, plan #7). Rulare: powershell -ExecutionPolicy Bypass -File test_pret_cu_tva_nivel2.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_pret_cu_tva_nivel2.prg') ` + -Steps @('grid_gol_afisat', 'p0_grid_gol', 'p1_caz6', 'p2_caz8a', 'p3_caz8b', 'p4_caz8c', 'p5_caz11_plafon') ` + -ShotsDir (Join-Path $Teste 'screenshots_nivel2') ` + -SyncDir (Join-Path $Teste 'uisync_nivel2') ` + -StepTimeoutSec 60 ` + -ReadyTimeoutSec 90 diff --git a/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel2_retur.prg b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel2_retur.prg new file mode 100644 index 0000000..1d601ba --- /dev/null +++ b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel2_retur.prg @@ -0,0 +1,506 @@ +* test_pret_cu_tva_nivel2_retur.prg +* Test UI Nivel 2 (S5, plan #7) pentru RAMURA DE RETUR (tip 8/9) a plafonului recalculat de S2c +* (rec_s2c_ncantitatemax.md). Verificarea de plafon pentru retur (frm_articol_factura. +* inainte_de_do_termin, ofacturare.vc2:2265, "Nu se poate returna mai mult decat a fost facturat!") +* NU are garda de gestionabil/llStoculConteaza - se verifica NECONDITIONAT - deci articolul poate +* fi gestionabil=0, ceea ce pastreaza fluxul de adaugare pe calea SIMPLA (frm_articol_factura +* direct, fara do_alege_stoc), aceeasi infrastructura dovedita la cazurile 6/8. +* +* Cazuri (din rec_s2c_ncantitatemax.md, ramura retur - tip 8/9): +* PAS 0: adaugare linie retur (crsarticole.cantitate=10 "cat s-a facturat", id_c=3001) prin +* But_urmator1.Click() real -> crsfactura.cantitate=-10 (negat de do_initializeaza_articol +* pt. tip 8/9), crsarticole.cantitate scade la 0 (decrementata de do_adauga_articol). +* PAS 1: modificare DOAR de pret (cantitate neschimbata) -> trebuie ACCEPTATA (plafonul recalculat +* egaleaza cantitatea curenta a liniei: 0 - (-10) = 10 = Abs(-10), nu strict mai mare). +* PAS 2: se simuleaza o schimbare externa a stocului sursa (alt utilizator/proces a modificat +* cat mai e disponibil de returnat) - crsarticole.cantitate setat manual la 5 (NU e +* populare de crsfactura, e o schimbare pe cursorul SURSA, plauzibila in productie). +* PAS 3: crestere cantitate returnata la -12 (magnitudine 12) -> plafonul RECALCULAT e +* 5 - (-10) = 15, deci 12 <= 15 -> ACCEPTATA. Sub formula VECHE (ncantitatemax fixat la +* cantitatea curenta a liniei, magnitudine 10, nerecalculat), 12 > 10 ar fi fost RESPINSA - +* acesta e cazul care distinge formula veche de cea noua (S2c). +* PAS 4: crestere cantitate returnata la -20 (magnitudine 20) -> peste plafonul recalculat (15) -> +* RESPINSA cu mesajul "Nu se poate returna mai mult decat a fost facturat!"; iesire din +* dialog prin do_renunt() (nu do_termin(), care nu elibereaza formularul la respingere). + +SET SAFETY OFF +SET TALK OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcUILog, gcSyncDir +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_pret_cu_tva\test_pret_cu_tva_nivel2_retur_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_pret_cu_tva\uisync_nivel2_retur\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + LOCAL gcAppPath, lcPath + gcAppPath = "D:\ROA\ROAFACTURARE\" + SET DEFAULT TO (gcAppPath) + + lcPath = gcAppPath + 'Date;' + gcAppPath + 'Include;' + gcAppPath + 'FERESTRE;' + ; + gcAppPath + 'GRAFICE;' + gcAppPath + 'CLASE;' + gcAppPath + 'MENIURI;' + ; + gcAppPath + 'PROGRAME;' + gcAppPath + 'RAPOARTE;' + gcAppPath + 'COMUN;' + ; + gcAppPath + 'COMUN\CLASE;' + gcAppPath + 'COMUN\FERESTRE;' + gcAppPath + 'COMUN\PROGRAME;' + ; + gcAppPath + 'COMUN\GRAFICE;' + gcAppPath + 'COMUN\RAPOARTE;' + ; + gcAppPath + 'COMUN\UTILE\CALENDAR;' + gcAppPath + 'COMUN\UTILE\CTL32;' + ; + gcAppPath + 'COMUN\UTILE\HPDF;' + gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ; + gcAppPath + 'COMUN\UTILE\WEB;' + gcAppPath + 'COMUN\UTILE\EMAIL;' + ; + gcAppPath + 'COMUN\UTILE\NFJSON;' + gcAppPath + 'COMUN\UTILE\NFXML;' + ; + ADDBS(SUBSTR(gcAppPath,1,RAT([\],gcAppPath,2)))+[COMUNROA\] + SET PATH TO &lcPath ADDITIVE + DO AfLog WITH 'SET PATH OK' + + SET CLASSLIB TO (gcAppPath + "comun\clase\appwiz") ADDITIVE + SET CLASSLIB TO registry ADDITIVE + SET CLASSLIB TO cauta_alfa_forms ADDITIVE + SET CLASSLIB TO ofacturare.vcx ADDITIVE + SET CLASSLIB TO ofacturare_comun.vcx ADDITIVE + SET CLASSLIB TO accessibility.vcx ADDITIVE + SET CLASSLIB TO ocriterii.vcx ADDITIVE + SET CLASSLIB TO ctl32_statusbar.vcx ADDITIVE + SET CLASSLIB TO ctl32_common.vcx ADDITIVE + SET CLASSLIB TO ctl32_structs.vcx ADDITIVE + SET CLASSLIB TO ctl32_progressbar.vcx ADDITIVE + SET CLASSLIB TO DECABAZA ADDITIVE + SET CLASSLIB TO onomenclatoare ADDITIVE + SET CLASSLIB TO onomenclatoare2 ADDITIVE + SET CLASSLIB TO ofacturare_rapoarte ADDITIVE + SET CLASSLIB TO orapoarte ADDITIVE + SET CLASSLIB TO ferestre_oracle ADDITIVE + SET CLASSLIB TO messagebox ADDITIVE + SET CLASSLIB TO otoolbar ADDITIVE + SET CLASSLIB TO onom_curs ADDITIVE + SET CLASSLIB TO comun ADDITIVE + SET CLASSLIB TO ferestre_cere_date ADDITIVE + SET CLASSLIB TO baza ADDITIVE + SET CLASSLIB TO caut ADDITIVE + SET CLASSLIB TO ointroduceri ADDITIVE + SET CLASSLIB TO serii_numere ADDITIVE + SET CLASSLIB TO caut_ora ADDITIVE + SET CLASSLIB TO wwdialogs.vcx ADDITIVE + SET CLASSLIB TO _calendar.vcx ADDITIVE + SET CLASSLIB TO locale ADDITIVE + SET CLASSLIB TO overificari ADDITIVE + SET CLASSLIB TO ocomenzi ADDITIVE + DO AfLog WITH 'SET CLASSLIB OK' + + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" + SET PROCEDURE TO proceduri_comune ADDITIVE + SET PROCEDURE TO quitapp ADDITIVE + SET PROCEDURE TO init_program ADDITIVE + SET PROCEDURE TO onomenclatoare.prg ADDITIVE + SET PROCEDURE TO onomenclatoare2.prg ADDITIVE + SET PROCEDURE TO oproceduri_rapoarte_fact.prg ADDITIVE + SET PROCEDURE TO email.prg ADDITIVE + SET PROCEDURE TO GENCURSOR.PRG ADDITIVE + SET PROCEDURE TO OPROCEDURI_COMUNE.PRG ADDITIVE + SET PROCEDURE TO OINIT_OPTIUNI.PRG ADDITIVE + SET PROCEDURE TO updateserver.PRG ADDITIVE + SET PROCEDURE TO OPROCEDURI_aMS.PRG ADDITIVE + SET PROCEDURE TO ocautare ADDITIVE + SET PROCEDURE TO odocumente ADDITIVE + SET PROCEDURE TO osecurity ADDITIVE + SET PROCEDURE TO acces_meniu ADDITIVE + SET PROCEDURE TO wwxmlhttp.prg ADDITIVE + SET PROCEDURE TO wwcodeupdate.prg ADDITIVE + SET PROCEDURE TO ini.prg ADDITIVE + SET PROCEDURE TO cauta_alfa.prg ADDITIVE + SET PROCEDURE TO oHeader.prg ADDITIVE + SET PROCEDURE TO oproceduri_curs.prg ADDITIVE + SET PROCEDURE TO proceduri.prg ADDITIVE + SET PROCEDURE TO oproceduri_facturare.prg ADDITIVE + SET PROCEDURE TO proceduri_rapoarte.prg ADDITIVE + SET PROCEDURE TO ofacturare.prg ADDITIVE + SET PROCEDURE TO oserii_numere.prg ADDITIVE + SET PROCEDURE TO wwutils.prg ADDITIVE + SET PROCEDURE TO wwConfig.prg ADDITIVE + SET PROCEDURE TO wwApi.prg ADDITIVE + SET PROCEDURE TO oexport.prg ADDITIVE + SET PROCEDURE TO validare.prg ADDITIVE + SET PROCEDURE TO ofacturare_comun.prg ADDITIVE + SET PROCEDURE TO ofacturare_stoc.prg ADDITIVE + SET PROCEDURE TO pmenu.prg ADDITIVE + SET PROCEDURE TO ointroduceri.prg ADDITIVE + SET PROCEDURE TO ovariabile_globale.prg ADDITIVE + SET PROCEDURE TO ooperatii_comune.prg ADDITIVE + SET PROCEDURE TO oproceduri_util.prg ADDITIVE + SET PROCEDURE TO filebringer.prg ADDITIVE + SET PROCEDURE TO iniacces.prg ADDITIVE + SET PROCEDURE TO oupdate.prg ADDITIVE + SET PROCEDURE TO procese.prg ADDITIVE + SET PROCEDURE TO version.prg ADDITIVE + SET PROCEDURE TO wwhttp.prg ADDITIVE + SET PROCEDURE TO xmlaccess.prg ADDITIVE + SET PROCEDURE TO xmlparser.prg ADDITIVE + SET PROCEDURE TO xdate.prg ADDITIVE + SET PROCEDURE TO suma_in_vorbe.prg ADDITIVE + SET PROCEDURE TO controllerecr ADDITIVE + SET PROCEDURE TO regex.prg ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE + DO AfLog WITH 'SET PROCEDURE OK' + + PUBLIC gnPc, gnPVal, gnPcant, gnPPretV, gnScadereStoc, gnMemProcDisc, gl406, gcAcces + PUBLIC gnModTotFact, gnRF_FACTURARE_FARA_STOC, gnPPret, gnPPretVal + gnPc = 2 + gnPVal = 2 + gnPcant = 3 + gnPPretV = 4 + gnPPret = 4 + gnPPretVal = 4 + gnScadereStoc = 0 + gnMemProcDisc = 0 + gl406 = .F. + gcAcces = "1;2;3;4;5;6;7;8;" + gnModTotFact = 0 + gnRF_FACTURARE_FARA_STOC = 0 + PUBLIC nror(65000) + + PUBLIC goApp, goExport, goExecutor + goApp = CREATEOBJECT('dummyapp') + goExport = CREATEOBJECT('dummyexport') + goExecutor = CREATEOBJECT('dummyexecutor') + + IF USED('jtva_coloane') + USE IN ('jtva_coloane') + ENDIF + CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2)) + INSERT INTO jtva_coloane VALUES (1, 'TVA 21%', 21) + GO TOP IN jtva_coloane + + IF USED('saft_taxtable') + USE IN ('saft_taxtable') + ENDIF + CREATE CURSOR saft_taxtable (taxname C(250), procent_taxa N(7,2), taxcode N(6), tva_livrari N(1)) + INSERT INTO saft_taxtable VALUES ('301104-Achizitii de bunuri si servicii taxabile cu cota de 21%', 21, 301104, 1) + + DO creeaza_facturacrs WITH 'crsfactura' + DO AfLog WITH 'crsfactura creat, Reccount=' + TRANSFORM(RECCOUNT('crsfactura')) + + *-- crsarticole: cantitate=10 reprezinta "cat s-a facturat / e disponibil de returnat". + *-- gestionabil=0: verificarea de retur (:2265) nu are garda de gestionabil, deci ramane pe + *-- calea simpla (frm_articol_factura direct), dar plafonul tot se verifica. + IF USED('crsarticole') + USE IN ('crsarticole') + ENDIF + CREATE CURSOR crsarticole (id_articol N(10), Id_Pol N(10), id_gestiune N(10), denumire C(100), ; + codmat C(50), codbare C(50), gestionabil N(1), cantitate N(18,4), pret N(18,4), ; + pret_val N(18,4), preturi_cu_tva N(1), proc_tvav N(18,4), discount_unitar N(18,4), ; + discount_unitar_val N(18,4), pret_achizitie N(18,4), tip_valuta N(1), Curs N(18,4), ; + multiplicator N(10,4), Cont C(10), um C(10), serie C(30), lot C(30), explicatie C(200), ; + opt_facturare N(3), id_ctr N(10), numar_contract C(50), pretd N(18,4), id_valuta N(10), ; + nume_val C(20), nume_lista_preturi C(100), id_jtva_coloana N(10), taxcode N(6), id_c N(10)) + INSERT INTO crsarticole (id_articol, Id_Pol, id_gestiune, denumire, codmat, codbare, ; + gestionabil, cantitate, pret, pret_val, preturi_cu_tva, proc_tvav, discount_unitar, ; + discount_unitar_val, pret_achizitie, tip_valuta, Curs, multiplicator, Cont, um, serie, ; + lot, explicatie, opt_facturare, id_ctr, numar_contract, pretd, id_valuta, nume_val, ; + nume_lista_preturi, id_jtva_coloana, taxcode, id_c) ; + VALUES (3001, 1, 1, 'ARTICOL RETUR NIVEL2', 'ART3001', '', ; + 0, 10, 50, 0, 1, 1.21, 0, ; + 0, 0, 0, 1, 1, '707', 'BUC', '', ; + '', '', 0, 0, '', 0, 0, '', ; + 'LISTA TEST', 1, 0, 3001) + GO TOP IN crsarticole + DO AfLog WITH 'crsarticole (retur) creat, Reccount=' + TRANSFORM(RECCOUNT('crsarticole')) + + PRIVATE poDate + poDate = CREATEOBJECT('oDateFactura') + poDate.tip = 8 && 8 = factura retur lei + poDate.serie_act = 'TST' + poDate.nract = 1 + DO AfLog WITH 'poDate pregatit (oDateFactura), tip=' + TRANSFORM(poDate.tip) + + PUBLIC goDriver, gnDriverTick, glDlgTratat, gcCazAct + gnDriverTick = 0 + glDlgTratat = .F. + gcCazAct = '' + goDriver = CREATEOBJECT('driverdeblocare4') + _SCREEN.AddObject('tmrDrvN2R', 'Timer') + _SCREEN.tmrDrvN2R.Interval = 200 + BINDEVENT(_SCREEN.tmrDrvN2R, 'Timer', goDriver, 'Executa') + _SCREEN.tmrDrvN2R.Enabled = .T. + DO AfLog WITH 'driver+timer pregatiti' + + _SCREEN.Visible = .T. + _SCREEN.WindowState = 2 + _SCREEN.Caption = 'TEST UI Nivel 2 - ramura retur (S2c)' + + PUBLIC goFrm + goFrm = CREATEOBJECT('frm_facturare_articole') + goFrm.WindowType = 0 + goFrm.Show() + goFrm.WindowState = 2 + DOEVENTS FORCE + DO AfLog WITH 'frm_facturare_articole afisat modeless, Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + + DO HarnessStep WITH 0, 'formular afisat, grid gol' + + *========================= PAS 0: adaugare linie retur (cantitate default, neschimbata) ========= + SELECT crsarticole + GO TOP + gcCazAct = 'ADD_DEFAULT' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_urmator1.Click() + DOEVENTS FORCE + LOCAL lnWait + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa But_urmator1: glDlgTratat=' + TRANSFORM(glDlgTratat) + ' Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + + IF RECCOUNT('crsfactura') = 1 + SELECT crsfactura + GO TOP + SELECT crsarticole + LOCATE FOR id_c = 3001 + IF ABS(crsfactura.cantitate - (-10)) < 0.001 AND ABS(crsarticole.cantitate - 0) < 0.001 + DO UILog WITH 'PASS P0 adaugare retur: crsfactura.cantitate=' + TRANSFORM(crsfactura.cantitate) + ' crsarticole.cantitate=' + TRANSFORM(crsarticole.cantitate) + ' (asteptat -10 / 0)' + ELSE + DO UILog WITH 'FAIL P0 adaugare retur: crsfactura.cantitate=' + TRANSFORM(crsfactura.cantitate) + ' crsarticole.cantitate=' + TRANSFORM(crsarticole.cantitate) + ' (asteptat -10 / 0)' + ENDIF + ELSE + DO UILog WITH 'FAIL P0: Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ' (asteptat 1) - articolul retur nu a fost adaugat' + ENDIF + DO HarnessStep WITH 1, 'P0 adaugare retur: Reccount=' + TRANSFORM(RECCOUNT('crsfactura')) + + *========================= PAS 1: modificare DOAR de pret, cantitate neschimbata -> ACCEPTATA === + IF RECCOUNT('crsfactura') = 1 + gcCazAct = 'RETUR_DOAR_PRET' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_modifica1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa But_modifica1 (P1): glDlgTratat=' + TRANSFORM(glDlgTratat) + + SELECT crsfactura + GO TOP + IF ABS(cantitate - (-10)) < 0.001 AND ABS(pretftva - 77) < 0.01 + DO UILog WITH 'PASS P1 retur - doar pret modificat, ACCEPTAT: cantitate=' + TRANSFORM(cantitate) + ' pretftva=' + TRANSFORM(pretftva) + ' (asteptat -10 / 77)' + ELSE + DO UILog WITH 'FAIL P1 retur - doar pret: cantitate=' + TRANSFORM(cantitate) + ' pretftva=' + TRANSFORM(pretftva) + ' (asteptat -10 / 77 - verifica daca a fost respins pe nedrept)' + ENDIF + ELSE + DO UILog WITH 'NEACOPERIT P1: nu exista randul' + ENDIF + DO HarnessStep WITH 2, 'P1 retur doar pret' + + *========================= PAS 2: simulare schimbare externa a stocului sursa ========= + SELECT crsarticole + LOCATE FOR id_c = 3001 + IF FOUND() + REPLACE cantitate WITH 5 + DO AfLog WITH 'P2: crsarticole.cantitate setat manual la 5 (simuleaza schimbare externa a stocului sursa, NU populare de crsfactura)' + ENDIF + DO HarnessStep WITH 3, 'P2 stoc extern schimbat' + + *========================= PAS 3: crestere la -12 (in limita plafonului RECALCULAT=15, dar peste + *========================= plafonul VECHI fixat la 10) -> trebuie ACCEPTATA ========= + IF RECCOUNT('crsfactura') = 1 + gcCazAct = 'RETUR_CRESTERE_IN_PLAFON_NOU' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_modifica1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa But_modifica1 (P3): glDlgTratat=' + TRANSFORM(glDlgTratat) + + SELECT crsfactura + GO TOP + IF ABS(cantitate - (-12)) < 0.001 + DO UILog WITH 'PASS P3 retur - crestere la magnitudine 12 (peste plafonul VECHI=10, in plafonul NOU recalculat=15), ACCEPTATA: cantitate=' + TRANSFORM(cantitate) + ' - confirma ca S2c chiar RECALCULEAZA plafonul, nu il fixeaza la cantitatea initiala a liniei' + ELSE + DO UILog WITH 'FAIL P3 retur - crestere in plafonul nou: cantitate=' + TRANSFORM(cantitate) + ' (asteptat -12) - fie a fost respinsa (plafon nerecalculat), fie alta problema' + ENDIF + ELSE + DO UILog WITH 'NEACOPERIT P3: nu exista randul' + ENDIF + DO HarnessStep WITH 4, 'P3 retur crestere in plafon nou' + + *========================= PAS 4: crestere la -20 (peste plafonul NOU=15) -> RESPINSA ========= + IF RECCOUNT('crsfactura') = 1 + LOCAL lnCantitateInainte + SELECT crsfactura + GO TOP + lnCantitateInainte = cantitate + + gcCazAct = 'RETUR_CRESTERE_PESTE_PLAFON' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_modifica1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa But_modifica1 (P4): glDlgTratat=' + TRANSFORM(glDlgTratat) + + SELECT crsfactura + GO TOP + IF ABS(cantitate - lnCantitateInainte) < 0.001 + DO UILog WITH 'PASS P4 retur - crestere la magnitudine 20 (peste plafonul nou=15) RESPINSA: randul a ramas neschimbat, cantitate=' + TRANSFORM(cantitate) + ELSE + DO UILog WITH 'FAIL P4 retur - crestere peste plafon: cantitate=' + TRANSFORM(cantitate) + ' (asteptat neschimbat, ' + TRANSFORM(lnCantitateInainte) + ') - a fost acceptata desi trebuia respinsa' + ENDIF + ELSE + DO UILog WITH 'NEACOPERIT P4: nu exista randul' + ENDIF + DO HarnessStep WITH 5, 'P4 retur peste plafon - final' + + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO AfLog WITH 'CATCH ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO HarnessDone WITH 'done-error' +ENDTRY + +QUIT + +*================================================================================== +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO AfLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +PROCEDURE UILog + LPARAMETERS tcMsg + DO AfLog WITH tcMsg +ENDPROC + +PROCEDURE FindCtl + LPARAMETERS toParent, tcName + LOCAL lnI, loGasit + loGasit = .NULL. + FOR lnI = 1 TO toParent.ControlCount + IF UPPER(toParent.Controls(lnI).Name) == UPPER(tcName) + loGasit = toParent.Controls(lnI) + ENDIF + ENDFOR + RETURN loGasit +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexport AS Custom + PROCEDURE citesteSetareRegistru + LPARAMETERS tcCheie + RETURN '' + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(tcCursor) + USE IN (tcCursor) + ENDIF + CREATE CURSOR (tcCursor) (codmatf C(50)) + RETURN 1 + ENDPROC + PROCEDURE oReset + ENDPROC +ENDDEFINE + +DEFINE CLASS driverdeblocare4 AS Custom + PROCEDURE Executa + LOCAL lnI, loForm, llGasit + gnDriverTick = gnDriverTick + 1 + llGasit = .F. + FOR lnI = 1 TO _SCREEN.FormCount + IF UPPER(_SCREEN.Forms(lnI).Class) == 'FRM_ARTICOL_FACTURA' + loForm = _SCREEN.Forms(lnI) + llGasit = .T. + ENDIF + ENDFOR + + IF glDlgTratat OR !llGasit + RETURN + ENDIF + + DO AfLog WITH 'driver4 tick ' + TRANSFORM(gnDriverTick) + ' POTRIVIT (caz=' + gcCazAct + '), intru in interactiune' + + LOCAL loCantitateCtn, loCantitate, loPretFtvaCtn, loPretFtvaNat, loRenunt + + TRY + DO CASE + CASE gcCazAct == 'ADD_DEFAULT' + DO AfLog WITH 'driver4 ADD_DEFAULT: nu ating nimic, apas do_termin() (accepta valorile implicite)' + loForm.do_termin() + + CASE gcCazAct == 'RETUR_DOAR_PRET' + loPretFtvaCtn = FindCtl(loForm, 'Clb_pretftva') + loPretFtvaNat = FindCtl(loPretFtvaCtn, 'tx_suma_nat') + loPretFtvaNat.Value = 77 + loPretFtvaNat.InteractiveChange() + DO AfLog WITH 'driver4 RETUR_DOAR_PRET: pretftva=77, cantitate neatinsa, apas do_termin()' + loForm.do_termin() + + CASE gcCazAct == 'RETUR_CRESTERE_IN_PLAFON_NOU' + loCantitateCtn = FindCtl(loForm, 'clb_cantitate') + loCantitate = FindCtl(loCantitateCtn, 'Text_simplu1') + loCantitate.Value = -12 + loCantitate.InteractiveChange() + DO AfLog WITH 'driver4 RETUR_CRESTERE_IN_PLAFON_NOU: cantitate=-12, apas do_termin()' + loForm.do_termin() + + CASE gcCazAct == 'RETUR_CRESTERE_PESTE_PLAFON' + loCantitateCtn = FindCtl(loForm, 'clb_cantitate') + loCantitate = FindCtl(loCantitateCtn, 'Text_simplu1') + loCantitate.Value = -20 + loCantitate.InteractiveChange() + DO AfLog WITH 'driver4 RETUR_CRESTERE_PESTE_PLAFON: cantitate=-20, apas do_termin() (asteptat: respins, ramane deschis)' + loForm.do_termin() + DO AfLog WITH 'driver4: dupa do_termin() pe cazul de respingere - inchid explicit prin do_renunt() ca sa nu ramana Show(1) blocat' + loForm.do_renunt() + + OTHERWISE + DO AfLog WITH 'driver4: gcCazAct necunoscut [' + gcCazAct + ']' + ENDCASE + + glDlgTratat = .T. + DO AfLog WITH 'driver4: interactiune REUSITA pentru caz=' + gcCazAct + CATCH TO loExcDrv + DO AfLog WITH 'driver4: CATCH caz=' + gcCazAct + ' ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ; + ' Message=' + loExcDrv.Message + ' Procedure=' + loExcDrv.Procedure + ; + ' LineNo=' + TRANSFORM(loExcDrv.LineNo) + ' LineContents=[' + loExcDrv.LineContents + ']' + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel2_retur.ps1 b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel2_retur.ps1 new file mode 100644 index 0000000..0acd96c --- /dev/null +++ b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel2_retur.ps1 @@ -0,0 +1,12 @@ +# test_pret_cu_tva_nivel2_retur.ps1 - wrapper peste harness-ul generic pentru ramura de retur +# a plafonului recalculat (S2c, rec_s2c_ncantitatemax.md). Rulare: +# powershell -ExecutionPolicy Bypass -File test_pret_cu_tva_nivel2_retur.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_pret_cu_tva_nivel2_retur.prg') ` + -Steps @('formular_afisat', 'p0_adaugare', 'p1_doar_pret', 'p2_stoc_extern', 'p3_in_plafon_nou', 'p4_peste_plafon') ` + -ShotsDir (Join-Path $Teste 'screenshots_nivel2_retur') ` + -SyncDir (Join-Path $Teste 'uisync_nivel2_retur') ` + -StepTimeoutSec 60 ` + -ReadyTimeoutSec 90 diff --git a/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel3_gestiuni.prg b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel3_gestiuni.prg new file mode 100644 index 0000000..ab18bb2 --- /dev/null +++ b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel3_gestiuni.prg @@ -0,0 +1,940 @@ +* test_pret_cu_tva_nivel3_gestiuni.prg +* Test UI Nivel 3 (S2d, plan #7) pentru ramura GESTIONABILA a lui do_modifica/do_adauga_articol - +* dialogul frm_articol_gest_factura, deschis prin do_alege_stoc (frm_facturare_articole, +* ofacturare.vc2). Decizia coordonatorului: se mockuieste Oracle la GRANITA (goExecutor.oExecute, +* singurul punct de contact al lui do_alege_stoc cu Oracle), NU se populeaza direct crsgestarticol/ +* crsfactura - fluxul real (butoane, taste, SPACE) ramane intact, doar sursa de date se inlocuieste. +* +* Articol 3001, gestionabil=1, gnScadereStoc=1, poDate.tip=4 (aviz - in Inlist-ul validat de +* inainte_de_do_termin SI de plafonul S2c/S2d). 4 gestiuni mock, stoc constant (10/15/8/6) - Oracle +* nu stie de cosul in lucru, exact ca in productie; scaderea celor deja pe factura o face codul +* real (sub-selectul cu excluderea id_temp, S2d pct. 1). +* +* Cazuri (litere din review-ul S2d): +* PAS 1 (caz a): adaugare linie1 din gestiunea G1 -> dialogul cu gestiuni arata mai multe +* gestiuni (nu auto-select), ck_pret_cu_tva exista si e la Top=510 pe forma Height=546. +* PAS 2: adaugare linie2 (acelasi articol) din gestiunea G2 - pregateste discriminantul de la c. +* PAS 3 (cazuri b+c): redeschide linia1 -> crsgestarticol pozitionat pe gestiunea G1 a liniei; +* randul G1 arata stocul disponibil PLUS cantitatea proprie (10, nu 7); randul G2 (linia2, +* neexclusa) arata stocul scazut normal (11, nu 15). Inchis cu Renunta, nimic comis. +* PAS 4 (caz d, respins): redeschide linia1, cere cantitate 11 (peste stocul gestiunii G1=10) -> +* respins cu mesajul real "Cantitatea nu poate fi mai mare decat stocul gestiunii ...". +* PAS 5 (caz d, acceptat): redeschide linia1, cere cantitate 10 (exact stocul gestiunii) -> +* acceptat. +* PAS 6 (caz e): redeschide linia1, navigheaza (fara SPACE) pe gestiunea G3, cantitate 5 -> +* acceptat, linia1 trece pe G3. Verifica si g) crsarticole ajustat cu diferenta (-5). +* PAS 7 (caz f+g): redeschide linia1, SPACE pe G1 si G4 (multi-selectie) -> linia1 devine G1/10, +* apare O SINGURA linie noua G4/6 (exact regresia Scan/Skip, deja corectata) - Reccount +* creste cu 1, nu cu 2. Verifica si crsarticole ajustat cu diferenta (delta 16-5=11). +* PAS 8 (caz h): redeschide linia1, schimba pretul, apasa Renunta -> randul ramane BIT-IDENTIC. + +SET SAFETY OFF +SET TALK OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcUILog, gcSyncDir +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_pret_cu_tva\test_pret_cu_tva_nivel3_gestiuni_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_pret_cu_tva\uisync_nivel3\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + LOCAL gcAppPath, lcPath + gcAppPath = "D:\ROA\ROAFACTURARE\" + SET DEFAULT TO (gcAppPath) + + lcPath = gcAppPath + 'Date;' + gcAppPath + 'Include;' + gcAppPath + 'FERESTRE;' + ; + gcAppPath + 'GRAFICE;' + gcAppPath + 'CLASE;' + gcAppPath + 'MENIURI;' + ; + gcAppPath + 'PROGRAME;' + gcAppPath + 'RAPOARTE;' + gcAppPath + 'COMUN;' + ; + gcAppPath + 'COMUN\CLASE;' + gcAppPath + 'COMUN\FERESTRE;' + gcAppPath + 'COMUN\PROGRAME;' + ; + gcAppPath + 'COMUN\GRAFICE;' + gcAppPath + 'COMUN\RAPOARTE;' + ; + gcAppPath + 'COMUN\UTILE\CALENDAR;' + gcAppPath + 'COMUN\UTILE\CTL32;' + ; + gcAppPath + 'COMUN\UTILE\HPDF;' + gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ; + gcAppPath + 'COMUN\UTILE\WEB;' + gcAppPath + 'COMUN\UTILE\EMAIL;' + ; + gcAppPath + 'COMUN\UTILE\NFJSON;' + gcAppPath + 'COMUN\UTILE\NFXML;' + ; + gcAppPath + 'COMUN\UTILE\GridExtras;' + ; + ADDBS(SUBSTR(gcAppPath,1,RAT([\],gcAppPath,2)))+[COMUNROA\] + SET PATH TO &lcPath ADDITIVE + DO AfLog WITH 'SET PATH OK' + + *----- CLASE (lista dovedita de Nivel 1/2 - mediul unei suite noi se mosteneste din suita + * care TRECE, nu dintr-un smoke-test) ----- + SET CLASSLIB TO (gcAppPath + "comun\clase\appwiz") ADDITIVE + SET CLASSLIB TO registry ADDITIVE + SET CLASSLIB TO cauta_alfa_forms ADDITIVE + SET CLASSLIB TO ofacturare.vcx ADDITIVE + SET CLASSLIB TO ofacturare_comun.vcx ADDITIVE + SET CLASSLIB TO accessibility.vcx ADDITIVE + SET CLASSLIB TO ocriterii.vcx ADDITIVE + SET CLASSLIB TO ctl32_statusbar.vcx ADDITIVE + SET CLASSLIB TO ctl32_common.vcx ADDITIVE + SET CLASSLIB TO ctl32_structs.vcx ADDITIVE + SET CLASSLIB TO ctl32_progressbar.vcx ADDITIVE + SET CLASSLIB TO DECABAZA ADDITIVE + SET CLASSLIB TO onomenclatoare ADDITIVE + SET CLASSLIB TO onomenclatoare2 ADDITIVE + SET CLASSLIB TO ofacturare_rapoarte ADDITIVE + SET CLASSLIB TO orapoarte ADDITIVE + SET CLASSLIB TO ferestre_oracle ADDITIVE + SET CLASSLIB TO messagebox ADDITIVE + SET CLASSLIB TO otoolbar ADDITIVE + SET CLASSLIB TO onom_curs ADDITIVE + SET CLASSLIB TO comun ADDITIVE + SET CLASSLIB TO ferestre_cere_date ADDITIVE + SET CLASSLIB TO baza ADDITIVE + SET CLASSLIB TO caut ADDITIVE + SET CLASSLIB TO ointroduceri ADDITIVE + SET CLASSLIB TO serii_numere ADDITIVE + SET CLASSLIB TO caut_ora ADDITIVE + SET CLASSLIB TO wwdialogs.vcx ADDITIVE + SET CLASSLIB TO _calendar.vcx ADDITIVE + SET CLASSLIB TO locale ADDITIVE + SET CLASSLIB TO overificari ADDITIVE + SET CLASSLIB TO ocomenzi ADDITIVE + DO AfLog WITH 'SET CLASSLIB OK' + + *----- PROCEDURI (mock amessagebox PRIMUL, ui_harness la final) ----- + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" + SET PROCEDURE TO proceduri_comune ADDITIVE + SET PROCEDURE TO quitapp ADDITIVE + SET PROCEDURE TO init_program ADDITIVE + SET PROCEDURE TO onomenclatoare.prg ADDITIVE + SET PROCEDURE TO onomenclatoare2.prg ADDITIVE + SET PROCEDURE TO oproceduri_rapoarte_fact.prg ADDITIVE + SET PROCEDURE TO email.prg ADDITIVE + SET PROCEDURE TO GENCURSOR.PRG ADDITIVE + SET PROCEDURE TO OPROCEDURI_COMUNE.PRG ADDITIVE + SET PROCEDURE TO OINIT_OPTIUNI.PRG ADDITIVE + SET PROCEDURE TO updateserver.PRG ADDITIVE + SET PROCEDURE TO OPROCEDURI_aMS.PRG ADDITIVE + SET PROCEDURE TO ocautare ADDITIVE + SET PROCEDURE TO odocumente ADDITIVE + SET PROCEDURE TO osecurity ADDITIVE + SET PROCEDURE TO acces_meniu ADDITIVE + SET PROCEDURE TO wwxmlhttp.prg ADDITIVE + SET PROCEDURE TO wwcodeupdate.prg ADDITIVE + SET PROCEDURE TO ini.prg ADDITIVE + SET PROCEDURE TO cauta_alfa.prg ADDITIVE + SET PROCEDURE TO oHeader.prg ADDITIVE + SET PROCEDURE TO oproceduri_curs.prg ADDITIVE + SET PROCEDURE TO proceduri.prg ADDITIVE + SET PROCEDURE TO oproceduri_facturare.prg ADDITIVE + SET PROCEDURE TO proceduri_rapoarte.prg ADDITIVE + SET PROCEDURE TO ofacturare.prg ADDITIVE + SET PROCEDURE TO oserii_numere.prg ADDITIVE + SET PROCEDURE TO wwutils.prg ADDITIVE + SET PROCEDURE TO wwConfig.prg ADDITIVE + SET PROCEDURE TO wwApi.prg ADDITIVE + SET PROCEDURE TO oexport.prg ADDITIVE + SET PROCEDURE TO validare.prg ADDITIVE + SET PROCEDURE TO ofacturare_comun.prg ADDITIVE + SET PROCEDURE TO ofacturare_stoc.prg ADDITIVE + SET PROCEDURE TO pmenu.prg ADDITIVE + SET PROCEDURE TO ointroduceri.prg ADDITIVE + SET PROCEDURE TO ovariabile_globale.prg ADDITIVE + SET PROCEDURE TO ooperatii_comune.prg ADDITIVE + SET PROCEDURE TO oproceduri_util.prg ADDITIVE + SET PROCEDURE TO filebringer.prg ADDITIVE + SET PROCEDURE TO iniacces.prg ADDITIVE + SET PROCEDURE TO oupdate.prg ADDITIVE + SET PROCEDURE TO procese.prg ADDITIVE + SET PROCEDURE TO version.prg ADDITIVE + SET PROCEDURE TO wwhttp.prg ADDITIVE + SET PROCEDURE TO xmlaccess.prg ADDITIVE + SET PROCEDURE TO xmlparser.prg ADDITIVE + SET PROCEDURE TO xdate.prg ADDITIVE + SET PROCEDURE TO suma_in_vorbe.prg ADDITIVE + SET PROCEDURE TO controllerecr ADDITIVE + SET PROCEDURE TO regex.prg ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE + DO AfLog WITH 'SET PROCEDURE OK' + + *----- Globale aplicatie ----- + PUBLIC gnPc, gnPVal, gnPcant, gnPPretV, gnScadereStoc, gnMemProcDisc, gl406, gcAcces + PUBLIC gnModTotFact, gnRF_FACTURARE_FARA_STOC + gnModTotFact = 0 + gnRF_FACTURARE_FARA_STOC = 0 + PUBLIC gnPPret, gnPPretVal + gnPc = 2 + gnPVal = 2 + gnPcant = 3 + gnPPretV = 4 + gnPPret = 4 + gnPPretVal = 4 + gnScadereStoc = 1 && activeaza ramura de stoc - do_alege_stoc SE apeleaza (opusul Nivel 2) + gnMemProcDisc = 0 + gl406 = .F. + gcAcces = "1;2;3;4;5;6;7;8;" + *-- do_alege_stoc citeste si aceste globale (parametri SQL cursor_gestiuni_articol) - lipsa lor + *-- da ON ERROR 12 "Variable not found" la primul apel + PUBLIC gnAn, gnLuna, gnIdUtil, gnIdSucursala + gnAn = YEAR(DATE()) + gnLuna = MONTH(DATE()) + gnIdUtil = 1 + gnIdSucursala = 0 + PUBLIC nror(65000) + + *-- gcMockUltimMesaj: mock_amessagebox.prg memoreaza aici ultimul mesaj afisat - folosit pt. + *-- asertia pe TEXTUL respingerii de plafon (caz d). + PUBLIC gcMockUltimMesaj, gnMockUltimTip + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + + PUBLIC goApp, goExport, goExecutor + goApp = CREATEOBJECT('dummyapp') + goExport = CREATEOBJECT('dummyexport') + goExecutor = CREATEOBJECT('dummyexecutor') + + IF USED('jtva_coloane') + USE IN ('jtva_coloane') + ENDIF + CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2)) + INSERT INTO jtva_coloane VALUES (1, 'TVA 21%', 21) + INSERT INTO jtva_coloane VALUES (2, 'TVA 11%', 11) + GO TOP IN jtva_coloane + + IF USED('saft_taxtable') + USE IN ('saft_taxtable') + ENDIF + CREATE CURSOR saft_taxtable (taxname C(250), procent_taxa N(7,2), taxcode N(6), tva_livrari N(1)) + INSERT INTO saft_taxtable VALUES ('301104-Achizitii de bunuri si servicii taxabile cu cota de 21%', 21, 301104, 1) + INSERT INTO saft_taxtable VALUES ('3011XX-Achizitii de bunuri si servicii taxabile cu cota de 11%', 11, 301108, 1) + + *----- crsfactura: structura REALA, fara Oracle ----- + DO creeaza_facturacrs WITH 'crsfactura' + DO AfLog WITH 'crsfactura creat, Reccount=' + TRANSFORM(RECCOUNT('crsfactura')) + + *----- crsarticole: sursa (stoc/lista de preturi). Articolul 3001, gestionabil=1, cantitate mare + * (plafonul S2c/S2d ramane generos - testele de mai jos verifica plafonul PE LOT din + * dialogul de gestiuni, nu plafonul pe articol din crsarticole). ----- + IF USED('crsarticole') + USE IN ('crsarticole') + ENDIF + CREATE CURSOR crsarticole (id_articol N(10), Id_Pol N(10), id_gestiune N(10), denumire C(100), ; + codmat C(50), codbare C(50), gestionabil N(1), cantitate N(18,4), pret N(18,4), ; + pret_val N(18,4), preturi_cu_tva N(1), proc_tvav N(18,4), discount_unitar N(18,4), ; + discount_unitar_val N(18,4), pret_achizitie N(18,4), tip_valuta N(1), Curs N(18,4), ; + multiplicator N(10,4), Cont C(10), um C(10), serie C(30), lot C(30), explicatie C(200), ; + opt_facturare N(3), id_ctr N(10), numar_contract C(50), pretd N(18,4), id_valuta N(10), ; + nume_val C(20), nume_lista_preturi C(100), id_jtva_coloana N(10), taxcode N(6), id_c N(10)) + INSERT INTO crsarticole (id_articol, Id_Pol, id_gestiune, denumire, codmat, codbare, ; + gestionabil, cantitate, pret, pret_val, preturi_cu_tva, proc_tvav, discount_unitar, ; + discount_unitar_val, pret_achizitie, tip_valuta, Curs, multiplicator, Cont, um, serie, ; + lot, explicatie, opt_facturare, id_ctr, numar_contract, pretd, id_valuta, nume_val, ; + nume_lista_preturi, id_jtva_coloana, taxcode, id_c) ; + VALUES (3001, 1, 0, 'ARTICOL GESTIUNI NIVEL3', 'ART3001', '', ; + 1, 1000, 50, 0, 0, 1.21, 0, ; + 0, 0, 0, 1, 1, '701', 'BUC', '', ; + '', '', 0, 0, '', 0, 0, '', ; + 'LISTA TEST', 1, 0, 3001) + GO TOP IN crsarticole + DO AfLog WITH 'crsarticole creat, Reccount=' + TRANSFORM(RECCOUNT('crsarticole')) + + *----- crsMockStoc: gestiunile "Oracle" pentru articolul 3001, stoc FIX pe tot testul - Oracle + * nu stie de cosul in lucru; scaderea celor deja pe factura o face codul real (LEFT JOIN + + * excluderea id_temp, S2d pct. 1), nu mock-ul. dummyexecutor.oExecute o serveste la fiecare + * apel cu 'cursor_gestiuni_articol' in SQL. Coloanele sunt exact cele citite de do_alege_stoc + * (Insert Into (lcCursor) (...), ofacturare.vc2:13299, si copiaza_structura_cursor). ----- + IF USED('crsMockStoc') + USE IN ('crsMockStoc') + ENDIF + *-- Cont/serie/lot cu ACEEASI latime ca in crsfactura (creeaza_facturacrs: Cont c(4), serie c(100), + *-- lot C(20)) - LEFT JOIN-ul din do_alege_stoc compara aceste campuri intre cele doua cursoare + *-- (:13304-13306); latimi diferite ar produce padding diferit si ar rupe egalitatea sub SET EXACT ON. + *-- datain e DateTime (T), nu Date: coloana cDataIn a gridului are ControlSource "TTOD(datain)" + *-- (ofacturare.vc2:3519), iar TTOD pe un camp D da eroarea 11 la constructia formularului. + CREATE CURSOR crsMockStoc (ales N(1), id_gestiune N(10), cantitate N(18,4), Cont C(4), ; + serie C(100), lot C(20), Pret N(18,4), nume_gestiune C(50), datain T, pretv N(18,4), ; + pretvctva N(18,4), part_rez C(30), id_part_rez N(10), nrord_rez N(10), id_lucrare_rez N(10), ; + pretd N(18,4), id_valuta N(10), nume_val C(20)) + INSERT INTO crsMockStoc VALUES (0, 101, 10, '701', 'SG1', 'LOT1', 50, 'GESTIUNE 1', {^2020-01-01 08:00:00}, 50, 60.50, '', 0, 0, 0, 0, 0, '') + INSERT INTO crsMockStoc VALUES (0, 102, 15, '701', 'SG2', 'LOT2', 55, 'GESTIUNE 2', {^2020-01-02 08:00:00}, 55, 66.55, '', 0, 0, 0, 0, 0, '') + INSERT INTO crsMockStoc VALUES (0, 103, 8, '701', 'SG3', 'LOT3', 52, 'GESTIUNE 3', {^2020-01-03 08:00:00}, 52, 62.92, '', 0, 0, 0, 0, 0, '') + INSERT INTO crsMockStoc VALUES (0, 104, 6, '701', 'SG4', 'LOT4', 48, 'GESTIUNE 4', {^2020-01-04 08:00:00}, 48, 58.08, '', 0, 0, 0, 0, 0, '') + GO TOP IN crsMockStoc + DO AfLog WITH 'crsMockStoc creat (4 gestiuni, stoc 10/15/8/6), Reccount=' + TRANSFORM(RECCOUNT('crsMockStoc')) + + *----- poDate: clasa REALA oDateFactura ----- + PRIVATE poDate + poDate = CREATEOBJECT('oDateFactura') + poDate.tip = 4 && 4 = aviz - in Inlist-ul validat de inainte_de_do_termin SI de plafonul S2c/S2d + poDate.serie_act = 'TST' + poDate.nract = 1 + DO AfLog WITH 'poDate pregatit (oDateFactura), tip=' + TRANSFORM(poDate.tip) + ' gnScadereStoc=' + TRANSFORM(gnScadereStoc) + + *----- driverul de deblocare Show(1): Timer la nivel _SCREEN + _SCREEN.Forms + Controls(i), + * mecanism validat (test_modal_unlock_smoketest2.prg / Nivel 2). De data asta cauta + * FRM_ARTICOL_GEST_FACTURA, nu FRM_ARTICOL_FACTURA. ----- + PUBLIC goDriver, gnDriverTick, glDlgTratat, gcCazAct + gnDriverTick = 0 + glDlgTratat = .F. + gcCazAct = '' + goDriver = CREATEOBJECT('driverdeblocaregest') + _SCREEN.AddObject('tmrDrvN3', 'Timer') + _SCREEN.tmrDrvN3.Interval = 200 + BINDEVENT(_SCREEN.tmrDrvN3, 'Timer', goDriver, 'Executa') + _SCREEN.tmrDrvN3.Enabled = .T. + DO AfLog WITH 'driver+timer pregatiti (cauta FRM_ARTICOL_GEST_FACTURA)' + + *----- Desktop VFP vizibil, ca la celelalte suite UI ----- + _SCREEN.Visible = .T. + _SCREEN.WindowState = 2 + _SCREEN.Caption = 'TEST UI Nivel 3 (S2d - ramura gestiuni)' + + PUBLIC goFrm + goFrm = CREATEOBJECT('frm_facturare_articole') + goFrm.WindowType = 0 && testul instantiaza direct - modeless, Show() revine imediat + goFrm.Show() + goFrm.WindowState = 2 + DOEVENTS FORCE + DO AfLog WITH 'frm_facturare_articole afisat modeless, Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + + DO HarnessStep WITH 0, 'formular afisat, mediu pregatit' + + *-- Local-e folosite pe tot parcursul -- + LOCAL lnWait, lnIdTempLinie1, lnIdTempLinie2, lnArtStocInainte, lnArtStocDupa + + *========================= PAS 1 (caz a): adaugare linie1 din G1 ========================= + SELECT crsarticole + GO TOP + gcCazAct = 'ADD_G1_Q3' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_urmator1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa ADD_G1_Q3: glDlgTratat=' + TRANSFORM(glDlgTratat) + ' Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + + IF RECCOUNT('crsfactura') = 1 + SELECT crsfactura + GO TOP + lnIdTempLinie1 = id_temp + IF id_gestiune = 101 AND ABS(cantitate - 3) < 0.001 + DO UILog WITH 'PASS P1 (caz a) linia1 adaugata din G1: id_gestiune=' + TRANSFORM(id_gestiune) + ' cantitate=' + TRANSFORM(cantitate) + ' pret_achizitie=' + TRANSFORM(pret_achizitie) + ELSE + DO UILog WITH 'FAIL P1 (caz a) linia1: id_gestiune=' + TRANSFORM(id_gestiune) + ' cantitate=' + TRANSFORM(cantitate) + ' (asteptat id_gestiune=101 cantitate=3)' + ENDIF + ELSE + DO UILog WITH 'FAIL P1 (caz a): Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ' (asteptat 1) - linia1 nu a fost adaugata' + ENDIF + DO HarnessStep WITH 1, 'P1 linia1 adaugata din G1' + + *========================= PAS 2: adaugare linie2 (acelasi articol) din G2 ========================= + SELECT crsarticole + GO TOP + gcCazAct = 'ADD_G2_Q4' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_urmator1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa ADD_G2_Q4: glDlgTratat=' + TRANSFORM(glDlgTratat) + ' Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + + IF RECCOUNT('crsfactura') = 2 + SELECT crsfactura + LOCATE FOR id_gestiune = 102 + IF FOUND() + lnIdTempLinie2 = id_temp + IF ABS(cantitate - 4) < 0.001 + DO UILog WITH 'PASS P2 linia2 adaugata din G2: cantitate=' + TRANSFORM(cantitate) + ELSE + DO UILog WITH 'FAIL P2 linia2: cantitate=' + TRANSFORM(cantitate) + ' (asteptat 4)' + ENDIF + ELSE + DO UILog WITH 'FAIL P2: nu exista rand cu id_gestiune=102' + ENDIF + ELSE + DO UILog WITH 'FAIL P2: Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ' (asteptat 2)' + ENDIF + DO HarnessStep WITH 2, 'P2 linia2 adaugata din G2' + + *========================= PAS 3 (cazuri b+c): redeschide linia1, verifica preselectia si + *========================= excluderea id_temp, apoi Renunta (nimic comis) ========================= + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie1 + gcCazAct = 'MOD_L1_PRESELECT_CHECK' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_modifica1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa MOD_L1_PRESELECT_CHECK: glDlgTratat=' + TRANSFORM(glDlgTratat) + + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie1 + IF RECCOUNT('crsfactura') = 2 AND FOUND() AND id_gestiune = 101 AND ABS(cantitate - 3) < 0.001 + DO UILog WITH 'PASS P3 (caz b+c, Renunta) nimic comis: Reccount=2, linia1 neschimbata (G1/3)' + ELSE + DO UILog WITH 'FAIL P3 (caz b+c, Renunta): Reccount=' + TRANSFORM(RECCOUNT('crsfactura')) + ' found=' + TRANSFORM(FOUND()) + ' id_gestiune=' + TRANSFORM(id_gestiune) + ' cantitate=' + TRANSFORM(cantitate) + ' (asteptat 2 / 101 / 3)' + ENDIF + DO HarnessStep WITH 3, 'P3 cazuri b+c - preselectie si excludere id_temp' + + *========================= PAS 4 (caz d, respins): redeschide linia1, cere 11 (peste stocul G1=10) ========================= + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie1 + gcCazAct = 'MOD_L1_REJECT_OVER_LOT' + glDlgTratat = .F. + gnDriverTick = 0 + gcMockUltimMesaj = '' + goFrm.But_modifica1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa MOD_L1_REJECT_OVER_LOT: glDlgTratat=' + TRANSFORM(glDlgTratat) + ' mesaj=[' + gcMockUltimMesaj + ']' + + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie1 + IF ABS(cantitate - 3) < 0.001 AND 'stocul gestiunii' $ gcMockUltimMesaj + DO UILog WITH 'PASS P4 (caz d, respins) cantitate 11 peste stocul G1(10) respinsa, linia neschimbata (cantitate=' + TRANSFORM(cantitate) + '), mesaj=[' + gcMockUltimMesaj + ']' + ELSE + DO UILog WITH 'FAIL P4 (caz d, respins): cantitate=' + TRANSFORM(cantitate) + ' (asteptat 3, neschimbata) mesaj=[' + gcMockUltimMesaj + ']' + ENDIF + DO HarnessStep WITH 4, 'P4 caz d - respins peste plafonul lotului' + + *========================= PAS 5 (caz d, acceptat): redeschide linia1, cere exact 10 ========================= + SELECT crsarticole + lnArtStocInainte = cantitate + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie1 + gcCazAct = 'MOD_L1_ACCEPT_AT_LOT' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_modifica1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa MOD_L1_ACCEPT_AT_LOT: glDlgTratat=' + TRANSFORM(glDlgTratat) + + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie1 + IF ABS(cantitate - 10) < 0.001 AND id_gestiune = 101 + DO UILog WITH 'PASS P5 (caz d, acceptat) cantitate 10 (exact stocul G1) acceptata: cantitate=' + TRANSFORM(cantitate) + ELSE + DO UILog WITH 'FAIL P5 (caz d, acceptat): cantitate=' + TRANSFORM(cantitate) + ' id_gestiune=' + TRANSFORM(id_gestiune) + ' (asteptat 10 / 101)' + ENDIF + *-- caz g: cantitatea liniei a crescut de la 3 la 10 (delta +7) -> crsarticole trebuie sa scada cu 7 + SELECT crsarticole + lnArtStocDupa = cantitate + IF ABS((lnArtStocInainte - lnArtStocDupa) - 7) < 0.001 + DO UILog WITH 'PASS P5 (caz g) crsarticole ajustat cu diferenta: ' + TRANSFORM(lnArtStocInainte) + ' -> ' + TRANSFORM(lnArtStocDupa) + ' (-7, cantitatea liniei a crescut 3->10)' + ELSE + DO UILog WITH 'FAIL P5 (caz g): crsarticole ' + TRANSFORM(lnArtStocInainte) + ' -> ' + TRANSFORM(lnArtStocDupa) + ' (asteptat -7)' + ENDIF + DO HarnessStep WITH 5, 'P5 caz d - acceptat la exact plafonul lotului' + + *========================= PAS 6 (caz e + g): navigheaza (fara SPACE) pe G3, cantitate 5 ========================= + *-- martorul se ia AICI: cel din PAS 5 masoara efectul lui PAS 5, nu al lui PAS 6 + SELECT crsarticole + lnArtStocInainte = cantitate + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie1 + gcCazAct = 'MOD_L1_CHANGE_GESTIUNE_NAV' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_modifica1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa MOD_L1_CHANGE_GESTIUNE_NAV: glDlgTratat=' + TRANSFORM(glDlgTratat) + + SELECT crsarticole + lnArtStocDupa = cantitate + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie1 + IF id_gestiune = 103 AND ABS(cantitate - 5) < 0.001 AND ABS(pret_achizitie - 52) < 0.001 + DO UILog WITH 'PASS P6 (caz e) schimbare gestiune prin navigare (fara SPACE): id_gestiune=' + TRANSFORM(id_gestiune) + ' cantitate=' + TRANSFORM(cantitate) + ' pret_achizitie=' + TRANSFORM(pret_achizitie) + ELSE + DO UILog WITH 'FAIL P6 (caz e): id_gestiune=' + TRANSFORM(id_gestiune) + ' cantitate=' + TRANSFORM(cantitate) + ' pret_achizitie=' + TRANSFORM(pret_achizitie) + ' (asteptat 103 / 5 / 52)' + ENDIF + *-- caz g: cantitatea liniei a scazut de la 10 la 5 (delta -5) -> crsarticole trebuie sa creasca cu 5 + IF ABS((lnArtStocDupa - lnArtStocInainte) - 5) < 0.001 + DO UILog WITH 'PASS P6 (caz g) crsarticole ajustat cu diferenta: ' + TRANSFORM(lnArtStocInainte) + ' -> ' + TRANSFORM(lnArtStocDupa) + ' (+5, cantitatea liniei a scazut 10->5)' + ELSE + DO UILog WITH 'FAIL P6 (caz g): crsarticole ' + TRANSFORM(lnArtStocInainte) + ' -> ' + TRANSFORM(lnArtStocDupa) + ' (asteptat +5)' + ENDIF + DO HarnessStep WITH 6, 'P6 caz e+g - schimbare gestiune prin navigare + sincronizare crsarticole' + + *========================= PAS 7 (caz f + g): multi-selectie SPACE pe G1 si G4 ========================= + SELECT crsarticole + lnArtStocInainte = cantitate + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie1 + gcCazAct = 'MOD_L1_MULTISELECT' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_modifica1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa MOD_L1_MULTISELECT: glDlgTratat=' + TRANSFORM(glDlgTratat) + ' Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + + SELECT crsarticole + lnArtStocDupa = cantitate + IF RECCOUNT('crsfactura') = 3 + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie1 + LOCAL llL1ok, llL2ok, llNouaOk + llL1ok = (id_gestiune = 101 AND ABS(cantitate - 10) < 0.001) + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie2 + llL2ok = FOUND() AND id_gestiune = 102 AND ABS(cantitate - 4) < 0.001 + SELECT crsfactura + LOCATE FOR id_gestiune = 104 + llNouaOk = FOUND() AND ABS(cantitate - 6) < 0.001 AND id_temp <> lnIdTempLinie1 AND id_temp <> lnIdTempLinie2 + IF llL1ok AND llL2ok AND llNouaOk + DO UILog WITH 'PASS P7 (caz f) multi-selectie: Reccount=3 (linia1 actualizata G1/10, linia2 neschimbata G2/4, O SINGURA linie noua G4/6 - fara duplicat)' + ELSE + DO UILog WITH 'FAIL P7 (caz f): llL1ok=' + TRANSFORM(llL1ok) + ' llL2ok=' + TRANSFORM(llL2ok) + ' llNouaOk=' + TRANSFORM(llNouaOk) + ENDIF + ELSE + DO UILog WITH 'FAIL P7 (caz f): Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ' (asteptat 3 - daca e 4, a reaparut regresia Scan/Skip cu linie duplicat)' + ENDIF + *-- caz g: cantitatea totala a articolului pe factura a crescut de la 5+4=9 la 10+6+4=20, delta +11 -> crsarticole trebuie sa scada cu 11 + IF ABS((lnArtStocInainte - lnArtStocDupa) - 11) < 0.001 + DO UILog WITH 'PASS P7 (caz g) crsarticole ajustat cu diferenta: ' + TRANSFORM(lnArtStocInainte) + ' -> ' + TRANSFORM(lnArtStocDupa) + ' (-11, cantitatea totala a crescut de la 5 la 16 pe aceasta redeschidere)' + ELSE + DO UILog WITH 'FAIL P7 (caz g): crsarticole ' + TRANSFORM(lnArtStocInainte) + ' -> ' + TRANSFORM(lnArtStocDupa) + ' (asteptat -11)' + ENDIF + DO HarnessStep WITH 7, 'P7 caz f+g - multi-selectie si sincronizare crsarticole' + + *========================= PAS 8 (caz h): Renunta pe dialogul cu gestiuni - rand bit-identic ========================= + IF RECCOUNT('crsfactura') >= 1 + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie1 + IF FOUND() + LOCAL ARRAY laSnapDinainte[1] + LOCAL lnF, lnCampuri + SCATTER TO laSnapDinainte + + gcCazAct = 'MOD_L1_RENUNTA' + glDlgTratat = .F. + gnDriverTick = 0 + goFrm.But_modifica1.Click() + DOEVENTS FORCE + lnWait = 0 + DO WHILE !glDlgTratat AND lnWait < 150 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO AfLog WITH 'dupa MOD_L1_RENUNTA: glDlgTratat=' + TRANSFORM(glDlgTratat) + + LOCAL ARRAY laSnapDupa[1] + SELECT crsfactura + LOCATE FOR id_temp = lnIdTempLinie1 + SCATTER TO laSnapDupa + + LOCAL llIdentic + llIdentic = (ALEN(laSnapDinainte,1) == ALEN(laSnapDupa,1)) + lnCampuri = 0 + IF llIdentic + FOR lnF = 1 TO ALEN(laSnapDinainte,1) + lnCampuri = lnCampuri + 1 + IF !(TRANSFORM(laSnapDinainte(lnF)) == TRANSFORM(laSnapDupa(lnF))) + llIdentic = .F. + DO AfLog WITH 'P8 diagnostic - campul ' + TRANSFORM(lnF) + ' difera: [' + ; + TRANSFORM(laSnapDinainte(lnF)) + '] -> [' + TRANSFORM(laSnapDupa(lnF)) + ']' + ENDIF + ENDFOR + ENDIF + + IF llIdentic + DO UILog WITH 'PASS P8 (caz h) Renunta pe dialogul cu gestiuni: randul ramane BIT-IDENTIC (' + TRANSFORM(lnCampuri) + ' campuri comparate)' + ELSE + DO UILog WITH 'FAIL P8 (caz h): randul S-A MODIFICAT desi s-a apasat Renunta (vezi diag pe campuri mai sus)' + ENDIF + ELSE + DO UILog WITH 'NEACOPERIT P8: linia1 (id_temp=' + TRANSFORM(lnIdTempLinie1) + ') nu mai exista' + ENDIF + ELSE + DO UILog WITH 'NEACOPERIT P8: crsfactura gol' + ENDIF + DO HarnessStep WITH 8, 'P8 caz h - Renunta bit-identic' + + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO AfLog WITH 'CATCH ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + + *-- DIAGNOSTIC temporar: AERROR() suplimentar, stare crsgestarticol, si o proba izolata de + *-- CREATEOBJECT("frm_articol_gest_factura",...) cu poArticol construit liber (ca Nivel 1) - + *-- separa o cauza de MEDIU (clase/globale) de una legata de FORMA lui poArticol produs de + *-- fluxul real (do_initializeaza_articol). + LOCAL ARRAY laErrDiag(1) + LOCAL lnEd + =AERROR(laErrDiag) + FOR lnEd = 1 TO ALEN(laErrDiag,1) + DO AfLog WITH 'AERROR[' + TRANSFORM(lnEd) + ']=' + TRANSFORM(NVL(laErrDiag(lnEd),'.NULL.')) + ENDFOR + DO AfLog WITH 'DIAG: USED(crsgestarticol)=' + TRANSFORM(USED('crsgestarticol')) + IIF(USED('crsgestarticol'), ' Reccount=' + TRANSFORM(RECCOUNT('crsgestarticol')), '') + + LOCAL lnPi, loProba + LOCAL ARRAY laPPropN(49), laPPropC(11) + laPPropN( 1)='id_articol' + laPPropN( 2)='Id_Pol' + laPPropN( 3)='id_gestiune' + laPPropN( 4)='id_c' + laPPropN( 5)='id_ctr' + laPPropN( 6)='id_valuta' + laPPropN( 7)='id_valuta_d' + laPPropN( 8)='id_lucrare_rez' + laPPropN( 9)='id_part_rez' + laPPropN(10)='id_jtva_coloana' + laPPropN(11)='taxcode' + laPPropN(12)='opt_facturare' + laPPropN(13)='gestionabil' + laPPropN(14)='tip_valuta' + laPPropN(15)='cantitate' + laPPropN(16)='Curs' + laPPropN(17)='multiplicator' + laPPropN(18)='pret_achizitie' + laPPropN(19)='pretv_orig' + laPPropN(20)='pretd' + laPPropN(21)='proc_tvav' + laPPropN(22)='preturi_cu_tva' + laPPropN(23)='pretftva' + laPPropN(24)='pretftva_val' + laPPropN(25)='pretctva' + laPPropN(26)='pretctva_val' + laPPropN(27)='tva' + laPPropN(28)='tva_val' + laPPropN(29)='discount_unitar' + laPPropN(30)='discount_unitar_val' + laPPropN(31)='discount_unitar_ctva' + laPPropN(32)='discount_unitar_ctva_val' + laPPropN(33)='valftva' + laPPropN(34)='valtva' + laPPropN(35)='valctva' + laPPropN(36)='valdiscountftva' + laPPropN(37)='valdiscounttva' + laPPropN(38)='valdiscountctva' + laPPropN(39)='valdiminuatftva' + laPPropN(40)='valdiminuattva' + laPPropN(41)='valdiminuatctva' + laPPropN(42)='vvalftva' + laPPropN(43)='vvaltva' + laPPropN(44)='vvalctva' + laPPropN(45)='vvaldiscountftva' + laPPropN(46)='vvaldiscounttva' + laPPropN(47)='vvaldiscountctva' + laPPropN(48)='vvaldiminuatftva' + laPPropN(49)='vvaldiminuattva' + laPPropC( 1)='codmat' + laPPropC( 2)='codmatf' + laPPropC( 3)='denumire' + laPPropC( 4)='um' + laPPropC( 5)='serie' + laPPropC( 6)='lot' + laPPropC( 7)='explicatie' + laPPropC( 8)='numar_contract' + laPPropC( 9)='codbare' + laPPropC(10)='nume_val' + laPPropC(11)='Cont' + + PRIVATE poArticol + poArticol = CREATEOBJECT('Empty') + FOR lnPi = 1 TO 49 + =ADDPROPERTY(poArticol, laPPropN(lnPi), 0) + ENDFOR + =ADDPROPERTY(poArticol, 'vvaldiminuatctva', 0) + FOR lnPi = 1 TO 11 + =ADDPROPERTY(poArticol, laPPropC(lnPi), '') + ENDFOR + poArticol.id_articol = 3001 + poArticol.Id_Pol = 1 + poArticol.Cont = '701' + poArticol.id_gestiune = 101 + poArticol.gestionabil = 1 + poArticol.tip_valuta = 0 + poArticol.Curs = 1 + poArticol.multiplicator = 1 + poArticol.cantitate = 3 + poArticol.codmat = 'ART3001' + poArticol.denumire = 'ARTICOL GESTIUNI NIVEL3' + poArticol.um = 'BUC' + poArticol.proc_tvav = 1.21 + poArticol.preturi_cu_tva = 0 + poArticol.pretftva = 50 + poArticol.pretctva = 60.5 + + TRY + loProba = CREATEOBJECT('frm_articol_gest_factura', 3, .F., .F.) + DO AfLog WITH 'DIAG PROBA: CREATEOBJECT reusit izolat, Class=' + loProba.Class + loProba.Release() + CATCH TO loExcProba + DO AfLog WITH 'DIAG PROBA: CATCH ErrorNo=' + TRANSFORM(loExcProba.ErrorNo) + ' Message=' + loExcProba.Message + ' Proc=' + loExcProba.Procedure + ' Line=' + TRANSFORM(loExcProba.LineNo) + ' [' + loExcProba.LineContents + ']' + ENDTRY + + DO HarnessDone WITH 'done-error' +ENDTRY + +QUIT + +*================================================================================== +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO AfLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +PROCEDURE UILog + LPARAMETERS tcMsg + DO AfLog WITH tcMsg +ENDPROC + +*-- FindCtl: referinta directa la un control prin Controls(i), potrivit dupa .Name - tehnica +*-- validata in test_modal_unlock_smoketest2.prg / Nivel 2 (accesul cu prefix direct pe o referinta +*-- obtinuta din _SCREEN.Forms da eroare 1925; Controls(i) e calea sigura). +PROCEDURE FindCtl + LPARAMETERS toParent, tcName + LOCAL lnI, loGasit + loGasit = .NULL. + FOR lnI = 1 TO toParent.ControlCount + IF UPPER(toParent.Controls(lnI).Name) == UPPER(tcName) + loGasit = toParent.Controls(lnI) + ENDIF + ENDFOR + RETURN loGasit +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexport AS Custom + PROCEDURE citesteSetareRegistru + LPARAMETERS tcCheie + RETURN '' + ENDPROC +ENDDEFINE + +*-- dummyexecutor: mock la GRANITA (goExecutor.oExecute e singurul punct de contact al lui +*-- do_alege_stoc cu Oracle, ofacturare.vc2:13254). Ramifica pe continutul SQL-ului: cererile +*-- 'cursor_gestiuni_articol*' (normal/_retur/_stoc0 - toate three trec prin acelasi mock, textul +*-- nu se distinge in teste, doar sursa comuna crsMockStoc) primesc structura+datele din +*-- crsMockStoc; orice alta interogare (ex. select codmatf ... from nom_articole, apelata dupa +*-- gnButon=1) primeste comportamentul implicit de dinainte (cursor gol cu un singur camp). +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(tcCursor) + USE IN (tcCursor) + ENDIF + IF 'CURSOR_GESTIUNI_ARTICOL' $ UPPER(tcSql) + SELECT * FROM crsMockStoc INTO CURSOR (tcCursor) READWRITE + ELSE + CREATE CURSOR (tcCursor) (codmatf C(50)) + ENDIF + RETURN 1 + ENDPROC + PROCEDURE oPrelucrareEroare + RETURN cEroare + ENDPROC + PROCEDURE oReset + ENDPROC +ENDDEFINE + +DEFINE CLASS driverdeblocaregest AS Custom + PROCEDURE Executa + *-- rulat la fiecare tick al _SCREEN.tmrDrvN3. Cauta FRM_ARTICOL_GEST_FACTURA (nu + *-- FRM_ARTICOL_FACTURA - dialogul cu gridul de gestiuni, deschis de do_alege_stoc), + *-- aplica interactiunea selectata de gcCazAct, inchide dialogul (do_termin sau + *-- But_renunt1.Click(), dupa caz). + LOCAL lnI, loForm, llGasit + gnDriverTick = gnDriverTick + 1 + llGasit = .F. + FOR lnI = 1 TO _SCREEN.FormCount + IF UPPER(_SCREEN.Forms(lnI).Class) == 'FRM_ARTICOL_GEST_FACTURA' + loForm = _SCREEN.Forms(lnI) + llGasit = .T. + ENDIF + ENDFOR + + IF glDlgTratat OR !llGasit + RETURN + ENDIF + + DO AfLog WITH 'driverGest tick ' + TRANSFORM(gnDriverTick) + ' POTRIVIT (caz=' + gcCazAct + '), intru in interactiune' + + LOCAL loCantitateCtn, loCantitate, loBifa, loRenunt, loGrid + + TRY + DO CASE + CASE gcCazAct == 'ADD_G1_Q3' + *-- caz a: dialogul cu gestiuni s-a deschis pe mai multe gestiuni (nu auto-select); + *-- verific ck_pret_cu_tva (mostenit din frm_articol_factura, S2a) - existenta si layout. + loBifa = FindCtl(loForm, 'ck_pret_cu_tva') + IF VARTYPE(loBifa) = 'O' + IF loForm.Height = 546 AND loBifa.Top = 510 + DO AfLog WITH 'driverGest ADD_G1_Q3: ck_pret_cu_tva EXISTA, Top=' + TRANSFORM(loBifa.Top) + ' pe forma Height=' + TRANSFORM(loForm.Height) + ' -> PASS layout' + ELSE + DO AfLog WITH 'driverGest ADD_G1_Q3: ck_pret_cu_tva EXISTA dar layout neasteptat: Top=' + TRANSFORM(loBifa.Top) + ' Height forma=' + TRANSFORM(loForm.Height) + ENDIF + ELSE + DO AfLog WITH 'driverGest ADD_G1_Q3: ck_pret_cu_tva LIPSESTE din instanta' + ENDIF + DO AfLog WITH 'driverGest ADD_G1_Q3: Reccount(crsgestarticol)=' + TRANSFORM(RECCOUNT('crsgestarticol')) + *-- pozitia implicita (Go Top, tnIdTempExclus=0 la adaugare) e deja pe G1 (datain cel mai vechi) + loCantitateCtn = FindCtl(loForm, 'clb_cantitate') + loCantitate = FindCtl(loCantitateCtn, 'Text_simplu1') + loCantitate.Value = 3 + loCantitate.InteractiveChange() + DO AfLog WITH 'driverGest ADD_G1_Q3: cantitate=3 pe G1 (pozitia implicita), apas do_termin()' + loForm.do_termin() + + CASE gcCazAct == 'ADD_G2_Q4' + SELECT crsgestarticol + LOCATE FOR id_gestiune = 102 + loGrid = FindCtl(loForm, 'grd_gestiuni') + loGrid.AfterRowColChange(1) + loCantitateCtn = FindCtl(loForm, 'clb_cantitate') + loCantitate = FindCtl(loCantitateCtn, 'Text_simplu1') + loCantitate.Value = 4 + loCantitate.InteractiveChange() + DO AfLog WITH 'driverGest ADD_G2_Q4: navigheaza pe G2, cantitate=4, apas do_termin()' + loForm.do_termin() + + CASE gcCazAct == 'MOD_L1_PRESELECT_CHECK' + *-- cazuri b+c: verifica preselectia pe randul liniei si excluderea id_temp, fara sa comita nimic + SELECT crsgestarticol + IF id_gestiune = 101 AND ABS(cantitate - 10) < 0.001 + DO UILog WITH 'PASS P3 (caz b) preselectie pe randul liniei modificate, cu propria cantitate reintoarsa in stoc: id_gestiune=' + TRANSFORM(id_gestiune) + ' cantitate=' + TRANSFORM(cantitate) + ELSE + DO UILog WITH 'FAIL P3 (caz b): id_gestiune=' + TRANSFORM(id_gestiune) + ' cantitate=' + TRANSFORM(cantitate) + ' (asteptat 101 / 10)' + ENDIF + LOCATE FOR id_gestiune = 102 + IF FOUND() AND ABS(cantitate - 11) < 0.001 + DO UILog WITH 'PASS P3 (caz c) randul G2 (linia2, neexclusa) scade normal cu cantitatea ei: cantitate=' + TRANSFORM(cantitate) + ' (15-4)' + ELSE + DO UILog WITH 'FAIL P3 (caz c): randul G2 found=' + TRANSFORM(FOUND()) + IIF(FOUND(), ' cantitate=' + TRANSFORM(cantitate), '') + ' (asteptat 11 = 15-4)' + ENDIF + loRenunt = FindCtl(loForm, 'But_renunt1') + DO AfLog WITH 'driverGest MOD_L1_PRESELECT_CHECK: apas Renunta (nimic de comis)' + loRenunt.Click() + + CASE gcCazAct == 'MOD_L1_REJECT_OVER_LOT' + SELECT crsgestarticol + LOCATE FOR id_gestiune = 101 + loGrid = FindCtl(loForm, 'grd_gestiuni') + loGrid.AfterRowColChange(1) + loCantitateCtn = FindCtl(loForm, 'clb_cantitate') + loCantitate = FindCtl(loCantitateCtn, 'Text_simplu1') + loCantitate.Value = 11 + loCantitate.InteractiveChange() + DO AfLog WITH 'driverGest MOD_L1_REJECT_OVER_LOT: cantitate=11 pe G1 (stoc 10), apas do_termin() - astept respingere' + loForm.do_termin() + *-- daca a respins, formularul ramane deschis (testare-ui-vfp.md, "Dialoguri modale") - inchid prin Renunta + loRenunt = FindCtl(loForm, 'But_renunt1') + IF VARTYPE(loRenunt) = 'O' + DO AfLog WITH 'driverGest MOD_L1_REJECT_OVER_LOT: dialogul a ramas deschis (validare respinsa, cum era asteptat), inchid cu Renunta' + loRenunt.Click() + ENDIF + + CASE gcCazAct == 'MOD_L1_ACCEPT_AT_LOT' + SELECT crsgestarticol + LOCATE FOR id_gestiune = 101 + loGrid = FindCtl(loForm, 'grd_gestiuni') + loGrid.AfterRowColChange(1) + loCantitateCtn = FindCtl(loForm, 'clb_cantitate') + loCantitate = FindCtl(loCantitateCtn, 'Text_simplu1') + loCantitate.Value = 10 + loCantitate.InteractiveChange() + DO AfLog WITH 'driverGest MOD_L1_ACCEPT_AT_LOT: cantitate=10 pe G1 (exact stocul), apas do_termin()' + loForm.do_termin() + + CASE gcCazAct == 'MOD_L1_CHANGE_GESTIUNE_NAV' + SELECT crsgestarticol + LOCATE FOR id_gestiune = 103 + loGrid = FindCtl(loForm, 'grd_gestiuni') + loGrid.AfterRowColChange(1) + loCantitateCtn = FindCtl(loForm, 'clb_cantitate') + loCantitate = FindCtl(loCantitateCtn, 'Text_simplu1') + loCantitate.Value = 5 + loCantitate.InteractiveChange() + DO AfLog WITH 'driverGest MOD_L1_CHANGE_GESTIUNE_NAV: navigheaza (fara SPACE) pe G3, cantitate=5, apas do_termin()' + loForm.do_termin() + + CASE gcCazAct == 'MOD_L1_MULTISELECT' + SELECT crsgestarticol + LOCATE FOR id_gestiune = 101 + DO AfLog WITH 'driverGest MOD_L1_MULTISELECT: SPACE (do_executa) pe G1' + loForm.do_executa() + SELECT crsgestarticol + LOCATE FOR id_gestiune = 104 + DO AfLog WITH 'driverGest MOD_L1_MULTISELECT: SPACE (do_executa) pe G4' + loForm.do_executa() + DO AfLog WITH 'driverGest MOD_L1_MULTISELECT: nselectate=' + TRANSFORM(loForm.nselectate) + IIF(TYPE('poArticol.cantitate') = 'N', ' poArticol.cantitate acumulata=' + TRANSFORM(poArticol.cantitate), '') + ', apas do_termin()' + loForm.do_termin() + + CASE gcCazAct == 'MOD_L1_RENUNTA' + loCantitateCtn = FindCtl(loForm, 'Clb_pretftva') + IF VARTYPE(loCantitateCtn) = 'O' + loCantitate = FindCtl(loCantitateCtn, 'tx_suma_nat') + IF VARTYPE(loCantitate) = 'O' + loCantitate.Value = 9999 + loCantitate.InteractiveChange() + ENDIF + ENDIF + loRenunt = FindCtl(loForm, 'But_renunt1') + DO AfLog WITH 'driverGest MOD_L1_RENUNTA: pret tastat 9999, apas But_renunt1 (Renunta)' + loRenunt.Click() + + OTHERWISE + DO AfLog WITH 'driverGest: gcCazAct necunoscut [' + gcCazAct + ']' + ENDCASE + + glDlgTratat = .T. + DO AfLog WITH 'driverGest: interactiune REUSITA pentru caz=' + gcCazAct + CATCH TO loExcDrv + DO AfLog WITH 'driverGest: CATCH caz=' + gcCazAct + ' ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ; + ' Message=' + loExcDrv.Message + ' Procedure=' + loExcDrv.Procedure + ; + ' LineNo=' + TRANSFORM(loExcDrv.LineNo) + ' LineContents=[' + loExcDrv.LineContents + ']' + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel3_gestiuni.ps1 b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel3_gestiuni.ps1 new file mode 100644 index 0000000..c3b5c9a --- /dev/null +++ b/utile/Teste/facturare_pret_cu_tva/test_pret_cu_tva_nivel3_gestiuni.ps1 @@ -0,0 +1,13 @@ +# test_pret_cu_tva_nivel3_gestiuni.ps1 - wrapper peste harness-ul generic pentru ramura GESTIONABILA +# a lui do_modifica/do_adauga_articol (S2d, review). Oracle mockuit la granita (goExecutor), fluxul +# real (butoane, taste, SPACE) ramane intact. Rulare: +# powershell -ExecutionPolicy Bypass -File test_pret_cu_tva_nivel3_gestiuni.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_pret_cu_tva_nivel3_gestiuni.prg') ` + -Steps @('mediu', 'p1_add_g1', 'p2_add_g2', 'p3_preselectie_excludere', 'p4_respins_peste_lot', 'p5_acceptat_la_lot', 'p6_schimbare_gestiune_nav', 'p7_multiselectie', 'p8_renunta') ` + -ShotsDir (Join-Path $Teste 'screenshots_nivel3') ` + -SyncDir (Join-Path $Teste 'uisync_nivel3') ` + -StepTimeoutSec 60 ` + -ReadyTimeoutSec 90