Files
comun/utile/Teste/achizitie_import/test_dvi_dialog_ui.prg
Marius Mutu 832fea4913 achizitie import: TVA DVI cu valuta proprie, discount financiar, cote multiple
- TVA-ul de pe DVI poate avea valuta si curs proprii, diferite de ale facturii
  (rand "protejat": rand_dvi/valuta_proprie pe introdc, sparge_tva_protejat).
- Discount financiar pe factura: rand tip_rand='G' (401 = 767), TVA calculat pe
  baza diminuata, marfa si preturile articolelor pe valoarea integrala.
- Factura multi-cota: randurile S, G si T se sparg pe cotele articolelor, cu
  explicatia TVA din familia coloanei si alinierea T -> S.
- Teste noi in utile/Teste/achizitie_import (discount, DVI, cote, e2e).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U9uDgDfUQXbh2Neib36CN8
2026-08-01 09:32:35 +03:00

794 lines
32 KiB
Plaintext

* test_dvi_dialog_ui.prg
* Runda30 (F1, plan fizzy-imagining-parnas.md): teste UI pe formularul REAL de adaugare
* factura (import_adauga_factura, COMUN\clase\ointroduceri.vcx), clona a test_adauga_factura_ui.prg,
* focalizata pe comportamentul dialogului pentru blocul DVI (valuta/curs proprii) si discount:
* 1. precompletarea valutei/cursului DVI din factura la Init (mirror automat);
* 2. contractul nou al mock_caut_valuta (goMockValutaCoada, coada FIFO) exercitat prin
* 2 pick-uri diferite in acelasi flux (valuta facturii, apoi valuta DVI) + fallback
* la contractul vechi (goMockValuta) cand coada se goleste;
* 3. alegerea RON pe DVI (curs fix 1, curs disabled, TVA valuta ascunsa si 0);
* 4. garda de dirty: TVA in valuta DVI editat manual (txtDviTvaVal.Valid) nu mai e
* rescris de recalc_tva (cazul unei a treia valute, diferita de RON si de factura);
* 5. Runda32: discountul e activ direct pe nDiscBaza<>0 (fara chkAreDiscount); caption-ul
* txtDiscBaza urmeaza valuta facturii, txtDiscBaza e permanent vizibil;
* 6. dirty-flags: txtDviCurs.Valid seteaza dirty; realegerea valutei DVI reseteaza cursul;
* 7. validari blocante: DVI non-RON cu curs 0; discount negativ; discount >= suma facturii.
*
* ASUMPTII (de confruntat cu implementarea reala):
* - proprietatile de dialog se numesc nDviIdValuta, cDviValuta, nDviCurs, lDviCursDirty,
* lDviTvaValDirty, nDiscBaza (verificate pe ointroduceri.vc2, lane F1+F2 dialog,
* 27.07.2026; Runda32 elimina chkAreDiscount/txtDiscTva/nDiscTva/lDiscTvaDirty);
* - RON e o valuta cu id propriu (1), nu id_valuta=0 (vezi test_repro_valuta_dblclick.prg);
* picker-ul (cmdValuta/cmdDviValuta.Click) ignora rezultate cu id_valuta=0 (guard
* !Empty(Nvl(loCauta.id_valuta,0))).
*
* Rulare:
* powershell -ExecutionPolicy Bypass -File test_dvi_dialog_ui.ps1
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\ROAGEST\COMUN\utile\Teste\achizitie_import\test_dvi_dialog_ui_log.txt"
gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_dvi_dialog\"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
ON ERROR DO DdErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
LOCAL gcAppPath, lcPath
gcAppPath = "D:\ROA\ROAGEST\"
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\MENIURI;' + ;
gcAppPath + 'COMUN\UTILE\GRIDEXTRAS;' + gcAppPath + 'COMUN\UTILE\CTL32;' + ;
gcAppPath + 'COMUN\UTILE\HPDF;' + gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ;
gcAppPath + 'COMUN\UTILE\WEB;' + gcAppPath + 'COMUN\UTILE\EXCEL;' + ;
ADDBS(SUBSTR(gcAppPath,1,RAT([\],gcAppPath,2)))+[COMUNROA\]
SET PATH TO &lcPath ADDITIVE
DO DdLog WITH 'SET PATH OK'
*----- CLASE -----
SET CLASSLIB TO (gcAppPath + "comun\clase\appwiz") ADDITIVE
SET CLASSLIB TO GESTIUNI ADDITIVE
SET CLASSLIB TO CAUT ADDITIVE
SET CLASSLIB TO BAZA ADDITIVE
SET CLASSLIB TO comun ADDITIVE
SET CLASSLIB TO accessibility.vcx ADDITIVE
SET CLASSLIB TO messagebox ADDITIVE
SET CLASSLIB TO registry ADDITIVE
SET CLASSLIB TO cauta_alfa_forms.vcx ADDITIVE
SET CLASSLIB TO DECABAZA ADDITIVE
SET CLASSLIB TO onomenclatoare ADDITIVE
SET CLASSLIB TO stocuri.vcx ADDITIVE
SET CLASSLIB TO rulaje.vcx ADDITIVE
SET CLASSLIB TO ointroduceri ADDITIVE
SET CLASSLIB TO ointroduceri_web ADDITIVE
SET CLASSLIB TO ointroduceri_depozit ADDITIVE
SET CLASSLIB TO overificari ADDITIVE
SET CLASSLIB TO ferestre_oracle ADDITIVE
SET CLASSLIB TO ferestre_cere_date.vcx ADDITIVE
SET CLASSLIB TO configurare.vcx ADDITIVE
SET CLASSLIB TO serii_numere.vcx ADDITIVE
SET CLASSLIB TO omodificari.vcx ADDITIVE
SET CLASSLIB TO ocompensari.vcx ADDITIVE
SET CLASSLIB TO caut_ora ADDITIVE
SET CLASSLIB TO onote_contabile ADDITIVE
SET CLASSLIB TO otoolbar ADDITIVE
SET CLASSLIB TO bon_fisc ADDITIVE
SET CLASSLIB TO onom_articole ADDITIVE
SET CLASSLIB TO onom_retete ADDITIVE
SET CLASSLIB TO orapoarte ADDITIVE
SET CLASSLIB TO orapoarte_gestiuni ADDITIVE
SET CLASSLIB TO orapoarte_parametri ADDITIVE
SET CLASSLIB TO ONOM_CURS ADDITIVE
SET CLASSLIB TO ctl32_statusbar_fals.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 ctl32_balloontip.vcx ADDITIVE
SET CLASSLIB TO ocriterii.vcx ADDITIVE
SET CLASSLIB TO oavize.vcx ADDITIVE
SET CLASSLIB TO onomenclatoare2 ADDITIVE
SET CLASSLIB TO wwdialogs.vcx ADDITIVE
SET CLASSLIB TO oimportxml.vcx ADDITIVE
SET CLASSLIB TO excelxml.vcx ADDITIVE
SET CLASSLIB TO orapoarte_obinv.vcx ADDITIVE
DO DdLog WITH 'SET CLASSLIB OK'
*----- PROCEDURI (mock-uri PRIMELE, ui_harness la final) -----
SET PROCEDURE TO PROCEDURI
SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\mock_caut_valuta.prg" ADDITIVE
SET PROCEDURE TO acces_meniu ADDITIVE
SET PROCEDURE TO cauta_alfa ADDITIVE
SET PROCEDURE TO pmenu ADDITIVE
SET PROCEDURE TO proceduri_comune ADDITIVE
SET PROCEDURE TO quitapp ADDITIVE
SET PROCEDURE TO init_program ADDITIVE
SET PROCEDURE TO oproceduri_listari.prg ADDITIVE
SET PROCEDURE TO oproceduri_configurare.prg ADDITIVE
SET PROCEDURE TO oproceduri_articole.prg ADDITIVE
SET PROCEDURE TO oproceduri_retete.prg ADDITIVE
SET PROCEDURE TO orapoarte.prg ADDITIVE
SET PROCEDURE TO mesaje ADDITIVE
SET PROCEDURE TO oserii_numere.prg ADDITIVE
SET PROCEDURE TO oexport.prg ADDITIVE
SET PROCEDURE TO wwConfig.prg ADDITIVE
SET PROCEDURE TO proceduri_rapoarte.prg ADDITIVE
SET PROCEDURE TO OPROCEDURI_CURS.PRG ADDITIVE
SET PROCEDURE TO validare.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 oinainte_de.prg ADDITIVE
SET PROCEDURE TO ooperatii_comune.prg ADDITIVE
SET PROCEDURE TO Ocompensari.PRG ADDITIVE
SET PROCEDURE TO OPROCEDURI_aMS.PRG ADDITIVE
SET PROCEDURE TO oproceduri_rulaje ADDITIVE
SET PROCEDURE TO oproceduri_stocuri ADDITIVE
SET PROCEDURE TO OINTRODUCERI ADDITIVE
SET PROCEDURE TO oHeader.prg ADDITIVE
SET PROCEDURE TO proceduri_excel.PRG ADDITIVE
SET PROCEDURE TO onomenclatoare.PRG ADDITIVE
SET PROCEDURE TO osecurity ADDITIVE
SET PROCEDURE TO ocautare ADDITIVE
SET PROCEDURE TO orefaceri ADDITIVE
SET PROCEDURE TO ofacturare_comun.PRG ADDITIVE
SET PROCEDURE TO ofacturare_stoc.PRG ADDITIVE
SET PROCEDURE TO oproceduri_casademarcat ADDITIVE
SET PROCEDURE TO oproceduri_casa_marcat_e500 ADDITIVE
SET PROCEDURE TO oproceduri_casa_marcat_mp500 ADDITIVE
SET PROCEDURE TO oproceduri_util.prg ADDITIVE
SET PROCEDURE TO wwxmlhttp.prg ADDITIVE
SET PROCEDURE TO ini.prg ADDITIVE
SET PROCEDURE TO odocumente.prg ADDITIVE
SET PROCEDURE TO regex.prg ADDITIVE
SET PROCEDURE TO wwutils.prg ADDITIVE
SET PROCEDURE TO inchidere_k 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 xmlaccess.prg ADDITIVE
SET PROCEDURE TO xmlparser.prg ADDITIVE
SET PROCEDURE TO filebringer.prg ADDITIVE
SET PROCEDURE TO wwcodeupdate.prg ADDITIVE
SET PROCEDURE TO wwhttp.prg ADDITIVE
SET PROCEDURE TO xdate.prg ADDITIVE
SET PROCEDURE TO ofacturare.prg ADDITIVE
SET PROCEDURE TO oproceduri_obinv.prg ADDITIVE
SET PROCEDURE TO oproceduri_facturare.prg ADDITIVE
SET PROCEDURE TO email.prg ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\ui_harness.prg" ADDITIVE
DO DdLog WITH 'SET PROCEDURE OK'
*----- Globale -----
PUBLIC gnPc, gnPval, gnPcant, gnPpret, gnPPretval, gnPCurs, gnPVal, gnPPretV, gnPPretVal
STORE 2 TO gnPc, gnPval, gnPVal
gnPcant = 3
STORE 4 TO gnPpret, gnPPretval, gnPPretVal, gnPPretV, gnPCurs
PUBLIC gl406, gcS, gnAn, gnLuna, gnIdFirma, gnIdSucursala, gcAcces, gcFirma
gl406 = .T.
gcS = 'CONTAFIN'
gnAn = YEAR(DATE())
gnLuna = MONTH(DATE())
gnIdFirma = 110
gnIdSucursala = 110
gcAcces = "1;2;3;4;5;6;7;8;"
gcFirma = gcS
PUBLIC nror(65000)
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 6
gcMockUltimMesaj = ''
gnMockUltimTip = 0
PUBLIC goExecutor, goApp
goExecutor = CREATEOBJECT('dummyexecutor')
goApp = CREATEOBJECT('dummyapp')
*----- poAct: antetul notei (factura in EUR, curs 5 - ca DVI-ul sa aiba ce mosteni la Init) -----
PUBLIC poAct
poAct = CREATEOBJECT('Custom')
poAct.AddProperty('nume_val', 'EUR')
poAct.AddProperty('curs', 5)
poAct.AddProperty('proc_tva', 1.21)
poAct.AddProperty('nnir', 0)
poAct.AddProperty('id_valuta', 978)
poAct.AddProperty('id_fdoc', 1)
poAct.AddProperty('fdoc', 'Factura')
poAct.AddProperty('id_partc', 501)
poAct.AddProperty('partc', 'FURNIZOR EXTERN GMBH')
poAct.AddProperty('serie_act', '')
poAct.AddProperty('dataact', DATE())
poAct.AddProperty('tva_incasare', 0)
poAct.AddProperty('id_set', 1)
poAct.AddProperty('id_gestin', 1)
*----- jtva_coloane2 / saft_taxtable: perechi reale 21% (achizitii interne + import) -----
IF USED('jtva_coloane2')
USE IN ('jtva_coloane2')
ENDIF
CREATE CURSOR jtva_coloane2 (ordine N(8), id_jtva_coloana N(14), denumire C(100), ;
jc N(1), jv N(1), afisat N(1), coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14))
INSERT INTO jtva_coloane2 VALUES (0, 0, '', 0, 0, 1, '', '', 0, 0)
INSERT INTO jtva_coloane2 VALUES (1, 208, 'ACH. INT. 21%', 1, 0, 1, 'RO21B', 'RO21T', 21, 209)
INSERT INTO jtva_coloane2 VALUES (2, 209, 'TVA ACH. INT. 21%', 1, 0, 1, 'RO21T', '', 21, 0)
INSERT INTO jtva_coloane2 VALUES (3, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221)
INSERT INTO jtva_coloane2 VALUES (4, 221, 'TVA ACH. IMP. 21%', 1, 0, 1, 'FO21T', '', 21, 0)
IF USED('saft_taxtable')
USE IN ('saft_taxtable')
ENDIF
CREATE CURSOR saft_taxtable (taxname C(250) NULL, typename C(250) NULL, taxcode N(6) NULL, ;
taxtype N(3) NULL, descriere C(250) NULL, tip C(100) NULL, descriere_tip C(250) NULL, ;
procent_taxa N(7,2) NULL, procent_prorata N(7,2) NULL, inactiv N(1) NULL, tva N(1) NULL, ;
wht N(1) NULL, tva_achizitii N(1) NULL, tva_livrari N(1) NULL)
INDEX ON taxcode TAG taxcode
INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ;
VALUES ('', 0, '', 0, 1, 1, 1, 1)
INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ;
VALUES ('301204-Import de bunuri cota 21%', 301204, '', 21, 1, 0, 1, 0)
DO CreeazaIntrodc WITH 'introdc'
DO CreeazaIntrodc WITH 'introdc_sablon'
INSERT INTO introdc_sablon (scd, scc, cu_tva, ordine, id_set, participa_valuta, tip_rand, ;
id_jtva_coloana, ptva, explicatie_tva) ;
VALUES ('371', '401', 1, 1, 1, .T., 'B', 208, 21, 'ACH. INT. 21%')
INSERT INTO introdc_sablon (scd, scc, cu_tva, ordine, id_set, participa_valuta, tip_rand, ;
id_jtva_coloana, ptva, explicatie_tva) ;
VALUES ('4426', '401', 1, 2, 1, .T., 'T', 209, 21, 'TVA ACH. INT. 21%')
GO TOP IN introdc_sablon
IF USED('rul_temp')
USE IN ('rul_temp')
ENDIF
CREATE CURSOR rul_temp (denumire C(100), codmat C(30), cant N(14,3), pret_val N(18,4), ;
pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), acont C(20), serie C(30), ;
lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2))
INSERT INTO rul_temp (denumire, codmat, cant, pret, pret_lei, cont, cota_tva) ;
VALUES ('PLACEHOLDER', 'PH', 1, 1, 1, '371', 21)
*-- index ord_doc INAINTE de CREATEOBJECT (capcana p, docs/testare-ui-vfp.md)
SELECT introdc
INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc
SET ORDER TO ord_doc
DO DdLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F. - mod import)'
PUBLIC goObj
goObj = CREATEOBJECT('IMPORT_nota', .F.)
IF VARTYPE(goObj) <> 'O'
DO DdLog WITH 'FAIL: instantiere import_nota'
DO HarnessDone WITH 'done-error'
QUIT
ENDIF
goObj.lDialogAratat = .T.
goObj.oact = poAct
goObj.lSpargeSecundare = .F.
goObj.WindowType = 0
goObj.Visible = .T.
goObj.Show()
goObj.WindowState = 2
DOEVENTS FORCE
SELECT rul_temp
ZAP
goObj.gridart.Refresh()
DOEVENTS FORCE
PRIVATE pnAsserts, pnPass
STORE 0 TO pnAsserts, pnPass
DO HarnessStep WITH 0, 'nota goala afisata, mod import (.F.)'
*========================= SCENARIU G: coada FIFO a mock-ului, 2 pick-uri in acelasi flux =========================
*-- valuta facturii (GBP) apoi valuta DVI (CHF) - independente; dupa coada, fallback la
*-- contractul vechi (goMockValuta fix).
PUBLIC goDlg
goDlg = CREATEOBJECT('import_adauga_factura', goObj)
goDlg.cFelDoc = 'Factura'
goDlg.nIdFdoc = 1
goDlg.nNract = 6001
goDlg.dDataAct = DATE()
goDlg.nIdPartener = 601
goDlg.cPartener = 'FURNIZOR UK LTD'
goDlg.nSuma = 100
goDlg.WindowType = 0
goDlg.Visible = .T.
goDlg.Show()
DOEVENTS FORCE
PUBLIC goMockValuta, goMockValutaCoada
goMockValuta = CREATEOBJECT('Custom')
goMockValuta.AddProperty('id_valuta', 978)
goMockValuta.AddProperty('nume_val', 'EUR')
goMockValutaCoada = CREATEOBJECT('Collection')
LOCAL loValGbp, loValChf
loValGbp = CREATEOBJECT('Custom')
loValGbp.AddProperty('id_valuta', 826)
loValGbp.AddProperty('nume_val', 'GBP')
goMockValutaCoada.Add(loValGbp)
loValChf = CREATEOBJECT('Custom')
loValChf.AddProperty('id_valuta', 756)
loValChf.AddProperty('nume_val', 'CHF')
goMockValutaCoada.Add(loValChf)
goDlg.cmdValuta.Click()
=Assert3('G1-pick1 (valuta facturii) seteaza nIdValuta=826 (GBP)', goDlg.nIdValuta, 826)
=AssertStr('G2-pick1 cValuta=GBP', ALLTRIM(goDlg.cValuta), 'GBP')
=Assert3('G3-DVI mirror dupa pick1 (nDviIdValuta=826, nu e dirty inca)', goDlg.nDviIdValuta, 826)
goDlg.cmdDviValuta.Click()
=Assert3('G4-pick2 (valuta DVI) seteaza nDviIdValuta=756 (CHF)', goDlg.nDviIdValuta, 756)
=AssertStr('G5-pick2 cDviValuta=CHF', ALLTRIM(goDlg.cDviValuta), 'CHF')
=Assert3('G6-valuta facturii ramane GBP (independenta de pick2)', goDlg.nIdValuta, 826)
=Assert3('G7-coada goala dupa 2 pick-uri (Count=0)', goMockValutaCoada.Count, 0)
LOCAL loFallback
loFallback = caut_valuta()
=Assert3('G8-coada goala: caut_valuta() revine la contractul vechi (goMockValuta EUR=978)', loFallback.id_valuta, 978)
goDlg.Hide()
DOEVENTS FORCE
DO HarnessStep WITH 1, 'scenariul G (coada FIFO mock_caut_valuta) verificat - vezi log'
*========================= SCENARIU A: precompletare valuta/curs DVI din factura la Init =========================
goDlg = CREATEOBJECT('import_adauga_factura', goObj)
=Assert3('A1-precompletare nDviIdValuta=978 (EUR, ca factura) la Init', goDlg.nDviIdValuta, 978)
=AssertStr('A2-precompletare cDviValuta=EUR la Init', ALLTRIM(goDlg.cDviValuta), 'EUR')
=Assert3('A3-precompletare nDviCurs=5 (ca factura) la Init', goDlg.nDviCurs, 5)
goDlg.optTipTva.Value = 2
goDlg.optTipTva.InteractiveChange()
=Assert3('A4-txtDviValuta.Visible=1 in mod TVA DVI', IIF(goDlg.txtDviValuta.Visible,1,0), 1)
goDlg.WindowType = 0
goDlg.Visible = .T.
goDlg.Show()
DOEVENTS FORCE
DO HarnessStep WITH 2, 'scenariul A (precompletare DVI la Init) verificat - vezi log'
goDlg.Hide()
DOEVENTS FORCE
*========================= SCENARIU B: alegerea RON pe DVI =========================
goDlg = CREATEOBJECT('import_adauga_factura', goObj)
goDlg.optTipTva.Value = 2
goDlg.optTipTva.InteractiveChange()
PUBLIC goMockValutaCoada
goMockValutaCoada = CREATEOBJECT('Collection')
LOCAL loValRon
loValRon = CREATEOBJECT('Custom')
loValRon.AddProperty('id_valuta', 1)
loValRon.AddProperty('nume_val', 'RON')
goMockValutaCoada.Add(loValRon)
goDlg.cmdDviValuta.Click()
=Assert3('B1-alegere RON: nDviIdValuta=1', goDlg.nDviIdValuta, 1)
=AssertStr('B2-alegere RON: cDviValuta=RON', ALLTRIM(goDlg.cDviValuta), 'RON')
=Assert3('B3-alegere RON: nDviCurs fixat la 1', goDlg.nDviCurs, 1)
=Assert3('B4-alegere RON: txtDviCurs.Enabled=0 (disabled)', IIF(goDlg.txtDviCurs.Enabled,1,0), 0)
=Assert3('B5-alegere RON: txtDviTvaVal.Visible=1 (ramane vizibil, comuta pe lei)', IIF(goDlg.txtDviTvaVal.Visible,1,0), 1)
=Assert3('B6-alegere RON: nDviTvaVal=0', goDlg.nDviTvaVal, 0)
goDlg.WindowType = 0
goDlg.Visible = .T.
goDlg.Show()
DOEVENTS FORCE
DO HarnessStep WITH 3, 'scenariul B (RON pe DVI) verificat - vezi log'
goDlg.Hide()
DOEVENTS FORCE
*========================= SCENARIU C: garda de dirty pe TVA in valuta DVI (a treia valuta) =========================
goDlg = CREATEOBJECT('import_adauga_factura', goObj)
goDlg.chkInValutaCont.Value = 1
goDlg.nSuma = 1000
goDlg.nProcentTva = 21
goDlg.optTipTva.Value = 2
goDlg.optTipTva.InteractiveChange()
PUBLIC goMockValutaCoada
goMockValutaCoada = CREATEOBJECT('Collection')
LOCAL loValUsd
loValUsd = CREATEOBJECT('Custom')
loValUsd.AddProperty('id_valuta', 840)
loValUsd.AddProperty('nume_val', 'USD')
goMockValutaCoada.Add(loValUsd)
goDlg.cmdDviValuta.Click()
=AssertStr('C1-DVI in USD (a treia valuta, diferita de EUR factura)', ALLTRIM(goDlg.cDviValuta), 'USD')
goDlg.txtDviCurs.Value = 4.5
goDlg.txtDviCurs.Valid()
goDlg.recalc_tva()
*-- nSumaLei=1000*5=5000; TvaLei=5000*21%=1050; TvaVal(auto)=Round(1050/4.5,2)=233.33
=Assert3('C2-baseline auto nDviTvaVal=233.33 (1050/4.5)', goDlg.nDviTvaVal, 233.33)
goDlg.txtDviTvaVal.Value = 999.99
goDlg.txtDviTvaVal.Valid()
=Assert3('C3-dupa editare manuala, nDviTvaVal=999.99', goDlg.nDviTvaVal, 999.99)
=Assert3('C4-lDviTvaValDirty=1 dupa editare manuala', IIF(goDlg.lDviTvaValDirty,1,0), 1)
goDlg.recalc_tva()
=Assert3('C5-dupa recalc_tva() repetat, nDviTvaVal ramane manual (999.99, nu se rescrie)', goDlg.nDviTvaVal, 999.99)
goDlg.WindowType = 0
goDlg.Visible = .T.
goDlg.Show()
DOEVENTS FORCE
DO HarnessStep WITH 4, 'scenariul C (garda dirty TVA valuta DVI) verificat - vezi log'
goDlg.Hide()
DOEVENTS FORCE
*========================= SCENARIU D: discount fara bifa (Runda32), caption dupa valuta =========================
goDlg = CREATEOBJECT('import_adauga_factura', goObj)
=Assert3('D1-txtDiscBaza.Visible=1 permanent (fara chkAreDiscount)', IIF(goDlg.txtDiscBaza.Visible,1,0), 1)
=AssertContains('D2-caption txtDiscBaza urmeaza valuta facturii (EUR)', 'EUR', goDlg.lblDiscBaza.Caption)
goDlg.chkInValutaCont.Value = 0
goDlg.chkInValutaCont.InteractiveChange()
=AssertContains('D3-caption dupa scoaterea valutei: "RON"', 'RON', goDlg.lblDiscBaza.Caption)
goDlg.txtDiscBaza.Value = 500
goDlg.txtDiscBaza.Valid()
=Assert3('D4-nDiscBaza=500 dupa completare', goDlg.nDiscBaza, 500)
goDlg.WindowType = 0
goDlg.Visible = .T.
goDlg.Show()
DOEVENTS FORCE
DO HarnessStep WITH 5, 'scenariul D (discount fara bifa, caption dupa valuta) verificat - vezi log'
goDlg.Hide()
DOEVENTS FORCE
*========================= SCENARIU E: dirty-flags txtDviCurs + revert la realegere valuta DVI =========================
goDlg = CREATEOBJECT('import_adauga_factura', goObj)
goDlg.optTipTva.Value = 2
goDlg.optTipTva.InteractiveChange()
goDlg.txtDviCurs.Value = 4.75
goDlg.txtDviCurs.Valid()
=Assert3('E1-lDviCursDirty=1 dupa editare manuala curs DVI', IIF(goDlg.lDviCursDirty,1,0), 1)
=Assert3('E2-nDviCurs=4.75 dupa editare manuala', goDlg.nDviCurs, 4.75)
PUBLIC goMockValutaCoada
goMockValutaCoada = CREATEOBJECT('Collection')
LOCAL loValEur2
loValEur2 = CREATEOBJECT('Custom')
loValEur2.AddProperty('id_valuta', 978)
loValEur2.AddProperty('nume_val', 'EUR')
goMockValutaCoada.Add(loValEur2)
goDlg.cmdDviValuta.Click()
=Assert3('E3-lDviCursDirty resetat (0) dupa realegerea valutei DVI', IIF(goDlg.lDviCursDirty,1,0), 0)
goDlg.WindowType = 0
goDlg.Visible = .T.
goDlg.Show()
DOEVENTS FORCE
DO HarnessStep WITH 6, 'scenariul E (dirty-flags txtDviCurs + revert) verificat - vezi log'
goDlg.Hide()
DOEVENTS FORCE
*========================= SCENARIU F1: validare blocanta - DVI non-RON cu curs 0 =========================
goDlg = CREATEOBJECT('import_adauga_factura', goObj)
goDlg.cFelDoc = 'Factura'
goDlg.nIdFdoc = 1
goDlg.nNract = 6002
goDlg.dDataAct = DATE()
goDlg.nIdPartener = 601
goDlg.cPartener = 'FURNIZOR UK LTD'
goDlg.nSuma = 100
goDlg.optTipTva.Value = 2
goDlg.optTipTva.InteractiveChange()
goDlg.nNractDvi = 7002
goDlg.dDviData = DATE()
goDlg.nDviIdPartener = 900
goDlg.cDviPartener = 'DIRECTIA VAMALA'
goDlg.nDviTvaLei = 21
goDlg.nDviIdValuta = 840
goDlg.cDviValuta = 'USD'
goDlg.nDviCurs = 0
*-- flagurile dirty marcheaza ca DVI a fost ales explicit (picker/curs tastat) - fara ele,
*-- dvi_valuta_efectiva()/dvi_curs_efectiv() urmeaza factura (EUR), nu USD/0 setate direct
goDlg.lDviValutaDirty = .T.
goDlg.lDviCursDirty = .T.
gcMockUltimMesaj = ''
LOCAL llOkF1
llOkF1 = goDlg.valideaza()
=Assert3('F1a-valideaza() respinge DVI non-RON cu curs 0', IIF(llOkF1,1,0), 0)
=AssertContains('F1b-mesaj contine "curs"', 'curs', gcMockUltimMesaj)
goDlg.WindowType = 0
goDlg.Visible = .T.
goDlg.Show()
DOEVENTS FORCE
DO HarnessStep WITH 7, 'scenariul F1 (DVI curs 0 blocant) verificat - vezi log'
goDlg.Hide()
DOEVENTS FORCE
*========================= SCENARIU F2: validari blocante - discount negativ / discount >= suma =========================
goDlg = CREATEOBJECT('import_adauga_factura', goObj)
goDlg.cFelDoc = 'Factura'
goDlg.nIdFdoc = 1
goDlg.nNract = 6003
goDlg.dDataAct = DATE()
goDlg.nIdPartener = 601
goDlg.cPartener = 'FURNIZOR UK LTD'
goDlg.nSuma = 100
goDlg.nIdExplicatieTva = 208
goDlg.cExplicatieTva = 'ACH. INT. 21%'
goDlg.optTipTva.Value = 1
goDlg.txtDiscBaza.Value = -10
goDlg.txtDiscBaza.Valid()
gcMockUltimMesaj = ''
LOCAL llOkF2a
llOkF2a = goDlg.valideaza()
=Assert3('F2a-valideaza() respinge discount negativ', IIF(llOkF2a,1,0), 0)
=AssertContains('F2b-mesaj contine "discount"', 'discount', gcMockUltimMesaj)
goDlg.txtDiscBaza.Value = 100
goDlg.txtDiscBaza.Valid()
gcMockUltimMesaj = ''
LOCAL llOkF2c
llOkF2c = goDlg.valideaza()
=Assert3('F2c-valideaza() respinge discount >= suma facturii', IIF(llOkF2c,1,0), 0)
=AssertContains('F2d-mesaj contine "discount"', 'discount', gcMockUltimMesaj)
goDlg.txtDiscBaza.Value = 50
goDlg.txtDiscBaza.Valid()
LOCAL llOkF2e
llOkF2e = goDlg.valideaza()
=Assert3('F2e-discount < suma: valideaza() trece', IIF(llOkF2e,1,0), 1)
goDlg.WindowType = 0
goDlg.Visible = .T.
goDlg.Show()
DOEVENTS FORCE
DO HarnessStep WITH 8, 'scenariul F2 (discount negativ / >=suma blocante) verificat - vezi log'
goDlg.Hide()
DOEVENTS FORCE
*========================= SCENARIU H: regresie - Tab fara modificare NU inghenuncheaza dirty =========================
*-- Regresia reala reparata de orchestrator: garda veche (This.Value<>Thisform.nXxx) nu se
*-- declansa NICIODATA, nici in productie, pentru ca ControlSource sincronizeaza proprietatea
*-- legata INAINTE ca Valid sa apuce sa compare. Fix: tipar nOldVal (GotFocus retine valoarea
*-- la intrare, Valid seteaza dirty doar daca s-a schimbat fata de acel moment - cf.
*-- GridArt.cCant.Text1.GotFocus, deja existent in proiect). Fara acest test, un refactor
*-- viitor ar putea reintroduce garda veche (mereu "dirty", declansata de intamplare de
*-- initializarea la 0 a lui nOldVal) fara sa aprinda nimic.
goDlg = CREATEOBJECT('import_adauga_factura', goObj)
goDlg.cFelDoc = 'Factura'
goDlg.nIdFdoc = 1
goDlg.nNract = 6004
goDlg.dDataAct = DATE()
goDlg.nIdPartener = 601
goDlg.cPartener = 'FURNIZOR UK LTD'
goDlg.nSuma = 100
goDlg.optTipTva.Value = 2
goDlg.optTipTva.InteractiveChange()
*-- txtDviTvaVal: valoare initiala, dirty resetat, Tab FARA modificare, apoi modificare reala
goDlg.lDviTvaValDirty = .F.
goDlg.txtDviTvaVal.Value = 500
goDlg.txtDviTvaVal.GotFocus()
goDlg.txtDviTvaVal.Valid()
=Assert3('H1-txtDviTvaVal: Tab fara modificare NU seteaza dirty', IIF(goDlg.lDviTvaValDirty,1,0), 0)
goDlg.txtDviTvaVal.Value = 777
goDlg.txtDviTvaVal.Valid()
=Assert3('H2-txtDviTvaVal: modificare reala SETEAZA dirty', IIF(goDlg.lDviTvaValDirty,1,0), 1)
*-- txtDviCurs: acelasi tipar
goDlg.lDviCursDirty = .F.
goDlg.txtDviCurs.Value = 5
goDlg.txtDviCurs.GotFocus()
goDlg.txtDviCurs.Valid()
=Assert3('H3-txtDviCurs: Tab fara modificare NU seteaza dirty', IIF(goDlg.lDviCursDirty,1,0), 0)
goDlg.txtDviCurs.Value = 6
goDlg.txtDviCurs.Valid()
=Assert3('H4-txtDviCurs: modificare reala SETEAZA dirty', IIF(goDlg.lDviCursDirty,1,0), 1)
goDlg.WindowType = 0
goDlg.Visible = .T.
goDlg.Show()
DOEVENTS FORCE
DO HarnessStep WITH 9, 'scenariul H (Tab fara modificare nu seteaza dirty) verificat - vezi log'
goDlg.Hide()
DOEVENTS FORCE
DO DdLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
IF pnPass = pnAsserts
DO DdLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
ELSE
DO DdLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
ENDIF
DO HarnessStep WITH 10, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
DO HarnessDone WITH 'done'
CATCH TO loExc
DO DdLog 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 CreeazaIntrodc
*-- Runda30 (F1/pas2): coloane NOI rand_dvi N(1), valuta_proprie N(1) fata de structura veche.
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
CREATE CURSOR (tcAlias) ( ;
id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ;
cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ;
ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ;
suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ;
id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ;
nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ;
id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ;
se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ;
doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ;
scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1))
ENDPROC
FUNCTION RECCOUNT_ACTIVE
LPARAMETERS tcAlias
LOCAL lnSel, lnCnt
lnSel = SELECT()
SELECT (tcAlias)
COUNT TO lnCnt FOR !DELETED()
SELECT (lnSel)
RETURN lnCnt
ENDFUNC
PROCEDURE Assert3
LPARAMETERS tcLabel, tuActual, tuExpected
pnAsserts = pnAsserts + 1
IF ABS(NVL(tuActual,0) - tuExpected) < 0.02
pnPass = pnPass + 1
DO DdLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
ELSE
DO DdLog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')'
ENDIF
ENDPROC
PROCEDURE AssertStr
LPARAMETERS tcLabel, tcActual, tcExpected
pnAsserts = pnAsserts + 1
IF tcActual == tcExpected
pnPass = pnPass + 1
DO DdLog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])'
ELSE
DO DdLog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])'
ENDIF
ENDPROC
PROCEDURE AssertContains
LPARAMETERS tcLabel, tcNeedle, tcHaystack
pnAsserts = pnAsserts + 1
IF UPPER(ALLTRIM(tcNeedle)) $ UPPER(ALLTRIM(NVL(tcHaystack,'')))
pnPass = pnPass + 1
DO DdLog WITH ' PASS ' + tcLabel + ' ([' + tcNeedle + '] gasit in [' + tcHaystack + '])'
ELSE
DO DdLog WITH ' FAIL ' + tcLabel + ' ([' + tcNeedle + '] NEGASIT in [' + tcHaystack + '])'
ENDIF
ENDPROC
PROCEDURE DdErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO DdLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE DdLog
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
DEFINE CLASS dummyexecutor AS Custom
cEroare = ''
PROCEDURE oExecute
LPARAMETERS tcSql, tcCursor
IF USED(m.tcCursor)
USE IN (m.tcCursor)
ENDIF
IF 'VJTVA_COLOANE' $ UPPER(m.tcSql)
DO CreeazaJtvaColoaneView WITH m.tcCursor
RETURN 1
ENDIF
IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP'
CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ;
pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ;
acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2))
RETURN 1
ENDIF
IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql)
CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30))
INSERT INTO (m.tcCursor) VALUES ('', '')
RETURN 1
ENDIF
IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql)
CREATE CURSOR (m.tcCursor) (acont C(20))
INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, ''))
RETURN 1
ENDIF
IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql)
CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20))
INSERT INTO (m.tcCursor) VALUES ('371', '4')
RETURN 1
ENDIF
CREATE CURSOR (m.tcCursor) (id_temp N(1))
RETURN 1
ENDPROC
PROCEDURE oExecuta
LPARAMETERS tcSql, tcCursor
IF !EMPTY(m.tcCursor)
IF USED(m.tcCursor)
USE IN (m.tcCursor)
ENDIF
IF UPPER(m.tcCursor) == 'CJTVACOL4427'
CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14))
ELSE
CREATE CURSOR (m.tcCursor) (id_temp N(1))
ENDIF
ENDIF
RETURN .T.
ENDPROC
PROCEDURE oSelect2Value
LPARAMETERS tcSql, toValue
toValue = ''
RETURN 1
ENDPROC
PROCEDURE oReset
ENDPROC
ENDDEFINE
PROCEDURE CreeazaJtvaColoaneView
LPARAMETERS tcCursor
IF USED(m.tcCursor)
USE IN (m.tcCursor)
ENDIF
CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14), denumire C(100), jc N(1), jv N(1), ;
coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14) NULL, afisat N(1), ;
id_jtva_ex N(14) NULL, id_jtva_neex N(14) NULL, ordine N(8), ;
taxcode N(6) NULL, taxcode_neexigibil N(6) NULL, taxcode_n50 N(6) NULL, ;
taxcode_n50_tvai N(6) NULL, taxcode_n100 N(6) NULL, taxcode_regularizare N(6) NULL, taxcode_tvai N(6) NULL)
INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, afisat, ordine, cota_tva) VALUES (0, '', 0, 0, 1, 0, 0)
INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ;
VALUES (208, 'ACH. INT. 21%', 1, 0, 'RO21B', 21, 209, 1, 1, 301104)
INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ;
VALUES (209, 'TVA ACH. INT. 21%', 1, 0, 'RO21T', 21, 1, 2, 301104)
INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ;
VALUES (220, 'ACH. IMP. 21%', 1, 0, 'FO21B', 21, 221, 1, 3, 301204)
INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ;
VALUES (221, 'TVA ACH. IMP. 21%', 1, 0, 'FO21T', 21, 1, 4, 301204)
ENDPROC