* test_repro_bug_nract_dvi_propagat.prg
* Test de REPRODUCERE (nu modifica NIMIC din codul aplicatiei). Ipoteza de verificat:
* Grid1.cNract.Text1.Valid (COMUN\clase\ointroduceri.vcx) apeleaza neconditionat
* Thisform.copiaza_valoare('nract'). copiaza_valoare propaga valoarea campului pe tot
* grupul doc_key, sarind DOAR randurile-TINTA cu rand_dvi=1 - dar NU protejeaza cazul in
* care randul-SURSA (pozitia curenta la apel) e chiar randul T al DVI-ului. Randul T al
* DVI-ului pastreaza doc_key-ul facturii-mama (vezi do_adauga_factura, cazul cTipTva='D':
* "doc_key ramane al documentului-mama, desi randul poarta partener/conturi de vama"),
* deci daca Valid se declanseaza cu pointerul din introdc pe randul DVI, numarul DVI-ului
* (101) s-ar scrie peste nract-ul randurilor B/G/S ale facturii principale (15000).
*
* Model de test (structura harness, capcane, toDlg inline): test_e2e_dvi_ron_discount.prg.
* Scenariu: factura import EUR (curs 5.23), discount financiar (doar baza), TVA pe DVI
* platit in RON, DVI cu nract/partener propriu (vama). Flux REAL: import_adauga_factura
* (dialog) + do_adauga_articol() + sincronizeaza() reale, NU insert direct in cursoare.
*
* Rulare:
*   powershell -ExecutionPolicy Bypass -File test_repro_bug_nract_dvi_propagat.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_repro_bug_nract_dvi_propagat_log.txt"
gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_repro_bug_nract_dvi\"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)

ON ERROR DO EeErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT

