teste: suita headless pentru pretul cu TVA pe linie (ROAFACTURARE 2.11.14)

Patru niveluri, 38 de asertii, toate PASS pe binarul din SVN r17998:

- test_pret_cu_tva_dialog        - dialogul frm_articol_factura izolat (14)
- test_pret_cu_tva_nivel2        - factura in curs de compunere, adaugare si ambele cai de
                                   modificare (buton si dublu-clic), Renunta bit-identic (7)
- test_pret_cu_tva_nivel2_retur  - plafonul de cantitate recalculat, pe ramura de retur (4)
- test_pret_cu_tva_nivel3_gestiuni - ramura gestionabila, cu Oracle mockuit la granita prin
                                   dummyexecutor: preselectia gestiunii, excluderea liniei din
                                   propriul stoc, plafonul pe lot, multi-selectia (13)

Nivelurile 2 si 3 conduc dialoguri modale deschise din codul aplicatiei (Show(1) hardcodat),
prin Timer pe _SCREEN si detectie in _SCREEN.Forms - mecanismul e descris in
docs/testare-ui-vfp.md.

Suita nu e in SVN (utile/Teste e ignorat acolo), deci traieste doar in git.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
This commit is contained in:
2026-08-08 00:23:15 +03:00
parent f88b2b9a5b
commit c5b0ce3a25
8 changed files with 2785 additions and 0 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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