TRY
	LOCAL gcAppPath, lcPath
	gcAppPath = "D:\ROA\ROAGEST\"
	SET DEFAULT TO (gcAppPath)

	lcPath = gcAppPath + 'COMUN\Utile\Teste\achizitie_import\stub_verificare;' + ;
		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 EeLog 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 EeLog 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 "D:\ROA\ROAGEST\COMUN\utile\Teste\mock_cauta_nom_articole.prg" ADDITIVE
	SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\mock_oscrie_in_fisiere.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 EeLog 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, gcMockArtCodmat
	gnMockRaspuns = 6
	gcMockUltimMesaj = ''
	gnMockUltimTip = 0
	PUBLIC gnButon
	gnButon = 1
	gcMockArtCodmat = ''

	PUBLIC goExecutor, goApp
	goExecutor = CREATEOBJECT('dummyexecutor')
	goApp = CREATEOBJECT('dummyapp')

	*----- poAct: antetul notei (factura import EUR, curs 5.23) -----
	PUBLIC poAct
	poAct = CREATEOBJECT('Custom')
	poAct.AddProperty('nume_val', 'EUR')
	poAct.AddProperty('curs', 5.23)
	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', 601)
	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

	DO CreeazaRulTemp
	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

	*-- vezi antetul test_e2e_dvi_ron_discount.prg: tlIntern BARA, aceeasi valoare ca la CREATEOBJECT
	PRIVATE tlIntern
	tlIntern = .F.

	PUBLIC gcTempPath
	gcTempPath = ADDBS(SYS(2023))
	PUBLIC gnHandle
	gnHandle = -1
	PUBLIC gnTipGest
	gnTipGest = 0
	PUBLIC gcCondSucursala
	gcCondSucursala = ''

	DO EeLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F. - mod import)'
	PUBLIC goObj
	goObj = CREATEOBJECT('IMPORT_nota', .F.)
	IF VARTYPE(goObj) <> 'O'
		DO EeLog 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.)'

	*========================= DIALOG: factura EUR 15000 + TVA DVI (nract 101) in RON + discount =========================
	PUBLIC goDlg
	goDlg = CREATEOBJECT('import_adauga_factura', goObj)
	goDlg.cFelDoc = 'Factura'
	goDlg.nIdFdoc = 1
	goDlg.nNract = 15000
	goDlg.dDataAct = DATE()
	goDlg.nIdPartener = 601
	goDlg.cPartener = 'FURNIZOR EXTERN GMBH'
	goDlg.cExplicatia = 'Repro bug propagare nract DVI'
	goDlg.nSuma = 1000
	goDlg.nSumaLei = 0
	goDlg.nCurs = 5.23
	goDlg.nIdValuta = 978
	goDlg.cValuta = 'EUR'
	goDlg.chkInValutaCont.Value = 1
	goDlg.chkParticipaValuta.Value = 1
	goDlg.nIdExplicatieTva = 220
	goDlg.cExplicatieTva = 'ACH. IMP. 21%'
	goDlg.nProcentTva = 21

	*-- DVI: identitate proprie (document vamal, partener vamal, nract 101)
	goDlg.cSerieDvi = ''
	goDlg.nNractDvi = 101
	goDlg.dDviData = DATE()
	goDlg.nIdFdocDVI = 2
	goDlg.cFelDocDvi = 'DVI'
	goDlg.nDviIdPartener = 900
	goDlg.cDviPartener = 'DIRECTIA VAMALA'

	*-- comuta pe mod TVA DVI (radio "TVA in vama") - flux real, InteractiveChange
	goDlg.optTipTva.Value = 2
	goDlg.optTipTva.InteractiveChange()

	*-- alegere RON pe blocul DVI, prin picker-ul REAL (mock_caut_valuta, coada FIFO cu 1 pick)
	PUBLIC goMockValuta, goMockValutaCoada
	goMockValuta = CREATEOBJECT('Custom')
	goMockValuta.AddProperty('id_valuta', 1)
	goMockValuta.AddProperty('nume_val', 'RON')
	goMockValutaCoada = CREATEOBJECT('Collection')
	LOCAL loValRon
	loValRon = CREATEOBJECT('Custom')
	loValRon.AddProperty('id_valuta', 1)
	loValRon.AddProperty('nume_val', 'RON')
	goMockValutaCoada.Add(loValRon)
	goDlg.cmdDviValuta.Click()
	=AssertStr('1-DVI valuta aleasa RON', ALLTRIM(goDlg.cDviValuta), 'RON')
	=Assert3('2-DVI curs fixat la 1 (RON)', goDlg.nDviCurs, 1)

	*-- discount financiar (doar baza, fara bifa) - Valid() reface TVA DVI pe baza NETA
	goDlg.txtDiscBaza.Value = 100
	goDlg.txtDiscBaza.Valid()

	goDlg.WindowType = 0
	goDlg.Visible = .T.
	goDlg.Show()
	DOEVENTS FORCE
	DO HarnessStep WITH 1, 'dialog completat: factura EUR nract=15000, DVI nract=101, discount baza 100'

	*-- valideaza() REAL de pe dialog (buton Termin apeleaza mereu asta primul)
	LOCAL llOkValid
	llOkValid = goDlg.valideaza()
	=Assert3('3-dialog valideaza() reuseste', IIF(llOkValid,1,0), 1)

	*-- toDlg construit INLINE in programul PRINCIPAL (capcana l, vezi antetul mock_caut_valuta.prg)
	PUBLIC goT
	goT = CREATEOBJECT('Empty')
	=ADDPROPERTY(goT,'serie_act',ALLTRIM(NVL(goDlg.cSerieAct,'')))
	=ADDPROPERTY(goT,'nract',goDlg.nNract)
	=ADDPROPERTY(goT,'dataact',goDlg.dDataAct)
	=ADDPROPERTY(goT,'fdoc',goDlg.cFelDoc)
	=ADDPROPERTY(goT,'id_fdoc',goDlg.nIdFdoc)
	=ADDPROPERTY(goT,'id_partc',goDlg.nIdPartener)
	=ADDPROPERTY(goT,'partc',goDlg.cPartener)
	=ADDPROPERTY(goT,'explicatia',ALLTRIM(NVL(goDlg.cExplicatia,'')))
	=ADDPROPERTY(goT,'suma',IIF(goDlg.chkInValutaCont.Value=1 AND goDlg.nCurs<>0,IIF(goDlg.nSumaLei<>0,goDlg.nSumaLei,ROUND(goDlg.nSuma*goDlg.nCurs,gnPC)),goDlg.nSuma))
	=ADDPROPERTY(goT,'suma_val',IIF(goDlg.chkInValutaCont.Value=1 AND goDlg.nCurs<>0,goDlg.nSuma,0))
	=ADDPROPERTY(goT,'in_valuta',goDlg.chkInValutaCont.Value)
	=ADDPROPERTY(goT,'participa_valuta',(goDlg.chkParticipaValuta.Value=1))
	=ADDPROPERTY(goT,'id_valuta',IIF(goDlg.chkInValutaCont.Value=1,goDlg.nIdValuta,0))
	=ADDPROPERTY(goT,'curs',IIF(goDlg.chkInValutaCont.Value=1,goDlg.nCurs,0))
	=ADDPROPERTY(goT,'nume_val',IIF(goDlg.chkInValutaCont.Value=1,ALLTRIM(NVL(goDlg.cValuta,'')),''))
	=ADDPROPERTY(goT,'cTipTva',IIF(goDlg.optTipTva.Value=1,'F',IIF(goDlg.optTipTva.Value=2,'D','N')))
	=ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva)
	IF goDlg.optTipTva.Value = 2
		=ADDPROPERTY(goT,'dvi_serie',CHRTRAN(ALLTRIM(NVL(goDlg.cSerieDvi,'')),CHR(34),''))
		=ADDPROPERTY(goT,'dvi_nract',goDlg.nNractDvi)
		=ADDPROPERTY(goT,'dvi_dataact',goDlg.dDviData)
		=ADDPROPERTY(goT,'dvi_id_fdoc',goDlg.nIdFdocDVI)
		=ADDPROPERTY(goT,'dvi_fdoc',goDlg.cFelDocDvi)
		=ADDPROPERTY(goT,'dvi_id_partc',goDlg.nDviIdPartener)
		=ADDPROPERTY(goT,'dvi_partc',goDlg.cDviPartener)
		=ADDPROPERTY(goT,'dvi_scc','401')
		=ADDPROPERTY(goT,'dvi_tva_lei',goDlg.nDviTvaLei)
		=ADDPROPERTY(goT,'dvi_tva_val',goDlg.nDviTvaVal)
		=ADDPROPERTY(goT,'dvi_in_valuta',!(EMPTY(goDlg.cDviValuta) OR UPPER(ALLTRIM(goDlg.cDviValuta))=='RON'))
		=ADDPROPERTY(goT,'dvi_id_valuta',goDlg.nDviIdValuta)
		=ADDPROPERTY(goT,'dvi_curs',goDlg.nDviCurs)
		=ADDPROPERTY(goT,'dvi_nume_val',ALLTRIM(NVL(goDlg.cDviValuta,'')))
		=ADDPROPERTY(goT,'dvi_valuta_proprie',IIF(!(EMPTY(goDlg.cDviValuta) OR UPPER(ALLTRIM(goDlg.cDviValuta))=='RON') OR !(EMPTY(goDlg.cValuta) OR UPPER(ALLTRIM(goDlg.cValuta))=='RON'),IIF(goDlg.nDviIdValuta<>goDlg.nIdValuta OR goDlg.nDviCurs<>goDlg.nCurs,1,0),0))
	ENDIF
	=ADDPROPERTY(goT,'disc_baza_lei',IIF(goDlg.chkInValutaCont.Value=1 AND goDlg.nCurs<>0,ROUND(goDlg.nDiscBaza*goDlg.nCurs,gnPC),goDlg.nDiscBaza))
	=ADDPROPERTY(goT,'disc_baza_val',IIF(goDlg.chkInValutaCont.Value=1 AND goDlg.nCurs<>0,goDlg.nDiscBaza,0))

	*-- "Termin" REAL: oParinte.do_adauga_factura() cu toDlg-ul construit mai sus
	LOCAL llOkAdauga
	llOkAdauga = goObj.do_adauga_factura(goT)
	=Assert3('4-do_adauga_factura(goT) reuseste (Termin)', IIF(llOkAdauga,1,0), 1)
	goDlg.Hide()
	DOEVENTS FORCE
	DO HarnessStep WITH 2, 'dupa Termin pe dialog: introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri'

	DO DumpIntrodc WITH 'DUMP dupa Termin (inainte de articol/sincronizare)'

	*========================= BASELINE: B/T-DVI/G create corect =========================
	SELECT introdc
	LOCATE FOR nract = 15000 AND tip_rand == 'B'
	=Assert3('5-randul B (baza factura) gasit', IIF(FOUND(),1,0), 1)
	IF FOUND()
		=Assert3('6-BASELINE B.nract=15000', nract, 15000)
		=AssertStr('7-B.scd=371', ALLTRIM(scd), '371')
	ELSE
		pnAsserts = pnAsserts + 2
		DO EeLog WITH '  FAIL 6-7: randul B negasit'
	ENDIF

	SELECT introdc
	LOCATE FOR Nvl(rand_dvi,0) = 1
	=Assert3('8-randul T-DVI (rand_dvi=1) gasit', IIF(FOUND(),1,0), 1)
	IF FOUND()
		=Assert3('9-BASELINE T-DVI.nract=101', nract, 101)
		=AssertStr('10-T-DVI.scd=4426', ALLTRIM(scd), '4426')
	ELSE
		pnAsserts = pnAsserts + 2
		DO EeLog WITH '  FAIL 9-10: randul T-DVI negasit'
	ENDIF

	SELECT introdc
	LOCATE FOR nract = 15000 AND tip_rand == 'G'
	=Assert3('11-randul G (discount) gasit', IIF(FOUND(),1,0), 1)
	IF FOUND()
		=Assert3('12-BASELINE G.nract=15000', nract, 15000)
	ELSE
		pnAsserts = pnAsserts + 1
		DO EeLog WITH '  FAIL 12: randul G negasit'
	ENDIF

	*========================= ARTICOL prin do_adauga_articol() REAL =========================
	gcMockArtCodmat = 'ART-BULD-212'
	LOCAL llEroareArt
	llEroareArt = .F.
	TRY
		goObj.do_adauga_articol()
	CATCH TO loExcArt
		llEroareArt = .T.
		DO EeLog WITH 'EROARE do_adauga_articol ' + TRANSFORM(loExcArt.ErrorNo) + ' [' + loExcArt.Message + ']'
	ENDTRY
	DOEVENTS FORCE
	=Assert3('13-do_adauga_articol() fara eroare', IIF(llEroareArt,0,1), 1)
	SELECT rul_temp
	LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212'
	=Assert3('14-articolul adaugat in rul_temp', IIF(FOUND(),1,0), 1)
	IF FOUND()
		REPLACE cant WITH 1, pret_val WITH 800, pretd WITH 800, pret WITH ROUND(800*5.23,4), ;
			pret_lei WITH ROUND(800*5.23,4), cota_tva WITH 21
	ELSE
		pnAsserts = pnAsserts + 1
		DO EeLog WITH '  FAIL 14: articolul nu a fost adaugat'
	ENDIF
	goObj.gridart.Refresh()
	DOEVENTS FORCE
	DO HarnessStep WITH 3, 'articol adaugat (BULDOEXCAVATOR, 800 EUR)'

	*========================= sincronizeaza() REAL (creeaza randurile S) =========================
	LOCAL llEroareSync
	llEroareSync = .F.
	TRY
		goObj.sincronizeaza()
	CATCH TO loExcSync
		llEroareSync = .T.
		DO EeLog WITH 'EROARE sincronizeaza() ' + TRANSFORM(loExcSync.ErrorNo) + ' [' + loExcSync.Message + '] in ' + loExcSync.Procedure + ':' + TRANSFORM(loExcSync.LineNo)
	ENDTRY
	DOEVENTS FORCE
	=Assert3('15-sincronizeaza() fara eroare', IIF(llEroareSync,0,1), 1)

	DO DumpIntrodc WITH 'DUMP dupa sincronizeaza() (inainte de TRIGGER)'

	LOCAL lnCntSDoc1
	lnCntSDoc1 = 0
	SELECT introdc
	SCAN FOR nract = 15000 AND tip_rand == 'S'
		lnCntSDoc1 = lnCntSDoc1 + 1
	ENDSCAN
	=Assert3('16-cel putin un rand S creat de sincronizeaza()', IIF(lnCntSDoc1 >= 1, 1, 0), 1)

	DO HarnessStep WITH 4, 'sincronizat: ' + TRANSFORM(lnCntSDoc1) + ' rand(uri) S, nract=15000 pe B/G/S (baseline)'

	*========================= TRIGGER: pointerul pe randul T-DVI, Valid() pe coloana Nr =========================
	SELECT introdc
	LOCATE FOR Nvl(rand_dvi,0) = 1
	=Assert3('17-pozitionare pe randul T-DVI reusita (inainte de trigger)', IIF(FOUND(),1,0), 1)

	LOCAL llTriggerOk, lcVarianta
	llTriggerOk = .F.
	lcVarianta = ''
	IF FOUND()
		TRY
			goObj.Grid1.cNract.Text1.Valid()
			llTriggerOk = .T.
			lcVarianta = 'Grid1.cNract.Text1.Valid() (apel direct pe coloana din grid)'
		CATCH TO loExcTrig1
			DO EeLog WITH 'INFO Grid1.cNract.Text1.Valid() a esuat (' + TRANSFORM(loExcTrig1.ErrorNo) + ' ' + loExcTrig1.Message + '), incerc fallback copiaza_valoare()'
			SELECT introdc
			LOCATE FOR Nvl(rand_dvi,0) = 1
			TRY
				goObj.copiaza_valoare('nract')
				llTriggerOk = .T.
				lcVarianta = 'copiaza_valoare(''nract'') (fallback, apel direct pe metoda)'
			CATCH TO loExcTrig2
				DO EeLog WITH 'EROARE si fallback copiaza_valoare(''nract'') a esuat: ' + TRANSFORM(loExcTrig2.ErrorNo) + ' ' + loExcTrig2.Message
			ENDTRY
		ENDTRY
	ENDIF
	DOEVENTS FORCE
	=Assert3('18-TRIGGER executat fara eroare', IIF(llTriggerOk,1,0), 1)
	DO EeLog WITH 'TRIGGER folosit: ' + lcVarianta

	DO DumpIntrodc WITH 'DUMP dupa TRIGGER (Valid()/copiaza_valoare pe randul T-DVI)'

	*========================= ASSERT-URI DUPA TRIGGER: nract pe G/S trebuie sa RAMANA 15000 =========================
	*-- randul B NU mai exista in acest punct (sincronizeaza() de mai sus l-a transformat in S -
	*-- comportament normal, nu are rost sa-l cautam aici; verificarea lui se face doar S mai jos).
	LOCAL llBugG, llBugS, lnCntSVerif
	llBugG = .F.
	llBugS = .F.

	SELECT introdc
	LOCATE FOR tip_rand == 'G' AND Nvl(rand_dvi,0) <> 1
	IF FOUND()
		pnAsserts = pnAsserts + 1
		IF nract == 15000
			pnPass = pnPass + 1
			DO EeLog WITH '  PASS 20-G.nract ramane 15000 dupa trigger (=' + TRANSFORM(nract) + ')'
		ELSE
			llBugG = .T.
			DO EeLog WITH '  FAIL 20-G.nract dupa trigger = ' + TRANSFORM(nract) + ' (asteptat 15000) -> BUG'
		ENDIF
	ELSE
		pnAsserts = pnAsserts + 1
		DO EeLog WITH '  FAIL 20: randul G negasit dupa trigger'
	ENDIF

	lnCntSVerif = 0
	SELECT introdc
	SCAN FOR tip_rand == 'S' AND Nvl(rand_dvi,0) <> 1
		lnCntSVerif = lnCntSVerif + 1
		pnAsserts = pnAsserts + 1
		IF nract == 15000
			pnPass = pnPass + 1
			DO EeLog WITH '  PASS 21.' + TRANSFORM(lnCntSVerif) + '-S.nract ramane 15000 dupa trigger (=' + TRANSFORM(nract) + ')'
		ELSE
			llBugS = .T.
			DO EeLog WITH '  FAIL 21.' + TRANSFORM(lnCntSVerif) + '-S.nract dupa trigger = ' + TRANSFORM(nract) + ' (asteptat 15000) -> BUG'
		ENDIF
	ENDSCAN

	*-- randul T-DVI insusi trebuie sa ramana 101 (sursa neschimbata de propriul Valid)
	SELECT introdc
	LOCATE FOR Nvl(rand_dvi,0) = 1
	=Assert3('22-T-DVI.nract ramane 101 (randul sursa neschimbat)', IIF(FOUND(), nract, -1), 101)

	*========================= dupa un NOU sincronizeaza(): randurile S refac starea =========================
	LOCAL llEroareSync2
	llEroareSync2 = .F.
	TRY
		goObj.sincronizeaza()
	CATCH TO loExcSync2
		llEroareSync2 = .T.
		DO EeLog WITH 'EROARE al doilea sincronizeaza() ' + TRANSFORM(loExcSync2.ErrorNo) + ' [' + loExcSync2.Message + ']'
	ENDTRY
	DOEVENTS FORCE
	=Assert3('23-al doilea sincronizeaza() fara eroare', IIF(llEroareSync2,0,1), 1)

	DO DumpIntrodc WITH 'DUMP dupa AL DOILEA sincronizeaza() (post-trigger)'

	LOCAL llBugSDupaSync2
	llBugSDupaSync2 = .F.
	lnCntSVerif = 0
	SELECT introdc
	SCAN FOR tip_rand == 'S' AND Nvl(rand_dvi,0) <> 1
		lnCntSVerif = lnCntSVerif + 1
		pnAsserts = pnAsserts + 1
		IF nract == 15000
			pnPass = pnPass + 1
			DO EeLog WITH '  PASS 24.' + TRANSFORM(lnCntSVerif) + '-dupa al 2-lea sync: S.nract=15000 (=' + TRANSFORM(nract) + ')'
		ELSE
			llBugSDupaSync2 = .T.
			DO EeLog WITH '  FAIL 24.' + TRANSFORM(lnCntSVerif) + '-dupa al 2-lea sync: S.nract=' + TRANSFORM(nract) + ' (asteptat 15000) -> BUG persista dupa sincronizare'
		ENDIF
	ENDSCAN

	DO HarnessStep WITH 5, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'

	DO EeLog WITH '========================================================='
	IF llBugG OR llBugS OR llBugSDupaSync2
		DO EeLog WITH 'BUG CONFIRMAT: nract-ul randului T-DVI (101) s-a propagat peste nract-ul' + ;
			' randurilor B/G/S ale facturii principale (asteptat 15000) dupa ce Valid()/' + ;
			'copiaza_valoare() a rulat cu pointerul pe randul T-DVI.'
	ELSE
		DO EeLog WITH 'BUG NECONFIRMAT: nract-ul randurilor B/G/S a ramas 15000 dupa trigger si dupa re-sincronizare.'
	ENDIF
	DO EeLog WITH '========================================================='

	DO EeLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
	IF pnPass = pnAsserts
		DO EeLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
	ELSE
		DO EeLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
	ENDIF

	DO HarnessDone WITH 'done'

CATCH TO loExc
	DO EeLog 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 DumpIntrodc
	LPARAMETERS tcTitlu
	LOCAL lcSelAnt, lnRecAnt
	lcSelAnt = SELECT()
	lnRecAnt = IIF(USED('introdc'), IIF(EOF('introdc') OR BOF('introdc'), 0, RECNO('introdc')), 0)
	DO EeLog WITH tcTitlu
	IF !USED('introdc')
		DO EeLog WITH '  (introdc neinstantiat)'
		RETURN
	ENDIF
	SELECT introdc
	SCAN
		DO EeLog WITH '  tip_rand=' + ALLTRIM(NVL(tip_rand,'?')) + ' nract=' + TRANSFORM(NVL(nract,0)) + ;
			' doc_key=[' + ALLTRIM(NVL(doc_key,'')) + '] rand_dvi=' + TRANSFORM(NVL(rand_dvi,0)) + ;
			' scd=' + ALLTRIM(NVL(scd,'')) + ' scc=' + ALLTRIM(NVL(scc,'')) + ' suma=' + TRANSFORM(NVL(suma,0))
	ENDSCAN
	IF lnRecAnt > 0
		TRY
			GO lnRecAnt
		CATCH
			GO TOP
		ENDTRY
	ENDIF
	SELECT (lcSelAnt)
ENDPROC

PROCEDURE CreeazaIntrodc
	*-- coloane rand_dvi N(1), valuta_proprie N(1) (rand_dvi = randul T-DVI)
	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

PROCEDURE CreeazaRulTemp
	IF USED('rul_temp')
		USE IN ('rul_temp')
	ENDIF
	CREATE CURSOR rul_temp ( ;
		id_rul N(20,0), an N(4,0), luna N(2,0), cod N(20,0);
		, serie C(100), nnir N(20,0), id_articol N(10,0), denumire C(100);
		, codmat C(50), codmatf C(50), codbare C(50), um C(20);
		, id_gestiune N(5,0), nume_gestiune C(50), cgest C(20), nr_pag N(2,0);
		, gestionar C(50), comisie_receptie1 C(50), comisie_receptie2 C(50), comisie_receptie3 C(50);
		, cant N(14,3), cante N(14,3), cont C(10), acont C(20);
		, pret N(18,4), tva N(18,4), valoare N(18,4), valtva N(18,4);
		, proc_tva N(5,2), pretv N(18,4), pretvtva N(18,4), tvav N(18,4);
		, valoarev N(18,4), valtvav N(18,4), proc_tvav N(5,2), adaos N(18,4);
		, adaos_tva N(18,4), valoare_adaos N(18,4), valtva_adaos N(18,4), procent N(10,3);
		, discunitar N(18,4), discount_tva N(18,4), valoare_discount N(18,4), valtva_discount N(18,4);
		, proc_disc N(7,3), pretd N(14,4), curs N(18,4), id_valuta N(10,0);
		, nume_val C(20), id_lucrare N(20,0), nrord C(100), id_responsabil N(10,0);
		, nresp C(100), resp_marca N(18,4), dataact T, id_util N(5,0);
		, util C(30), dataora T, id_sectie N(5,0), sectie C(50);
		, csectie C(10), alcooltutun N(1,0), datain T, dataout T;
		, id_fact N(20,0), id_gestiunec N(10,0), nume_gestiunec C(50), cgestc C(20);
		, id_responsabilc N(5,0), id_reteta N(10,0), reteta C(50), nrespc C(100);
		, respc_marca N(18,4), id_set N(20,0), id_tip_rulaj N(10,0), tip_rulaj C(50);
		, id_obiect_depozit N(10,0), id_rul_aux N(10,0), nract N(20,0), serie_act C(10);
		, dataoras T, id_utils N(10,0), lot C(30), adata_expirare T;
		, id_sucursala N(5,0), sucursala C(250), id_part_rez N(10,0), part_rez C(100);
		, id_lucrare_rez N(10,0), nrord_rez C(100), subgrupa C(100), grupa C(100);
		, id_subgrupa N(5,0), id_grupa N(5,0), in_stoc N(1,0), in_crm N(1,0);
		, id_furnizor N(10,0), furnizor C(100), id_jtva_coloana N(4,0), explicatie_tva C(100);
		, taxcode N(6,0), taxname C(254), saft_procent N(18,4), codnc8 C(20);
		, id_tara_origine N(4,0), cod_tara_origine C(5), tara_origine C(50), greutate N(12,4);
		, fdoc C(30), id_fdoc N(18,4);
		, pret_lei N(18,4), pret_val N(14,4), cota_tva N(6,2))
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 EeLog WITH '  PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
	ELSE
		DO EeLog 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 EeLog WITH '  PASS ' + tcLabel + ' (=[' + tcActual + '])'
	ELSE
		DO EeLog WITH '  FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])'
	ENDIF
ENDPROC

PROCEDURE EeErr
	LPARAMETERS tnErr, tcMsg, tcProg, tnLine
	DO EeLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC

PROCEDURE EeLog
	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))
			RETURN 1
		ENDIF
		IF 'VCONFIG_CONT_IREG' $ UPPER(m.tcSql)
			CREATE CURSOR (m.tcCursor) (contpart C(10), fel_cont N(1), cu_inregistrari N(1), ;
				explic_cont C(100), exceptie C(10), pozitie N(1), invers N(1), gasit N(1))
			INSERT INTO (m.tcCursor) VALUES ('401', 0, 0, 'Furnizori', '', 0, 0, 0)
			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
