diff --git a/.gitignore b/.gitignore
index cd6364a..e090a1f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -126,6 +126,7 @@ bash.exe.stackdump
.claude/
# --- artefacte generate de rularile de test headless ---
-utile/Teste/**/screenshots/
-utile/Teste/**/uisync/
+# (numele reale poarta sufixul scenariului: screenshots_total/, uisync_212/, ...)
+utile/Teste/**/screenshots*/
+utile/Teste/**/uisync*/
utile/Teste/**/*_log.txt
diff --git a/clase/ointroduceri.vc2 b/clase/ointroduceri.vc2
index 2ba18cb..5c83e87 100644
--- a/clase/ointroduceri.vc2
+++ b/clase/ointroduceri.vc2
@@ -5058,9 +5058,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="shpDvi" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_shape3" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_shape4" UniqueID="" Timestamp="" />
- *< OBJECTDATA: ObjPath="_label1" UniqueID="" Timestamp="" />
- *< OBJECTDATA: ObjPath="txtFelDocDVI" UniqueID="" Timestamp="" />
- *< OBJECTDATA: ObjPath="cmdFelDocDVI" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblFelDoc" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="txtFelDoc" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdFelDoc" UniqueID="" Timestamp="" />
@@ -5073,6 +5070,8 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="lblPartener" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="txtPartener" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdPartener" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="_label1" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="txtFelDocDVI" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblSuma" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="txtSuma" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblValuta" UniqueID="" Timestamp="" />
@@ -5083,6 +5082,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="chkParticipaValuta" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="chkInValutaCont" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="optTipTva" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="_label2" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblExplicatieTva" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="txtExplicatieTva" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdExplicatieTva" UniqueID="" Timestamp="" />
@@ -5096,26 +5096,37 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="cmdDviPartener" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblDviTvaVal" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="txtDviTvaVal" UniqueID="" Timestamp="" />
- *< OBJECTDATA: ObjPath="lblDviTvaLei" UniqueID="" Timestamp="" />
- *< OBJECTDATA: ObjPath="txtDviTvaLei" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="But_renunt1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblProcentTva" UniqueID="" Timestamp="" />
- *< OBJECTDATA: ObjPath="lblSumaLei" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="txtProcentTva" UniqueID="" Timestamp="" />
- *< OBJECTDATA: ObjPath="txtSumaLei" UniqueID="" Timestamp="" />
- *< OBJECTDATA: ObjPath="_label2" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="cmdFelDocDVI" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="lblDviValuta" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="txtDviValuta" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="cmdDviValuta" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="lblDviCurs" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="txtDviCurs" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="lblDiscBaza" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="txtDiscBaza" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="chkDviInValuta" UniqueID="" Timestamp="" />
*
+ *m: actualizeaza_etichete_sume
*m: actualizeaza_stare_dvi
+ *m: actualizeaza_stare_dvi_valuta
*m: actualizeaza_stare_valuta
- *m: actualizeaza_tabstop
*m: arata_valuta_curs
*m: construieste_todlg
+ *m: dvi_curs_efectiv
+ *m: dvi_id_valuta_efectiva
+ *m: dvi_tva_in_valuta
+ *m: dvi_valuta_efectiva
*m: recalc_tva
*m: seteaza_masti
+ *m: tva_dvi_lei
*m: valideaza
*p: cdvipartener
*p: cdviserie
+ *p: cdvivaluta
*p: cexplicatia
*p: cexplicatietva
*p: cfeldoc
@@ -5128,13 +5139,21 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
*p: ddataact
*p: ddvidata
*p: lcursdirty
+ *p: ldvicursdirty
+ *p: ldviinvalutadirty
+ *p: ldvitvavaldirty
+ *p: ldvivalutadirty
*p: linvalutadirty && bifa "in valuta" schimbata explicit de utilizator - nu o mai fortez
- *p: lsumaleidirty && suma in lei a fost editata manual - recalc_tva nu o mai suprascrie
*p: lsuprimadirty
*p: ncurs
+ *p: ndiscbaza
+ *p: ndvicurs
+ *p: ndvicursoldval
*p: ndviidpartener
+ *p: ndviidvaluta
*p: ndvitvalei
*p: ndvitvaval
+ *p: ndvitvavaloldval
*p: nidexplicatietva
*p: nidfdoc
*p: nidfdocdvi
@@ -5142,9 +5161,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
*p: nidvaluta
*p: nnract
*p: nnractdvi
+ *p: noldval
*p: nprocenttva
*p: nsuma
- *p: nsumalei && suma fara TVA in lei (calculata, doar afisare)
+ *p: nsumalei && suma fara TVA in lei (calculata din suma si curs)
*p: oparinte && referinta catre import_nota care a deschis dialogul
*
@@ -5152,6 +5172,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
BorderStyle = 1
cdvipartener = ""
cdviserie = ""
+ cdvivaluta = ""
cexplicatia = ""
cexplicatietva = ""
cfeldoc = ""
@@ -5164,16 +5185,24 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ddataact = {}
ddvidata = {}
DoCreate = .T.
- Height = 406
+ Height = 410
lcursdirty = .F.
+ ldvicursdirty = .F.
+ ldviinvalutadirty = .F.
+ ldvitvavaldirty = .F.
+ ldvivalutadirty = .F.
linvalutadirty = .F.
- lsumaleidirty = .F.
lsuprimadirty = .F.
Name = "import_adauga_factura"
ncurs = 0
+ ndiscbaza = 0
+ ndvicurs = 0
+ ndvicursoldval = 0
ndviidpartener = 0
+ ndviidvaluta = 0
ndvitvalei = 0
ndvitvaval = 0
+ ndvitvavaloldval = 0
nidexplicatietva = 0
nidfdoc = 0
nidfdocdvi = 0
@@ -5181,27 +5210,28 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
nidvaluta = 0
nnract = 0
nnractdvi = 0
+ noldval = 0
nprocenttva = 0
nsuma = 0
nsumalei = 0
oparinte =
- Width = 650
+ Width = 655
_shape1.Height = 29
_shape1.Left = 0
_shape1.Name = "_shape1"
_shape1.Top = 0
_shape1.Width = 653
_shape1.ZOrderSet = 3
- _shape2.Left = 583
+ _shape2.Left = 586
_shape2.Name = "_shape2"
_shape2.Top = 0
_shape2.ZOrderSet = 4
Lb_titlu_alb_b121.Caption = "Adauga factura"
Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121"
Lb_titlu_alb_b121.ZOrderSet = 5
- BUT_TERMIN1.Left = 620
+ BUT_TERMIN1.Left = 623
BUT_TERMIN1.Name = "BUT_TERMIN1"
- BUT_TERMIN1.TabIndex = 27
+ BUT_TERMIN1.TabIndex = 30
BUT_TERMIN1.Top = 1
BUT_TERMIN1.Visible = .T.
BUT_TERMIN1.ZOrderSet = 6
@@ -5216,9 +5246,9 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Caption = "Fel doc", ;
FontBold = .T., ;
Height = 17, ;
- Left = 25, ;
+ Left = 20, ;
Name = "_label1", ;
- Top = 305, ;
+ Top = 280, ;
Width = 50, ;
ZOrderSet = 8
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
@@ -5233,7 +5263,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Height = 17, ;
Left = 20, ;
Name = "_label2", ;
- Top = 252, ;
+ Top = 227, ;
Width = 257, ;
ZOrderSet = 32
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
@@ -5241,12 +5271,12 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ADD OBJECT '_shape3' AS _shape WITH ;
BackColor = 240,225,255, ;
BackStyle = 0, ;
- Height = 157, ;
- Left = 12, ;
+ Height = 131, ;
+ Left = 7, ;
Name = "_shape3", ;
SpecialEffect = 0, ;
Top = 36, ;
- Width = 628, ;
+ Width = 639, ;
ZOrderSet = 1
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="shape" />
@@ -5254,35 +5284,51 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
BackColor = 197,197,226, ;
BackStyle = 0, ;
Height = 83, ;
- Left = 12, ;
+ Left = 7, ;
Name = "_shape4", ;
SpecialEffect = 0, ;
- Top = 191, ;
- Width = 628, ;
+ Top = 165, ;
+ Width = 639, ;
ZOrderSet = 2
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="shape" />
ADD OBJECT 'But_renunt1' AS but_renunt WITH ;
- Left = 590, ;
+ Left = 593, ;
Name = "But_renunt1", ;
- TabIndex = 28, ;
+ TabIndex = 31, ;
Top = 1, ;
ZOrderSet = 47
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
+ ADD OBJECT 'chkDviInValuta' AS _checkbox WITH ;
+ Alignment = 0, ;
+ AutoSize = .T., ;
+ BackStyle = 0, ;
+ Caption = "Valuta", ;
+ Height = 18, ;
+ Left = 300, ;
+ Name = "chkDviInValuta", ;
+ TabIndex = 29, ;
+ TabStop = .F., ;
+ Top = 364, ;
+ Value = 0, ;
+ Width = 56, ;
+ ZOrderSet = 63
+ *< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" />
+
ADD OBJECT 'chkInValutaCont' AS _checkbox WITH ;
Alignment = 0, ;
- AutoSize = .F., ;
+ AutoSize = .T., ;
BackStyle = 0, ;
- Caption = "Suma in valuta in contabilitate", ;
- Height = 31, ;
- Left = 522, ;
+ Caption = "Valuta", ;
+ Height = 18, ;
+ Left = 560, ;
Name = "chkInValutaCont", ;
- TabIndex = 14, ;
+ TabIndex = 13, ;
TabStop = .F., ;
- Top = 117, ;
+ Top = 133, ;
Value = 1, ;
- Width = 102, ;
+ Width = 55, ;
WordWrap = .T., ;
ZOrderSet = 30
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" />
@@ -5293,11 +5339,11 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
BackStyle = 0, ;
Caption = "Participa la pretul de intrare", ;
Height = 34, ;
- Left = 522, ;
+ Left = 529, ;
Name = "chkParticipaValuta", ;
- TabIndex = 13, ;
+ TabIndex = 14, ;
TabStop = .F., ;
- Top = 150, ;
+ Top = 66, ;
Value = 1, ;
Width = 107, ;
WordWrap = .T., ;
@@ -5309,14 +5355,27 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Enabled = .F., ;
FontBold = .T., ;
FontName = "Arial", ;
- Left = 558, ;
+ Left = 496, ;
Name = "cmdDviPartener", ;
TabIndex = 24, ;
- Top = 332, ;
+ Top = 305, ;
Width = 24, ;
ZOrderSet = 42
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="commandbutton" />
+ ADD OBJECT 'cmdDviValuta' AS _commandbutton WITH ;
+ Caption = "...", ;
+ Enabled = .F., ;
+ FontBold = .T., ;
+ FontName = "Arial", ;
+ Left = 206, ;
+ Name = "cmdDviValuta", ;
+ TabIndex = 27, ;
+ Top = 361, ;
+ Width = 18, ;
+ ZOrderSet = 54
+ *< END OBJECT: ClassLib="_baza.vcx" BaseClass="commandbutton" />
+
ADD OBJECT 'cmdExplicatieTva' AS _commandbutton WITH ;
Caption = "...", ;
FontBold = .T., ;
@@ -5324,7 +5383,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Left = 475, ;
Name = "cmdExplicatieTva", ;
TabIndex = 18, ;
- Top = 225, ;
+ Top = 200, ;
Width = 24, ;
ZOrderSet = 34
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="commandbutton" />
@@ -5332,7 +5391,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ADD OBJECT 'cmdFelDoc' AS _commandbutton WITH ;
Caption = "...", ;
FontBold = .T., ;
- Left = 228, ;
+ Left = 223, ;
Name = "cmdFelDoc", ;
TabIndex = 2, ;
Top = 38, ;
@@ -5343,10 +5402,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ADD OBJECT 'cmdFelDocDVI' AS _commandbutton WITH ;
Caption = "...", ;
FontBold = .T., ;
- Left = 235, ;
+ Left = 230, ;
Name = "cmdFelDocDVI", ;
TabIndex = 20, ;
- Top = 300, ;
+ Top = 275, ;
Width = 24, ;
ZOrderSet = 10
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="commandbutton" />
@@ -5355,7 +5414,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Caption = "...", ;
FontBold = .T., ;
Height = 21, ;
- Left = 558, ;
+ Left = 490, ;
Name = "cmdPartener", ;
TabIndex = 7, ;
Top = 70, ;
@@ -5366,10 +5425,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ADD OBJECT 'cmdValuta' AS _commandbutton WITH ;
Caption = "...", ;
FontBold = .T., ;
- Left = 365, ;
+ Left = 440, ;
Name = "cmdValuta", ;
TabIndex = 11, ;
- Top = 120, ;
+ Top = 129, ;
Width = 24, ;
ZOrderSet = 26
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="commandbutton" />
@@ -5380,9 +5439,9 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Caption = "Curs", ;
FontBold = .T., ;
Height = 17, ;
- Left = 394, ;
+ Left = 472, ;
Name = "lblCurs", ;
- Top = 125, ;
+ Top = 111, ;
Width = 30, ;
ZOrderSet = 27
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
@@ -5393,22 +5452,48 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Caption = "Data", ;
FontBold = .T., ;
Height = 17, ;
- Left = 499, ;
+ Left = 494, ;
Name = "lblData", ;
Top = 43, ;
Width = 30, ;
ZOrderSet = 15
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
+ ADD OBJECT 'lblDiscBaza' AS _label WITH ;
+ AutoSize = .T., ;
+ BackStyle = 0, ;
+ Caption = "Discount", ;
+ FontBold = .T., ;
+ Height = 18, ;
+ Left = 190, ;
+ Name = "lblDiscBaza", ;
+ Top = 111, ;
+ Width = 56, ;
+ ZOrderSet = 59
+ *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
+
+ ADD OBJECT 'lblDviCurs' AS _label WITH ;
+ AutoSize = .T., ;
+ BackStyle = 0, ;
+ Caption = "Curs", ;
+ FontBold = .T., ;
+ Height = 18, ;
+ Left = 234, ;
+ Name = "lblDviCurs", ;
+ Top = 345, ;
+ Width = 30, ;
+ ZOrderSet = 55
+ *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
+
ADD OBJECT 'lblDviData' AS _label WITH ;
AutoSize = .T., ;
BackStyle = 0, ;
Caption = "Data", ;
FontBold = .T., ;
Height = 18, ;
- Left = 500, ;
+ Left = 453, ;
Name = "lblDviData", ;
- Top = 304, ;
+ Top = 279, ;
Width = 31, ;
ZOrderSet = 38
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
@@ -5419,9 +5504,9 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Caption = "Nr", ;
FontBold = .T., ;
Height = 18, ;
- Left = 287, ;
+ Left = 263, ;
Name = "lblDviNr", ;
- Top = 304, ;
+ Top = 279, ;
Width = 16, ;
ZOrderSet = 36
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
@@ -5432,39 +5517,39 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Caption = "Partener", ;
FontBold = .T., ;
Height = 18, ;
- Left = 25, ;
+ Left = 20, ;
Name = "lblDviPartener", ;
- Top = 335, ;
+ Top = 310, ;
Width = 57, ;
ZOrderSet = 40
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
- ADD OBJECT 'lblDviTvaLei' AS _label WITH ;
- AutoSize = .T., ;
- BackStyle = 0, ;
- Caption = "TVA lei", ;
- FontBold = .T., ;
- Height = 18, ;
- Left = 231, ;
- Name = "lblDviTvaLei", ;
- Top = 365, ;
- Width = 48, ;
- ZOrderSet = 45
- *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
-
ADD OBJECT 'lblDviTvaVal' AS _label WITH ;
AutoSize = .T., ;
BackStyle = 0, ;
Caption = "TVA valuta", ;
FontBold = .T., ;
Height = 18, ;
- Left = 25, ;
+ Left = 20, ;
Name = "lblDviTvaVal", ;
- Top = 365, ;
+ Top = 345, ;
Width = 71, ;
ZOrderSet = 43
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
+ ADD OBJECT 'lblDviValuta' AS _label WITH ;
+ AutoSize = .T., ;
+ BackStyle = 0, ;
+ Caption = "Valuta", ;
+ FontBold = .T., ;
+ Height = 18, ;
+ Left = 150, ;
+ Name = "lblDviValuta", ;
+ Top = 345, ;
+ Width = 43, ;
+ ZOrderSet = 52
+ *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
+
ADD OBJECT 'lblExplicatieTva' AS _label WITH ;
AutoSize = .T., ;
BackStyle = 0, ;
@@ -5473,7 +5558,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Height = 18, ;
Left = 118, ;
Name = "lblExplicatieTva", ;
- Top = 230, ;
+ Top = 205, ;
Width = 95, ;
ZOrderSet = 32
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
@@ -5484,7 +5569,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Caption = "Fel doc", ;
FontBold = .T., ;
Height = 17, ;
- Left = 20, ;
+ Left = 15, ;
Name = "lblFelDoc", ;
Top = 43, ;
Width = 50, ;
@@ -5497,7 +5582,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Caption = "Nr", ;
FontBold = .T., ;
Height = 17, ;
- Left = 350, ;
+ Left = 345, ;
Name = "lblNr", ;
Top = 43, ;
Width = 20, ;
@@ -5510,7 +5595,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Caption = "Partener", ;
FontBold = .T., ;
Height = 17, ;
- Left = 20, ;
+ Left = 15, ;
Name = "lblPartener", ;
Top = 73, ;
Width = 60, ;
@@ -5524,9 +5609,9 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
FontBold = .T., ;
ForeColor = 0,0,25, ;
Height = 18, ;
- Left = 25, ;
+ Left = 20, ;
Name = "lblPedagogieDvi", ;
- Top = 279, ;
+ Top = 254, ;
Width = 24, ;
ZOrderSet = 35
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
@@ -5539,7 +5624,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Height = 18, ;
Left = 18, ;
Name = "lblProcentTva", ;
- Top = 230, ;
+ Top = 205, ;
Width = 42, ;
ZOrderSet = 48
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
@@ -5550,7 +5635,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Caption = "Serie", ;
FontBold = .T., ;
Height = 17, ;
- Left = 260, ;
+ Left = 255, ;
Name = "lblSerie", ;
Top = 43, ;
Width = 34, ;
@@ -5563,35 +5648,22 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Caption = "Suma fara TVA", ;
FontBold = .T., ;
Height = 18, ;
- Left = 20, ;
+ Left = 15, ;
Name = "lblSuma", ;
- Top = 125, ;
+ Top = 111, ;
Width = 98, ;
ZOrderSet = 22
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
- ADD OBJECT 'lblSumaLei' AS _label WITH ;
- AutoSize = .T., ;
- BackStyle = 0, ;
- Caption = "Suma lei", ;
- FontBold = .T., ;
- Height = 18, ;
- Left = 59, ;
- Name = "lblSumaLei", ;
- Top = 154, ;
- Width = 59, ;
- ZOrderSet = 50
- *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
-
ADD OBJECT 'lblValuta' AS _label WITH ;
AutoSize = .F., ;
BackStyle = 0, ;
Caption = "Valuta", ;
FontBold = .T., ;
Height = 17, ;
- Left = 247, ;
+ Left = 366, ;
Name = "lblValuta", ;
- Top = 125, ;
+ Top = 111, ;
Width = 40, ;
ZOrderSet = 24
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
@@ -5604,7 +5676,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Left = 16, ;
Name = "optTipTva", ;
TabIndex = 15, ;
- Top = 196, ;
+ Top = 171, ;
Value = 1, ;
Width = 289, ;
ZOrderSet = 31, ;
@@ -5643,12 +5715,12 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ADD OBJECT 'shpDvi' AS _shape WITH ;
BackColor = 217,217,236, ;
BackStyle = 1, ;
- Height = 121, ;
- Left = 12, ;
+ Height = 158, ;
+ Left = 7, ;
Name = "shpDvi", ;
SpecialEffect = 0, ;
- Top = 273, ;
- Width = 628, ;
+ Top = 247, ;
+ Width = 639, ;
ZOrderSet = 0
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="shape" />
@@ -5657,10 +5729,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ControlSource = "Thisform.nCurs", ;
Format = "RK", ;
InputMask = "9999.9999", ;
- Left = 428, ;
+ Left = 472, ;
Name = "txtCurs", ;
TabIndex = 12, ;
- Top = 122, ;
+ Top = 131, ;
Width = 80, ;
ZOrderSet = 28
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
@@ -5668,7 +5740,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ADD OBJECT 'txtData' AS _textbox WITH ;
ControlSource = "Thisform.dDataAct", ;
Format = "K", ;
- Left = 533, ;
+ Left = 528, ;
Name = "txtData", ;
TabIndex = 5, ;
Top = 40, ;
@@ -5676,14 +5748,43 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ZOrderSet = 16
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
+ ADD OBJECT 'txtDiscBaza' AS _textbox WITH ;
+ Alignment = 1, ;
+ ControlSource = "Thisform.nDiscBaza", ;
+ Format = "RK", ;
+ Height = 23, ;
+ InputMask = "9999999999.9999", ;
+ Left = 190, ;
+ Name = "txtDiscBaza", ;
+ TabIndex = 9, ;
+ Top = 131, ;
+ Width = 114, ;
+ ZOrderSet = 60
+ *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
+
+ ADD OBJECT 'txtDviCurs' AS _textbox WITH ;
+ Alignment = 1, ;
+ ControlSource = "Thisform.nDviCurs", ;
+ Enabled = .F., ;
+ Format = "RK", ;
+ Height = 23, ;
+ InputMask = "9999.9999", ;
+ Left = 234, ;
+ Name = "txtDviCurs", ;
+ TabIndex = 28, ;
+ Top = 363, ;
+ Width = 55, ;
+ ZOrderSet = 56
+ *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
+
ADD OBJECT 'txtDviData' AS _textbox WITH ;
ControlSource = "Thisform.dDviData", ;
Enabled = .F., ;
Format = "K", ;
- Left = 540, ;
+ Left = 493, ;
Name = "txtDviData", ;
TabIndex = 22, ;
- Top = 302, ;
+ Top = 277, ;
Width = 90, ;
ZOrderSet = 39
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
@@ -5694,10 +5795,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Format = "RK", ;
Height = 23, ;
InputMask = "9999999999", ;
- Left = 312, ;
+ Left = 288, ;
Name = "txtDviNr", ;
TabIndex = 21, ;
- Top = 302, ;
+ Top = 277, ;
Width = 147, ;
ZOrderSet = 37
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
@@ -5707,28 +5808,14 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Enabled = .F., ;
Format = "K", ;
Height = 23, ;
- Left = 98, ;
+ Left = 93, ;
Name = "txtDviPartener", ;
TabIndex = 23, ;
- Top = 332, ;
- Width = 452, ;
+ Top = 307, ;
+ Width = 400, ;
ZOrderSet = 41
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
- ADD OBJECT 'txtDviTvaLei' AS _textbox WITH ;
- Alignment = 1, ;
- ControlSource = "Thisform.nDviTvaLei", ;
- Enabled = .F., ;
- Format = "RK", ;
- InputMask = "9999999.9999", ;
- Left = 285, ;
- Name = "txtDviTvaLei", ;
- TabIndex = 26, ;
- Top = 362, ;
- Width = 112, ;
- ZOrderSet = 46
- *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
-
ADD OBJECT 'txtDviTvaVal' AS _textbox WITH ;
Alignment = 1, ;
ControlSource = "Thisform.nDviTvaVal", ;
@@ -5736,14 +5823,28 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Format = "RK", ;
Height = 23, ;
InputMask = "9999999.9999", ;
- Left = 98, ;
+ Left = 21, ;
Name = "txtDviTvaVal", ;
TabIndex = 25, ;
- Top = 362, ;
+ Top = 363, ;
Width = 112, ;
ZOrderSet = 44
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
+ ADD OBJECT 'txtDviValuta' AS _textbox WITH ;
+ ControlSource = "Thisform.cDviValuta", ;
+ Enabled = .F., ;
+ Format = "K", ;
+ Height = 23, ;
+ Left = 150, ;
+ Name = "txtDviValuta", ;
+ ReadOnly = .T., ;
+ TabIndex = 26, ;
+ Top = 363, ;
+ Width = 52, ;
+ ZOrderSet = 53
+ *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
+
ADD OBJECT 'txtExplicatieTva' AS _textbox WITH ;
ControlSource = "Thisform.cExplicatieTva", ;
Enabled = .T., ;
@@ -5752,7 +5853,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Name = "txtExplicatieTva", ;
ReadOnly = .T., ;
TabIndex = 17, ;
- Top = 227, ;
+ Top = 202, ;
Width = 254, ;
ZOrderSet = 33
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
@@ -5761,7 +5862,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ControlSource = "Thisform.cFelDoc", ;
Enabled = .T., ;
Format = "K", ;
- Left = 74, ;
+ Left = 69, ;
Name = "txtFelDoc", ;
ReadOnly = .T., ;
TabIndex = 1, ;
@@ -5774,11 +5875,11 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ControlSource = "Thisform.cFelDocDVI", ;
Enabled = .T., ;
Format = "K", ;
- Left = 81, ;
+ Left = 76, ;
Name = "txtFelDocDVI", ;
ReadOnly = .T., ;
TabIndex = 19, ;
- Top = 302, ;
+ Top = 277, ;
Width = 150, ;
ZOrderSet = 9
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
@@ -5788,7 +5889,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Format = "RK", ;
Height = 23, ;
InputMask = "9999999999", ;
- Left = 371, ;
+ Left = 366, ;
Name = "txtNr", ;
TabIndex = 4, ;
Top = 40, ;
@@ -5801,12 +5902,12 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Enabled = .T., ;
Format = "K", ;
Height = 23, ;
- Left = 92, ;
+ Left = 87, ;
Name = "txtPartener", ;
ReadOnly = .T., ;
TabIndex = 6, ;
Top = 70, ;
- Width = 462, ;
+ Width = 400, ;
ZOrderSet = 18
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
@@ -5818,7 +5919,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Left = 62, ;
Name = "txtProcentTva", ;
TabIndex = 16, ;
- Top = 227, ;
+ Top = 202, ;
Width = 44, ;
ZOrderSet = 49
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
@@ -5827,7 +5928,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ControlSource = "Thisform.cSerieAct", ;
Format = "K", ;
Height = 23, ;
- Left = 298, ;
+ Left = 293, ;
Name = "txtSerie", ;
TabIndex = 3, ;
Top = 40, ;
@@ -5841,41 +5942,39 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Format = "RK", ;
Height = 23, ;
InputMask = "9999999999.9999", ;
- Left = 125, ;
+ Left = 15, ;
Name = "txtSuma", ;
- TabIndex = 9, ;
- Top = 122, ;
+ TabIndex = 8, ;
+ Top = 131, ;
Width = 114, ;
ZOrderSet = 23
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
- ADD OBJECT 'txtSumaLei' AS _textbox WITH ;
- Alignment = 1, ;
- ControlSource = "Thisform.nSumaLei", ;
- Format = "RK", ;
- Height = 23, ;
- InputMask = "9999999999.99", ;
- Left = 125, ;
- Name = "txtSumaLei", ;
- TabIndex = 29, ;
- Top = 151, ;
- Width = 114, ;
- ZOrderSet = 51
- *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
-
ADD OBJECT 'txtValuta' AS _textbox WITH ;
ControlSource = "Thisform.cValuta", ;
Enabled = .T., ;
Format = "K", ;
- Left = 291, ;
+ Left = 366, ;
Name = "txtValuta", ;
ReadOnly = .T., ;
TabIndex = 10, ;
- Top = 122, ;
+ Top = 131, ;
Width = 70, ;
ZOrderSet = 25
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
+ PROCEDURE actualizeaza_etichete_sume
+ *!* Etichetele sumelor arata moneda in care se tasteaza: valuta documentului cand
+ *!* bifa "Valuta" e pusa, altfel RON; TVA-ul DVI urmeaza bifa lui.
+ Local lcVal, lcValDvi
+ lcVal = Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0 And !(Empty(Nvl(This.cValuta, '')) Or Upper(Alltrim(Nvl(This.cValuta, ''))) == 'RON'), Alltrim(This.cValuta), 'RON')
+ lcValDvi = Iif(This.dvi_tva_in_valuta(), Alltrim(This.dvi_valuta_efectiva()), 'RON')
+ This.lblSuma.Caption = 'Valoare fara TVA ' + lcVal
+ This.lblDiscBaza.Caption = 'Discount fara TVA ' + lcVal
+ This.lblDviTvaVal.Caption = 'Valoare TVA ' + lcValDvi
+ This.Refresh()
+ ENDPROC
+
PROCEDURE actualizeaza_stare_dvi
*!* Arata/ascunde subrandul DVI dupa radio-ul TVA; pre-completeaza din memoria DVI
*!* a lui import_nota si pune data DVI = data facturii principale daca lipseste.
@@ -5907,6 +6006,36 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
This.txtDviData.Value = This.dDviData
This.txtDviPartener.Value = This.cDviPartener
Endif
+ This.actualizeaza_stare_dvi_valuta()
+ This.Refresh()
+ ENDPROC
+
+ PROCEDURE actualizeaza_stare_dvi_valuta
+ *!* Resincronizeaza bifa cu starea valutei facturii daca n-a fost schimbata manual.
+ *!* Bifa scoasa = DVI fara valuta proprie: ascunde valuta/cursul, curs=1, TVA tastat in lei.
+ If This.optTipTva.Value <> 2
+ Return
+ Endif
+ If !This.lDviInValutaDirty
+ This.chkDviInValuta.Value = Iif(This.chkInValutaCont.Value = 1 And !(Empty(This.cValuta) Or Upper(Alltrim(This.cValuta)) == 'RON'), 1, 0)
+ Endif
+ This.lblDviValuta.Visible = (This.chkDviInValuta.Value = 1)
+ This.txtDviValuta.Visible = (This.chkDviInValuta.Value = 1)
+ This.cmdDviValuta.Visible = (This.chkDviInValuta.Value = 1)
+ If This.dvi_tva_in_valuta()
+ This.lblDviCurs.Visible = .T.
+ This.txtDviCurs.Visible = .T.
+ This.txtDviCurs.Enabled = .T.
+ Else
+ This.lblDviCurs.Visible = .F.
+ This.txtDviCurs.Visible = .F.
+ This.txtDviCurs.Enabled = .F.
+ This.nDviCurs = 1
+ This.txtDviCurs.Value = 1
+ This.lDviCursDirty = .F.
+ Endif
+ This.seteaza_masti()
+ This.actualizeaza_etichete_sume()
This.Refresh()
ENDPROC
@@ -5935,17 +6064,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
This.Refresh()
ENDPROC
- PROCEDURE actualizeaza_tabstop
- *!* Butoanele "..." ies din ordinea de tab cand valoarea lor e deja completata,
- *!* ca Tab/Enter sa nu se mai opreasca pe ele (cautarea ramane pe dublu-click/GotFocus).
- This.cmdFelDoc.TabStop = Empty(Nvl(This.nIdFdoc, 0)) And Empty(Alltrim(Nvl(This.cFelDoc, '')))
- This.cmdPartener.TabStop = Empty(Nvl(This.nIdPartener, 0))
- This.cmdExplicatieTva.TabStop = Empty(Nvl(This.nIdExplicatieTva, 0))
- This.cmdFelDocDVI.TabStop = Empty(Nvl(This.nIdFdocDVI, 0)) And Empty(Alltrim(Nvl(This.cFelDocDvi, '')))
- This.cmdDviPartener.TabStop = Empty(Nvl(This.nDviIdPartener, 0))
- This.cmdValuta.TabStop = Empty(Nvl(This.nIdValuta, 0)) And Empty(Alltrim(Nvl(This.cValuta, '')))
- ENDPROC
-
PROCEDURE arata_valuta_curs
*!* Arata/ascunde selectorul de valuta si cursul (bifa "Suma in valuta in contabilitate").
Lparameters tlArata
@@ -5957,9 +6075,8 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
ENDPROC
PROCEDURE construieste_todlg
- *!* Construieste obiectul toDlg pentru import_nota.do_adauga_factura().
- *!* Contract populabil programatic (nu doar din UI) - vezi docs M2.
- Local loT
+ *!* Construieste obiectul toDlg cu datele dialogului, pentru import_nota.do_adauga_factura().
+ Local loT, lcDviVal, lcFactVal, llDviFaraVal, llFactFaraVal, llDviPropriu
loT = Createobject('Empty')
Addproperty(loT, 'serie_act', Alltrim(Nvl(This.cSerieAct, '')))
Addproperty(loT, 'nract', This.nNract)
@@ -5969,7 +6086,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Addproperty(loT, 'id_partc', This.nIdPartener)
Addproperty(loT, 'partc', This.cPartener)
Addproperty(loT, 'explicatia', Alltrim(Nvl(This.cExplicatia, '')))
- Addproperty(loT, 'suma', Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, Iif(This.nSumaLei <> 0, This.nSumaLei, Round(This.nSuma * This.nCurs, m.gnPC)), This.nSuma))
+ Addproperty(loT, 'suma', Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, Round(This.nSuma * This.nCurs, m.gnPC), This.nSuma))
Addproperty(loT, 'suma_val', Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, This.nSuma, 0))
Addproperty(loT, 'in_valuta', This.chkInValutaCont.Value)
Addproperty(loT, 'participa_valuta', (This.chkParticipaValuta.Value = 1))
@@ -5979,6 +6096,11 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Addproperty(loT, 'cTipTva', Iif(This.optTipTva.Value = 1, 'F', Iif(This.optTipTva.Value = 2, 'D', 'N')))
Addproperty(loT, 'id_jtva_coloana', This.nIdExplicatieTva)
If This.optTipTva.Value = 2
+ lcDviVal = Alltrim(Nvl(This.dvi_valuta_efectiva(), ''))
+ lcFactVal = Alltrim(Nvl(This.cValuta, ''))
+ llDviFaraVal = (This.chkDviInValuta.Value = 0) Or Empty(lcDviVal) Or Upper(lcDviVal) == 'RON'
+ llFactFaraVal = (Empty(lcFactVal) Or Upper(lcFactVal) == 'RON')
+ llDviPropriu = (This.dvi_id_valuta_efectiva() <> This.nIdValuta Or This.dvi_curs_efectiv() <> This.nCurs)
Addproperty(loT, 'dvi_serie', Chrtran(Alltrim(Nvl(This.cSerieDvi, '')), Chr(34), ''))
Addproperty(loT, 'dvi_nract', This.nNractDvi)
Addproperty(loT, 'dvi_dataact', This.dDviData)
@@ -5987,24 +6109,47 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Addproperty(loT, 'dvi_id_partc', This.nDviIdPartener)
Addproperty(loT, 'dvi_partc', This.cDviPartener)
Addproperty(loT, 'dvi_scc', '401')
- Addproperty(loT, 'dvi_tva_lei', This.nDviTvaLei)
- Addproperty(loT, 'dvi_tva_val', This.nDviTvaVal)
+ Addproperty(loT, 'dvi_tva_lei', This.tva_dvi_lei())
+ Addproperty(loT, 'dvi_tva_val', Iif(llDviFaraVal, 0, This.nDviTvaVal))
+ Addproperty(loT, 'dvi_in_valuta', !llDviFaraVal)
+ Addproperty(loT, 'dvi_id_valuta', This.dvi_id_valuta_efectiva())
+ Addproperty(loT, 'dvi_curs', This.dvi_curs_efectiv())
+ Addproperty(loT, 'dvi_nume_val', lcDviVal)
+ Addproperty(loT, 'dvi_valuta_proprie', Iif(llDviFaraVal And llFactFaraVal, 0, Iif(llDviFaraVal <> llFactFaraVal, 1, Iif(llDviPropriu, 1, 0))))
Endif
+ Addproperty(loT, 'disc_baza_lei', Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, Round(This.nDiscBaza * This.nCurs, m.gnPC), This.nDiscBaza))
+ Addproperty(loT, 'disc_baza_val', Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, This.nDiscBaza, 0))
Return loT
ENDPROC
+ PROCEDURE dvi_curs_efectiv
+ Return Iif(This.lDviValutaDirty Or This.lDviCursDirty, This.nDviCurs, This.nCurs)
+ ENDPROC
+
+ PROCEDURE dvi_id_valuta_efectiva
+ Return Iif(This.lDviValutaDirty, This.nDviIdValuta, This.nIdValuta)
+ ENDPROC
+
+ PROCEDURE dvi_tva_in_valuta
+ *!* .T. cand TVA-ul DVI se tasteaza in valuta (bifa pusa si valuta efectiva nu e RON).
+ Return This.chkDviInValuta.Value = 1 And !(Empty(This.dvi_valuta_efectiva()) Or Upper(Alltrim(This.dvi_valuta_efectiva())) == 'RON')
+ ENDPROC
+
+ PROCEDURE dvi_valuta_efectiva
+ Return Iif(This.lDviValutaDirty, This.cDviValuta, This.cValuta)
+ ENDPROC
+
PROCEDURE inainte_de_do_termin
- *!* Hook standard _frmbase (apelat de do_termin, _frm_base.vc2:363): valideaza + adauga
- *!* perechea (baza+TVA) prin import_nota.do_adauga_factura() +, daca reuseste, permite
- *!* inchiderea dialogului (Return .T.). Return .F. tine dialogul deschis pentru corectare.
+ *!* Hook _frmbase apelat de do_termin: valideaza si adauga perechea baza+TVA prin
+ *!* import_nota.do_adauga_factura(). Return .F. tine dialogul deschis pentru corectare.
Local loFelDviCauta, llOk
If !Thisform.valideaza()
Return .F.
Endif
- * la prima trecere pe "prin DVI" in aceasta sesiune, cer felul documentului DVI
- * (devine cheia sesiunii pentru M1/memoria DVI - docs M2, autoplan #37)
+ * la prima trecere pe "prin DVI" cer felul documentului DVI - devine cheia
+ * memoriei DVI pentru restul sesiunii
If Thisform.optTipTva.Value = 2 And Empty(Nvl(Thisform.nIdFdocDVI, 0)) And Empty(Alltrim(Nvl(Thisform.cFelDocDvi, '')))
loFelDviCauta = caut_fdoc(.F., .T.)
If Vartype(loFelDviCauta) <> 'O' Or Empty(Nvl(loFelDviCauta.id_fdoc, 0))
@@ -6048,11 +6193,13 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
This.nIdValuta = Nvl(toParinte.oact.id_valuta, 0)
This.cValuta = Alltrim(Nvl(toParinte.oact.nume_val, ''))
This.nCurs = Nvl(toParinte.oact.curs, 1)
+ This.nDviIdValuta = This.nIdValuta
+ This.cDviValuta = This.cValuta
+ This.nDviCurs = This.nCurs
This.cExplicatia = ''
- * pre-completare din antetul notei (toParinte.oact = Scatter din vact) - Marius alege
- * felul documentului, furnizorul si cursul la deschiderea notei; dialogul le mosteneste,
- * editabile. Guard Type() ca sa nu crape Init daca vreun camp lipseste din vact.
+ * pre-completare din antetul notei (toParinte.oact = Scatter din vact); campurile raman
+ * editabile. Type() acopera cazul in care un camp lipseste din vact.
If Type('toParinte.oact.id_fdoc') <> 'U'
This.nIdFdoc = Nvl(toParinte.oact.id_fdoc, 0)
This.cFelDoc = Alltrim(Nvl(toParinte.oact.fdoc, ''))
@@ -6102,39 +6249,47 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
This.optTipTva.Value = 1
This.actualizeaza_stare_valuta()
This.actualizeaza_stare_dvi()
- This.actualizeaza_tabstop()
+ This.actualizeaza_etichete_sume()
This.Refresh()
ENDPROC
PROCEDURE recalc_tva
- *!* Precompleteaza TVA-ul DVI din baza facturii si cota (This.nProcentTva):
- *!* in valuta: TVA_val = baza_val * cota/100, TVA_lei = TVA_val * curs;
- *!* in lei (RON): TVA_lei = baza_lei * cota/100. Utilizatorul poate corecta.
- Local lnCota, lnBazaVal, lnTvaVal, lnTvaLei
+ *!* Precompleteaza TVA-ul DVI din baza neta (suma - discount) si cota (This.nProcentTva).
+ *!* Campul de TVA se tasteaza in valuta DVI cand DVI-ul are valuta, altfel in lei.
+ Local lnCota, lnTvaVal, lnTvaLei, lnDiscLei, lnDiscVal, lnBazaLeiNet, lnBazaValNet
lnCota = Nvl(This.nProcentTva, 0)
- * suma fara TVA in lei (editabila): o recalculez doar daca nu a fost editata manual
- If !This.lSumaLeiDirty
- If This.chkInValutaCont.Value = 1 And This.nCurs <> 0
- This.nSumaLei = Round(This.nSuma * This.nCurs, m.gnPC)
- Else
- This.nSumaLei = Round(This.nSuma, m.gnPC)
- Endif
- This.txtSumaLei.Refresh()
+ If This.chkInValutaCont.Value = 1 And This.nCurs <> 0
+ This.nSumaLei = Round(This.nSuma * This.nCurs, m.gnPC)
+ Else
+ This.nSumaLei = Round(This.nSuma, m.gnPC)
Endif
If This.optTipTva.Value = 2 And lnCota > 0 And This.nSuma <> 0
- If This.chkInValutaCont.Value = 1 And This.nCurs <> 0
- lnBazaVal = This.nSuma
- lnTvaVal = Round(lnBazaVal * lnCota / 100, m.gnPval)
- lnTvaLei = Round(lnTvaVal * This.nCurs, m.gnPC)
- Else
+ lnDiscLei = Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, Round(This.nDiscBaza * This.nCurs, m.gnPC), This.nDiscBaza)
+ lnDiscVal = Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, This.nDiscBaza, 0)
+ lnBazaLeiNet = This.nSumaLei - lnDiscLei
+ lnBazaValNet = This.nSuma - lnDiscVal
+ If !This.dvi_tva_in_valuta()
+ lnTvaLei = Round(lnBazaLeiNet * lnCota / 100, m.gnPC)
lnTvaVal = 0
- lnTvaLei = Round(This.nSuma * lnCota / 100, m.gnPC)
+ Else
+ If This.chkInValutaCont.Value = 1 And This.nCurs <> 0 And This.dvi_id_valuta_efectiva() == This.nIdValuta
+ lnTvaVal = Round(lnBazaValNet * lnCota / 100, m.gnPval)
+ Else
+ lnTvaLei = Round(lnBazaLeiNet * lnCota / 100, m.gnPC)
+ lnTvaVal = Iif(This.dvi_curs_efectiv() <> 0, Round(lnTvaLei / This.dvi_curs_efectiv(), m.gnPval), 0)
+ Endif
+ Endif
+ If !This.lDviTvaValDirty
+ This.nDviTvaVal = Iif(This.dvi_tva_in_valuta(), lnTvaVal, lnTvaLei)
+ This.txtDviTvaVal.Value = This.nDviTvaVal
+ Endif
+ Else
+ If !This.lDviTvaValDirty
+ This.nDviTvaVal = 0
+ This.txtDviTvaVal.Value = 0
Endif
- This.nDviTvaVal = lnTvaVal
- This.nDviTvaLei = lnTvaLei
- This.txtDviTvaVal.Value = lnTvaVal
- This.txtDviTvaLei.Value = lnTvaLei
Endif
+ This.nDviTvaLei = This.tva_dvi_lei()
ENDPROC
PROCEDURE seteaza_masti
@@ -6143,13 +6298,17 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Local llValuta
llValuta = (This.chkInValutaCont.Value = 1 And This.nCurs <> 0)
This.txtSuma.InputMask = get_mask(12, Iif(llValuta, m.gnPval, m.gnPC))
- This.txtSumaLei.InputMask = get_mask(12, m.gnPC)
- This.txtDviTvaVal.InputMask = get_mask(12, m.gnPval)
- This.txtDviTvaLei.InputMask = get_mask(12, m.gnPC)
+ This.txtDiscBaza.InputMask = get_mask(12, Iif(llValuta, m.gnPval, m.gnPC))
+ This.txtDviTvaVal.InputMask = get_mask(12, Iif(This.dvi_tva_in_valuta(), m.gnPval, m.gnPC))
+ ENDPROC
+
+ PROCEDURE tva_dvi_lei
+ *!* TVA-ul DVI in lei, din valoarea tastata (in valuta DVI sau direct in lei).
+ Return Iif(This.dvi_tva_in_valuta(), Round(This.nDviTvaVal * This.dvi_curs_efectiv(), m.gnPC), Round(This.nDviTvaVal, m.gnPC))
ENDPROC
PROCEDURE valideaza
- *!* Validari la "Termin", numite explicit, fara crash (docs/propuneri_ergonomie_import.md, M2).
+ *!* Validari la "Termin": mesaj explicit per camp lipsa, Return .F. opreste inchiderea.
If Empty(Nvl(This.nIdFdoc, 0)) And Empty(Alltrim(Nvl(This.cFelDoc, '')))
Amessagebox('Alegeti felul documentului.', 0 + 48, 'Adauga factura')
Return .F.
@@ -6187,21 +6346,45 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Amessagebox('Alegeti partenerul vamal (DVI).', 0 + 48, 'Adauga factura')
Return .F.
Endif
- If This.nDviTvaLei = 0
- Amessagebox('TVA in lei (DVI) trebuie sa fie mai mare decat zero.', 0 + 48, 'Adauga factura')
+ If This.chkDviInValuta.Value = 1 And !(Empty(This.dvi_valuta_efectiva()) Or Upper(Alltrim(This.dvi_valuta_efectiva())) == 'RON') And This.dvi_curs_efectiv() = 0
+ Amessagebox('Completati cursul valutei DVI.', 0 + 48, 'Adauga factura')
+ Return .F.
+ Endif
+ If This.tva_dvi_lei() = 0
+ Amessagebox('Valoarea TVA (DVI) trebuie sa fie mai mare decat zero.', 0 + 48, 'Adauga factura')
+ Return .F.
+ Endif
+ Endif
+ If This.nDiscBaza <> 0
+ If This.nDiscBaza < 0
+ Amessagebox('Discountul nu poate fi negativ.', 0 + 48, 'Adauga factura')
+ Return .F.
+ Endif
+ If This.nDiscBaza >= This.nSuma
+ Amessagebox('Discountul este mai mare sau egal cu suma facturii. Verificati valoarea.', 0 + 48, 'Adauga factura')
Return .F.
Endif
Endif
Return .T.
ENDPROC
+ PROCEDURE chkDviInValuta.InteractiveChange
+ Thisform.lDviInValutaDirty = .T.
+ Thisform.lDviTvaValDirty = .F.
+ Thisform.actualizeaza_stare_dvi_valuta()
+ Thisform.recalc_tva()
+ ENDPROC
+
PROCEDURE chkInValutaCont.InteractiveChange
*!* bifa scoasa = suma NU se inregistreaza in valuta: valuta si cursul nu au sens,
*!* le ascund; valorile raman memorate pe forma si revin la re-bifare.
Thisform.lInValutaDirty = .T.
+ Thisform.lDviTvaValDirty = .F.
Thisform.arata_valuta_curs(This.Value = 1)
Thisform.seteaza_masti()
+ Thisform.actualizeaza_stare_dvi_valuta()
Thisform.recalc_tva()
+ Thisform.actualizeaza_etichete_sume()
ENDPROC
PROCEDURE cmdDviPartener.Click
@@ -6212,7 +6395,21 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Thisform.cDviPartener = Alltrim(loCauta.denumire)
Thisform.txtDviPartener.Refresh()
Endif
- Thisform.actualizeaza_tabstop()
+ ENDPROC
+
+ PROCEDURE cmdDviValuta.Click
+ Local loCauta
+ loCauta = caut_valuta(, .F., .F.)
+ If Vartype(loCauta) = 'O' And !Empty(Nvl(loCauta.id_valuta, 0))
+ Thisform.nDviIdValuta = loCauta.id_valuta
+ Thisform.cDviValuta = Alltrim(loCauta.nume_val)
+ Thisform.txtDviValuta.Refresh()
+ Thisform.lDviCursDirty = .F.
+ Thisform.lDviValutaDirty = .T.
+ Thisform.lDviTvaValDirty = .F.
+ Thisform.actualizeaza_stare_dvi_valuta()
+ Thisform.recalc_tva()
+ Endif
ENDPROC
PROCEDURE cmdExplicatieTva.Click
@@ -6239,7 +6436,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Thisform.txtProcentTva.Refresh()
Endif
Thisform.recalc_tva()
- Thisform.actualizeaza_tabstop()
ENDPROC
PROCEDURE cmdFelDoc.Click
@@ -6251,7 +6447,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Thisform.txtFelDoc.Refresh()
Thisform.txtSerie.SetFocus()
Endif
- Thisform.actualizeaza_tabstop()
ENDPROC
PROCEDURE cmdFelDocDVI.Click
@@ -6263,7 +6458,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Thisform.txtFelDocDVI.Refresh()
Thisform.txtDVINr.SetFocus()
Endif
- Thisform.actualizeaza_tabstop()
ENDPROC
PROCEDURE cmdPartener.Click
@@ -6275,7 +6469,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Thisform.txtPartener.Refresh()
Thisform.txtSuma.SetFocus()
Endif
- Thisform.actualizeaza_tabstop()
ENDPROC
PROCEDURE cmdValuta.Click
@@ -6287,10 +6480,19 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Thisform.txtValuta.Refresh()
Thisform.lCursDirty = .F.
Thisform.lInValutaDirty = .F.
+ Thisform.lDviTvaValDirty = .F.
Thisform.actualizeaza_stare_valuta()
+ If !Thisform.lDviValutaDirty
+ Thisform.nDviIdValuta = Thisform.nIdValuta
+ Thisform.cDviValuta = Thisform.cValuta
+ Thisform.nDviCurs = Thisform.nCurs
+ Thisform.txtDviValuta.Refresh()
+ Thisform.txtDviCurs.Refresh()
+ Endif
+ Thisform.actualizeaza_stare_dvi_valuta()
+ Thisform.actualizeaza_etichete_sume()
Thisform.recalc_tva()
Endif
- Thisform.actualizeaza_tabstop()
ENDPROC
PROCEDURE optTipTva.InteractiveChange
@@ -6303,6 +6505,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
Thisform.lCursDirty = .T.
Endif
Thisform.nCurs = This.Value
+ If !Thisform.lDviValutaDirty
+ Thisform.nDviCurs = Thisform.nCurs
+ Thisform.txtDviCurs.Refresh()
+ Endif
Thisform.recalc_tva()
ENDPROC
@@ -6311,6 +6517,23 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
This.Parent.actualizeaza_stare_valuta()
ENDPROC
+ PROCEDURE txtDiscBaza.Valid
+ Thisform.nDiscBaza = This.Value
+ Thisform.recalc_tva()
+ ENDPROC
+
+ PROCEDURE txtDviCurs.GotFocus
+ Thisform.nOldVal = This.Value
+ ENDPROC
+
+ PROCEDURE txtDviCurs.Valid
+ Thisform.nDviCurs = This.Value
+ If This.Value <> Thisform.nOldVal
+ Thisform.lDviCursDirty = .T.
+ Endif
+ Thisform.recalc_tva()
+ ENDPROC
+
PROCEDURE txtDviPartener.DblClick
Thisform.cmddviPartener.Click()
ENDPROC
@@ -6331,6 +6554,22 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
This.Value = Thisform.cDviPartener
ENDPROC
+ PROCEDURE txtDviTvaVal.GotFocus
+ Thisform.nOldVal = This.Value
+ ENDPROC
+
+ PROCEDURE txtDviTvaVal.Valid
+ Thisform.nDviTvaVal = This.Value
+ If This.Value <> Thisform.nOldVal
+ Thisform.lDviTvaValDirty = .T.
+ Endif
+ Thisform.nDviTvaLei = Thisform.tva_dvi_lei()
+ ENDPROC
+
+ PROCEDURE txtDviValuta.DblClick
+ Thisform.cmdDviValuta.Click()
+ ENDPROC
+
PROCEDURE txtExplicatieTva.DblClick
Thisform.cmdExplicatieTva.Click()
ENDPROC
@@ -6408,20 +6647,13 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx"
PROCEDURE txtSuma.Valid
If This.Value <> Thisform.nSuma
- * suma s-a schimbat: reiau calculul automat al sumei in lei
- Thisform.lSumaLeiDirty = .F.
+ * suma s-a schimbat: reiau calculul automat al TVA-ului
+ Thisform.lDviTvaValDirty = .F.
Endif
Thisform.nSuma = This.Value
Thisform.recalc_tva()
ENDPROC
- PROCEDURE txtSumaLei.Valid
- If This.Value <> Thisform.nSumaLei
- Thisform.nSumaLei = This.Value
- Thisform.lSumaLeiDirty = .T.
- Endif
- ENDPROC
-
PROCEDURE txtValuta.DblClick
Thisform.cmdvaluta.Click()
ENDPROC
@@ -6548,12 +6780,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
*
*m: actualizeaza_banda
+ *m: aliniaza_tva_la_baza
*m: aplica_explicatie_tva
*m: assign_analitic
*m: calc_baze_cota_creditor
*m: calc_doc_key
*m: copiaza_valoare
*m: creeaza_rand_s
+ *m: disc_document
*m: do_adauga_articol
*m: do_adauga_factura
*m: do_calculeaza_diferente
@@ -6565,33 +6799,39 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
*m: do_modiparam
*m: do_sterge_articol
*m: gaseste_jtva_cota
+ *m: rand_protejat
*m: recalculeaza
*m: recalc_diferente
*m: recalc_tva_document
*m: refac_culori_documente
*m: sincronizeaza
+ *m: sparge_discount
*m: sparge_document
+ *m: sparge_tva_protejat
*m: uneste_document
*m: updateexplicatiesaft
*m: valideaza_sume
*p: cdvifeldoc && memoria DVI: textul felului de document al DVI (pt. redeschidere dialog)
- *p: cdvinr && memoria DVI (M2): numarul DVI, ca sir - vezi contract mai jos
+ *p: cdvinr && memoria DVI: numarul DVI, ca sir
*p: cdvipartener && memoria DVI: denumirea partenerului vamal
*p: cdviserie && memoria DVI: seria DVI (de regula goala)
*p: cmesajsync && mesajele valideaza_sume/sparge_document/recalc_diferente (banda de sincronizare)
+ *p: coldval && valoarea celulei caracter la intrarea in focus (scc/ascc) - pereche cu noldval, numeric
*p: ddvidata && memoria DVI: data DVI
*p: ldialogaratat && dialogul "Adauga factura" a fost deschis automat la Activate (o singura data)
- *p: linsync && A1: guard de reintrare in sincronizeaza()
+ *p: linsync && guard de reintrare in sincronizeaza()
*p: lintern && Formularul este folosit pentru Import (.T.) sau pentru achizitii interne (.F.)
*p: lrecalctva && recalculeaza automat T-urile nemanuale cand se modifica totalul facturii
*p: lspargesecundare && spargerea facturilor secundare pe conturile/analiticele articolelor (implicit activa)
- *p: lsyncpending && A1: sincronizare amanata, armata din Valid-uri, executata de tmrSync
+ *p: lsyncpending && sincronizare amanata, armata din Valid-uri, executata de tmrSync
*p: nbazaprincipala_lei && baza principala lei (nr_doc minim B/S), numitor procente per rand (sincronizeaza)
*p: nbazaprincipala_val && baza principala valuta, numitor procente per rand (sincronizeaza)
*p: nbaza_lei && baza lei totala (recalculeaza) - documentele cu S insumeaza S, fara S insumeaza B
*p: nbaza_val && baza valuta totala (recalculeaza)
*p: ndif_lei && diferenta lei randul D (recalc_diferente)
*p: ndif_val && diferenta valuta randul D (recalc_diferente)
+ *p: ndisc_lei && discount lei totala (recalculeaza), suma randurilor G
+ *p: ndisc_val && discount valuta totala (recalculeaza)
*p: ndviidfdoc && memoria DVI: id_fdoc ales prima data prin caut_fdoc - cheia sesiunii DVI
*p: ndviidpartener && memoria DVI: id_part al partenerului vamal
*p: nid_part_finalizarenir
@@ -6599,8 +6839,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
*p: ntva_lei && TVA lei totala (recalculeaza)
*p: ntva_val && TVA valuta totala (recalculeaza)
*p: oact
- *p: procent_lei && A3: procent incarcare lei (100 + transport/taxe), calculat direct in recalculeaza()
- *p: procent_val && A3: procent incarcare valuta, calculat direct in recalculeaza()
+ *p: procent_lei && procent incarcare lei (100 + transport/taxe), calculat in recalculeaza()
+ *p: procent_val && procent incarcare valuta, calculat in recalculeaza()
*p: tprocente
*p: tsuma
*
@@ -6612,6 +6852,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
cdvipartener = ""
cdviserie = ""
cmesajsync = ""
+ coldval = ""
ddvidata = {}
DoCreate = .T.
Height = 620
@@ -6629,6 +6870,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
nbaza_val = 0
ndif_lei = 0
ndif_val = 0
+ ndisc_lei = 0
+ ndisc_val = 0
ndviidfdoc = 0
ndviidpartener = 0
nid_part_finalizarenir =
@@ -8242,7 +8485,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE actualizeaza_banda
- *!* 16.07.2026 claude (T3, E2/D-M1/D-M4/D-M5) - banda de stare + totalurile formularului
+ *!* Banda de stare (sincronizat / nesincronizat, incarcarea pretului) si totalurile formularului.
If Empty(This.cmesajsync)
This.lblSync.BackColor = Rgb(226,239,218)
This.lblSync.Caption = 'Sincronizat | Incarcare pret (transport/taxe): +' + Alltrim(Str(This.procent_val * This.procent_lei / 100 - 100, 12, 4)) + ' %'
@@ -8250,8 +8493,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
This.lblSync.BackColor = Rgb(255,221,221)
This.lblSync.Caption = Left('NESINCRONIZAT: ' + Strtran(Strtran(This.cmesajsync, Chr(13), ''), Chr(10), ' | '), 254)
Endif
- This.text2.Value = This.nbaza_lei + This.ntva_lei
- This.text3.Value = This.nbaza_val + This.ntva_val
+ This.text2.Value = This.nbaza_lei + This.ntva_lei - This.ndisc_lei
+ This.text3.Value = This.nbaza_val + This.ntva_val - This.ndisc_val
This.txtftvalei.Value = This.nbaza_lei
This.TxtIncLei.Refresh()
If !This.lIntern
@@ -8265,16 +8508,54 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Endif
ENDPROC
+ PROCEDURE aliniaza_tva_la_baza
+ *!* Aliniaza randurile T ale documentului la familia de explicatii a randului S de aceeasi
+ *!* cota (perechea de TVA din nomenclator), reface taxcode (SAFT) si comutarea scc
+ *!* 4427/creditor S; randurile cu explicatia aleasa manual (expl_manual=1) raman neatinse.
+ Lparameters tcDocKey
+ Local lcSel, lnCotaCrt, lnIdJtvaT
+ lcSel = Select()
+
+ Select Distinct introdc.ptva As cota, jb.id_tva As id_jtva_t, jt.denumire As denumire, ;
+ introdc.scc As scc_s, introdc.ascc As ascc_s ;
+ From introdc, jtva_coloane2 jb, jtva_coloane2 jt ;
+ Where introdc.doc_key == tcDocKey And introdc.tip_rand == 'S' And Nvl(introdc.ptva,0) > 0 ;
+ And jb.id_jtva_coloana = introdc.id_jtva_coloana And Nvl(jb.cota_tva,0) = Nvl(introdc.ptva,0) ;
+ And Nvl(jb.id_tva,0) > 0 And jt.id_jtva_coloana = jb.id_tva ;
+ Into Cursor crsPerecheT NOFILTER
+
+ Select introdc
+ Scan For doc_key == tcDocKey And tip_rand == 'T' And Nvl(expl_manual,0) <> 1 And Nvl(ptva,0) > 0
+ lnCotaCrt = ptva
+ Select crsPerecheT
+ Locate For cota = lnCotaCrt
+ lnIdJtvaT = Iif(Found(), crsPerecheT.id_jtva_t, 0)
+ Select introdc
+ If lnIdJtvaT <> 0 And lnIdJtvaT <> Nvl(id_jtva_coloana,0)
+ Replace id_jtva_coloana With lnIdJtvaT, explicatie_tva With crsPerecheT.denumire
+ If Seek(lnIdJtvaT, "cJtvaCol4427", "id_jtva")
+ Replace scc With '4427', ascc With ''
+ Else
+ *!* creditorul propriu al randului T (spargerea pe creditori) se pastreaza - se reface doar iesirea din 4427
+ If Alltrim(Nvl(scc,'')) == '4427'
+ Replace scc With crsPerecheT.scc_s, ascc With Nvl(crsPerecheT.ascc_s,'')
+ Endif
+ Endif
+ Thisform.UpdateExplicatieSAFT()
+ Endif
+ Endscan
+ Use In crsPerecheT
+
+ Select (lcSel)
+ ENDPROC
+
PROCEDURE aplica_explicatie_tva
- *!* Extrasa din do_modifica_explicatie_tva si Grid1.cExplicatieTva.Combo1.Valid
- *!* (comutarea 4426=4427/401 + UpdateExplicatieSAFT), ca sa nu se duplice logica intre
- *!* editarea in grid si frm_adauga_factura (docs/propuneri_ergonomie_import.md, M2).
- *!* CONTRACT (16.07.2026 claude, tip_rand/doc_key): se apeleaza cu randul curent din
- *!* introdc pozitionat pe un rand non-T (B, sau S din T2); randul T al documentului
- *!* (acelasi doc_key) se cauta cu Locate; pozitia initiala se restaureaza la iesire.
+ *!* Aplica explicatia TVA pe randul curent si pe randurile T de aceeasi cota ale documentului
+ *!* (comutare scc 4426=4427 / creditorul bazei + UpdateExplicatieSAFT). Se apeleaza cu randul
+ *!* curent pozitionat pe un rand non-T (B sau S); pozitia initiala se restaureaza la iesire.
Lparameters tnIdJtvaColoana
Local lnPtva, lcExplicatieTva, lnId_tva, lnId_jtva_coloanaTVA, lnCota_tva, lcExplicatie_TVA
- Local lcDocKey, lcTipRand, lcScd
+ Local lcDocKey, lcTipRand, lcScd, lnTaxCodeBaza, lcSccS, lcAsccS, lnRanduriT
Select jtva_coloane2
Locate For id_jtva_coloana = tnIdJtvaColoana
@@ -8289,10 +8570,23 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
lcDocKey = Padr(Thisform.calc_doc_key(), Len(doc_key))
lcTipRand = tip_rand
lcScd = scd
+ lcSccS = Nvl(scc,'')
+ lcAsccS = Nvl(ascc,'')
Replace id_jtva_coloana With tnIdJtvaColoana, ptva With lnPtva, explicatie_tva With lcExplicatieTva
+ If lcTipRand == 'T'
+ *!* explicatie aleasa direct pe randul de TVA - sincronizarea nu o realiniaza la familia bazei
+ Replace expl_manual With 1
+ Endif
+ If lcTipRand == 'G'
+ *!* randul de discount se editeaza local, fara sa atinga randul de TVA al documentului
+ Thisform.UpdateExplicatieSAFT()
+ Replace cu_tva With Iif(lnPtva = 0, 0, 1)
+ Return .T.
+ Endif
If lcTipRand <> 'T'
Thisform.UpdateExplicatieSAFT()
+ lnTaxCodeBaza = taxcode
If lnPtva = 0
Select introdc
Replace cu_tva With 0
@@ -8308,26 +8602,38 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
lnCota_tva = jtva_coloane2.cota_Tva
lcExplicatie_TVA = jtva_coloane2.denumire
- * PENTRU TAXARE INVERSA SI COMUNITATEA EUROPEANA: 4426 = 4427 PE LINIA DE TVA, ALTFEL 4426 = 401
+ * PENTRU TAXARE INVERSA SI COMUNITATEA EUROPEANA: 4426 = 4427 PE LINIA DE TVA, ALTFEL CREDITORUL BAZEI
Select introdc
Replace cu_tva With 1
- Locate For doc_key == lcDocKey And tip_rand = 'T'
- If Found()
+ *!* un singur rand T = fara ambiguitate de cota (factura abia creata, randul T din sablon)
+ Count For doc_key == lcDocKey And tip_rand == 'T' To lnRanduriT
+ Scan For doc_key == lcDocKey And tip_rand == 'T' And (lnRanduriT = 1 Or Nvl(ptva,0) = lnPtva)
Replace id_jtva_coloana With lnId_jtva_coloanaTVA, ptva With lnCota_tva, ;
explicatie_tva With lcExplicatie_TVA, cu_tva With 1
If Seek(lnId_jtva_coloanaTVA, "cJtvaCol4427", "id_jtva")
- Replace scc With '4427' In introdc
+ Replace scc With '4427', ascc With ''
Else
- Replace scc With '401' In introdc
+ *!* creditorul propriu al randului T se pastreaza - se reface doar iesirea din 4427
+ If Alltrim(Nvl(scc,'')) == '4427'
+ Replace scc With lcSccS, ascc With lcAsccS
+ Endif
Endif
- Endif
- Thisform.UpdateExplicatieSAFT()
+ Thisform.UpdateExplicatieSAFT()
+ Endscan
Endif
Endif
Endif
+ *!* randul de discount urmeaza baza documentului: aceeasi cota, explicatie si taxa SAFT
+ If lcTipRand <> 'T'
+ Select introdc
+ Replace id_jtva_coloana With tnIdJtvaColoana, ptva With lnPtva, ;
+ explicatie_tva With lcExplicatieTva, taxcode With lnTaxCodeBaza, ;
+ cu_tva With Iif(lnPtva = 0, 0, 1) ;
+ For doc_key == lcDocKey And tip_rand == 'G'
+ Endif
Select introdc
- *!* 16.07.2026 claude (T2) - pentru S extind Locate cu scd (mai multe S per doc - ambiguu altfel)
+ *!* pentru S, Locate cuprinde si scd - un document poate avea mai multe randuri S
If lcTipRand == 'S'
Locate For doc_key == lcDocKey And tip_rand == lcTipRand And scd == lcScd
Else
@@ -8338,8 +8644,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE assign_analitic
- *!* 16.07.2026 claude - copiat din import_nir.assign_analitic (T3 va muta import_nir);
- *!* folosit de creeaza_rand_s pentru analiticul contului articolelor pe randul S.
+ *!* analiticul contului articolelor pe randul S (folosit de creeaza_rand_s)
PARAMETERS tcCont,pcAct,pcRul
PRIVATE pcCont,pcAct,pcRul,pParamP,pParamS
@@ -8444,12 +8749,11 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE calc_baze_cota_creditor
- *!* runda27 (D3+D6): grupeaza bazele articolelor (rul_temp) pe cota TVA + creditorul
- *!* (scc/ascc) al S-ului corespunzator contului articolului (scd==cont, ascd==acont);
- *!* cand nu exista un S pereche, foloseste scc/ascc din toFallback. Partenerul TVA
- *!* (id_partc/partc pe T) NU se preia de la S-uri - ramane cel ales la introducerea
- *!* facturii (furnizor sau DVI). Rezultatul ramane deschis in crsGrupCota (cota_tva,
- *!* scc, ascc, baza_lei, baza_val) - apelantul il elibereaza (Use In crsGrupCota).
+ *!* Grupeaza bazele articolelor (rul_temp) pe cota TVA + creditorul (scc/ascc) al S-ului
+ *!* corespunzator contului articolului (scd==cont, ascd==acont); fara S pereche foloseste
+ *!* scc/ascc din toFallback. Partenerul TVA (id_partc/partc pe T) ramane cel ales la
+ *!* introducerea facturii. Rezultatul ramane deschis in crsGrupCota (cota_tva, scc, ascc,
+ *!* baza_lei, baza_val) - apelantul face Use In crsGrupCota.
Lparameters tcDocKey, toFallback
Local lcSelCbcc
lcSelCbcc = Select()
@@ -8493,18 +8797,18 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE calc_doc_key
- * cheia documentului: nr_doc e identificatorul unic per document (o factura + rand TVA + eventual DVI);
- * campurile de business (serie_act/nract/id_fdoc/id_partc) raman informative in cheie, nu mai asigura unicitatea
+ * cheia documentului: nr_doc identifica unic documentul (factura + rand TVA + eventual DVI);
+ * serie_act/nract/id_fdoc/id_partc raman informative in cheie
Return Alltrim(Str(Nvl(introdc.nr_doc,0),8)) + '|' + Upper(Alltrim(Nvl(introdc.serie_act,''))) + '|' + Alltrim(Str(Nvl(introdc.nract,0),14)) + '|' + ;
Alltrim(Str(Nvl(introdc.id_fdoc,0),14)) + '|' + Alltrim(Str(Nvl(introdc.id_partc,0),14))
ENDPROC
PROCEDURE copiaza_valoare
- *!* 16.07.2026 claude - propaga valoarea pe tot grupul doc_key (E1 generalizat,
- *!* inlocuieste copierea pe perechea para din paritatea Recno); daca tcCamp e o
- *!* cheie a documentului, regenereaza doc_key pe grup dupa propagare.
+ *!* Propaga valoarea campului tcCamp pe tot grupul doc_key; daca tcCamp face parte din
+ *!* cheia documentului, doc_key se regenereaza pe grup dupa propagare.
Lparameters tcCamp
Local lcSelect, lcCursor, luValoare, lcDocKeyOld, lcDocKeyNou, lnRecCurent, llCheie
+ Local llCampValuta, llCampIdentitate, llSursaProtejata
lcCursor = Thisform.grid1.RecordSource
lcSelect = Select()
Select (lcCursor)
@@ -8512,10 +8816,21 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
lcDocKeyOld = doc_key
luValoare = &tcCamp
llCheie = Inlist(Lower(tcCamp), 'serie_act', 'nract', 'id_fdoc', 'fdoc', 'id_partc', 'partc')
+ llCampValuta = Inlist(Lower(tcCamp), 'in_valuta', 'id_valuta', 'nume_val', 'curs', 'suma_val')
+ llCampIdentitate = Inlist(Lower(tcCamp), 'nract', 'serie_act', 'partc', 'id_fdoc', 'fdoc')
+ llSursaProtejata = (llCampValuta And Thisform.rand_protejat())
- Scan For doc_key == lcDocKeyOld And Recno() <> lnRecCurent
- Replace (tcCamp) With luValoare
- Endscan
+ If !llSursaProtejata
+ Scan For doc_key == lcDocKeyOld And Recno() <> lnRecCurent
+ If llCampValuta And Thisform.rand_protejat()
+ Loop
+ Endif
+ If llCampIdentitate And Nvl(rand_dvi,0) = 1
+ Loop
+ Endif
+ Replace (tcCamp) With luValoare
+ Endscan
+ Endif
If llCheie
Go lnRecCurent
@@ -8528,15 +8843,16 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Go lnRecCurent
Select (lcSelect)
Release lcSelect, lcCursor, luValoare, lcDocKeyOld, lcDocKeyNou, lnRecCurent, llCheie
+ Release llCampValuta, llCampIdentitate, llSursaProtejata
ENDPROC
PROCEDURE creeaza_rand_s
*!* un rand S: copie completa a sablonului documentului (toSablon de la sparge_document,
*!* altfel randul B/S gasit aici); suprascrie doar scd/ascd, suma/suma_val, tip_rand, mod_manual.
- *!* analiticul (tcAcont) vine de pe articole cand e furnizat (C2), altfel fallback assign_analitic.
- Lparameters tcDocKey, tcCont, tnSumaLei, tnSumaVal, toSablon, tcAcont
+ *!* analiticul (tcAcont) vine de pe articole cand e furnizat, altfel din assign_analitic.
+ Lparameters tcDocKey, tcCont, tnSumaLei, tnSumaVal, toSablon, tcAcont, tnCota
Private loRandB, lcAcont
- Local lcSelAnt
+ Local lcSelAnt, lnIdJtvaS
lcSelAnt = Select()
Select introdc
If Pcount() >= 5 And Vartype(toSablon) == 'O'
@@ -8561,6 +8877,19 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Endif
Replace tip_rand With 'S', doc_key With tcDocKey, scd With tcCont, ascd With lcAcont, ;
suma With tnSumaLei, suma_val With tnSumaVal, mod_manual With 0
+ If Pcount() >= 7 And Vartype(tnCota) == 'N' And tnCota > 0 And tnCota <> Nvl(ptva,0)
+ lnIdJtvaS = Thisform.gaseste_jtva_cota(Nvl(loRandB.id_jtva_coloana,0), tnCota)
+ Replace ptva With tnCota
+ If lnIdJtvaS <> 0
+ Replace id_jtva_coloana With lnIdJtvaS
+ Select jtva_coloane2
+ Locate For id_jtva_coloana = lnIdJtvaS
+ If Found()
+ Replace explicatie_tva With jtva_coloane2.denumire In introdc
+ Endif
+ Select introdc
+ Endif
+ Endif
Select (lcSelAnt)
ENDPROC
@@ -8568,11 +8897,29 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
USE IN (SELECT('cJtvaCol4427'))
ENDPROC
+ PROCEDURE disc_document
+ *!* discountul (rand G) al documentului tcDocKey, in lei sau in valuta.
+ Lparameters tcDocKey, tlValuta
+ Local lcSelAnt, lnRecAnt, lnDisc
+ lcSelAnt = Select()
+ lnRecAnt = Recno('introdc')
+ Select introdc
+ If tlValuta
+ Sum suma_val For doc_key == tcDocKey And tip_rand == 'G' To lnDisc
+ Else
+ Sum suma For doc_key == tcDocKey And tip_rand == 'G' To lnDisc
+ Endif
+ Select (lcSelAnt)
+ If Between(lnRecAnt, 1, Reccount('introdc'))
+ Go lnRecAnt In introdc
+ Endif
+ Return lnDisc
+ ENDPROC
+
PROCEDURE do_adauga
- *!* Pas 3: deschide dialogul modal frm_adauga_factura. Memoria DVI (cDviSerie/cDviNr/
- *!* dDviData/nDviIdPartener/cDviPartener/nDviIdFdoc) traieste pe Thisform (import_nota)
- *!* si e citita/scrisa de dialog prin Thisform.oParinte - vezi frm_adauga_factura.Init
- *!* si cmdAdauga.Click in pas3_frm_class.txt.
+ *!* Deschide dialogul modal frm_adauga_factura. Memoria DVI (cDviSerie/cDviNr/dDviData/
+ *!* nDviIdPartener/cDviPartener/nDviIdFdoc) traieste pe import_nota si e citita/scrisa
+ *!* de dialog prin Thisform.oParinte.
Local loDlg
loDlg = Createobject('import_adauga_factura', Thisform)
loDlg.Show(1)
@@ -8581,10 +8928,9 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE do_adauga_articol
- *!* 16.07.2026 claude (T3-A) - filtrul se largeste la clasa 2+3 (precedent do_modiparam
- *!* :7504), nu mai depinde de conturile prezente pe nota (spargerea le genereaza acum).
+ *!* filtru pe conturile de clasa 2+3, independent de conturile deja prezente pe nota
LOCAL lcXMLArticole, lcFiltru, lcCrsArt, lcCrsNir, lnPtvaPrincipal
- *!* 16.07.2026 claude (3f) - filtrul ajunge in WHERE-ul Oracle prin cauta_nom_articole: sintaxa SQL, nu VFP.
+ *!* filtrul intra in WHERE-ul Oracle prin cauta_nom_articole: sintaxa SQL, nu VFP.
lcFiltru = [Substr(Trim(a.cont),1,1) In ('2','3')]
lcXMLArticole = cauta_nom_articole(lcFiltru) && ocautare.prg - selectie multipla (click/SPACE); adauga singura a.inactiv = 0
@@ -8608,7 +8954,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
SELECT (lcCrsArt)
SCAN
SCATTER NAME loArt
- *!* F2: articol fara cont in nomenclator - blocam adaugarea lui, continuam cu restul
+ *!* articol fara cont in nomenclator - nu se adauga, restul continua
IF EMPTY(ALLTRIM(NVL(loArt.cont,'')))
amessagebox("Articolul " + ALLTRIM(loArt.denumire) + " nu are cont definit in nomenclator - nu a fost adaugat pe nota!",48,"Atentie")
LOOP
@@ -8634,14 +8980,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE do_adauga_factura
- *!* Directia A: cloneaza perechea-sablon (baza + TVA) din introdc_sablon,
- *!* o adauga in introdc si o populeaza cu datele documentului (toDlg).
- *!* 16.07.2026 claude - identitatea randurilor e tip_rand+doc_key (nu paritatea Recno);
- *!* fiecare document primeste un nr_doc nou (F1, index de sortare).
- *!* toDlg.cTipTva in {'F' furnizor, 'D' DVI, 'N' fara} decide randul de TVA -
- *!* vezi docs/propuneri_ergonomie_import.md, M2, "Ramura TVA".
+ *!* Cloneaza perechea-sablon (baza + TVA) din introdc_sablon, o adauga in introdc si o
+ *!* populeaza cu datele documentului (toDlg). Identitatea randurilor e tip_rand+doc_key,
+ *!* iar fiecare document primeste un nr_doc nou. toDlg.cTipTva in {'F' furnizor, 'D' DVI,
+ *!* 'N' fara} decide randul de TVA. Cand exista discount (disc_baza_lei<>0), randul G se
+ *!* creeaza intre randul B si randul T, cu aceleasi date de TVA ca baza.
Lparameters toDlg
- Local lnSel, loBaza, loTva, lnNrDoc, lnRecT
+ Local lnSel, loBaza, loTva, lnNrDoc, lnRecT, llDviInValuta, lnDviTvaAsteptat
+ Local lcIdValutaDvi, lnCursDvi, lcNumeValDvi, lnValutaProprie, lcDocKeyCrt
lnSel = Select()
If !Used('introdc_sablon') Or Reccount('introdc_sablon') < 2
Messagebox('Lipseste perechea-sablon (introdc_sablon).', 0+16, 'Adauga factura')
@@ -8649,7 +8995,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Return .F.
Endif
- *!* 16.07.2026 claude - urmatorul nr_doc (F1); ignora randurile D (99999999, vin la T2)
+ *!* urmatorul nr_doc; randurile D (99999999) sunt ignorate
lnNrDoc = 0
Select introdc
If Reccount() > 0
@@ -8684,6 +9030,29 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Replace tip_rand With 'B', nr_doc With lnNrDoc
Replace doc_key With Thisform.calc_doc_key(), suma_doc With toDlg.suma, suma_doc_val With toDlg.suma_val
+ * --- rand DISCOUNT (rand G, intre B si T; clona randului B proaspat creat) ---
+ If Type('toDlg.disc_baza_lei') <> 'U' And Round(Nvl(toDlg.disc_baza_lei,0), gnPC) <> 0
+ Scatter Name loBaza Memo
+ Append Blank
+ Gather Name loBaza Memo
+ Replace tip_rand With 'G', ;
+ scd With loBaza.scc, ;
+ ascd With loBaza.ascc, ;
+ scc With '767', ;
+ ascc With '', ;
+ suma With toDlg.disc_baza_lei, ;
+ suma_val With Iif(Type('toDlg.disc_baza_val')='U', 0, toDlg.disc_baza_val), ;
+ id_partd With loBaza.id_partc, ;
+ partd With loBaza.partc, ;
+ id_partc With 0, ;
+ partc With '', ;
+ participa_valuta With .F., ;
+ explicatia With 'DISCOUNT', ;
+ mod_manual With 0, ;
+ rand_dvi With 0, ;
+ valuta_proprie With 0
+ Endif
+
* --- rand TVA (clona recordului 2 din sablon; suma TVA o pune do_executa) ---
Select introdc_sablon
Go 2
@@ -8707,24 +9076,32 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Replace tip_rand With 'T', nr_doc With lnNrDoc
Replace doc_key With Thisform.calc_doc_key(), suma_doc With toDlg.suma, suma_doc_val With toDlg.suma_val
lnRecT = Recno()
+ lcDocKeyCrt = doc_key
Do Case
Case toDlg.cTipTva = 'F'
* explicatia TVA + comutarea 4426=4427/401, ca la editarea in grid (aplica_explicatie_tva);
- * metoda asteapta randul curent pe un rand non-T (B) - repozitionez pe baza; aplica_explicatie_tva
- * gaseste ea insasi randul T prin doc_key. do_executa() face Go Top, deci pozitia finala nu conteaza.
- Skip -1
+ * metoda asteapta randul curent pe un rand non-T (B) - repozitionez pe baza (Locate, nu Skip -1,
+ * pentru ca randul G se poate afla intre B si T); aplica_explicatie_tva gaseste ea insasi
+ * randul T prin doc_key. do_executa() face Go Top, deci pozitia finala nu conteaza.
+ Locate For doc_key == lcDocKeyCrt And tip_rand == 'B'
Thisform.aplica_explicatie_tva(toDlg.id_jtva_coloana)
Case toDlg.cTipTva = 'D'
* explicatia TVA in tandem (baza + linia de TVA), ca la editarea in grid (aplica_explicatie_tva);
* apoi Replace-ul de mai jos suprascrie pe linia de TVA campurile proprii DVI-ului - doc_key ramane
* al documentului-mama (nr_doc neschimbat), desi randul poarta partener/conturi de vama
- Skip -1
+ Locate For doc_key == lcDocKeyCrt And tip_rand == 'B'
Thisform.aplica_explicatie_tva(toDlg.id_jtva_coloana)
Select introdc
*!* randul T al facturii curente, pe Recno-ul salvat la creare (Locate cu
*!* calc_doc_key() in FOR se evalueaza per rand scanat => gasea primul T din cursor)
Go lnRecT
+ llDviInValuta = Iif(Type('toDlg.dvi_in_valuta') = 'U', (toDlg.dvi_tva_val <> 0), toDlg.dvi_in_valuta)
+ lcIdValutaDvi = Iif(Type('toDlg.dvi_id_valuta') = 'U', toDlg.id_valuta, toDlg.dvi_id_valuta)
+ lnCursDvi = Iif(Type('toDlg.dvi_curs') = 'U', toDlg.curs, toDlg.dvi_curs)
+ lcNumeValDvi = Iif(Type('toDlg.dvi_nume_val') = 'U', toDlg.nume_val, toDlg.dvi_nume_val)
+ lnValutaProprie = Iif(Type('toDlg.dvi_valuta_proprie') = 'U', 0, toDlg.dvi_valuta_proprie)
+ lnDviTvaAsteptat = Round((toDlg.suma - Iif(Type('toDlg.disc_baza_lei') = 'U', 0, Nvl(toDlg.disc_baza_lei, 0))) * ptva / 100, gnPC)
* TVA platit in vama: randul de TVA devine "al DVI-ului" - alt document/partener/conturi
Replace serie_act With toDlg.dvi_serie, ;
nract With toDlg.dvi_nract, ;
@@ -8736,12 +9113,15 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
scd With '4426', ;
scc With toDlg.dvi_scc, ;
suma With toDlg.dvi_tva_lei, ;
- suma_val With toDlg.dvi_tva_val, ;
- in_valuta With Iif(toDlg.dvi_tva_val <> 0, toDlg.in_valuta, 0), ;
- participa_valuta With toDlg.participa_valuta, ;
- id_valuta With Iif(toDlg.dvi_tva_val <> 0, toDlg.id_valuta, 0), ;
- curs With Iif(toDlg.dvi_tva_val <> 0, toDlg.curs, 0), ;
- nume_val With Iif(toDlg.dvi_tva_val <> 0, toDlg.nume_val, '')
+ suma_val With Iif(llDviInValuta, toDlg.dvi_tva_val, 0), ;
+ in_valuta With Iif(llDviInValuta, 1, 0), ;
+ participa_valuta With Iif(llDviInValuta, toDlg.participa_valuta, .F.), ;
+ id_valuta With Iif(llDviInValuta, lcIdValutaDvi, 0), ;
+ curs With Iif(llDviInValuta, lnCursDvi, 0), ;
+ nume_val With Iif(llDviInValuta, lcNumeValDvi, ''), ;
+ rand_dvi With 1, ;
+ valuta_proprie With lnValutaProprie, ;
+ mod_manual With Iif(Round(Nvl(toDlg.dvi_tva_lei, 0), gnPC) <> lnDviTvaAsteptat, 1, 0)
Case toDlg.cTipTva = 'N'
* fara TVA: randul pereche ramane gol fiscal, ca la cota 0 in logica existenta
Replace id_jtva_coloana With 0, ptva With 0, cu_tva With 0, explicatie_tva With ''
@@ -8772,7 +9152,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
SUM ROUND(Pret*cant,gnPc) TO lnLeiTot
SUM ROUND(Pretd*cant,gnPval) TO lnValTot
- *!* 25.07.2026 claude - baza doar din documentele participante la pret + respecta randul D manual (ca recalc_diferente)
+ *!* baza doar din documentele participante la pret; randul D manual se pastreaza (ca in recalc_diferente)
If Used('introdc')
lnRecIntr = Iif(Eof('introdc') Or Bof('introdc'), 0, Recno('introdc'))
Select introdc
@@ -8903,10 +9283,10 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
lcDocKeyNou = ''
If lnRaspuns = 6
- *!* colectez intai recno-urile B/T (nu S - se regenereaza la sincronizare), abia apoi
+ *!* colectez intai recno-urile B/G/T (nu S - se regenereaza la sincronizare), abia apoi
*!* copiez pe array: indexul ord_doc ar baga randurile noi in parcurgere daca as copia in Scan
lnCnt = 0
- Scan For doc_key == lcDocKey And Inlist(tip_rand,'B','T')
+ Scan For doc_key == lcDocKey And Inlist(tip_rand,'B','G','T')
lnCnt = lnCnt + 1
Dimension laRecno[lnCnt]
laRecno[lnCnt] = Recno()
@@ -8916,7 +9296,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Scatter Name loRec Memo
Append Blank
Gather Name loRec Memo
- Replace nr_doc With lnNrDoc, mod_manual With 0
+ Replace nr_doc With lnNrDoc, mod_manual With 0, rand_dvi With 0, valuta_proprie With 0
lnRecnoNou = Recno()
If Empty(lcDocKeyNou) And tip_rand == 'B'
lcDocKeyNou = Thisform.calc_doc_key()
@@ -8936,7 +9316,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Scatter Name loRec Memo
Append Blank
Gather Name loRec Memo
- Replace nr_doc With lnNrDoc, mod_manual With 0
+ Replace nr_doc With lnNrDoc, mod_manual With 0, rand_dvi With 0, valuta_proprie With 0
Replace doc_key With Thisform.calc_doc_key()
Endif
@@ -8959,11 +9339,11 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
PROCEDURE do_executa
Local lnSuma1, lnSuma2, lnSuma_val, Tsuma
Store 0 To lnSuma1, lnSuma2, lnSuma_val, Tsuma
- LOCAL lnBazaVal, tSumaVal, lnBazaLei, lcDocKeyRec, lcTipRandRec, lcDocKeyCrt
+ LOCAL lnBazaVal, tSumaVal, lnBazaLei, lcDocKeyRec, lcTipRandRec, lcDocKeyCrt, lnDiscTotalLei, lnDiscTotalVal
lnBazaVal = 0
tSumaVal = 0
Sele introdc
- *!* 16.07.2026 claude - E6: repozitionare finala pe doc_key+tip_rand, nu Goto absolut
+ *!* pozitia curenta se salveaza pe doc_key+tip_rand, nu pe numarul de inregistrare
lcDocKeyRec = ''
lcTipRandRec = ''
If Reccount() > 0 And Between(Recno(), 1, Reccount())
@@ -8985,17 +9365,18 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDIF
- Sum suma_val For in_valuta = 1 To tSumaVal
+ Sum suma_val For in_valuta = 1 And tip_rand<>'G' To tSumaVal
+ Sum suma For tip_rand = 'G' To lnDiscTotalLei
+ Sum suma_val For tip_rand = 'G' To lnDiscTotalVal
*!*lnBazaLei = suma && adaugata 06.09.2007 marius.mutu - mi-e neclar fata de ce suma se calculeaza procentele
&& procentele se recalculeaza oricum in ointroduceri.prg
- *!* 16.07.2026 claude - tip_rand+doc_key inlocuiesc paritatea Mod(Recno(),2): Scan doar
- *!* pe randurile B, randul T al fiecarui document se cauta prin Locate pe doc_key
+ *!* Scan doar pe randurile B; randul T al fiecarui document se cauta prin Locate pe doc_key
Scan For tip_rand = 'B'
- lnSuma2 = suma
- lnSuma_val = suma_val
+ lnSuma2 = suma - Thisform.disc_document(doc_key, .F.)
+ lnSuma_val = suma_val - Thisform.disc_document(doc_key, .T.)
*REPL explicatia4 WITH ALLT(STR(lnSuma2/lnSuma1*100,6,2))+'%'
*!* If in_valuta = 0
*!* procentele per rand (explicatia4/explicatia5) le scrie sincronizeaza(), dupa spargere - nu aici
@@ -9007,7 +9388,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Locate For doc_key == lcDocKeyCrt And tip_rand = 'T'
If Found()
*!* rand T marcat manual (mod_manual=1) - nu se rescrie suma/suma_val
- If Nvl(mod_manual,0) <> 1
+ If Nvl(mod_manual,0) <> 1 And !Thisform.rand_protejat()
If ptva <> 0
IF lnSuma2 <> 0
Repl suma With Round(lnSuma2*ptva/100,gnPC)
@@ -9036,7 +9417,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
*!* *!* ENDIF
*!* ENDIF
- *!* 16.07.2026 claude - repozitionare finala pe doc_key+tip_rand (E6), fallback Go Top
+ *!* repozitionare finala pe doc_key+tip_rand, fallback Go Top
Do Case
Case lcTipRandRec == 'D'
*!* randul D are doc_key gol - repozitionare dupa tip_rand
@@ -9054,6 +9435,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Endcase
+ Tsuma = Tsuma - lnDiscTotalLei
+ tSumaVal = tSumaVal - lnDiscTotalVal
Thisform.text2.Value = Tsuma
Thisform.text3.Value = tSumaVal
Thisform.refac_culori_documente()
@@ -9095,14 +9478,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
lnPretVal = ROUND(lnPretVal - (lnPretVal * proc_disc/100 ),gnPPretval) && modificare v 2.1.39 : gnPPretval in loc de gnPVal
REPLACE pretd WITH lnPretval
- *!* 16.07.2026 claude (3f) - ncurs era proprietatea lui import_nir (nesetata pe import_nota); cursul documentului e oact.Curs.
+ *!* cursul documentului e oact.Curs (ncurs exista doar pe import_nir)
lnPretLei = ROUND(ROUND(lnPretval*thisform.oact.Curs,gnPpret)*thisform.procent_lei/100,gnPpret)
REPLACE pret WITH lnPretLei
ENDIF
ENDIF
this.do_calculeaza_diferente(tRecNo,tcCursor) && modificare v 2.1.3 : am adaugat tcCursor
- *!* 16.07.2026 claude (A1) - sync amanata (nu direct din Valid/LostFocus de grid)
+ *!* sincronizare amanata - nu se apeleaza direct din Valid/LostFocus de grid
Thisform.lSyncPending = .T.
Thisform.tmrSync.Interval = 1
ENDPROC
@@ -9138,7 +9521,9 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Select introdc
Thisform.aplica_explicatie_tva(lnId)
- Thisform.grid1.cSuma.teXT1.Valid
+ Thisform.do_executa()
+ Thisform.lSyncPending = .T.
+ Thisform.tmrSync.Interval = 1
ENDPROC
PROCEDURE do_modifica_fdoc
@@ -9349,7 +9734,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Else
lnPretval = Round(orul.pret_val*Thisform.procent_val/100,gnPPretVal) && modificare v 2.1.39 : gnPPretVal in loc de gnPVal
lnPretval = Round(lnPretval - (lnPretval * orul.proc_disc/100 ),gnPPretVal) && modificare v 2.1.39 : gnPPretVal in loc de gnPVal
- *!* 16.07.2026 claude (3f) - idem do_executa_pret: oact.Curs in loc de ncurs (inexistent pe import_nota).
+ *!* cursul documentului e oact.Curs (ncurs exista doar pe import_nir)
lnPretlei = Round(Round(lnPretval*Thisform.oact.Curs,gnPpret)*Thisform.procent_lei/100,gnPpret)
Endif
*!* modificare v 2.1.37 ^
@@ -9427,7 +9812,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE do_sterge_articol
- *!* 16.07.2026 claude (T3d) - butonul de stergere articol pe grila GridArt (rul_temp)
+ *!* Sterge articolul curent de pe grila GridArt (rul_temp).
Local lnSel, lnRaspuns, lcDenumire
If !Used('rul_temp')
Return
@@ -9451,22 +9836,23 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE gaseste_jtva_cota
- *!* 16.07.2026 claude (dec.6) - mapare cota->id_jtva_coloana in aceeasi familie
- *!* (LEFT(coloana_jc,2), precedent frm_conversie ~:3087-3091). tnIdJtvaFamilie = un
- *!* id_jtva_coloana din familia sursa (alta cota); tnCota = cota tinta. Returneaza 0
- *!* daca nu gaseste (validare blocanta in apelant, nu inventez id-uri).
+ *!* Mapare cota -> id_jtva_coloana dupa semnatura coloanei (coloana_jc fara cifre, distinge baza de TVA).
+ *!* tnIdJtvaFamilie = un id_jtva_coloana din familia sursa, tnCota = cota tinta.
+ *!* Returneaza 0 daca nu gaseste.
Lparameters tnIdJtvaFamilie, tnCota
- Local lcSel, lcFamilie, lnGasit
+ Local lcSel, lcSemnatura, lnGasit
lnGasit = 0
lcSel = Select()
If Used('jtva_coloane2')
Select jtva_coloane2
Locate For id_jtva_coloana = tnIdJtvaFamilie
If Found()
- lcFamilie = Left(Nvl(coloana_jc,''), 2)
- Locate For Left(Nvl(coloana_jc,''),2) == lcFamilie And cota_tva = tnCota
- If Found()
- lnGasit = id_jtva_coloana
+ lcSemnatura = Chrtran(Alltrim(Nvl(coloana_jc,'')),'0123456789','')
+ If !Empty(lcSemnatura)
+ Locate For Chrtran(Alltrim(Nvl(coloana_jc,'')),'0123456789','') == lcSemnatura And cota_tva = tnCota
+ If Found()
+ lnGasit = id_jtva_coloana
+ Endif
Endif
Endif
Endif
@@ -9552,7 +9938,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
lnNract = nract
Endif
*!* modificare v 2.1.39
- If Thisform.nid_part_finalizarenir = 0 And loFact.cu_tva = 0 And loFact.tip_rand <> 'D'
+ If Thisform.nid_part_finalizarenir = 0 And loFact.cu_tva = 0 And !Inlist(loFact.tip_rand,'D','G')
Select actactan
Append Blank
Gather Name poAct
@@ -9575,25 +9961,23 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
*!* 20.09.2012
*!* marius.atanasiu
*!* am scos conditia "cu_tva=1" de la toate SUM-urile de mai jos
- *!* 16.07.2026 claude (A3) - sumarile + procentele mutate in recalculeaza(); Sum
- *!* Val(explicatia4/5) eliminat (nu se mai copiaza, formula noua e directa)
+ *!* sumarile si procentele se calculeaza in recalculeaza()
Thisform.recalculeaza()
lnBazaLei = Thisform.nbaza_lei
lnBazaVal = Thisform.nbaza_val
lnTvaLei = Thisform.ntva_lei
lnTvaVal = Thisform.ntva_val
- lnProcLei = Thisform.procent_lei - Iif(tlIntern, 0, 100)
+ lnProcLei = Thisform.procent_lei - Iif(Thisform.lIntern, 0, 100)
lnProcVal = Thisform.procent_val
Locate
poAct.proc_tva = (100 + ptva)/100
- *!* rul_temp e creat in Load (nu mai aici); vezi acolo.
+ *!* rul_temp e creat in Load
this.AlwaysOnTop = .F.
- *!* 16.07.2026 claude (T3) - do_termin unificat: verificare/scriere migrate din
- *!* import_nir.inainte_de_do_termin; import_nir nu se mai instantiaza (ramane rezerva)
+ *!* verificarea si scrierea NIR-ului, comune importului si achizitiei interne
Select * From actactan Into Cursor crsActactanTemp READWRITE NOFILTER
Do Form verificare With .T. , .T.
If gnButon = 2
@@ -9623,7 +10007,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
* le pastrez intr-un cursor temporar ca sa le pot readauga daca scrierea esueaza
Select * From rul_temp Where Nvl(in_stoc,1) = 0 And !Deleted() Into Cursor crsNegest NOFILTER Readwrite
Delete From rul_temp Where Nvl(in_stoc,1) = 0
- *!* 16.07.2026 claude (T3, F4) - sumar spargere in log, pentru reconstructie post-hoc la client
+ *!* sumar spargere in log, pentru reconstructie ulterioara
If Type('goLog') = 'O'
lcLogSumar = 'NIR import unificat: act ' + Alltrim(Nvl(lcSerieActPrima,'')) + ' ' + Alltrim(Str(Nvl(lnNrActPrima,0),14))
Select introdc
@@ -9675,8 +10059,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
This.grid1.cSumaVal.Visible = .F.
This.grid1.cExplicatia5.Visible = .F.
This.lb_titlu_alb_b121.Caption = "ACHIZIÞIE INTERNÃ MARFÃ/MATERIALE"
- *!* 16.07.2026 claude (T3-A, sectiunea F) - ascunde coloanele valutare si pe grila
- *!* articolelor (ca in import_nir.Init), plus But_modiparam1 (XLS-ul cere pret valuta).
+ *!* pe intern se ascund coloanele valutare de pe grila articolelor si importul XLS (cere pret in valuta)
This.gridart.cPretFactura.ControlSource = "pret_lei"
This.gridart.cPretFactura.Header1.Caption = "Pret lei factura"
This.gridart.cPretFactura.InputMask = get_mask(10,gnPPret)
@@ -9717,7 +10100,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
PROCEDURE KeyPress
LPARAMETERS nKeyCode, nShiftAltCtrl
- *!* 16.07.2026 claude (T3, D-M3) - F5 = Recalculeaza (sincronizare manuala)
+ *!* F5 = sincronizare manuala
If nKeyCode = -4
Nodefault
Thisform.sincronizeaza()
@@ -9747,20 +10130,19 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Endif
ENDPROC
+ PROCEDURE rand_protejat
+ Return (Nvl(valuta_proprie,0) = 1)
+ ENDPROC
+
PROCEDURE recalculeaza
- *!* 16.07.2026 claude (A3) - muta sumarile din inainte_de_do_termin (baza/tva) aici, ca
- *!* proprietati de formular. Regula dec.1: cu S existent baza documentului e Suma(S) (B a
- *!* disparut la spargere - D9); fara S ramane B - de aceea filtrul de mai jos e pe
- *!* tip_rand IN ('B','S') fara distinctie (invarianta garantata de sparge_document).
- *!* Procentele NU mai copiaza Sum Val(explicatia4/5) (eliminat la migrare) - se calculeaza
- *!* direct. 16.07.2026b claude (C4 - corectii T2): pe import, procent_lei NU mai e
- *!* 100*baza_totala/baza_principala (ar dubla incarcarea documentelor de transport in
- *!* valuta - do_reface aplica intai procent_val pe pretd, apoi procent_lei pe pret derivat
- *!* din pretd*curs) - procent_lei pe import = 100; documentele neparticipante NU mai
- *!* incarca pretul, raman pe randul D (recalc_diferente). Ramura intern
- *!* ramane neschimbata (echivalenta cu vechiul calcul din do_executa).
+ *!* Totalurile formularului (baza si TVA, in lei si in valuta) si procentele de incarcare.
+ *!* Baza unui document e Suma(S) daca a fost spart, altfel randul B - de aceea filtrul e
+ *!* pe tip_rand IN ('B','S'). Pe import procent_lei = 100 (incarcarea in valuta se aplica
+ *!* pe pretd, iar pretul in lei deriva din pretd*curs), iar documentele care nu participa
+ *!* la pret raman pe randul D (recalc_diferente); pe intern procent_lei =
+ *!* 100*baza_totala/baza_principala.
Local lnBazaLei, lnBazaVal, lnBazaVal2, lnTvaLei, lnTvaVal, lnTvaVal2, lcSel
- Local lnMinNrDoc, lnBazaPrincipalaLei, lnBazaPrincipalaVal
+ Local lnMinNrDoc, lnBazaPrincipalaLei, lnBazaPrincipalaVal, lnDiscLei, lnDiscVal
lcSel = Select()
If !Used('introdc')
Select (lcSel)
@@ -9786,17 +10168,21 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Calculate Min(Iif(Inlist(tip_rand,'B','S'), nr_doc, 99999998)) To lnMinNrDoc
Sum suma_val For Inlist(tip_rand,'B','S') And nr_doc = lnMinNrDoc And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And in_valuta = 1 To lnBazaPrincipalaVal
Sum suma For Inlist(tip_rand,'B','S') And nr_doc = lnMinNrDoc And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) To lnBazaPrincipalaLei
+ Sum suma For tip_rand = 'G' To lnDiscLei
+ Sum suma_val For tip_rand = 'G' To lnDiscVal
This.nbaza_lei = lnBazaLei
This.nbaza_val = lnBazaVal
This.ntva_lei = lnTvaLei
This.ntva_val = lnTvaVal
+ This.ndisc_lei = lnDiscLei
+ This.ndisc_val = lnDiscVal
This.nbazaprincipala_lei = lnBazaPrincipalaLei
This.nbazaprincipala_val = lnBazaPrincipalaVal
If This.lIntern
This.procent_lei = Iif(lnBazaPrincipalaLei <> 0, 100 * lnBazaLei / lnBazaPrincipalaLei, 100)
Else
- *!* 25.07.2026 claude - debifat participa_valuta = exclus complet din pret si din diferenta (randul D)
+ *!* documentele fara participa_valuta nu incarca pretul - raman pe randul D
This.procent_lei = 100
Endif
This.procent_val = Iif(lnBazaPrincipalaVal <> 0, 100 * lnBazaVal / lnBazaPrincipalaVal, 100)
@@ -9804,19 +10190,17 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE recalc_diferente
- *!* 16.07.2026b claude (C5 - corectii T2) - randul D unic (doc_key='', nr_doc=99999999):
- *!* diferenta = baza documentelor participante la pret (participa_valuta) - Suma(pret*cant) cu
- *!* pretul INCARCAT (do_reface-adjusted, ca vechiul do_calculeaza_diferente), NU suma_doc
- *!* a principalei si NU pretul de factura (pret_lei/pret_val). Cont dominant = clasa 3 cu
- *!* baza (aceeasi formula) ABS maxima (dec.9+E5); fara clasa 3 -> dominant clasa 2, cont fix 6588.
- *!* Diferenta se determina si se scrie DOAR in lei (fara valuta). E3: D mosteneste antetul documentului principal.
+ *!* Randul D, unic pe nota (doc_key gol, nr_doc 99999999): diferenta = baza documentelor
+ *!* care participa la pret - Suma(pret*cant) cu pretul incarcat. Cont dominant = contul de
+ *!* clasa 3 cu baza ABS maxima; fara clasa 3 -> clasa 2, cu contul fix 6588. Diferenta se
+ *!* scrie doar in lei. Antetul se mosteneste de la documentul principal.
Local lcSel, lnMinNrDoc, lnTotalLei, lnTotalVal, lnBazaParticipa
Local lcContDominant, lnBazaDominantaAbs, lcScd1, lnDiferentaLei, lnDiferentaVal, lcExplicatie
Local llGasitClasa3, loAntet
lcSel = Select()
If !Used('rul_temp') Or Reccount('rul_temp') = 0
- *!* E7: fara articole - nimic de calculat; sterg D-ul ramas orfan, daca exista
+ *!* fara articole nu exista diferenta - sterg randul D ramas orfan
Select introdc
Delete For tip_rand == 'D' And Nvl(mod_manual,0) <> 1
Locate For tip_rand == 'D'
@@ -9835,7 +10219,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Return
Endif
- *!* 25.07.2026 claude - randul D modificat manual (mod_manual=1) nu se rescrie/sterge, ca randurile T
+ *!* randul D modificat manual (mod_manual=1) nu se rescrie/sterge, ca randurile T
Locate For tip_rand == 'D'
If Found() And Nvl(mod_manual,0) = 1
This.ndif_lei = suma
@@ -9852,8 +10236,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
lnTotalVal = Nvl(crsTotArt.tot_val, 0)
Use In crsTotArt
- *!* contul dominant: clasa 3 cu baza (pret incarcat) ABS maxima (dec.9+E5);
- *!* fara clasa 3 -> clasa 2 (imobilizari), nota D cu cont fix 6588
+ *!* contul dominant: clasa 3 cu baza (pret incarcat) ABS maxima;
+ *!* fara clasa 3 -> clasa 2 (imobilizari), randul D cu cont fix 6588
Select cont, Sum(Round(pret*cant,gnPc)) As baza_lei ;
From rul_temp Where !Deleted() And Inlist(Left(Alltrim(Nvl(cont,'')),1),'2','3') Group By cont Into Cursor crsGrupDom NOFILTER
lcContDominant = ''
@@ -9937,7 +10321,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
lnRec = Recno('introdc')
Select introdc
- Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1
+ Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1
If !Found()
Select (lcSel)
If Between(lnRec, 1, Reccount('introdc'))
@@ -9950,8 +10334,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Scatter Name loRandT Memo
llValuta = (loRandT.in_valuta = 1)
lnCurs = Iif(Nvl(loRandT.curs,0) <> 0, loRandT.curs, Thisform.oact.Curs)
- lnTotal = loRandT.suma_doc
- lnTotalVal = loRandT.suma_doc_val
+ lnTotal = loRandT.suma_doc - Thisform.disc_document(tcDocKey, .F.)
+ lnTotalVal = loRandT.suma_doc_val - Thisform.disc_document(tcDocKey, .T.)
*!* bazele articolelor (rul_temp) descriu doar documentul principal (nr_doc minim intre B/S)
Local lnMinNrDoc, llPrincipal
lnMinNrDoc = 99999998
@@ -9961,7 +10345,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Local lnCntCote
lnCntCote = 0
If Used('rul_temp')
- *!* runda27 (D6): aceeasi grupare cota+creditor ca in sparge_document (D3), reutilizata
+ *!* aceeasi grupare cota+creditor ca in sparge_document
Thisform.calc_baze_cota_creditor(tcDocKey, loRandT)
lnCntCote = Reccount('crsGrupCota')
Endif
@@ -9988,7 +10372,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Scan
lnPondere = Iif(This.lIntern, baza_lei, baza_val) / lnBazaTotala
Select introdc
- Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And ptva == crsGrupCota.cota_tva ;
+ Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 And ptva == crsGrupCota.cota_tva ;
And Alltrim(Nvl(scc,'')) == Alltrim(Nvl(crsGrupCota.scc,'')) And Alltrim(Nvl(ascc,'')) == Alltrim(Nvl(crsGrupCota.ascc,''))
If This.lIntern
Replace suma With Round(lnTotal * lnPondere * ptva / 100, gnPc), suma_val With 0
@@ -10012,14 +10396,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
*!* o singura cota / document secundar / fara rul_temp: T = total nou x ptva / 100;
*!* daca T-urile secundarei sunt sparte pe creditori, fiecare primeste cota-parte
*!* proportionala cu S-urile creditorului sau
- Select Count(*) As nr From introdc Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsCntTSec NOFILTER
+ Select Count(*) As nr From introdc Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsCntTSec NOFILTER
lnCntTSec = crsCntTSec.nr
Use In crsCntTSec
lnTotSLei2 = 0
lnPtvaSec = 0
If lnCntTSec > 1
Select introdc
- Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1
+ Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1
lnPtvaSec = ptva
Select scc, ascc, Sum(suma) As s_lei From introdc ;
Where doc_key == tcDocKey And tip_rand == 'S' ;
@@ -10029,7 +10413,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Use In crsTotSR
Endif
Select introdc
- Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1
+ Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1
lnPondere = Iif(lnCntTSec > 1, 1 / lnCntTSec, 1)
If lnCntTSec > 1 And lnTotSLei2 <> 0
Select crsGrupSccR
@@ -10053,9 +10437,9 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Use In crsGrupSccR
Endif
If lnCntTSec > 1
- *!* reziduul de rotunjire pe T-ul cu |suma| maxima (modelul D5)
+ *!* reziduul de rotunjire pe T-ul cu |suma| maxima
Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ;
- Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsSumTSec2 NOFILTER
+ Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsSumTSec2 NOFILTER
If This.lIntern Or !llValuta
lnRestLei2 = Round(lnTotal * lnPtvaSec / 100, gnPc) - Round(Nvl(crsSumTSec2.s_lei,0), gnPc)
lnRestVal2 = 0
@@ -10068,7 +10452,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
lnMaxAbs2 = -1
lnRecMaxAbs2 = 0
Select introdc
- Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1
+ Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1
If Abs(suma) > lnMaxAbs2
lnMaxAbs2 = Abs(suma)
lnRecMaxAbs2 = Recno()
@@ -10094,10 +10478,9 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE refac_culori_documente
- * M1: culoare fundal + eticheta document, precalculate pe cursorul introdc.
- * Cheia document = doc_key (nr_doc+serie_act+nract+id_fdoc+id_partc, calc_doc_key).
- * primul rand B/S al unui doc_key defineste documentul - B dispare dupa spargere (dec.9);
- * randul 'T' mosteneste culoarea/eticheta. Repozitionare finala pe doc_key+tip_rand (E6).
+ * Culoare de fundal + eticheta document, precalculate pe cursorul introdc.
+ * Cheia documentului e doc_key (calc_doc_key); primul rand B/S al unui doc_key defineste
+ * documentul (B dispare dupa spargere), randul T mosteneste culoarea si eticheta.
Local lcSel, lnDocCount, lnIdx, i, lcCheie, lnPrevColor, lcPrevLabel, lcPrevDocKey
Local laCol[6], laKeys[100], lcDocKeyRec, lcTipRandRec
If !Used('introdc')
@@ -10152,8 +10535,10 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Case Inlist(tip_rand, 'B', 'S')
*!* S-urile urmatoare ale aceluiasi document
Replace doc_color With lnPrevColor, doc_label With lcPrevLabel
+ Case tip_rand == 'G'
+ Replace doc_color With lnPrevColor, doc_label With Iif(lcPrevLabel == '-', '-', lcPrevLabel + ' DISC')
Otherwise
- Replace doc_color With lnPrevColor, doc_label With Iif(lcPrevLabel == '-', '-', lcPrevLabel + ' TVA')
+ Replace doc_color With lnPrevColor, doc_label With Iif(lcPrevLabel == '-', '-', lcPrevLabel + ' TVA' + Iif(Thisform.rand_protejat(), '*', ''))
Endcase
Endscan
Do Case
@@ -10184,16 +10569,15 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
DoDefault(tnStyle)
Endif
This.grid1.HeaderHeight = 49
- *!* 16.07.2026 claude (T3-A) - reface preturile articolelor la afisare (ca in import_nir.Show),
- *!* doar daca exista deja articole (rul_temp populat la reintrare din verificare/listare).
+ *!* reface preturile articolelor la afisare, daca exista deja articole in rul_temp
If Reccount('rul_temp') > 0
This.do_reface()
Endif
ENDPROC
PROCEDURE sincronizeaza
- *!* 16.07.2026 claude (A1+F3+D-C1) - orchestratorul sincronizarii; NU se apeleaza direct
- *!* din Valid (eroare VFP 2166) - armare prin lSyncPending+tmrSync. Guard de reintrare lInSync.
+ *!* Orchestratorul sincronizarii; nu se apeleaza direct din Valid (eroare VFP 2166) - se
+ *!* armeaza prin lSyncPending + tmrSync. lInSync e garda de reintrare.
If This.lInSync
Return
Endif
@@ -10213,7 +10597,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
This.cmesajsync = ''
- *!* directia nota->articole: recalculez procentele, apoi (T3) do_reface repreteste articolele
+ *!* directia nota->articole: recalculez procentele, apoi do_reface reface preturile articolelor
This.recalculeaza()
If Pemstatus(This, 'do_reface', 5)
This.do_reface()
@@ -10280,7 +10664,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Endif
This.valideaza_sume()
- *!* D-C1: restaurare pozitie (randul D dupa tip_rand - doc_key-ul lui e gol;
+ *!* restaurare pozitie (randul D dupa tip_rand - doc_key-ul lui e gol;
*!* fallback: primul rand al documentului, apoi Go Top)
Select introdc
Do Case
@@ -10307,15 +10691,99 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
This.lInSync = .F.
ENDPROC
+ PROCEDURE sparge_discount
+ *!* Sparge randurile G (discount) pe cotele TVA ale articolelor, proportional cu bazele pe
+ *!* cota, pastrand totalul discountului. Cere crsGrupCota deschis (calc_baze_cota_creditor).
+ Lparameters tcDocKey
+ Local lcSel, lnCnt, lnTotLei, lnTotVal, lnBazaTot, lnPondere, lnCotaCrt, lnIdJtvaCrt
+ Local lnRestLei, lnRestVal, lnMaxAbs, lnRecMaxAbs, loRandG
+ lcSel = Select()
+
+ Select introdc
+ Locate For doc_key == tcDocKey And tip_rand == 'G'
+ If !Found()
+ Select (lcSel)
+ Return
+ Endif
+ Scatter Name loRandG Memo
+ Select Count(*) As nr, Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ;
+ Where doc_key == tcDocKey And tip_rand == 'G' Into Cursor crsTotG NOFILTER
+ lnCnt = Nvl(crsTotG.nr, 0)
+ lnTotLei = Nvl(crsTotG.s_lei, 0)
+ lnTotVal = Nvl(crsTotG.s_val, 0)
+ Use In crsTotG
+
+ If This.lIntern
+ Select cota_tva, Sum(baza_lei) As pond From crsGrupCota Group By cota_tva Into Cursor crsPondDisc NOFILTER
+ Else
+ Select cota_tva, Sum(baza_val) As pond From crsGrupCota Group By cota_tva Into Cursor crsPondDisc NOFILTER
+ Endif
+ Select Sum(pond) As tot From crsPondDisc Into Cursor crsPondDiscTot NOFILTER
+ lnBazaTot = Nvl(crsPondDiscTot.tot, 0)
+ Use In crsPondDiscTot
+ Go Top In crsPondDisc
+ If lnBazaTot = 0 Or (lnCnt = 1 And Reccount('crsPondDisc') = 1 And crsPondDisc.cota_tva = loRandG.ptva)
+ *!* o singura cota, aceeasi cu a randului de discount - nimic de spart
+ Use In crsPondDisc
+ Select (lcSel)
+ Return
+ Endif
+
+ Select introdc
+ Delete For doc_key == tcDocKey And tip_rand == 'G'
+ Select crsPondDisc
+ Scan
+ lnCotaCrt = crsPondDisc.cota_tva
+ lnPondere = crsPondDisc.pond / lnBazaTot
+ lnIdJtvaCrt = Iif(lnCotaCrt = loRandG.ptva, loRandG.id_jtva_coloana, Thisform.gaseste_jtva_cota(Nvl(loRandG.id_jtva_coloana,0), lnCotaCrt))
+ Select introdc
+ Append Blank
+ Gather Name loRandG Memo
+ Replace tip_rand With 'G', doc_key With tcDocKey, ptva With lnCotaCrt, ;
+ suma With Round(lnTotLei * lnPondere, gnPc), suma_val With Round(lnTotVal * lnPondere, gnPval)
+ If lnIdJtvaCrt <> 0
+ Replace id_jtva_coloana With lnIdJtvaCrt
+ Select jtva_coloane2
+ Locate For id_jtva_coloana = lnIdJtvaCrt
+ If Found()
+ Replace explicatie_tva With jtva_coloane2.denumire In introdc
+ Endif
+ Endif
+ Select crsPondDisc
+ Endscan
+ Use In crsPondDisc
+
+ *!* reziduul de rotunjire pe randul de discount cu |suma| maxima
+ Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ;
+ Where doc_key == tcDocKey And tip_rand == 'G' Into Cursor crsSumG NOFILTER
+ lnRestLei = Round(lnTotLei - Nvl(crsSumG.s_lei,0), gnPc)
+ lnRestVal = Round(lnTotVal - Nvl(crsSumG.s_val,0), gnPval)
+ Use In crsSumG
+ If lnRestLei <> 0 Or lnRestVal <> 0
+ lnMaxAbs = -1
+ lnRecMaxAbs = 0
+ Select introdc
+ Scan For doc_key == tcDocKey And tip_rand == 'G'
+ If Abs(suma) > lnMaxAbs
+ lnMaxAbs = Abs(suma)
+ lnRecMaxAbs = Recno()
+ Endif
+ Endscan
+ If lnRecMaxAbs > 0
+ Go lnRecMaxAbs In introdc
+ Replace suma With suma + lnRestLei, suma_val With suma_val + lnRestVal
+ Endif
+ Endif
+
+ Select (lcSel)
+ ENDPROC
+
PROCEDURE sparge_document
- *!* 16.07.2026b claude (corectii T2 dupa review) - sparge documentul tcDocKey pe conturile
- *!* articolelor din rul_temp. C1: B poate fi deja sters de la o spargere anterioara - daca
- *!* nu exista, template-ul e primul rand S al documentului (nu mai ies fara sa fac nimic);
- *!* sursa unica a totalului documentului e suma_doc/suma_doc_val (nu loBaza.suma, care pe
- *!* un rand S ar fi doar cota unui cont). C2: baza de repartizare e in moneda documentului
- *!* (This.lIntern): import -> pret_val*cant (D-H4: suma_val editabil, suma=val*curs);
- *!* intern -> pret_lei*cant, suma_val=0. C7: la 0 articole S-urile dispar NECONDITIONAT
- *!* (E7), B se recreeaza din primul S daca lipseste.
+ *!* Sparge documentul tcDocKey in randuri S, pe conturile articolelor din rul_temp.
+ *!* Sablonul e randul B, sau primul S daca B a disparut la o spargere anterioara.
+ *!* Totalul documentului se ia din suma_doc/suma_doc_val. Baza de repartizare e in moneda
+ *!* documentului: import -> pret_val*cant, intern -> pret_lei*cant (suma_val = 0).
+ *!* Fara articole S-urile dispar, iar B se recreeaza din primul S daca lipseste.
Lparameters tcDocKey
Local lcSel, lnAreArticole, llPrincipal, lnMinNrDoc, llValuta, lnCurs, llAreB, lnBazaArtTot
Local loBaza, lnSumaDoc, lnSumaDocVal, lnRestLei, lnRestVal, lcContMaxAbs, lnMaxAbs, llAreManual, lnBazaTotala
@@ -10344,8 +10812,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
lnSumaDoc = loBaza.suma_doc
lnSumaDocVal = loBaza.suma_doc_val
- *!* documentul "principal" (are articole) = nr_doc minim dintre B/S existente
- *!* (v1: articolele apartin intotdeauna primului document - decizia 3)
+ *!* documentul principal (cel cu articole) = nr_doc minim dintre B/S existente
lnMinNrDoc = 99999998
Calculate Min(Iif(Inlist(tip_rand,'B','S'), nr_doc, 99999998)) To lnMinNrDoc
llPrincipal = (loBaza.nr_doc = lnMinNrDoc)
@@ -10385,7 +10852,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Endif
If lnAreArticole = 0
- *!* E7 (C7): fara articole -> S-urile dispar NECONDITIONAT; B se recreeaza daca lipseste
+ *!* fara articole S-urile dispar neconditionat; B se recreeaza daca lipseste
Select introdc
Locate For doc_key == tcDocKey And tip_rand == 'S'
If Found()
@@ -10412,7 +10879,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Endif
If llAreManual
- *!* D-H3 (simplificat la T2): editari manuale prezente - nu rescriu S-urile documentului
+ *!* editari manuale prezente - nu rescriu S-urile documentului
Select (lcSel)
Return
Endif
@@ -10425,24 +10892,42 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Where doc_key == tcDocKey And tip_rand == 'S' And Nvl(id_partd,0) <> 0 ;
Into Cursor crsPartS NOFILTER
- *!* runda27 (D2): scc/ascc/id_partc/partc editate manual pe un S se pastreaza la
- *!* regenerare (spre deosebire de crsPartS, se reaplica NECONDITIONAT mai jos)
+ *!* scc/ascc/id_partc/partc editate manual pe un S se pastreaza la regenerare
+ *!* (se reaplica neconditionat mai jos, spre deosebire de crsPartS)
Select scd, ascd, scc, ascc, id_partc, partc From introdc ;
Where doc_key == tcDocKey And tip_rand == 'S' And !Empty(Alltrim(Nvl(scc,''))) ;
Into Cursor crsSccS NOFILTER
- *!* C1: sterg S-urile existente ale documentului inainte de regenerare (altfel se
+ *!* sterg S-urile existente ale documentului inainte de regenerare (altfel se
*!* acumuleaza duplicate la fiecare resincronizare)
Select introdc
Delete For doc_key == tcDocKey And tip_rand == 'S'
- *!* C2: grupez articolele pe cont+analitic, in moneda documentului (import: pret_val; intern: pret_lei)
+ *!* articolele fara cota proprie preiau cota documentului, ca randurile S sa se poata grupa pe cota
+ If llPrincipal And Nvl(loBaza.ptva,0) > 0
+ Select rul_temp
+ Replace cota_tva With loBaza.ptva For Nvl(cota_tva,0) <= 0
+ Select introdc
+ Endif
+
+ *!* grupez articolele pe cont+analitic (la principal si pe cota TVA - randul S poarta cota
+ *!* articolelor lui, in concordanta cu randul T al cotei), in moneda documentului
If This.lIntern
- Select cont, acont, Sum(Round(pret_lei*cant,gnPc)) As baza_lei, 0 As baza_val ;
- From rul_temp Where !Deleted() Group By cont, acont Into Cursor crsGrupCont NOFILTER
+ If llPrincipal
+ Select cont, acont, cota_tva, Sum(Round(pret_lei*cant,gnPc)) As baza_lei, 0 As baza_val ;
+ From rul_temp Where !Deleted() Group By cont, acont, cota_tva Into Cursor crsGrupCont NOFILTER
+ Else
+ Select cont, acont, 0 As cota_tva, Sum(Round(pret_lei*cant,gnPc)) As baza_lei, 0 As baza_val ;
+ From rul_temp Where !Deleted() Group By cont, acont Into Cursor crsGrupCont NOFILTER
+ Endif
Else
- Select cont, acont, Sum(Round(pret_val*cant,gnPval)) As baza_val, 0 As baza_lei ;
- From rul_temp Where !Deleted() Group By cont, acont Into Cursor crsGrupCont NOFILTER
+ If llPrincipal
+ Select cont, acont, cota_tva, Sum(Round(pret_val*cant,gnPval)) As baza_val, 0 As baza_lei ;
+ From rul_temp Where !Deleted() Group By cont, acont, cota_tva Into Cursor crsGrupCont NOFILTER
+ Else
+ Select cont, acont, 0 As cota_tva, Sum(Round(pret_val*cant,gnPval)) As baza_val, 0 As baza_lei ;
+ From rul_temp Where !Deleted() Group By cont, acont Into Cursor crsGrupCont NOFILTER
+ Endif
Endif
If llPrincipal
@@ -10450,17 +10935,16 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Select crsGrupCont
Scan
If This.lIntern
- Thisform.creeaza_rand_s(tcDocKey, cont, baza_lei, 0, loBaza, acont)
+ Thisform.creeaza_rand_s(tcDocKey, cont, baza_lei, 0, loBaza, acont, cota_tva)
Else
- Thisform.creeaza_rand_s(tcDocKey, cont, Round(baza_val*lnCurs,gnPc), Iif(loBaza.in_valuta = 1, baza_val, 0), loBaza, acont)
+ Thisform.creeaza_rand_s(tcDocKey, cont, Round(baza_val*lnCurs,gnPc), Iif(loBaza.in_valuta = 1, baza_val, 0), loBaza, acont, cota_tva)
Endif
Select crsGrupCont
Endscan
Else
- *!* transport/taxe (dec.2 revizuita): proportional cu bazele articolelor per cont,
- *!* raportat la baza totala a facturii principale (in moneda documentului); debit =
- *!* contul articolelor, credit = mostenit din randul B/S sablon (scc), prin
- *!* creeaza_rand_s (A2)
+ *!* transport/taxe: proportional cu bazele articolelor per cont, raportat la baza totala
+ *!* a facturii principale (in moneda documentului); debit = contul articolelor,
+ *!* credit = mostenit din randul sablon (scc)
If This.lIntern
Select Sum(baza_lei) As tot From crsGrupCont Into Cursor crsBazaTotala NOFILTER
Else
@@ -10499,8 +10983,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Endif
Use In crsGrupCont
- *!* E2: rotunjire independenta per moneda - reziduul pe randul S cu |suma| maxima,
- *!* raportat la suma_doc/suma_doc_val (sursa unica, C1)
+ *!* rotunjire independenta per moneda - reziduul pe randul S cu |suma| maxima,
+ *!* raportat la suma_doc/suma_doc_val
Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc Where doc_key == tcDocKey And tip_rand == 'S' Into Cursor crsSumS NOFILTER
lnRestLei = Round(lnSumaDoc - Nvl(crsSumS.s_lei,0), gnPc)
lnRestVal = Round(lnSumaDocVal - Nvl(crsSumS.s_val,0), gnPval)
@@ -10550,8 +11034,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Use In crsPartS
Endif
- *!* runda27 (D2): reaplic scc/ascc/id_partc/partc pe cheia scd+ascd, NECONDITIONAT -
- *!* creditorul ales de utilizator per cont invinge mostenirea din sablon
+ *!* reaplic scc/ascc/id_partc/partc pe cheia scd+ascd - creditorul ales de utilizator
+ *!* per cont invinge mostenirea din sablon
If Used('crsSccS') And Reccount('crsSccS') > 0
Select crsSccS
Scan
@@ -10566,22 +11050,56 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Use In crsSccS
Endif
- *!* dec.6: cate un rand T per cota TVA prezenta pe articolele documentului (doar la principal)
+ *!* explicatiile alese manual pe randuri T se pastreaza peste regenerare, pe cota
+ Select ptva, id_jtva_coloana, explicatie_tva From introdc ;
+ Where doc_key == tcDocKey And tip_rand == 'T' And Nvl(expl_manual,0) = 1 ;
+ Into Cursor crsExplT NOFILTER
+ Select introdc
+
+ *!* cate un rand T per cota TVA prezenta pe articolele documentului (doar la principal)
If llPrincipal
Select introdc
Locate For doc_key == tcDocKey And tip_rand == 'T'
If Found()
- Local loRandT
- Scatter Name loRandT Memo
+ Local loRandT, llTvaProtejat
lnIdJtvaOrig = id_jtva_coloana
+ llTvaProtejat = .F.
+ Locate For doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) <> 1
+ If Found()
+ Scatter Name loRandT Memo
+ Else
+ *!* TVA-ul documentului sta doar pe randul protejat (DVI cu valuta proprie) - se sparge
+ *!* acela pe cotele articolelor, nu se nasc T-uri noi din randul de baza
+ llTvaProtejat = .T.
+ Locate For doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) = 1
+ Scatter Name loRandT Memo
+ Endif
Select rul_temp
Replace cota_tva With loRandT.ptva For Nvl(cota_tva,0) <= 0
- *!* runda27 (D3): grupare pe cota + creditor (scc/ascc) al S-ului corespunzator contului articolului
+ *!* grupare pe cota + creditor (scc/ascc) al S-ului corespunzator contului articolului
Thisform.calc_baze_cota_creditor(tcDocKey, loBaza)
+ Local lnBazaGrupTot, lnFactorDisc
+ If This.lIntern
+ Select Sum(baza_lei) As tot From crsGrupCota Into Cursor crsBazaGrupTot NOFILTER
+ lnBazaGrupTot = Nvl(crsBazaGrupTot.tot, 0)
+ Use In crsBazaGrupTot
+ lnFactorDisc = Iif(lnBazaGrupTot <> 0, Max((lnBazaGrupTot - Thisform.disc_document(tcDocKey, .F.)) / lnBazaGrupTot, 0), 1)
+ Else
+ Select Sum(baza_val) As tot From crsGrupCota Into Cursor crsBazaGrupTot NOFILTER
+ lnBazaGrupTot = Nvl(crsBazaGrupTot.tot, 0)
+ Use In crsBazaGrupTot
+ lnFactorDisc = Iif(lnBazaGrupTot <> 0, Max((lnBazaGrupTot - Thisform.disc_document(tcDocKey, .T.)) / lnBazaGrupTot, 0), 1)
+ Endif
If Reccount('crsGrupCota') > 0
+ Thisform.sparge_discount(tcDocKey)
+ Endif
+ If llTvaProtejat And Reccount('crsGrupCota') > 0
+ Thisform.sparge_tva_protejat(tcDocKey, loRandT, lnIdJtvaOrig)
+ Endif
+ If Reccount('crsGrupCota') > 0 And !llTvaProtejat
Select introdc
*!* T-urile manuale (mod_manual=1) nu se sterg - raman neatinse
- Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1
+ Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1
Select crsGrupCota
Scan
lnCotaCrt = cota_tva
@@ -10600,21 +11118,22 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Endif
If lnIdJtvaCrt = 0
Thisform.cmesajsync = Thisform.cmesajsync + Iif(Empty(Thisform.cmesajsync),'',Chr(13)+Chr(10)) + ;
- "Nu am gasit coloana TVA pentru cota " + Transform(lnCotaCrt) + "% (document " + Alltrim(Nvl(loRandT.fdoc,'')) + ")."
+ "Documentul " + Alltrim(Nvl(loRandT.fdoc,'')) + " are marfa la " + Transform(lnCotaCrt) + "%, dar nu exista explicatie TVA de " + Transform(lnCotaCrt) + "% in seria '" + Alltrim(Strtran(Chrtran(Nvl(loRandT.explicatie_tva,''),'0123456789%',''),' ',' ')) + "' - completati nomenclatorul de explicatii TVA."
Else
Select introdc
Append Blank
Gather Name loRandT Memo
+ Replace rand_dvi With 0, valuta_proprie With 0, expl_manual With 0
If This.lIntern
Replace tip_rand With 'T', doc_key With tcDocKey, nr_doc With loRandT.nr_doc, ;
id_jtva_coloana With lnIdJtvaCrt, ptva With lnCotaCrt, ;
scc With crsGrupCota.scc, ascc With crsGrupCota.ascc, ;
- suma With Round(crsGrupCota.baza_lei * lnCotaCrt / 100, gnPc), suma_val With 0
+ suma With Round(crsGrupCota.baza_lei * lnFactorDisc * lnCotaCrt / 100, gnPc), suma_val With 0
Else
Replace tip_rand With 'T', doc_key With tcDocKey, nr_doc With loRandT.nr_doc, ;
id_jtva_coloana With lnIdJtvaCrt, ptva With lnCotaCrt, ;
scc With crsGrupCota.scc, ascc With crsGrupCota.ascc, ;
- suma_val With Round(crsGrupCota.baza_val * lnCotaCrt / 100, gnPval)
+ suma_val With Round(crsGrupCota.baza_val * lnFactorDisc * lnCotaCrt / 100, gnPval)
Replace suma With Round(suma_val * lnCurs, gnPc)
If !llValuta
Replace suma_val With 0
@@ -10627,15 +11146,16 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Select introdc
Replace explicatie_tva With jtva_coloane2.denumire
Endif
+ Select introdc
+ Thisform.UpdateExplicatieSAFT()
Endif
Endif
Select crsGrupCota
Endscan
- *!* runda27 (D5): rotunjire reziduala per cota - suma T-urilor nemanuale ale unei cote
- *!* cu mai multe creditoare trebuie sa fie exact baza_totala_cota*cota/100; reziduul
- *!* merge pe T-ul cu |suma| maxima al cotei. Sarit daca exista deja un T manual pe
- *!* cota respectiva (baza lui nu mai apartine lotului auto).
+ *!* rotunjire reziduala per cota: suma T-urilor nemanuale ale unei cote trebuie sa fie
+ *!* exact baza_cota*cota/100, reziduul merge pe T-ul cu |suma| maxima al cotei.
+ *!* Cotele care au deja un T manual se sar.
Select Distinct cota_tva From crsGrupCota Into Cursor crsCoteRund NOFILTER
Select crsCoteRund
Scan
@@ -10647,18 +11167,18 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
From crsGrupCota Where cota_tva == lnCotaCrt Into Cursor crsBazaCota NOFILTER
If crsBazaCota.nr_grup > 1
If This.lIntern Or !llValuta
- Select Sum(suma) As s From introdc Where doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 Into Cursor crsSumTCota NOFILTER
+ Select Sum(suma) As s From introdc Where doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsSumTCota NOFILTER
If This.lIntern
- lnRestLei = Round(crsBazaCota.tot_lei * lnCotaCrt / 100, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc)
+ lnRestLei = Round(crsBazaCota.tot_lei * lnFactorDisc * lnCotaCrt / 100, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc)
Else
- lnRestLei = Round(Round(crsBazaCota.tot_val * lnCotaCrt / 100, gnPval) * lnCurs, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc)
+ lnRestLei = Round(Round(crsBazaCota.tot_val * lnFactorDisc * lnCotaCrt / 100, gnPval) * lnCurs, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc)
Endif
Use In crsSumTCota
If lnRestLei <> 0
lnMaxAbs = -1
lnRecMaxAbs = 0
Select introdc
- Scan For doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1
+ Scan For doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1
If Abs(suma) > lnMaxAbs
lnMaxAbs = Abs(suma)
lnRecMaxAbs = Recno()
@@ -10670,14 +11190,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Endif
Endif
Else
- Select Sum(suma_val) As s From introdc Where doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 Into Cursor crsSumTCota NOFILTER
- lnRestVal = Round(crsBazaCota.tot_val * lnCotaCrt / 100, gnPval) - Round(Nvl(crsSumTCota.s,0), gnPval)
+ Select Sum(suma_val) As s From introdc Where doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsSumTCota NOFILTER
+ lnRestVal = Round(crsBazaCota.tot_val * lnFactorDisc * lnCotaCrt / 100, gnPval) - Round(Nvl(crsSumTCota.s,0), gnPval)
Use In crsSumTCota
If lnRestVal <> 0
lnMaxAbs = -1
lnRecMaxAbs = 0
Select introdc
- Scan For doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1
+ Scan For doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1
If Abs(suma_val) > lnMaxAbs
lnMaxAbs = Abs(suma_val)
lnRecMaxAbs = Recno()
@@ -10705,11 +11225,11 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
*!* secundara: T-urile nemanuale se regrupeaza pe creditorii S-urilor (scc/ascc),
*!* impartind totalul T existent proportional cu sumele S per creditor
Select introdc
- Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1
+ Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1
If Found()
Scatter Name loRandTS Memo
Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ;
- Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsTotTSec NOFILTER
+ Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsTotTSec NOFILTER
lnTotTLei = Nvl(crsTotTSec.s_lei,0)
lnTotTVal = Nvl(crsTotTSec.s_val,0)
Use In crsTotTSec
@@ -10721,21 +11241,22 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Use In crsTotSSec
If Reccount('crsGrupSccT') > 0 And lnTotSLei <> 0
Select introdc
- Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1
+ Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1
Select crsGrupSccT
Scan
lnPondere = crsGrupSccT.s_lei / lnTotSLei
Select introdc
Append Blank
Gather Name loRandTS Memo
+ Replace rand_dvi With 0, valuta_proprie With 0, expl_manual With 0
Replace scc With crsGrupSccT.scc, ascc With crsGrupSccT.ascc, ;
suma With Round(lnTotTLei * lnPondere, gnPc), ;
suma_val With Round(lnTotTVal * lnPondere, gnPval)
Select crsGrupSccT
Endscan
- *!* reziduul de rotunjire pe T-ul cu |suma| maxima (modelul D5)
+ *!* reziduul de rotunjire pe T-ul cu |suma| maxima
Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ;
- Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsSumTSec NOFILTER
+ Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsSumTSec NOFILTER
lnRestLei = Round(lnTotTLei - Nvl(crsSumTSec.s_lei,0), gnPc)
lnRestVal = Round(lnTotTVal - Nvl(crsSumTSec.s_val,0), gnPval)
Use In crsSumTSec
@@ -10743,7 +11264,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
lnMaxAbs = -1
lnRecMaxAbs = 0
Select introdc
- Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1
+ Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1
If Abs(suma) > lnMaxAbs
lnMaxAbs = Abs(suma)
lnRecMaxAbs = Recno()
@@ -10759,13 +11280,129 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Endif
Endif
- *!* B dispare dupa spargere (dec.9=D9)
+ *!* explicatiile alese manual pe randuri T revin pe cota lor, restul urmeaza familia S-ului
+ Select crsExplT
+ Scan
+ Select introdc
+ Replace id_jtva_coloana With crsExplT.id_jtva_coloana, explicatie_tva With crsExplT.explicatie_tva, expl_manual With 1 ;
+ For doc_key == tcDocKey And tip_rand == 'T' And ptva == crsExplT.ptva
+ Select crsExplT
+ Endscan
+ Use In crsExplT
+ Thisform.aliniaza_tva_la_baza(tcDocKey)
+
+ *!* randul B dispare dupa spargere
Select introdc
Delete For doc_key == tcDocKey And tip_rand == 'B'
Select (lcSel)
ENDPROC
+ PROCEDURE sparge_tva_protejat
+ *!* Sparge randurile T protejate (TVA pe DVI cu valuta proprie) pe cotele TVA ale
+ *!* articolelor, pastrand totalul introdus pe DVI, identitatea vamala si protectia.
+ *!* Cere crsGrupCota deschis (calc_baze_cota_creditor).
+ Lparameters tcDocKey, toRandT, tnIdJtvaOrig
+ Local lcSel, lnTotLei, lnTotVal, lnCntProt, lnPonderiTot, lnPondere, lnCotaCrt, lnIdJtvaCrt
+ Local lnRestLei, lnRestVal, lnMaxAbs, lnRecMaxAbs
+ lcSel = Select()
+
+ Select Count(*) As nr, Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ;
+ Where doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) = 1 Into Cursor crsTotTProt NOFILTER
+ lnCntProt = Nvl(crsTotTProt.nr, 0)
+ lnTotLei = Nvl(crsTotTProt.s_lei, 0)
+ lnTotVal = Nvl(crsTotTProt.s_val, 0)
+ Use In crsTotTProt
+
+ *!* ponderea unei cote = baza articolelor pe cota x cota (in moneda documentului)
+ If This.lIntern
+ Select cota_tva, Sum(Round(baza_lei * cota_tva / 100, gnPc)) As pond ;
+ From crsGrupCota Group By cota_tva Into Cursor crsPondCota NOFILTER
+ Else
+ Select cota_tva, Sum(Round(baza_val * cota_tva / 100, gnPval)) As pond ;
+ From crsGrupCota Group By cota_tva Into Cursor crsPondCota NOFILTER
+ Endif
+ Select Sum(pond) As tot From crsPondCota Into Cursor crsPondTot NOFILTER
+ lnPonderiTot = Nvl(crsPondTot.tot, 0)
+ Use In crsPondTot
+ Go Top In crsPondCota
+ If lnPonderiTot = 0 Or (lnCntProt = 1 And Reccount('crsPondCota') = 1 And crsPondCota.cota_tva = toRandT.ptva)
+ *!* nimic de spart: o singura cota, aceeasi cu a randului protejat
+ Use In crsPondCota
+ Select (lcSel)
+ Return
+ Endif
+
+ *!* creditorul fiecarei cote se pastreaza peste recreare - clonarea lui toRandT ar da
+ *!* tuturor cotelor creditorul primului rand protejat
+ Select ptva, scc, ascc From introdc ;
+ Where doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) = 1 ;
+ Into Cursor crsSccProt NOFILTER
+ Select introdc
+ Delete For doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) = 1
+ Select crsPondCota
+ Scan
+ lnCotaCrt = crsPondCota.cota_tva
+ lnPondere = crsPondCota.pond / lnPonderiTot
+ lnIdJtvaCrt = Iif(lnCotaCrt = toRandT.ptva, tnIdJtvaOrig, Thisform.gaseste_jtva_cota(tnIdJtvaOrig, lnCotaCrt))
+ Select introdc
+ Append Blank
+ Gather Name toRandT Memo
+ Replace tip_rand With 'T', doc_key With tcDocKey, nr_doc With toRandT.nr_doc, ptva With lnCotaCrt, ;
+ suma With Round(lnTotLei * lnPondere, gnPc), suma_val With Round(lnTotVal * lnPondere, gnPval), ;
+ expl_manual With Iif(lnCotaCrt = toRandT.ptva, Nvl(toRandT.expl_manual,0), 0)
+ Select crsSccProt
+ Locate For ptva = lnCotaCrt
+ If Found()
+ Replace scc With crsSccProt.scc, ascc With Nvl(crsSccProt.ascc,'') In introdc
+ Endif
+ Select introdc
+ If lnIdJtvaCrt = 0
+ Thisform.cmesajsync = Thisform.cmesajsync + Iif(Empty(Thisform.cmesajsync),'',Chr(13)+Chr(10)) + ;
+ "Documentul " + Alltrim(Nvl(toRandT.fdoc,'')) + " are marfa la " + Transform(lnCotaCrt) + "%, dar nu exista explicatie TVA de " + Transform(lnCotaCrt) + "% in seria '" + Alltrim(Strtran(Chrtran(Nvl(toRandT.explicatie_tva,''),'0123456789%',''),' ',' ')) + "' - completati nomenclatorul de explicatii TVA."
+ Else
+ Replace id_jtva_coloana With lnIdJtvaCrt
+ If lnIdJtvaCrt <> tnIdJtvaOrig
+ Select jtva_coloane2
+ Locate For id_jtva_coloana = lnIdJtvaCrt
+ If Found()
+ Select introdc
+ Replace explicatie_tva With jtva_coloane2.denumire
+ Endif
+ Select introdc
+ Thisform.UpdateExplicatieSAFT()
+ Endif
+ Endif
+ Select crsPondCota
+ Endscan
+ Use In crsPondCota
+ Use In crsSccProt
+
+ *!* reziduul de rotunjire pe randul cu |suma| maxima
+ Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ;
+ Where doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) = 1 Into Cursor crsSumTProt NOFILTER
+ lnRestLei = Round(lnTotLei - Nvl(crsSumTProt.s_lei,0), gnPc)
+ lnRestVal = Round(lnTotVal - Nvl(crsSumTProt.s_val,0), gnPval)
+ Use In crsSumTProt
+ If lnRestLei <> 0 Or lnRestVal <> 0
+ lnMaxAbs = -1
+ lnRecMaxAbs = 0
+ Select introdc
+ Scan For doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) = 1
+ If Abs(suma) > lnMaxAbs
+ lnMaxAbs = Abs(suma)
+ lnRecMaxAbs = Recno()
+ Endif
+ Endscan
+ If lnRecMaxAbs > 0
+ Go lnRecMaxAbs In introdc
+ Replace suma With suma + lnRestLei, suma_val With suma_val + lnRestVal
+ Endif
+ Endif
+
+ Select (lcSel)
+ ENDPROC
+
PROCEDURE uneste_document
*!* reface randul B al unui document din S-urile lui (cand spargerea secundarelor e oprita)
Lparameters tcDocKey
@@ -10807,16 +11444,16 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Delete For doc_key == tcDocKey And tip_rand == 'S'
*!* T-urile nemanuale sparte pe creditori se reunesc intr-unul singur (documentul revine la B unic)
Select Count(*) As nr, Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ;
- Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsTU NOFILTER
+ Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsTU NOFILTER
lnCntTU = crsTU.nr
lnSumTULei = Nvl(crsTU.s_lei,0)
lnSumTUVal = Nvl(crsTU.s_val,0)
Use In crsTU
If lnCntTU > 1
Select introdc
- Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1
+ Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1
lnRecTU = Recno()
- Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Recno() <> lnRecTU
+ Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 And Recno() <> lnRecTU
Go lnRecTU In introdc
Replace suma With lnSumTULei, suma_val With lnSumTUVal
Endif
@@ -10849,9 +11486,9 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE valideaza_sume
- *!* 16.07.2026 claude - Suma(S) vs suma_doc per document (E2), articole fara cont (F2);
- *!* cmesajsync acumuleaza si mesajele deja setate de sparge_document/recalc_diferente
- *!* (jtva lipsa - dec.6, 2xx nerepartizat - dec.9). Return .F. daca exista vreun mesaj.
+ *!* Verifica Suma(S) fata de suma_doc per document si articolele fara cont; cmesajsync
+ *!* acumuleaza si mesajele setate de sparge_document/recalc_diferente.
+ *!* Return .F. daca exista vreun mesaj.
Local lcSel, lcMesaje, lcDocKeyCrt, lnSumaS, lnSumaDoc, lnSumaSVal, lnSumaDocVal, lcSelAna, lnSuccesAna, lcArtMesaj, lcContCrt, lcAcontCrt, lcDenCrt, lcMsgCrt, lcConturiAna
lcSel = Select()
lcMesaje = Thisform.cmesajsync
@@ -10887,7 +11524,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Use In crsDocSparte
Endif
- *!* F2: articol fara cont in nomenclator (validarea completa la adaugare vine cu do_adauga la T3)
+ *!* articol fara cont in nomenclator
If Used('rul_temp')
Select Count(*) As nr From rul_temp Where !Deleted() And Empty(Alltrim(Nvl(cont,''))) Into Cursor crsFaraCont NOFILTER
If crsFaraCont.nr > 0
@@ -10897,7 +11534,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Use In crsFaraCont
Endif
- *!* F3: analitic pe cont articol (cont cu analitice in plan neasignat/necunoscut - vezi assign_analitic/verificare_note_contabile)
+ *!* cont de articol cu analitice in plan, neasignat sau necunoscut (vezi assign_analitic)
If Used('rul_temp') And Reccount('rul_temp') > 0
lcConturiAna = cursor2listac('rul_temp','cont',',',[!Deleted() And !Empty(Alltrim(Nvl(cont,'')))])
If !Empty(lcConturiAna)
@@ -10955,7 +11592,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE Cmd_executa1.Click
- *!* 16.07.2026 claude (T3) - butonul benzii: sincronizare manuala (nu do_executa direct)
+ *!* butonul benzii: sincronizare manuala
Thisform.sincronizeaza()
ENDPROC
@@ -10965,7 +11602,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
PROCEDURE Grid1.cAscc.Text1.GotFocus
*!* valoarea la intrarea in celula - Valid recalculeaza doar daca s-a modificat
- Thisform.nOldVal = This.Value
+ Thisform.cOldVal = This.Value
Dodefault()
ENDPROC
@@ -10986,7 +11623,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
If Thisform.lInSync
Return
Endif
- If This.Value = Thisform.nOldVal
+ If This.Value = Thisform.cOldVal
Return
Endif
If introdc.tip_rand == 'S'
@@ -10997,7 +11634,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Thisform.lSyncPending = .T.
Thisform.tmrSync.Interval = 1
Endif
- Thisform.nOldVal = This.Value
+ Thisform.cOldVal = This.Value
ENDPROC
PROCEDURE Grid1.cAscd.Text1.Click
@@ -11017,10 +11654,20 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
*!* cursul editat se scrie explicit (ca la cSumaVal.Valid - dupa amessagebox grid-ul
*!* nu-l mai scria in camp) si se copiaza pe randul de TVA pereche; apoi ofer
*!* recalcularea sumei in lei din suma in valuta, ca la modificarea sumei in valuta
- *!* 24.07.2026 claude - recalcularea din curs se aplica pe toate randurile documentului si reface totalurile suma_doc/suma_doc_val
+ *!* recalcularea se aplica pe toate randurile documentului si reface suma_doc/suma_doc_val
Local lnSumaDinVal, lnRaspuns, lcDocKeyC, lnRecC, lnCntS, lnSLei, lnSVal, lnMinNrDocC
If This.Value # 0
Select introdc
+ If tip_rand == 'T' And Nvl(rand_dvi,0) = 1
+ Replace curs With This.Value, valuta_proprie With 1
+ If This.Value <> 0
+ Replace suma_val With Round(suma / This.Value, gnPval)
+ Endif
+ Thisform.do_executa()
+ Thisform.lSyncPending = .T.
+ Thisform.tmrSync.Interval = 1
+ Return
+ Endif
Replace curs With This.Value
Thisform.copiaza_valoare([curs])
lnRecC = Recno('introdc')
@@ -11098,7 +11745,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
*!* 14.07.2016
*!* marius.mutu
*!* inlocuiesc 4426 = 401 cu 4426 = 4427 pt ach tx inversa/CE 20%
- *!* 16.07.2026 claude - delegat la aplica_explicatie_tva (era duplicat pe paritate)
+ *!* aplicarea pe cursor e delegata la aplica_explicatie_tva
LOCAL lnId, lnPtva
lnId = jtva_coloane2.id_jtva_coloana
@@ -11106,11 +11753,18 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Select introdc
Replace id_jtva_coloana With lnId, ptva With lnPtva
- If introdc.tip_rand = 'B'
+ If Inlist(introdc.tip_rand, 'B', 'S', 'G')
Thisform.aplica_explicatie_tva(lnId)
+ Else
+ If introdc.tip_rand == 'T'
+ *!* explicatie aleasa direct pe randul de TVA - sincronizarea nu o realiniaza la familia bazei
+ Replace expl_manual With 1
+ Endif
Endif
- Thisform.grid1.cSuma.teXT1.Valid
+ Thisform.do_executa()
+ Thisform.lSyncPending = .T.
+ Thisform.tmrSync.Interval = 1
ENDPROC
@@ -11133,13 +11787,23 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE Grid1.cFDoc.Text1.When
- *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul D (diferente, fara act propriu)
+ *!* blocat pe randul D (diferente, fara act propriu)
Return !(introdc.tip_rand == 'D')
ENDPROC
PROCEDURE Grid1.cInValuta.Check1.Valid
- *!* 24.07.2026 claude - la debifare se sterg valuta, suma in valuta si cursul pe liniile documentului
+ *!* la debifare se sterg valuta, suma in valuta si cursul pe liniile documentului
Select introdc
+ If tip_rand == 'T' And Nvl(rand_dvi,0) = 1
+ Replace in_valuta With This.Value, valuta_proprie With 1
+ If This.Value = 0
+ Replace id_valuta With 0, nume_val With '', curs With 0, suma_val With 0
+ Endif
+ Thisform.do_executa()
+ Thisform.lSyncPending = .T.
+ Thisform.tmrSync.Interval = 1
+ Return
+ Endif
Replace in_valuta With This.Value
Thisform.copiaza_valoare([in_valuta])
If This.Value = 0
@@ -11174,7 +11838,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE Grid1.cNract.Text1.When
- *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul D (diferente, fara act propriu)
+ *!* blocat pe randul D (diferente, fara act propriu)
Return !(introdc.tip_rand == 'D')
ENDPROC
@@ -11214,7 +11878,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE Grid1.cPartC.Text1.Valid
- *!* 16.07.2026 claude - propaga pe doc_key (inlocuieste MOD(RECNO(),2)+SKIP)
+ *!* propaga valoarea pe randurile aceluiasi doc_key
LOCAL lcSelect, lcDocKey, lnIdPart, lcPart, lcCont, lnRecCurent
lcSelect = SELECT()
@@ -11277,7 +11941,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE Grid1.cPartD.Text1.Valid
- *!* 16.07.2026 claude - propaga pe doc_key (inlocuieste MOD(RECNO(),2)+SKIP)
+ *!* propaga valoarea pe randurile aceluiasi doc_key
LOCAL lcSelect, lcDocKey, lnIdPart, lcPart, lcCont, lnRecCurent
lcSelect = SELECT()
@@ -11306,7 +11970,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
PROCEDURE Grid1.cScc.Text1.GotFocus
*!* valoarea la intrarea in celula - Valid recalculeaza doar daca s-a modificat
- Thisform.nOldVal = This.Value
+ Thisform.cOldVal = This.Value
Dodefault()
ENDPROC
@@ -11319,7 +11983,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
If Thisform.lInSync
Return
Endif
- If This.Value = Thisform.nOldVal
+ If This.Value = Thisform.cOldVal
Return
Endif
If introdc.tip_rand == 'S'
@@ -11330,7 +11994,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Thisform.lSyncPending = .T.
Thisform.tmrSync.Interval = 1
Endif
- Thisform.nOldVal = This.Value
+ Thisform.cOldVal = This.Value
ENDPROC
PROCEDURE Grid1.cSerie_act.Text1.Valid
@@ -11352,7 +12016,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE Grid1.cSerie_act.Text1.When
- *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul D (diferente, fara act propriu)
+ *!* blocat pe randul D (diferente, fara act propriu)
Return !(introdc.tip_rand == 'D')
ENDPROC
@@ -11363,10 +12027,15 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE Grid1.cSuma.Text1.Valid
- *!* 16.07.2026 claude (A1+dec.5) - NU sincronizeaza() direct (eroare VFP 2166); doar
- *!* marcheaza documentul si armeaza tmrSync. 16.07.2026b claude (C6): suma_doc se
- *!* propaga pe grup DOAR cand editez randul B (nu si pe T, unde userul editeaza suma
- *!* de TVA - altfel suma_doc ar deveni eronat egala cu TVA-ul).
+ *!* Nu apeleaza sincronizeaza() direct (eroare VFP 2166) - marcheaza documentul si armeaza
+ *!* tmrSync. suma_doc se propaga pe grup doar la editarea randului B; pe T utilizatorul
+ *!* editeaza suma de TVA. Valid re-declansat de regenerarea randurilor din sincronizare iese devreme.
+ If Thisform.lInSync
+ Return
+ Endif
+ If Vartype(This.Value) <> 'N'
+ Return
+ Endif
If This.Value = Thisform.nOldVal
*!* nemodificat (ex. navigare cu sagetile) - fara recalcul si fara resincronizare
Return
@@ -11408,7 +12077,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE Grid1.cSuma.Text1.When
- *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul S cu suma in valuta (editabil doar cSumaVal)
+ *!* blocat pe randul S cu suma in valuta (editabil doar cSumaVal)
Return !(introdc.tip_rand == 'S' And introdc.in_valuta = 1)
ENDPROC
@@ -11428,9 +12097,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE Grid1.cSumaVal.Text1.Valid
- *!* Mutat din LostFocus: acolo valoarea tastata se pierdea (dupa amessagebox
- *!* grid-ul nu o mai scria in camp) - aici o scriu explicit din This.Value.
+ *!* valoarea tastata se scrie explicit din This.Value (dupa amessagebox grid-ul nu o mai scrie in camp)
Local lnSumaDinVal, lnRaspuns
+ If Thisform.lInSync
+ Return
+ Endif
+ If Vartype(This.Value) <> 'N'
+ Return
+ Endif
If This.Value = Thisform.nOldVal
*!* nemodificat (ex. navigare cu sagetile) - fara recalcul si fara resincronizare
Return
@@ -11438,8 +12112,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
If This.Value # 0
Select introdc
Replace suma_val With This.Value
- * runda 13: folosesc cursul randului (editabil in grid) cand exista; altfel cursul
- * facturii principale, ca inainte
+ * folosesc cursul randului (editabil in grid) cand exista; altfel cursul facturii principale
lnSumaDinVal = Round(This.Value * Iif(introdc.in_valuta = 1 And Nvl(introdc.curs, 0) <> 0, introdc.curs, Thisform.oact.Curs), gnPC)
lnRaspuns = 6
If suma <> 0 And suma <> lnSumaDinVal
@@ -11450,8 +12123,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Replace suma With lnSumaDinVal
Endif
Endif
- *!* 16.07.2026 claude (A1+dec.5) - vezi Grid1.cSuma.Text1.Valid. 16.07.2026b claude (C6):
- *!* suma_doc se propaga pe grup DOAR pe randul B (nu si pe T).
+ *!* ca la Grid1.cSuma.Text1.Valid; suma_doc se propaga pe grup doar pe randul B
If Inlist(introdc.tip_rand, 'S', 'D', 'T')
Select introdc
Replace mod_manual With 1
@@ -11489,7 +12161,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE Grid1.cSumaVal.Text1.When
- *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul S cu suma in lei (editabil doar cSuma)
+ *!* blocat pe randul S cu suma in lei (editabil doar cSuma)
Return !(introdc.tip_rand == 'S' And introdc.in_valuta = 0)
ENDPROC
@@ -11519,10 +12191,25 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
PROCEDURE Grid1.cValuta.Text1.DblClick
* alegerea valutei pe rand (caut_valuta, ca in dialogul Adauga factura);
* la anulare raman valorile vechi; valoarea se copiaza pe randul de TVA pereche
- Local loCauta
+ Local loCauta, llDviRon, llDocRon, llCoincideDoc
loCauta = caut_valuta(, .F., .F.)
If Vartype(loCauta) = 'O' And !Empty(Nvl(loCauta.id_valuta, 0))
Select introdc
+ If tip_rand == 'T' And Nvl(rand_dvi,0) = 1
+ llDviRon = (Empty(Alltrim(Nvl(loCauta.nume_val,''))) Or Upper(Alltrim(Nvl(loCauta.nume_val,''))) == 'RON')
+ llDocRon = (Empty(Alltrim(Nvl(Thisform.oact.nume_val,''))) Or Upper(Alltrim(Nvl(Thisform.oact.nume_val,''))) == 'RON')
+ llCoincideDoc = Iif(llDviRon And llDocRon, .T., (loCauta.id_valuta == Nvl(Thisform.oact.id_valuta,0)))
+ Replace id_valuta With loCauta.id_valuta, nume_val With Alltrim(loCauta.nume_val), ;
+ valuta_proprie With Iif(llCoincideDoc, 0, 1)
+ If llCoincideDoc
+ Replace in_valuta With Iif(llDocRon, 0, 1), curs With Iif(llDocRon, 0, Thisform.oact.Curs)
+ Replace suma_val With Iif(!llDocRon And curs <> 0, Round(suma / curs, gnPval), 0)
+ Endif
+ This.Value = introdc.nume_val
+ Thisform.do_executa()
+ Thisform.grid1.Refresh()
+ Return
+ Endif
Replace id_valuta With loCauta.id_valuta, nume_val With Alltrim(loCauta.nume_val)
Thisform.copiaza_valoare([id_valuta])
Thisform.copiaza_valoare([nume_val])
@@ -11538,12 +12225,12 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE Grid1.Init
- *!* 16.07.2026 claude - italic pe randul T (inlocuieste Mod(Recno('introdc'),2)=0)
+ *!* italic pe randul T
thisform.grid1.SetAll("dynamicbackcolor", "", "Column")
thisform.grid1.SetAll("dynamicforecolor", "", "Column")
thisform.grid1.SetAll("DynamicBackColor", "introdc.doc_color", "Column")
thisform.grid1.SetAll("DynamicFontItalic", "introdc.tip_rand == 'T'", "Column")
- *!* 16.07.2026 claude (T3c2, D-H4) - gri pe coloanele blocate dinamic (vezi metodele .When)
+ *!* gri pe coloanele blocate dinamic (vezi metodele .When)
thisform.grid1.cSuma.DynamicBackColor = "Iif(introdc.tip_rand = 'S' And introdc.in_valuta = 1, Rgb(229,229,229), introdc.doc_color)"
thisform.grid1.cSumaVal.DynamicBackColor = "Iif(introdc.tip_rand = 'S' And introdc.in_valuta = 0, Rgb(229,229,229), introdc.doc_color)"
thisform.grid1.cSerie_act.DynamicBackColor = "Iif(introdc.tip_rand = 'D', Rgb(229,229,229), introdc.doc_color)"
@@ -11581,8 +12268,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE GridArt.cCotaTva.Text1.Valid
- *!* 16.07.2026 claude (T3-A, dec.6/D7) - editarea cotei TVA per articol nu recalculeaza
- *!* direct (A1) - doar armeaza sincronizarea amanata (tmrSync regenereaza liniile T pe cota).
+ *!* editarea cotei TVA nu recalculeaza direct - armeaza sincronizarea amanata,
+ *!* care regenereaza randurile T pe cota
If This.Value = Thisform.nOldVal
Return
Endif
@@ -11679,8 +12366,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE tmrSync.Timer
- *!* 16.07.2026 claude (A1) - executa sincronizarea amanata (armata din Valid-urile de grid);
- *!* Interval=0 opreste repetarea pana la urmatoarea armare.
+ *!* executa sincronizarea amanata armata din Valid-urile de grid;
+ *!* Interval=0 opreste repetarea pana la urmatoarea armare
If Thisform.lSyncPending
Thisform.lSyncPending = .F.
This.Interval = 0
diff --git a/docs/depanare_testare_vfp.md b/docs/depanare_testare_vfp.md
index 575dbde..bb197f9 100644
--- a/docs/depanare_testare_vfp.md
+++ b/docs/depanare_testare_vfp.md
@@ -108,6 +108,26 @@ Cand un bug apare "de azi", compara cu clasa veche fara a atinge SVN:
programului ruleaza, doar linia aceea lipseste din `.fxp` si da eroare 16 cand se ajunge la
ea. De aceea SQL-ul lung se scrie cu `TEXT TO [TEXTMERGE] NOSHOW ... ENDTEXT` sau
concatenat. Verificare: `awk 'length($0) > 260 {print NR": "length($0)}' fisier.prg`.
+- **Linie de COD (nu doar literal string) prea lunga intr-o metoda de clasa `.vc2` poate
+ arunca eroarea 11 ("Function argument value, type, or count is invalid") pe PRIMA
+ instructiune a metodei, nu pe linia vinovata** - simptom complet derutant. Se exclude prin
+ diagnostic: aceeasi expresie merge normal la nivel de program, in alta clasa, intr-o
+ subclasa cu metoda noua, si pe instanta virgina - deci nu tine de tipul datelor, de context
+ sau de clasa parinte. Reper practic: linii preexistente >200 caractere intr-o clasa mare
+ functioneaza pana la ~250; pragul real e in jur de 255, ca la literalii de string. Remediu:
+ sparge expresia in pasi cu variabile locale. Verificare (comparat intre fisierul curent si
+ un backup anterior):
+ ```powershell
+ $l=[IO.File]::ReadAllLines($p,[Text.Encoding]::GetEncoding(28591))
+ for($i=0;$i -lt $l.Length;$i++){ if($l[$i].Length -gt 200){ "{0}: len={1}" -f ($i+1), $l[$i].Length } }
+ ```
+- **Un UDF care citeste campul curent (`Nvl(camp,0)=1` sau similar) nu e de incredere intr-o
+ clauza de filtrare** (`SELECT ... WHERE`, `LOCATE FOR`, `SCAN FOR`, `DELETE FOR`) - pointerul
+ nu e garantat pe randul evaluat la fiecare apel, deci filtrul devine practic o valoare
+ constanta (fie nu se declanseaza niciodata, fie loveste tot). Simptome vazute: o comasare de
+ randuri care nu se mai producea deloc; un test agatat. Remediu: in clauze de filtrare
+ foloseste expresia INLINE pe camp (`Nvl(camp,0) <> 1`); pastreaza helper-ul doar in cod
+ procedural (`If`, `Replace` pe randul curent), unde pointerul e garantat pozitionat.
## 7. Capcane la SCRIEREA scriptului de test
diff --git a/docs/flux-editare-vfp-text.md b/docs/flux-editare-vfp-text.md
index 5817aea..8e4c8c9 100644
--- a/docs/flux-editare-vfp-text.md
+++ b/docs/flux-editare-vfp-text.md
@@ -10,11 +10,21 @@ in IDE. `txt2vcx.ps1` cu `-CacheRoot` = `-ProjectRoot` (implicit). Pasul 0 de ma
rularea `git_sync.ps1`; restul pasilor raman la fel. Fluxul cu cache extern (`vcx2txt.ps1` +
`-CacheRoot` separat) ramane doar pentru proiectele nemigrate.
+**Capcana: `git_sync.ps1` cu `-ProjectRoot` pe COMUN direct.** Lista implicita
+`-RoundtripExempt` are cai de forma `COMUN\clase\.vcx` (raportate la radacina unei aplicatii,
+unde COMUN e subfolder) si se lipeste de `-ProjectRoot`. Cand radacina E chiar COMUN, caile nu
+mai potrivesc si clasele scutite (FFC/third-party cu `#INCLUDE`, ex. `oinventar.vcx`) raporteaza
+fals `roundtrip text1 != text2`. Ruleaza atunci cu lista rebazata:
+`git_sync.ps1 -ProjectRoot 'D:\ROA\ROAGEST\COMUN' -RoundtripExempt @('clase\accessibility.vcx',
+'clase\oinventar.vcx','clase\_gdiplus.vcx','clase\_reportlistener.vcx',
+'utile\foxcharts\foxcharts.vcx','utile\web\_webview.vcx')` - si apeleaza scriptul cu `&`, nu cu
+`powershell -File` (acolo lista nu se leaga ca array).
+
## Parametri per proiect (nemigrate, cache extern)
- **ROAGEST**: `-Project 'D:\ROA\ROAGEST\roagest.pjx' -ProjectRoot 'D:\ROA\ROAGEST'
- -CacheRoot 'D:\ROA\_vfp_textcache\roagest'`; procese de verificat inainte de write-back:
- `vfp9`, `roagest`; patch-uri de review in `docs/diff_runda_.patch`.
+ -CacheRoot 'D:\ROA\_vfp_textcache\roagest'`; patch-uri de review in
+ `docs/diff_runda_.patch`.
## Pasii unei runde
@@ -37,7 +47,10 @@ rularea `git_sync.ps1`; restul pasilor raman la fel. Fluxul cu cache extern (`vc
dintr-un cursor in loc de Scan manual; butoane din cmd_butoane.vcx in loc de butoane ad-hoc).
Inventarul comunelor: COMUN\docs\inventar-comun.md - se consulta si la pasul de plan/arhitectura,
inainte de a scrie cod nou.
-4. Preconditie write-back: niciun proces vfp9/ (tin lock pe binar); nu se omoara.
+4. Preconditie write-back: binarul tinta sa nu fie blocat. `txt2vcx.ps1` verifica singur
+ (`Test-ExclusiveAccess` pe `.vcx`+`.vct`) si refuza cu mesaj clar daca e lock. NU conteaza
+ existenta altor instante `vfp9` — utilizatorul poate lucra in paralel in alt proiect VFP —
+ si NU se omoara procese: cand lock-ul exista, se cere utilizatorului sa inchida sesiunea.
5. Write-back: `txt2vcx.ps1 -TextFile -ProjectRoot -CacheRoot `
(+ `-AllowComun` cu aprobare explicita pentru tinte COMUN — afecteaza toate aplicatiile ROA).
Succes = fidelity-check trecut: binar cu mtime nou; `vcx2txt.ps1` ulterior il vede la zi.
@@ -68,3 +81,8 @@ rularea `git_sync.ps1`; restul pasilor raman la fel. Fluxul cu cache extern (`vc
fluxul text->bin punctual pe binarul vizat.
- Subagentii delegati primesc regulile 2-5 in prompt si raporteaza unicitatea sirurilor
inlocuite + rezultatul fidelity-check-ului.
+- Fisierele `.vc2`/`.sc2` sunt CRLF, dar here-string-urile PowerShell (`"...`r`n..."` sau
+ `@"..."@`) produc LF simplu pe orice linie noua inserata daca nu incluzi explicit `` `r`n ``
+ la fiecare capat de linie - rezultatul e un fisier cu sfarsituri de linie amestecate (CRLF pe
+ continutul vechi, LF pe cel nou). Verificare finala obligatorie dupa orice scriere: numara
+ octetii `0x0A` neprecedati de `0x0D` (LF izolati) - trebuie sa fie 0.
diff --git a/docs/orchestrare-subagenti.md b/docs/orchestrare-subagenti.md
index 18c2e87..2b337c1 100644
--- a/docs/orchestrare-subagenti.md
+++ b/docs/orchestrare-subagenti.md
@@ -38,3 +38,63 @@ Regula (valabila in toate proiectele ROA/VFP): un singur subagent care duce o mi
completeaza-l, nu repeta investigatia.
- Orchestratorul face el insusi munca de volum -> deleaga si pastreaza-si contextul
pentru decizii, verificari si deblocari.
+
+## Disciplina de context a ORCHESTRATORULUI
+
+Pragul de ~200-250k e pentru subagenti, dar orchestratorul se umple la fel de repede daca isi
+lasa in sesiune munca de CITIT. Masurat pe o runda reala (implementare + 4 rulari ale unei suite
+de 25 de teste): sesiunea principala a ajuns la ~570k desi tot codul fusese scris de subagenti.
+Consumul, in ordinea marimii: (1) citirea rezultatelor de test dupa fiecare test terminat, cu tot
+cu liniile "OK"; (2) citirea codului ca sa diagnosticheze esecurile; (3) diagnostic si fixuri
+aplicate direct in loc de delegate.
+
+- **Nu citi log-uri brute.** Scripturile de raportare afiseaza DOAR esecurile plus un total
+ ("22 OK, 3 FAIL: "). Tabelul complet se citeste o singura data, la
+ baseline - nu dupa fiecare rulare. Pentru suitele VFP exista deja:
+ `COMUN\utile\Teste\raport_teste.ps1 -Dir [-Tot] [-Baseline ]` - fara `-Tot`
+ afiseaza doar esecurile, iar cu `-Baseline` le marcheaza `[preexistent]` vs `[NOU - REGRESIE]`.
+- **Nu citi cod ca sa diagnostichezi.** Deleaga cu "adu-mi dovada, nu fisierul": agentul intoarce
+ cauza + linia + citatul minim. Verifici afirmatia, nu o redescoperi.
+- **Verifica prin assert, nu prin citire.** Daca vrei sa stii ca ceva e adevarat, cere o comanda
+ care intoarce da/nu, nu continutul din care ai deduce singur.
+- **Nu aplica fixuri direct** decat sub ~5 linii si doar daca ai deja contextul in sesiune.
+- **Prag si pe orchestrator**: la ~50% din fereastra, scrie handoff-ul si reia orchestrarea
+ dintr-o sesiune noua. Handoff-ul e deja pe disc - exact pentru asta exista.
+
+## Model de lucru: backlog de story-uri mici, context mic per story
+
+Impartirea pe "lane-uri" mari (o clasa, un modul) produce subagenti cu context mare si serializare
+pe fisier. Alternativa mai ieftina si mai robusta: **backlog de story-uri mici, fiecare rezolvabila
+cu context mic, rulate in bucla de agenti PROASPETI.**
+
+Doua fisiere pe disc tin toata starea:
+
+- `docs/handoff_.md` - **contextul stabil**: reguli de editare, cai, ancore verificate,
+ capcane confirmate, decizii luate. Il citeste fiecare agent; se actualizeaza rar.
+- `docs/backlog_.md` - **starea vie**: story-uri cu ID, criteriu de acceptare
+ VERIFICABIL, fisiere atinse, stare (`todo` / `in lucru` / `gata` / `blocat de #N`).
+
+Bucla:
+1. orchestratorul ia primul story `todo` neblocat;
+2. spawneaza un agent proaspat cu prompt = trimitere la handoff + textul story-ului + criteriul
+ de acceptare. **Nimic altceva** - fara istoric, fara rapoartele celorlalti agenti;
+3. agentul modifica, ruleaza verificarea din criteriu si raporteaza **verdict + ce a schimbat +
+ ce a descoperit neasteptat**, atat;
+4. orchestratorul marcheaza story-ul in backlog si trece la urmatorul.
+
+O story buna: are criteriu de acceptare care se poate RULA (un test, un grep, o comanda da/nu);
+atinge un singur fisier sau o singura zona (altfel story-urile se serializeaza intre ele); incape
+in 15-20 de linii de descriere; nu cere citirea intregului fisier ca sa fie inteleasa.
+
+Sablon:
+
+ ### S7 - garda pe randul protejat in recalcule
+ Fisiere: COMUN\clase\.vc2 (do_executa, recalc_tva_document)
+ Blocat de: S4
+ De facut: <2-4 propozitii>
+ Acceptare: test_.ps1 trece 12/12 SI `rand_protejat()` nu mai apare in nicio clauza Where
+ Stare: todo
+
+Cand un story pica de doua ori la rand, nu-l reincerca a treia oara cu acelasi prompt: semnul e ca
+descrierea sau criteriul e gresit, nu executia. Rescrie story-ul (mai mic, sau cu criteriul
+corectat) inainte de a mai cheltui un agent.
\ No newline at end of file
diff --git a/docs/reguli_lucru.md b/docs/reguli_lucru.md
index 2d19c87..8243453 100644
--- a/docs/reguli_lucru.md
+++ b/docs/reguli_lucru.md
@@ -7,11 +7,17 @@
.gitignore ca `docs/diff_runda*.patch`); raman doar local, pe disc.
Curatenie: dupa commit se sterg patch-urile de review si backup-urile de lucru
(`*.pre_runda*.bak`).
-2. Comentarii in cod: istoricul modificarilor sta DOAR in ANTETUL fisierului, niciodata inline.
- Se aplica la fel in `.prg` si in package-urile/procedurile PL/SQL Oracle.
- In corpul codului sunt permise numai comentarii FUNCTIONALE (ce face codul si de ce, acolo
- unde nu se vede din cod) - niciodata "am adaugat / am modificat / am sters", data sau autor.
- In ANTET se tine o singura intrare CUMULATIVA per functionalitate, scurta si compacta, in stilul
+2. Comentarii in cod: minime si strict functionale - descriu comportamentul CURENT, ca si cum
+ codul ar fi fost scris asa de la inceput. O linie de regula; 2-3 linii doar pentru o metoda
+ cu contract nebanal (parametri, cursorul asteptat/lasat deschis, pozitionarea la iesire).
+ Istoricul modificarilor sta DOAR in ANTETUL fisierului, niciodata inline; se aplica la fel
+ in `.prg` si in package-urile/procedurile PL/SQL Oracle.
+ INTERZIS in comentariu: nume de agent ("claude"), referinte la documente de propuneri sau la
+ decizii/etape (`docs/propuneri_*.md`, "M2", "T3", "dec.6", "runda27", "E7", "D-H2"), istoricul
+ modificarii ("inlocuieste ...", "nu mai depinde de ...", "mutat din ..."), date si autori pe
+ cod nou. Comentariile vechi in stil jurnal nu se rescriu din oficiu - doar cand blocul e
+ oricum atins, sau la cerere explicita.
+ In ANTETUL fisierului se tine o singura intrare CUMULATIVA per functionalitate, in stilul
existent (`*!* DD.MM.YYYY` / `*!* autor` / `*!* ce face, 1-2 fraze`): la revenirea pe aceeasi
lucrare se rescrie intrarea, nu se adauga alta. Autorul e persoana care semneaza livrarea
(ex. `marius.mutu`) - niciodata "claude" sau alt nume de agent.
diff --git a/docs/testare-ui-vfp.md b/docs/testare-ui-vfp.md
index 6e7e44f..4b3f0a0 100644
--- a/docs/testare-ui-vfp.md
+++ b/docs/testare-ui-vfp.md
@@ -46,13 +46,17 @@ c. **Asteptarea `ready_0`**: cu `.fxp` cald START apare in ~2s, la rece mult mai
classlib-uri). `-ReadyTimeoutSec` generos (implicit 180s); retry NUMAI la "start ratat",
nu la "start lent". Detectia "a pornit" se face pe mtime-ul log-ului > momentul lansarii
(un log stale tinut de un vfp9 zombi pacaleste verificarea "log ne-gol") - omoara zombii
- inainte de fiecare lansare.
+ PROPRII (filtrati pe linia de comanda, vezi punctul e) inainte de fiecare lansare.
d. **`vfp9 -A test.prg` deschide INTERMITENT editorul** in loc sa ruleze (log gol). Lanseaza
`.fxp`-ul PRECOMPILAT. Precompilarea (`COMPILE`+`QUIT`) atarna dupa COMPILE si, rulata in
ACEEASI sesiune powershell, otraveste lansarile ulterioare - ruleaza-o intr-un proces copil
izolat (`Start-Process -Wait _precompile.ps1`).
-e. **Suitele NU se ruleaza in paralel**: `_precompile.ps1` face `Get-Process vfp9 | Stop-Process
- -Force` (omoara toate instantele), deci un test lansat in paralel il ucide pe cel in curs.
+e. **Suitele NU se ruleaza in paralel** intre ele: harness-ul isi omoara instantele `vfp9`
+ ramase inainte de fiecare lansare, deci un al doilea test pornit peste primul il ucide.
+ Omorarea e INSA filtrata pe linia de comanda (`Win32_Process.CommandLine` care contine
+ folderul de teste): instantele `vfp9` straine — sesiunea IDE a utilizatorului sau teste
+ dintr-un ALT proiect VFP — nu sunt atinse si nu blocheaza rularea. Nu reintroduce
+ `Get-Process vfp9 | Stop-Process -Force` fara filtru.
f. **FARA FURT DE FOCUS (17/07/2026)**: `Graphics.CopyFromScreen` fura focus si se corupe daca
utilizatorul lucreaza in paralel - nu se mai foloseste. Capturile se fac cu `PrintWindow`
(user32, P/Invoke) pe `Process.MainWindowHandle`, flag `2` = `PW_RENDERFULLCONTENT`
@@ -83,13 +87,35 @@ j. **Mock-urile de date trebuie sa reproduca structura si semantica REALA a surs
valori "compuse" manual in test). Un mock incomplet lasa campuri mereu NULL sau ascunde
pasul care se testeaza. Cand un flag global activeaza cod suplimentar (ex. `gl406`), acel
cod cere mock-uri in plus - verifica ce apeleaza si adauga metodele lipsa din dummy.
+ Cu `gl406=.T.` (SAFT), `GetTaxCodeIdPart`/`GetTaxCode` cer: `goApp.ReadIni`/`WriteIni`
+ (proprietate simpla nu ajunge, clasa `dummyapp` are nevoie de METODE), `goExecutor.oReset`
+ (no-op e suficient), si un cursor `saft_taxtable` real (nu doar mock pe `goExecutor` -
+ `update_jtva_coloane` face `USE saft_taxtable` direct pe alias). Fara ele, simptomul e un
+ dialog nativ Windows "Open" (cauta `saft_taxtable.dbf`) care blocheaza headless la nesfarsit,
+ fara nicio linie noua in log si CPU 0% - vezi `depanare_testare_vfp.md` pentru diagnosticul
+ cu `EnumWindows`/`PrintWindow` pe fereastra ascunsa cand simptomul e "ecran gol, fara eroare".
k. **`LOCATE FOR camp == 'literal'` pe camp `C(n)` padded nu gaseste nimic** (`==` e exact) -
foloseste `ALLTRIM(camp) == 'literal'`.
l. **`CREATEOBJECT`/`ADDPROPERTY` se comporta gresit apelate DINTR-O PROCEDURA in acest runtime
headless** (obiect returnat ca string de 30 spatii; `ADDPROPERTY` da eroare 11). Din
programul PRINCIPAL merg. Construieste obiectele-parametru INLINE in main, nu intr-un helper.
- (Cauza neclara; reproductibil.)
+ Cauza confirmata intr-un caz concret: linie de cod prea lunga in ACEEASI metoda de clasa -
+ vezi `depanare_testare_vfp.md` sectiunea 6. Remediul (constructie inline) ramane valabil
+ oricum, indiferent de cauza exacta dintr-un caz punctual.
m. **Fara `SELECT-SQL` pe cursorul legat de grid**: `SELECT ... FROM INTO CURSOR` cat
timp cursorul e RecordSource-ul unui grid viu poate omori procesul vfp9 silentios (fara
eroare catchabila, fara semafor). Foloseste xBase nativ (`COUNT FOR ... TO`, `CALCULATE`,
`LOCATE`), care nu comuta zona de lucru a grid-ului.
+n. **Wrapper-ul `.ps1` trebuie sa paseze `-SyncDir` daca `.prg`-ul isi seteaza propriul
+ `gcSyncDir`** - altfel testul scrie semafoarele intr-un folder si `vfp_ui_harness.ps1` le
+ asteapta in cel implicit (`uisync\`), deadlock pana la timeout. Simptom identic cu "test
+ agatat", dar FARA `.ERR` si cu CPU ~0 la procesul vfp9 (nu un dialog modal - procesul chiar
+ asteapta un fisier care nu vine). Timeout minim: ~30s x numarul de pasi din `-Steps`
+ (auto-continue per checkpoint din `HarnessWaitContinue`), plus marja de pornire.
+o. **Formularul resincronizeaza singur dupa o alegere din grid** (`lSyncPending` + `tmrSync`,
+ ex. `do_modifica_explicatie_tva` din `ointroduceri.vcx`): starea de imediat dupa actiune NU e
+ observabila - `DOEVENTS FORCE` lasa timer-ul sa porneasca, iar resincronizarea rescrie ce
+ tocmai s-a aplicat (la explicatia TVA: randul S revine la familia documentului si randurile T
+ se realiniaza dupa el). Scrie assert-urile pe starea de DUPA resincronizare si alege un efect
+ pe care resincronizarea NU il repara (acolo: `scc`-ul randului T, atins doar cand se schimba
+ explicatia). Altfel testul pica fara sa fie ceva gresit in cod.
diff --git a/programe/ointroduceri.prg b/programe/ointroduceri.prg
index 314ff28..abcfda9 100644
--- a/programe/ointroduceri.prg
+++ b/programe/ointroduceri.prg
@@ -80,6 +80,13 @@
*!* In xsets s-a modificat 21% de la 01.08.2025
+*!* 28.07.2026
+*!* marius.mutu
+*!* achizitie_import - blocul de TVA din DVI poate avea valuta si curs proprii, diferite de ale
+*!* facturii (inclusiv fara valuta), iar factura poate avea discount financiar; cursorul introdc
+*!* primeste coloanele rand_dvi si valuta_proprie.
+
+
#Define CRLF Chr(13) + Chr(10)
********* INCEPUT: lans_Nir_Bon ***********
@@ -1557,8 +1564,8 @@ Procedure achizitie_import
poAct.id_valuta As id_valuta, poAct.Curs As Curs, poAct.nume_val As nume_val, poAct.dataact as dataact, poAct.fdoc as fdoc, poAct.id_fdoc as id_fdoc, 0 as se_scrie, poAct.tva_incasare as tva_incasare, ;
16777215 As doc_color, Space(10) As doc_label, ;
'B' As tip_rand, Space(80) As doc_key, 00000000 As nr_doc, ;
- 00000000000000.0000 As suma_doc, 00000000000000.0000 As suma_doc_val, 0 As mod_manual, ;
- Space(20) As scd_orig, Space(20) As ascd_orig ;
+ 00000000000000.0000 As suma_doc, 00000000000000.0000 As suma_doc_val, 0 As mod_manual, 0 As expl_manual, ;
+ Space(20) As scd_orig, Space(20) As ascd_orig, 0 As rand_dvi, 0 As valuta_proprie ;
FROM cnote_contabile N ;
WHERE N.id_set = poAct.id_set ;
INTO Cursor introdc Readwrite Order By ordine
@@ -1615,7 +1622,7 @@ Procedure achizitie_import
*!* 16.07.2026 claude - F1: index unic de sortare pe introdc, o singura data, inainte de Show
*!* (niciodata re-INDEX ulterior sub grid - vezi docs/propuneri_import_unificat.md)
SELECT introdc
- INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc
+ 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
SELECT introdc
diff --git a/utile/Teste/_precompile.ps1 b/utile/Teste/_precompile.ps1
index 602f70a..200b2e5 100644
--- a/utile/Teste/_precompile.ps1
+++ b/utile/Teste/_precompile.ps1
@@ -10,7 +10,15 @@ $dir = [System.IO.Path]::GetDirectoryName($Prg)
$tmpPrg = Join-Path $dir '_compile_tmp.prg'
# prg temporar care compileaza target-ul (COMPILE cu variabila; forma cu literal in ghilimele da eroare)
Set-Content -Path $tmpPrg -Value ("lcT = `"$Prg`"`r`nCOMPILE (lcT)`r`nQUIT`r`n") -Encoding ascii
-Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
+# omoara doar vfp9 proprii (linia de comanda contine folderul testului), nu instante straine
+function Stop-VfpProprii([string]$Marker) {
+ Get-CimInstance Win32_Process -Filter "Name='vfp9.exe'" -ErrorAction SilentlyContinue | ForEach-Object {
+ if ($_.CommandLine -and $_.CommandLine.ToLower().Contains($Marker.ToLower())) {
+ Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue
+ }
+ }
+}
+Stop-VfpProprii $dir
Start-Sleep -Milliseconds 500
if (Test-Path $Fxp) { [System.IO.File]::Delete($Fxp) }
@@ -48,7 +56,7 @@ foreach ($try in 1..3) {
Start-Sleep -Milliseconds 300
}
Start-Sleep -Seconds 3
- Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
+ Stop-VfpProprii $dir
Start-Sleep -Seconds 1
if (Test-Path $Fxp) { $ok = $true; break }
}
diff --git a/utile/Teste/achizitie_import/mock_caut_valuta.prg b/utile/Teste/achizitie_import/mock_caut_valuta.prg
index af50118..c92c45c 100644
--- a/utile/Teste/achizitie_import/mock_caut_valuta.prg
+++ b/utile/Teste/achizitie_import/mock_caut_valuta.prg
@@ -4,5 +4,11 @@
* (capcana l: CREATEOBJECT/ADDPROPERTY nu merg corect apelate dintr-o procedura in acest runtime).
FUNCTION caut_valuta
LPARAMETERS tnPornire, tlDesktop, tlFaraMonedaNationala
+ LOCAL loRezultat
+ IF TYPE('goMockValutaCoada') = 'O' AND !ISNULL(goMockValutaCoada) AND goMockValutaCoada.Count > 0
+ loRezultat = goMockValutaCoada.Item(1)
+ goMockValutaCoada.Remove(1)
+ RETURN loRezultat
+ ENDIF
RETURN goMockValuta
ENDFUNC
diff --git a/utile/Teste/achizitie_import/mock_cauta_alfa_tva11.prg b/utile/Teste/achizitie_import/mock_cauta_alfa_tva11.prg
new file mode 100644
index 0000000..24aae19
--- /dev/null
+++ b/utile/Teste/achizitie_import/mock_cauta_alfa_tva11.prg
@@ -0,0 +1,50 @@
+* mock_cauta_alfa_tva11.prg - shadow PROCEDURE cauta_alfa (COMUN\programe\cauta_alfa.prg) DOAR
+* pentru testul de reproducere TVA 11% pe explicatia TVA din grid (do_modifica_explicatie_tva,
+* COMUN\clase\ointroduceri.vcx). Acelasi motiv ca mock_cauta_alfa_dialog.prg (cauta_alfa real
+* populeaza cursorul din Oracle prin gencursor/CursorAdapter - nemock-uibil prin goExecutor) -
+* vezi acel fisier pentru detalii complete despre flux. Aici simplificat la modul SINGLE-SELECT:
+* do_modifica_explicatie_tva nu trimite tnTipReturn, deci cauta_alfa il impune 0 (obiect scatter
+* pe randul curent, lAles=.F.) - submit-ul e echivalentul unui dublu-click pe randul dialogului
+* (bind dblClick->do_termin activ doar in modul single-select, cauta_alfa_forms.vc2:652
+* "If !Thisform.lales"), fara nevoie de marcaj (cAles).
+*
+* Control test (setat de testul principal INAINTE de fiecare apel):
+* goDlgTva11 - formularul REAL cauta_alfa_form, pre-construit in main (capcana l:
+* CREATEOBJECT dintr-o procedura da obiect stricat in acest runtime headless)
+* gcTestTvaAlege - denumirea randului de ales (coloana "denumire" a cursorului dialogului)
+
+Procedure cauta_alfa
+ Parameters tcselect,tcfiltru,tcschema,tcorder,tccoloana,tcTitlu,tcTitluColoane, ;
+ tcNume_Proc,tl_AllInList,tcFiltruOriginal,tcPrimaColoana, tnPornire, tnTipReturn, ;
+ tcIdColumn, tlDesktop, tcGroup, tcGridDynamicBackColor, tcGridToolTip, tlModParam, tcStringCriterii, ;
+ tcProceduraVerifica, tcProceduraCopiaza,tcLocate
+
+ LOCAL lcCursor, oReturnScattObj
+
+ lcCursor = goDlgTva11.crs_cursor
+
+ SELECT (lcCursor)
+ LOCATE FOR ALLTRIM(denumire) == ALLTRIM(gcTestTvaAlege)
+ IF !FOUND()
+ GO TOP
+ ENDIF
+ IF TYPE('gcUILog') = 'C'
+ DO HarnessLog WITH 'MOCK cauta_alfa(explicatie tva) pozitionat pe [' + ALLTRIM(denumire) + '] id_jtva_coloana=' + TRANSFORM(id_jtva_coloana) + ' cota_tva=' + TRANSFORM(cota_tva)
+ ENDIF
+
+ *-- echivalentul dublu-click pe randul dialogului (submit direct, mod single-select):
+ *-- butonul OK REAL (_frm_base.do_termin: gnButon=1, Release oForm_cautare)
+ goDlgTva11.do_termin()
+ DOEVENTS FORCE
+
+ *-- de aici incolo: cod IDENTIC cu cauta_alfa.prg real (tnTipReturn=0 implicit) - SCATTER
+ *-- pe randul curent al cursorului (NU se mai atinge oForm_cautare, Release-uit mai sus)
+ SELECT (lcCursor)
+ IF gnButon = 1
+ SCATTER NAME oReturnScattObj MEMO
+ ELSE
+ SCATTER NAME oReturnScattObj MEMO BLANK
+ ENDIF
+ RETURN oReturnScattObj
+
+Endproc && cauta_alfa (shadow test tva11)
diff --git a/utile/Teste/achizitie_import/mock_oscrie_in_fisiere.prg b/utile/Teste/achizitie_import/mock_oscrie_in_fisiere.prg
new file mode 100644
index 0000000..58eda9c
--- /dev/null
+++ b/utile/Teste/achizitie_import/mock_oscrie_in_fisiere.prg
@@ -0,0 +1,19 @@
+* mock_oscrie_in_fisiere.prg - inlocuieste oscrie_in_fisiere (COMUN\programe\oscrie_in_fisiere.prg)
+* in testul e2e - functia reala face scriere Oracle NATIVA (SQLSetprop pe gnHandle, conexiune
+* SQLCONNECT reala), imposibil de mock-uit prin goExecutor/dummyexecutor (acela intercepteaza
+* doar apeluri oExecute/oExecuta, nu SQL nativ). Fara mock, testul se opreste la eroarea 1466
+* "Connection handle is invalid" - asteptata, nu bug (vezi handoff_dvi_discount.md).
+* Incarcat cu SET PROCEDURE ADDITIVE INAINTE de fisierele reale (castiga primul incarcat,
+* capcana g - vezi antetul mock_caut_valuta.prg). Foloseste DOAR in test_e2e_dvi_ron_discount.prg,
+* NU global pentru suita - scrierea reala in ACT/actactan trebuie testata separat, cu conexiune
+* Oracle vie (nu aici).
+* Contract: aceiasi parametri ca apelul real (tnScrie_Sterge, tlModificare, tlRul,
+* tlNuSuprascrieCod, tlLoadBackup - vezi oscrie_in_fisiere.prg:14), intoarce 1 (succes - acelasi
+* cod folosit de functia reala la finalul ei, linia 108/167).
+FUNCTION oscrie_in_fisiere
+ LPARAMETERS tnScrie_Sterge, tlModificare, tlRul, tlNuSuprascrieCod, tlLoadBackup
+ IF TYPE('gcUILog') = 'C'
+ DO HarnessLog WITH 'MOCK oscrie_in_fisiere apelat: tnScrie_Sterge=' + TRANSFORM(NVL(tnScrie_Sterge,-1)) + ' tlModificare=' + TRANSFORM(NVL(tlModificare,.F.)) + ' tlRul=' + TRANSFORM(NVL(tlRul,.F.)) + ' -> succes mock'
+ ENDIF
+ RETURN 1
+ENDFUNC
\ No newline at end of file
diff --git a/utile/Teste/achizitie_import/stub_verificare/verificare.sc2 b/utile/Teste/achizitie_import/stub_verificare/verificare.sc2
new file mode 100644
index 0000000..1f94340
--- /dev/null
+++ b/utile/Teste/achizitie_import/stub_verificare/verificare.sc2
@@ -0,0 +1,41 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+*< FOXBIN2PRG: Version="1.21" SourceFile="verificare.scx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
+*
+*
+DEFINE CLASS dataenvironment AS dataenvironment
+ *< CLASSDATA: Baseclass="dataenvironment" Timestamp="" Scale="" Uniqueid="" ClassIcon="1" />
+
+ *
+ DataSource = .NULL.
+ Height = 0
+ Left = 0
+ Name = "Dataenvironment"
+ Top = 0
+ Width = 0
+ *
+
+ENDDEFINE
+
+DEFINE CLASS form1 AS form
+ *< CLASSDATA: Baseclass="form" Timestamp="" Scale="" Uniqueid="" />
+
+ *
+ AutoCenter = .T.
+ Caption = "STUB verificare (test harness only)"
+ DoCreate = .T.
+ Height = 100
+ Name = "FORM1"
+ Visible = .F.
+ Width = 200
+ WindowType = 0
+ *
+
+ PROCEDURE Init
+ LPARAMETERS tVerificAnalitic, tAlegPartener, tnButonIntoarcere, tlNuVerificCont
+ gnButon = 1
+ RETURN .F.
+ ENDPROC
+
+ENDDEFINE
diff --git a/utile/Teste/achizitie_import/test_adauga_factura_ui.prg b/utile/Teste/achizitie_import/test_adauga_factura_ui.prg
index 3a9fae9..2965302 100644
--- a/utile/Teste/achizitie_import/test_adauga_factura_ui.prg
+++ b/utile/Teste/achizitie_import/test_adauga_factura_ui.prg
@@ -541,8 +541,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 VerificaPereche
diff --git a/utile/Teste/achizitie_import/test_adauga_repere_212.prg b/utile/Teste/achizitie_import/test_adauga_repere_212.prg
index 6a6290b..1ff6baa 100644
--- a/utile/Teste/achizitie_import/test_adauga_repere_212.prg
+++ b/utile/Teste/achizitie_import/test_adauga_repere_212.prg
@@ -535,22 +535,21 @@ TRY
DO ArLog WITH 'INFO verificare2: cmesajsync gol -> nota SINCRONIZATA'
ENDIF
- *-- runda4c (spargere doar factura principala): dupa sincronizeaza(), doar documentul
- *-- principal (primul B/S din introdc, aici nract=100/RAJA) trebuie spart in randuri S (cont
- *-- 212); documentele 102 (TRANS OIL MOTO) si 103 (BIROUL VAMAL) trebuie sa ramana B/T
- *-- neatinse (regula de domeniu: articolele apartin doar facturii principale).
- LOCAL llDoc100Spart, llDoc102Nesparte, llDoc103Nesparte
+ *-- lSpargeSecundare implicit .T. si documentele 102/103 sunt participante (lIntern=.F.,
+ *-- id_jtva_coloana nenul): dupa sincronizeaza() se sparg TOATE documentele B/S in randuri S
+ *-- pe conturile articolelor (aici doar 212), nu doar documentul principal (100/RAJA).
+ LOCAL llDoc100Spart, llDoc102Spart, llDoc103Spart
SELECT introdc
LOCATE FOR nract = 100 AND tip_rand == 'S'
llDoc100Spart = FOUND()
- LOCATE FOR nract = 102 AND tip_rand == 'B'
- llDoc102Nesparte = FOUND()
- LOCATE FOR nract = 103 AND tip_rand == 'B'
- llDoc103Nesparte = FOUND()
- IF llDoc100Spart AND llDoc102Nesparte AND llDoc103Nesparte
- DO ArLog WITH 'PASS verificare3 (runda4c spargere doar principala): doc 100/RAJA spart (rand S gasit), doc 102/103 raman B/T nesparte'
+ LOCATE FOR nract = 102 AND tip_rand == 'S'
+ llDoc102Spart = FOUND()
+ LOCATE FOR nract = 103 AND tip_rand == 'S'
+ llDoc103Spart = FOUND()
+ IF llDoc100Spart AND llDoc102Spart AND llDoc103Spart
+ DO ArLog WITH 'PASS verificare3 (lSpargeSecundare implicit): doc 100/102/103 toate sparte (rand S gasit pe fiecare)'
ELSE
- DO ArLog WITH 'FAIL verificare3 (runda4c spargere doar principala): doc100Spart=' + TRANSFORM(llDoc100Spart) + ' (astept .T.) doc102Nesparte=' + TRANSFORM(llDoc102Nesparte) + ' (astept .T.) doc103Nesparte=' + TRANSFORM(llDoc103Nesparte) + ' (astept .T.)'
+ DO ArLog WITH 'FAIL verificare3 (lSpargeSecundare implicit): doc100Spart=' + TRANSFORM(llDoc100Spart) + ' (astept .T.) doc102Spart=' + TRANSFORM(llDoc102Spart) + ' (astept .T.) doc103Spart=' + TRANSFORM(llDoc103Spart) + ' (astept .T.)'
ENDIF
*========================= PAS 2: dupa sincronizeaza() =========================
@@ -691,8 +690,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 VerificaPereche
diff --git a/utile/Teste/achizitie_import/test_analitic_partener_d.prg b/utile/Teste/achizitie_import/test_analitic_partener_d.prg
index 3753f3c..5f01851 100644
--- a/utile/Teste/achizitie_import/test_analitic_partener_d.prg
+++ b/utile/Teste/achizitie_import/test_analitic_partener_d.prg
@@ -254,7 +254,7 @@ TRY
*-- index ord_doc INAINTE de CREATEOBJECT - vezi docs/testare-ui-vfp.md capcana p.
SELECT introdc
- INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc
+ 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 ApLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)'
@@ -566,8 +566,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 DumpIntrodc
diff --git a/utile/Teste/achizitie_import/test_debifare_invaluta.prg b/utile/Teste/achizitie_import/test_debifare_invaluta.prg
index a09c487..e9dc98e 100644
--- a/utile/Teste/achizitie_import/test_debifare_invaluta.prg
+++ b/utile/Teste/achizitie_import/test_debifare_invaluta.prg
@@ -281,8 +281,8 @@ poAct.AddProperty('id_valuta', 1)
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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))
INSERT INTO introdc (tip_rand, scd, scc, ascc, suma, suma_val, id_jtva_coloana, ptva, explicatie_tva, ;
in_valuta, participa_valuta, id_valuta, curs, nume_val, nr_doc, nract, serie_act, fdoc, partc, explicatia, ;
diff --git a/utile/Teste/achizitie_import/test_discount_factura.prg b/utile/Teste/achizitie_import/test_discount_factura.prg
new file mode 100644
index 0000000..caa4b84
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_discount_factura.prg
@@ -0,0 +1,878 @@
+* test_discount_factura.prg
+* Runda32 (model B/G/T, plan docs/plan_runda32_discount_baza.md): discount financiar pe factura
+* de import - UN SINGUR rand nou tip_rand='G' (acelasi doc_key/nr_doc cu factura), creat intre
+* randul B si randul T:
+* G: scd = contul 401 (cu analitic) preluat de pe CREDITUL randului B, scc='767', suma/
+* suma_val = baza discount (POZITIVE), id_partd/partd = partenerul facturii (preluat de
+* pe creditul B), participa_valuta=.F., cota/coloana de TVA ale bazei documentului,
+* explicatia='DISCOUNT'.
+* Randul T (4426/4427) se calculeaza pe baza NETA: T.suma = (B.suma - G.suma) * ptva/100,
+* T.suma_val = (B.suma_val - G.suma_val) * ptva/100 - calculat automat de do_executa() (apelat
+* din do_adauga_factura), nu necesita pas separat.
+* Verifica: conturi/sume/semne/parteneri corecte pe G; ordinea fizica in cursor (Append Blank:
+* B -> G -> T); T calculat pe baza neta; preturile articolelor si randul D neafectate; G
+* supravietuieste sparge_document/uneste_document/sincronizeaza (nu doar la creare); stergere
+* factura (document) sterge si discountul; variante discount=0 (fara G) si factura in RON
+* (fara valuta).
+*
+* ASUMPTII (de confruntat cu implementarea reala):
+* - toDlg poarta disc_baza_lei/disc_baza_val (fara are_discount/disc_tva_lei/disc_tva_val,
+* eliminate in Runda32); discountul e activ cand Round(Nvl(toDlg.disc_baza_lei,0),gnPC)<>0;
+* - G se scrie DUPA Endcase-ul ramurii de TVA (F/D/N), inainte de crearea randului T (plan
+* pct. 6: ordinea devine B -> G -> T), clonat din randul B proaspat creat;
+* - assert-ul pe actactan/inainte_de_do_termin (:9555 zona, !Inlist(tip_rand,'D','G')) e
+* best-effort (TRY/CATCH) - harness-ul nu modeleaza integral scrierea reala in ACT/actactan;
+* - grid-ul NU are index de sortare in productie (randurile noi se adauga la finalul
+* cursorului) - verificarea de ordine se face pe RECNO fizic, imediat dupa creare, nu pe un
+* index custom.
+*
+* Rulare:
+* powershell -ExecutionPolicy Bypass -File test_discount_factura.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_discount_factura_log.txt"
+gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_discount_factura\"
+STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
+
+ON ERROR DO DcErr 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 DcLog 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 DcLog 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\mock_cauta_nom_articole.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 DcLog WITH 'SET PROCEDURE OK'
+
+ PUBLIC goMockValuta
+ goMockValuta = CREATEOBJECT('Custom')
+ goMockValuta.AddProperty('id_valuta', 978)
+ goMockValuta.AddProperty('nume_val', 'EUR')
+
+ *----- 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 gnButon
+ STORE 2 TO gnButon
+ PUBLIC gcMockArtCodmat, gcMockAcontCrt
+ gcMockArtCodmat = ''
+ gcMockAcontCrt = ''
+ PUBLIC gnMockRaspuns
+ gnMockRaspuns = 6
+
+ PUBLIC goExecutor, goApp
+ goExecutor = CREATEOBJECT('dummyexecutor')
+ goApp = CREATEOBJECT('dummyapp')
+
+ *----- poAct: antetul notei (moneda principala 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', 'RAJA')
+ 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% -----
+ 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)
+
+ 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 DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)'
+ PUBLIC goObj
+ goObj = CREATEOBJECT('IMPORT_nota', .F.)
+ IF VARTYPE(goObj) <> 'O'
+ DO DcLog 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
+
+ *========================= DOC1: FACTURA EUR + discount (100 EUR / 523.00 lei, curs 5.23) =========================
+ PUBLIC goDlg, goT, gcDocKey1, gnB1ScdCredit, gnB1IdPartc, gcB1Partc
+ DO AdaugaFactura WITH 15000, 'RAJA', 601, 100.00
+ DO HarnessStep WITH 0, 'dupa DOC1 (cu discount): introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri'
+
+ SELECT introdc
+ SET ORDER TO
+ LOCATE FOR nract = 15000 AND tip_rand == 'B'
+ =Assert3('1-DOC1: rand B gasit', IIF(FOUND(),1,0), 1)
+ LOCAL lnRecnoB1
+ lnRecnoB1 = 0
+ IF FOUND()
+ gcDocKey1 = ALLTRIM(NVL(doc_key,''))
+ gnB1IdPartc = id_partc
+ gcB1Partc = ALLTRIM(NVL(partc,''))
+ lnRecnoB1 = RECNO()
+ ENDIF
+
+ LOCAL lnCntG1, lnRecnoG1, lnRecnoT1
+ STORE 0 TO lnCntG1, lnRecnoG1, lnRecnoT1
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1
+ DO CASE
+ CASE tip_rand == 'G'
+ lnCntG1 = lnCntG1 + 1
+ lnRecnoG1 = RECNO()
+ DO DcLog WITH 'DOC1 G: scd=' + ALLTRIM(scd) + ' scc=' + ALLTRIM(scc) + ' suma=' + TRANSFORM(suma) + ' suma_val=' + TRANSFORM(suma_val) + ' id_partd=' + TRANSFORM(NVL(id_partd,0)) + ' explicatia=[' + ALLTRIM(NVL(explicatia,'')) + ']'
+ CASE tip_rand == 'T' AND lnRecnoT1 = 0
+ lnRecnoT1 = RECNO()
+ ENDCASE
+ ENDSCAN
+ =Assert3('2-DOC1: exact 1 rand G (model B/G/T)', lnCntG1, 1)
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G'
+ =Assert3('3-DOC1: randul G gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =AssertStr('4-G.scd == 401 (analitic preluat de pe creditul B)', ALLTRIM(scd), '401')
+ =AssertStr('5-G.scc == 767', ALLTRIM(scc), '767')
+ =Assert3('6-G.suma=523.00 (POZITIVA, 100 EUR x curs 5.23)', suma, 523.00)
+ =Assert3('7-G.suma_val=100.00 (POZITIVA)', suma_val, 100.00)
+ =Assert3('8-G.id_partd = partenerul facturii (preluat de pe creditul B)', NVL(id_partd,0), gnB1IdPartc)
+ =AssertStr('9-G.partd = partenerul facturii', ALLTRIM(NVL(partd,'?')), gcB1Partc)
+ =Assert3('10-G.participa_valuta=.F.', IIF(participa_valuta,1,0), 0)
+ =Assert3('11-G.ptva = cota documentului (G e baza de TVA)', NVL(ptva,0), 21)
+ =Assert3('12-G.cu_tva=1', NVL(cu_tva,0), 1)
+ =Assert3('13-G.id_jtva_coloana = coloana bazei', NVL(id_jtva_coloana,0), goDlg.nIdExplicatieTva)
+ =AssertStr('14-G.explicatia=DISCOUNT', ALLTRIM(NVL(explicatia,'?')), 'DISCOUNT')
+ =AssertStr('15-G.doc_key = doc_key facturii', ALLTRIM(NVL(doc_key,'?')), gcDocKey1)
+ ELSE
+ pnAsserts = pnAsserts + 11
+ DO DcLog WITH ' FAIL 4-15: G negasit'
+ ENDIF
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T'
+ =Assert3('16-DOC1: randul T gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('17-T.suma=988.47 ((5230.00-523.00)*21%, baza NETA)', suma, 988.47)
+ =Assert3('18-T.suma_val=189.00 ((1000.00-100.00)*21%, baza NETA in valuta)', suma_val, 189.00)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO DcLog WITH ' FAIL 17-18: T negasit'
+ ENDIF
+
+ *========================= ORDINE FIZICA IN CURSOR (Append Blank: B -> G -> T) =========================
+ =Assert3('19-ordine fizica: B/G/T gasite (recno>0)', IIF(lnRecnoB1>0 AND lnRecnoG1>0 AND lnRecnoT1>0,1,0), 1)
+ =Assert3('20-ordine fizica: RECNO(B) < RECNO(G)', IIF(lnRecnoB1 < lnRecnoG1,1,0), 1)
+ =Assert3('21-ordine fizica: RECNO(G) < RECNO(T)', IIF(lnRecnoG1 < lnRecnoT1,1,0), 1)
+
+ DO HarnessStep WITH 1, 'DOC1 (G creat, T pe baza neta) verificat - vezi log'
+
+ *========================= ARTICOL + PRETURI NEAFECTATE DE DISCOUNT =========================
+ SELECT introdc
+ SET ORDER TO ord_doc
+ gcMockArtCodmat = 'ART-BULD-212'
+ gcMockAcontCrt = '1'
+ TRY
+ goObj.do_adauga_articol()
+ CATCH TO loExcA1
+ DO DcLog WITH 'EROARE do_adauga_articol ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212'
+ IF FOUND()
+ REPLACE cant WITH 1, pret_val WITH 1000, pretd WITH 1000, pret WITH ROUND(1000*5.23,4), pret_lei WITH ROUND(1000*5.23,4)
+ ENDIF
+ goObj.gridart.Refresh()
+ DOEVENTS FORCE
+
+ LOCAL llEroareSync1
+ llEroareSync1 = .F.
+ TRY
+ goObj.sincronizeaza()
+ CATCH TO loExcS1
+ llEroareSync1 = .T.
+ DO DcLog WITH 'EROARE la sincronizeaza() ' + TRANSFORM(loExcS1.ErrorNo) + ' [' + loExcS1.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ =Assert3('22-sincronizeaza() (dupa articol) fara eroare', IIF(llEroareSync1,0,1), 1)
+
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212'
+ IF FOUND()
+ =Assert3('23-pretul articolului NEAFECTAT de discount (pretd=1000)', pretd, 1000)
+ ELSE
+ pnAsserts = pnAsserts + 1
+ DO DcLog WITH ' FAIL 23: articolul negasit dupa sincronizare'
+ ENDIF
+
+ SELECT introdc
+ LOCATE FOR tip_rand == 'D'
+ IF FOUND()
+ DO DcLog WITH 'rand D (diferenta) dupa discount+articol: suma=' + TRANSFORM(suma)
+ =Assert3('24-randul D NEAFECTAT de discount (|suma|<=0.02)', ABS(suma), 0)
+ ELSE
+ pnAsserts = pnAsserts + 1
+ pnPass = pnPass + 1
+ DO DcLog WITH ' INFO 24: nu exista rand D (diferenta 0) - OK'
+ ENDIF
+
+ *========================= G SUPRAVIETUIESTE dupa sincronizare (nu doar la creare) =========================
+ LOCAL lnCntGDupaSync
+ lnCntGDupaSync = 0
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G'
+ lnCntGDupaSync = lnCntGDupaSync + 1
+ ENDSCAN
+ =Assert3('25-dupa sincronizare (cu articol): tot 1 rand G (nu s-a dublat/sters)', lnCntGDupaSync, 1)
+
+ *-- a doua sincronizare (stabilitate la re-rulare)
+ TRY
+ goObj.sincronizeaza()
+ CATCH TO loExcS2
+ DO DcLog WITH 'EROARE la sincronizeaza() #2 ' + TRANSFORM(loExcS2.ErrorNo) + ' [' + loExcS2.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ LOCAL lnCntGDupaSync2
+ lnCntGDupaSync2 = 0
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G'
+ lnCntGDupaSync2 = lnCntGDupaSync2 + 1
+ ENDSCAN
+ =Assert3('26-dupa a doua sincronizare: tot 1 rand G (stabil)', lnCntGDupaSync2, 1)
+
+ DO HarnessStep WITH 2, 'articol/preturi/stabilitate G verificate - vezi log'
+
+ *========================= inainte_de_do_termin: G nu genereaza rand fals de finalizare NIR (best-effort) =========================
+ TRY
+ goObj.inainte_de_do_termin()
+ DO DcLog WITH 'INFO inainte_de_do_termin() rulat fara eroare'
+ IF USED('actactan')
+ LOCAL lnCntGActactan
+ lnCntGActactan = 0
+ SELECT actactan
+ SCAN FOR tip_rand == 'G'
+ lnCntGActactan = lnCntGActactan + 1
+ ENDSCAN
+ DO DcLog WITH 'actactan: ' + TRANSFORM(lnCntGActactan) + ' randuri G gasite (fara relevanta pt NIR fals - vezi INFO)'
+ ELSE
+ DO DcLog WITH 'INFO: cursorul actactan nu exista in acest harness (scriere reala neacoperita de dummyexecutor) - assert 27 omis'
+ ENDIF
+ CATCH TO loExcNir
+ DO DcLog WITH 'INFO inainte_de_do_termin() a aruncat eroare in acest harness (dependent de Oracle real): ' + loExcNir.Message + ' - assert 27 omis'
+ ENDTRY
+
+ DO HarnessStep WITH 3, 'inainte_de_do_termin (best-effort) verificat - vezi log'
+
+ *========================= STERGERE FACTURA -> STERGE SI DISCOUNTUL =========================
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'B'
+ IF !FOUND()
+ *-- dupa spargere B poate lipsi - folosesc orice rand al documentului pentru pozitionare
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1
+ ENDIF
+ =Assert3('28-rand al DOC1 gasit pentru stergere', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ gnMockRaspuns = 6 && Da = tot documentul
+ TRY
+ goObj.do_sterge()
+ CATCH TO loExcDel
+ DO DcLog WITH 'EROARE do_sterge ' + TRANSFORM(loExcDel.ErrorNo) + ' [' + loExcDel.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ ENDIF
+ LOCAL lnCntDupaStergere
+ lnCntDupaStergere = 0
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1
+ lnCntDupaStergere = lnCntDupaStergere + 1
+ ENDSCAN
+ =Assert3('29-dupa stergere document: 0 randuri ramase (inclusiv G)', lnCntDupaStergere, 0)
+
+ DO HarnessStep WITH 4, 'stergere factura + discount verificata - vezi log'
+
+ *========================= VARIANTA A: discount = 0 (fara G, T pe baza integrala) =========================
+ SELECT rul_temp
+ ZAP
+ PUBLIC gcDocKey2
+ DO AdaugaFactura WITH 15001, 'TRANS OIL', 602, 0.00
+ SELECT introdc
+ LOCATE FOR nract = 15001 AND tip_rand == 'B'
+ IF FOUND()
+ gcDocKey2 = ALLTRIM(NVL(doc_key,''))
+ ENDIF
+ LOCAL lnCntG2A
+ lnCntG2A = 0
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey2 AND tip_rand == 'G'
+ lnCntG2A = lnCntG2A + 1
+ ENDSCAN
+ =Assert3('30-VARIANTA discount=0: niciun rand G', lnCntG2A, 0)
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey2 AND tip_rand == 'T'
+ =Assert3('31-VARIANTA discount=0: randul T gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('32-VARIANTA discount=0: T.suma=1098.30 (baza integrala 5230.00*21%)', suma, 1098.30)
+ =Assert3('33-VARIANTA discount=0: T.suma_val=210.00 (baza integrala 1000.00*21%)', suma_val, 210.00)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO DcLog WITH ' FAIL 32-33: T (discount=0) negasit'
+ ENDIF
+
+ DO HarnessStep WITH 5, 'varianta discount=0 verificata - vezi log'
+
+ *========================= VARIANTA B: FACTURA IN RON (fara valuta) + discount 400 lei =========================
+ PUBLIC gcDocKey3
+ DO AdaugaFacturaRon WITH 15002, 'FURNIZOR INTERN SRL', 603, 400.00
+ SELECT introdc
+ LOCATE FOR nract = 15002 AND tip_rand == 'B'
+ IF FOUND()
+ gcDocKey3 = ALLTRIM(NVL(doc_key,''))
+ ENDIF
+ LOCAL lnCntG3
+ lnCntG3 = 0
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey3 AND tip_rand == 'G'
+ lnCntG3 = lnCntG3 + 1
+ =Assert3('34.'+TRANSFORM(RECNO())+'-VARIANTA RON: G.suma_val=0 (fara valuta)', NVL(suma_val,0), 0)
+ ENDSCAN
+ =Assert3('35-VARIANTA RON: exact 1 rand G', lnCntG3, 1)
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey3 AND tip_rand == 'G'
+ IF FOUND()
+ =Assert3('36-VARIANTA RON: G.suma=400.00', suma, 400.00)
+ ELSE
+ pnAsserts = pnAsserts + 1
+ DO DcLog WITH ' FAIL 36: G (RON) negasit'
+ ENDIF
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey3 AND tip_rand == 'T'
+ IF FOUND()
+ =Assert3('37-VARIANTA RON: T.suma=336.00 ((2000.00-400.00)*21%)', suma, 336.00)
+ =Assert3('38-VARIANTA RON: T.suma_val=0 (fara valuta)', NVL(suma_val,0), 0)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO DcLog WITH ' FAIL 37-38: T (RON) negasit'
+ ENDIF
+
+ DO HarnessStep WITH 6, 'varianta factura RON + discount verificata - vezi log'
+
+ DO DcLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
+ IF pnPass = pnAsserts
+ DO DcLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
+ ELSE
+ DO DcLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
+ ENDIF
+
+ DO HarnessStep WITH 7, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
+ DO HarnessDone WITH 'done'
+
+CATCH TO loExc
+ DO DcLog 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 AdaugaFactura
+ *-- FACTURA EUR curs 5.23, 1000 EUR, TVA pe furnizor (F, normal - discountul e independent
+ *-- de ramura TVA); baza discountul e in EUR (aceeasi unitate ca suma facturii).
+ LPARAMETERS tnNract, tcPartener, tnIdPartener, tnDiscBazaVal
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = tnNract
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = tnIdPartener
+ goDlg.cPartener = tcPartener
+ goDlg.cExplicatia = 'Import marfa ' + tcPartener
+ goDlg.nSuma = 1000
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 5.23
+ goDlg.nIdValuta = 978
+ goDlg.cValuta = 'EUR'
+ goDlg.nIdExplicatieTva = 208
+ goDlg.cExplicatieTva = 'ACH. INT. 21%'
+ goDlg.optTipTva.Value = 1 && F = furnizor (normal)
+ goDlg.chkInValutaCont.Value = 1
+ goDlg.chkParticipaValuta.Value = 1
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO DcLog WITH 'DOC ' + TRANSFORM(tnNract) + ': valideaza = ' + TRANSFORM(goDlg.valideaza())
+ DO ConstruiesteToDlgF1F2 WITH ROUND(tnDiscBazaVal*5.23,4), tnDiscBazaVal
+ DO DcLog WITH 'DOC ' + TRANSFORM(tnNract) + ': do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT))
+ goDlg.Hide()
+ DOEVENTS FORCE
+ENDPROC
+
+PROCEDURE AdaugaFacturaRon
+ *-- Varianta FACTURA IN RON (fara valuta) + discount - disc_baza_val=0.
+ LPARAMETERS tnNract, tcPartener, tnIdPartener, tnDiscBazaLei
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = tnNract
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = tnIdPartener
+ goDlg.cPartener = tcPartener
+ goDlg.cExplicatia = 'Achizitie ' + tcPartener
+ goDlg.nSuma = 2000
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 0
+ goDlg.nIdExplicatieTva = 208
+ goDlg.cExplicatieTva = 'ACH. INT. 21%'
+ goDlg.optTipTva.Value = 1
+ goDlg.chkInValutaCont.Value = 0
+ goDlg.chkParticipaValuta.Value = 1
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO DcLog WITH 'DOC ' + TRANSFORM(tnNract) + ' (RON): valideaza = ' + TRANSFORM(goDlg.valideaza())
+ DO ConstruiesteToDlgF1F2 WITH tnDiscBazaLei, 0
+ DO DcLog WITH 'DOC ' + TRANSFORM(tnNract) + ' (RON): do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT))
+ goDlg.Hide()
+ DOEVENTS FORCE
+ENDPROC
+
+PROCEDURE ConstruiesteToDlgF1F2
+ *-- Runda32: doar disc_baza_lei/disc_baza_val (are_discount/disc_tva_lei/disc_tva_val
+ *-- eliminate din construieste_todlg).
+ LPARAMETERS tnDiscBazaLei, tnDiscBazaVal
+ 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)
+ =ADDPROPERTY(goT,'dvi_serie','')
+ =ADDPROPERTY(goT,'dvi_nract',0)
+ =ADDPROPERTY(goT,'dvi_dataact',DATE())
+ =ADDPROPERTY(goT,'dvi_id_fdoc',0)
+ =ADDPROPERTY(goT,'dvi_fdoc','')
+ =ADDPROPERTY(goT,'dvi_id_partc',0)
+ =ADDPROPERTY(goT,'dvi_partc','')
+ =ADDPROPERTY(goT,'dvi_scc','401')
+ =ADDPROPERTY(goT,'dvi_tva_lei',0)
+ =ADDPROPERTY(goT,'dvi_tva_val',0)
+ =ADDPROPERTY(goT,'dvi_in_valuta',.F.)
+ =ADDPROPERTY(goT,'dvi_id_valuta',0)
+ =ADDPROPERTY(goT,'dvi_curs',0)
+ =ADDPROPERTY(goT,'dvi_nume_val','')
+ =ADDPROPERTY(goT,'dvi_valuta_proprie',0)
+ *-- Runda32: discount financiar - doar baza (fara are_discount/disc_tva_lei/disc_tva_val)
+ =ADDPROPERTY(goT,'disc_baza_lei',tnDiscBazaLei)
+ =ADDPROPERTY(goT,'disc_baza_val',tnDiscBazaVal)
+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
+
+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 DcLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
+ ELSE
+ DO DcLog 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 DcLog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])'
+ ELSE
+ DO DcLog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])'
+ ENDIF
+ENDPROC
+
+PROCEDURE DcErr
+ LPARAMETERS tnErr, tcMsg, tcProg, tnLine
+ DO DcLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
+ENDPROC
+
+PROCEDURE DcLog
+ 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
diff --git a/utile/Teste/achizitie_import/test_discount_factura.ps1 b/utile/Teste/achizitie_import/test_discount_factura.ps1
new file mode 100644
index 0000000..2c48a72
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_discount_factura.ps1
@@ -0,0 +1,12 @@
+# test_discount_factura.ps1 - wrapper peste harness-ul generic pentru discountul financiar pe
+# factura de import (model B/G/T, un singur rand G) - Runda32.
+# powershell -ExecutionPolicy Bypass -File test_discount_factura.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_discount_factura.prg') `
+ -Steps @('doc1_creat','doc1_g_t_verificat','articol_stabilitate','nir_best_effort','stergere_document','discount_zero','factura_ron','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_discount_factura') `
+ -SyncDir (Join-Path $Teste 'uisync_discount_factura') `
+ -StepTimeoutSec 180 `
+ -ReadyTimeoutSec 180
diff --git a/utile/Teste/achizitie_import/test_discount_multicota.prg b/utile/Teste/achizitie_import/test_discount_multicota.prg
new file mode 100644
index 0000000..8dbbdc9
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_discount_multicota.prg
@@ -0,0 +1,723 @@
+* test_discount_multicota.prg
+* Runda32 (model B/G/T): factura de import cu articole pe DOUA cote TVA (21% si 11%) + discount
+* financiar. Verifica distribuirea discountului in sparge_document (calc_baze_cota_creditor +
+* lnFactorDisc): fiecare rand T e scalat cu ACELASI factor de discount ((baza_grup_tot -
+* discount) / baza_grup_tot), aplicat pe baza PROPRIE a cotei, nu pe un singur T global.
+* Flux REAL: dialogul `import_adauga_factura` + doua `do_adauga_articol()` (cote diferite) +
+* `sincronizeaza()` (declanseaza sparge_document, documentul e principal si unic).
+*
+* Discountul se sparge si el pe cote (sparge_discount), proportional cu bazele: fiecare rand G
+* poarta cota lui, iar randurile S poarta cota articolelor lor - baza si TVA-ul sunt concordante.
+* Scenariu: factura EUR curs 5, 1500 EUR (=1000 la 21% + 500 la 11%, fara diferenta reziduala),
+* discount baza 150 EUR (10% din total):
+* - lnFactorDisc = (1500-150)/1500 = 0.9
+* - T(21%): suma_val = ROUND(1000*0.9*21/100,2) = 189.00, suma = 945.00
+* - T(11%): suma_val = ROUND(500*0.9*11/100,2) = 49.50, suma = 247.50
+* - suma T-urilor = 238.50 (val) / 1192.50 (lei) - fara reziduu de rotunjire (numere curate).
+*
+* ASUMPTII: jtva_coloane2 are 2 familii import (FO) la 21%/11% (id 220/222, coloana_jc
+* FO21B/FO11B) ca gaseste_jtva_cota sa gaseasca perechea corecta pentru a doua cota; articolele
+* au conturi DIFERITE (212/371), dar fara randuri S preexistente calc_baze_cota_creditor le da
+* la amandoua ACELASI creditor fallback (scc/ascc-ul randului B), deci crsGrupCota le separa
+* DOAR dupa cota_tva (grupare pe cota_tva+scc+ascc, nu pe cont).
+*
+* Rulare:
+* powershell -ExecutionPolicy Bypass -File test_discount_multicota.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_discount_multicota_log.txt"
+gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_discount_multicota\"
+STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
+
+ON ERROR DO McErr 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 McLog 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 McLog 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\mock_cauta_nom_articole.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 McLog WITH 'SET PROCEDURE OK'
+
+ PUBLIC goMockValuta
+ goMockValuta = CREATEOBJECT('Custom')
+ goMockValuta.AddProperty('id_valuta', 978)
+ goMockValuta.AddProperty('nume_val', 'EUR')
+
+ *----- 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 gnButon
+ STORE 2 TO gnButon
+ PUBLIC gcMockArtCodmat, gcMockAcontCrt
+ gcMockArtCodmat = ''
+ gcMockAcontCrt = ''
+ PUBLIC gnMockRaspuns
+ gnMockRaspuns = 6
+
+ PUBLIC goExecutor, goApp
+ goExecutor = CREATEOBJECT('dummyexecutor')
+ goApp = CREATEOBJECT('dummyapp')
+
+ *----- poAct: antetul notei (moneda principala EUR, curs 5) -----
+ 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', 601)
+ poAct.AddProperty('partc', 'MULTI SUPPLY SRL')
+ 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: DOUA familii import (FO), 21% si 11% -----
+ 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, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221)
+ INSERT INTO jtva_coloane2 VALUES (2, 221, 'TVA ACH. IMP. 21%', 1, 0, 1, 'FO21T', '', 21, 0)
+ INSERT INTO jtva_coloane2 VALUES (3, 222, 'ACH. IMP. 11%', 1, 0, 1, 'FO11B', 'FO11T', 11, 223)
+ INSERT INTO jtva_coloane2 VALUES (4, 223, 'TVA ACH. IMP. 11%', 1, 0, 1, 'FO11T', '', 11, 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)
+ INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ;
+ VALUES ('301205-Import de bunuri cota 11%', 301205, '', 11, 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', 220, 21, 'ACH. IMP. 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', 221, 21, 'TVA ACH. IMP. 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)
+
+ 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 McLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)'
+ PUBLIC goObj
+ goObj = CREATEOBJECT('IMPORT_nota', .F.)
+ IF VARTYPE(goObj) <> 'O'
+ DO McLog 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
+
+ *========================= FACTURA: 1500 EUR (1000@21% + 500@11%), discount 150 EUR =========================
+ PUBLIC goDlg, goT, gcDocKey1
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = 16000
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = 601
+ goDlg.cPartener = 'MULTI SUPPLY SRL'
+ goDlg.cExplicatia = 'Import marfa multicota'
+ goDlg.nSuma = 1500
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 5
+ goDlg.nIdValuta = 978
+ goDlg.cValuta = 'EUR'
+ goDlg.nIdExplicatieTva = 220
+ goDlg.cExplicatieTva = 'ACH. IMP. 21%'
+ goDlg.optTipTva.Value = 1
+ goDlg.chkInValutaCont.Value = 1
+ goDlg.chkParticipaValuta.Value = 1
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO McLog WITH 'valideaza = ' + TRANSFORM(goDlg.valideaza())
+
+ goT = CREATEOBJECT('Empty')
+ =ADDPROPERTY(goT,'serie_act','')
+ =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC))
+ =ADDPROPERTY(goT,'suma_val',goDlg.nSuma)
+ =ADDPROPERTY(goT,'in_valuta',goDlg.chkInValutaCont.Value)
+ =ADDPROPERTY(goT,'participa_valuta',.T.)
+ =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta)
+ =ADDPROPERTY(goT,'curs',goDlg.nCurs)
+ =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,'')))
+ =ADDPROPERTY(goT,'cTipTva','F')
+ =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva)
+ =ADDPROPERTY(goT,'dvi_serie','')
+ =ADDPROPERTY(goT,'dvi_nract',0)
+ =ADDPROPERTY(goT,'dvi_dataact',DATE())
+ =ADDPROPERTY(goT,'dvi_id_fdoc',0)
+ =ADDPROPERTY(goT,'dvi_fdoc','')
+ =ADDPROPERTY(goT,'dvi_id_partc',0)
+ =ADDPROPERTY(goT,'dvi_partc','')
+ =ADDPROPERTY(goT,'dvi_scc','401')
+ =ADDPROPERTY(goT,'dvi_tva_lei',0)
+ =ADDPROPERTY(goT,'dvi_tva_val',0)
+ =ADDPROPERTY(goT,'dvi_in_valuta',.F.)
+ =ADDPROPERTY(goT,'dvi_id_valuta',0)
+ =ADDPROPERTY(goT,'dvi_curs',0)
+ =ADDPROPERTY(goT,'dvi_nume_val','')
+ =ADDPROPERTY(goT,'dvi_valuta_proprie',0)
+ =ADDPROPERTY(goT,'disc_baza_lei',ROUND(150*5,gnPC))
+ =ADDPROPERTY(goT,'disc_baza_val',150)
+
+ LOCAL llOkAdauga
+ llOkAdauga = goObj.do_adauga_factura(goT)
+ =Assert3('1-do_adauga_factura(goT) reuseste', IIF(llOkAdauga,1,0), 1)
+ goDlg.Hide()
+ DOEVENTS FORCE
+
+ SELECT introdc
+ SET ORDER TO
+ LOCATE FOR nract = 16000 AND tip_rand == 'B'
+ IF FOUND()
+ gcDocKey1 = ALLTRIM(NVL(doc_key,''))
+ ENDIF
+ SELECT introdc
+ SET ORDER TO ord_doc
+
+ DO HarnessStep WITH 0, 'factura creata, doc_key=' + gcDocKey1
+
+ *========================= DOUA ARTICOLE, COTE DIFERITE (21% si 11%) =========================
+ gcMockArtCodmat = 'ART-BULD-212'
+ gcMockAcontCrt = ''
+ TRY
+ goObj.do_adauga_articol()
+ CATCH TO loExcA1
+ DO McLog WITH 'EROARE do_adauga_articol (1) ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212'
+ IF FOUND()
+ REPLACE cant WITH 1, pret_val WITH 1000, pretd WITH 1000, pret WITH ROUND(1000*5,4), ;
+ pret_lei WITH ROUND(1000*5,4), cota_tva WITH 21
+ ENDIF
+
+ gcMockArtCodmat = 'ART-A8-371'
+ TRY
+ goObj.do_adauga_articol()
+ CATCH TO loExcA2
+ DO McLog WITH 'EROARE do_adauga_articol (2) ' + TRANSFORM(loExcA2.ErrorNo) + ' [' + loExcA2.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371'
+ IF FOUND()
+ REPLACE cant WITH 1, pret_val WITH 500, pretd WITH 500, pret WITH ROUND(500*5,4), ;
+ pret_lei WITH ROUND(500*5,4), cota_tva WITH 11
+ ENDIF
+ goObj.gridart.Refresh()
+ DOEVENTS FORCE
+
+ =Assert3('2-doua articole in rul_temp', RECCOUNT_ACTIVE('rul_temp'), 2)
+
+ DO HarnessStep WITH 1, 'articole (21% si 11%) adaugate'
+
+ *========================= sincronizeaza() (declanseaza sparge_document) =========================
+ LOCAL llEroareSync
+ llEroareSync = .F.
+ TRY
+ goObj.sincronizeaza()
+ CATCH TO loExcS
+ llEroareSync = .T.
+ DO McLog WITH 'EROARE sincronizeaza() ' + TRANSFORM(loExcS.ErrorNo) + ' [' + loExcS.Message + '] in ' + loExcS.Procedure + ':' + TRANSFORM(loExcS.LineNo)
+ ENDTRY
+ DOEVENTS FORCE
+ =Assert3('3-sincronizeaza() fara eroare', IIF(llEroareSync,0,1), 1)
+
+ *========================= G: discountul se sparge pe cote (baza TVA-ului) =========================
+ LOCAL lnCntG, lnSumGVal, lnSumG
+ STORE 0 TO lnCntG, lnSumGVal, lnSumG
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G'
+ lnCntG = lnCntG + 1
+ lnSumGVal = lnSumGVal + suma_val
+ lnSumG = lnSumG + suma
+ ENDSCAN
+ =Assert3('4-doua randuri G (unul pe cota)', lnCntG, 2)
+ =Assert3('4a-total discount valuta pastrat', lnSumGVal, 150.00)
+ =Assert3('4b-total discount lei pastrat', lnSumG, 750.00)
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' AND ptva == 21
+ =Assert3('5-G(21%) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('5a-G(21%).suma_val=100.00 (150*1000/1500)', suma_val, 100.00)
+ =Assert3('5b-G(21%).suma=500.00', suma, 500.00)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO McLog WITH ' FAIL 5a-5b: G(21%) negasit'
+ ENDIF
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' AND ptva == 11
+ =Assert3('6-G(11%) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('6a-G(11%).suma_val=50.00 (150*500/1500)', suma_val, 50.00)
+ =Assert3('6b-G(11%).suma=250.00', suma, 250.00)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO McLog WITH ' FAIL 6a-6b: G(11%) negasit'
+ ENDIF
+
+ *========================= T-uri: cate unul pe cota, scalate cu acelasi factor de discount =========================
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' AND ptva == 21
+ =Assert3('7-T(21%) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('8-T(21%).suma_val=189.00 (1000*0.9*21%)', suma_val, 189.00)
+ =Assert3('9-T(21%).suma=945.00', suma, 945.00)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO McLog WITH ' FAIL 8-9: T(21%) negasit'
+ ENDIF
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' AND ptva == 11
+ =Assert3('10-T(11%) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('11-T(11%).suma_val=49.50 (500*0.9*11%)', suma_val, 49.50)
+ =Assert3('12-T(11%).suma=247.50', suma, 247.50)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO McLog WITH ' FAIL 11-12: T(11%) negasit'
+ ENDIF
+
+ LOCAL lnCntT, lnSumTVal, lnSumT
+ STORE 0 TO lnCntT, lnSumTVal, lnSumT
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T'
+ lnCntT = lnCntT + 1
+ lnSumTVal = lnSumTVal + suma_val
+ lnSumT = lnSumT + suma
+ ENDSCAN
+ =Assert3('13-exact 2 randuri T (o cota fiecare)', lnCntT, 2)
+ =Assert3('14-suma T-urilor (valuta) = 238.50, fara reziduu de rotunjire', lnSumTVal, 238.50)
+ =Assert3('15-suma T-urilor (lei) = 1192.50, fara reziduu de rotunjire', lnSumT, 1192.50)
+
+ *========================= S: cota randului de baza = cota articolelor lui =========================
+ LOCAL lnCntS
+ lnCntS = 0
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S'
+ lnCntS = lnCntS + 1
+ ENDSCAN
+ =Assert3('16-doua randuri S', lnCntS, 2)
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 21
+ =Assert3('17-S cu cota 21 (articolul de 1000)', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('17a-S(21%).suma_val=1000.00', suma_val, 1000.00)
+ ELSE
+ pnAsserts = pnAsserts + 1
+ DO McLog WITH ' FAIL 17a: S(21%) negasit'
+ ENDIF
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11
+ =Assert3('18-S cu cota 11 (articolul de 500)', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('18a-S(11%).suma_val=500.00', suma_val, 500.00)
+ ELSE
+ pnAsserts = pnAsserts + 1
+ DO McLog WITH ' FAIL 18a: S(11%) negasit'
+ ENDIF
+
+ DO HarnessStep WITH 2, 'T-uri multicota verificate - suma val=' + TRANSFORM(lnSumTVal) + ' lei=' + TRANSFORM(lnSumT)
+
+ DO McLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
+ IF pnPass = pnAsserts
+ DO McLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
+ ELSE
+ DO McLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
+ ENDIF
+
+ DO HarnessStep WITH 3, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
+ DO HarnessDone WITH 'done'
+
+CATCH TO loExc
+ DO McLog 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 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
+
+PROCEDURE CreeazaIntrodc
+ 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 McLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
+ ELSE
+ DO McLog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')'
+ ENDIF
+ENDPROC
+
+PROCEDURE McErr
+ LPARAMETERS tnErr, tcMsg, tcProg, tnLine
+ DO McLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
+ENDPROC
+
+PROCEDURE McLog
+ 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 (220, 'ACH. IMP. 21%', 1, 0, 'FO21B', 21, 221, 1, 1, 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, 2, 301204)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ;
+ VALUES (222, 'ACH. IMP. 11%', 1, 0, 'FO11B', 11, 223, 1, 3, 301205)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ;
+ VALUES (223, 'TVA ACH. IMP. 11%', 1, 0, 'FO11T', 11, 1, 4, 301205)
+ENDPROC
diff --git a/utile/Teste/achizitie_import/test_discount_multicota.ps1 b/utile/Teste/achizitie_import/test_discount_multicota.ps1
new file mode 100644
index 0000000..b305278
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_discount_multicota.ps1
@@ -0,0 +1,12 @@
+# test_discount_multicota.ps1 - wrapper peste harness-ul generic pentru discountul financiar
+# distribuit pe doua cote TVA (21%/11%) - Runda32.
+# powershell -ExecutionPolicy Bypass -File test_discount_multicota.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_discount_multicota.prg') `
+ -Steps @('factura_creata','articole_adaugate','sincronizare','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_discount_multicota') `
+ -SyncDir (Join-Path $Teste 'uisync_discount_multicota') `
+ -StepTimeoutSec 180 `
+ -ReadyTimeoutSec 180
diff --git a/utile/Teste/achizitie_import/test_discount_valuta.prg b/utile/Teste/achizitie_import/test_discount_valuta.prg
new file mode 100644
index 0000000..d650dfd
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_discount_valuta.prg
@@ -0,0 +1,624 @@
+* test_discount_valuta.prg
+* Runda32 (model B/G/T): discount financiar pe factura de import IN VALUTA - verifica suma
+* (lei) si suma_val (valuta) pe randul G (discount) si pe randul T (TVA pe baza neta), pentru
+* DOUA valute diferite (EUR cu suma_lei introdusa manual, GBP cu suma_lei auto-calculata din
+* curs) - discountul insusi e introdus in valuta facturii (aceeasi unitate ca txtSuma).
+*
+* DOC1 (EUR, curs 4.50, 1000 EUR, nSumaLei introdus manual = 4500.00):
+* discount baza = 200 EUR -> disc_baza_lei=900.00, disc_baza_val=200.00
+* G.suma=900.00, G.suma_val=200.00
+* T.suma = (4500.00-900.00)*21% = 756.00, T.suma_val = (1000.00-200.00)*21% = 168.00
+* DOC2 (GBP, curs 5.75, 500 GBP, nSumaLei auto = ROUND(500*5.75,2) = 2875.00):
+* discount baza = 60 GBP -> disc_baza_lei=345.00, disc_baza_val=60.00
+* G.suma=345.00, G.suma_val=60.00
+* T.suma = (2875.00-345.00)*21% = 531.30, T.suma_val = (500.00-60.00)*21% = 92.40
+*
+* Flux REAL: dialogul `import_adauga_factura` (toDlg construit inline, capcana l -
+* CREATEOBJECT/ADDPROPERTY nu merg dintr-o procedura in acest runtime headless).
+*
+* Rulare:
+* powershell -ExecutionPolicy Bypass -File test_discount_valuta.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_discount_valuta_log.txt"
+gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_discount_valuta\"
+STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
+
+ON ERROR DO DvErr 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 DvLog 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 DvLog 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\mock_cauta_nom_articole.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 DvLog WITH 'SET PROCEDURE OK'
+
+ PUBLIC goMockValuta
+ goMockValuta = CREATEOBJECT('Custom')
+ goMockValuta.AddProperty('id_valuta', 978)
+ goMockValuta.AddProperty('nume_val', 'EUR')
+
+ *----- 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 gnButon
+ STORE 2 TO gnButon
+ PUBLIC gcMockArtCodmat, gcMockAcontCrt
+ gcMockArtCodmat = ''
+ gcMockAcontCrt = ''
+ PUBLIC gnMockRaspuns
+ gnMockRaspuns = 6
+
+ PUBLIC goExecutor, goApp
+ goExecutor = CREATEOBJECT('dummyexecutor')
+ goApp = CREATEOBJECT('dummyapp')
+
+ *----- poAct: antetul notei (moneda principala EUR, curs 4.50) -----
+ PUBLIC poAct
+ poAct = CREATEOBJECT('Custom')
+ poAct.AddProperty('nume_val', 'EUR')
+ poAct.AddProperty('curs', 4.50)
+ 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', 'EURO IMPEX')
+ 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% -----
+ 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)
+
+ 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 DvLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)'
+ PUBLIC goObj
+ goObj = CREATEOBJECT('IMPORT_nota', .F.)
+ IF VARTYPE(goObj) <> 'O'
+ DO DvLog 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
+
+ *========================= DOC1: EUR, nSumaLei introdus manual =========================
+ PUBLIC goDlg, goT, gcDocKey1
+ DO AdaugaFacturaValuta WITH 17000, 'EURO IMPEX', 601, 978, 'EUR', 4.50, 1000, 4500.00, 200.00
+ SELECT introdc
+ SET ORDER TO
+ LOCATE FOR nract = 17000 AND tip_rand == 'B'
+ IF FOUND()
+ gcDocKey1 = ALLTRIM(NVL(doc_key,''))
+ ENDIF
+ SELECT introdc
+ SET ORDER TO ord_doc
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'B'
+ =Assert3('1-DOC1(EUR): B.suma=4500.00 (nSumaLei manual)', suma, 4500.00)
+ =Assert3('2-DOC1(EUR): B.suma_val=1000.00', suma_val, 1000.00)
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G'
+ =Assert3('3-DOC1(EUR): randul G gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('4-DOC1(EUR): G.suma=900.00', suma, 900.00)
+ =Assert3('5-DOC1(EUR): G.suma_val=200.00', suma_val, 200.00)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO DvLog WITH ' FAIL 4-5: G (DOC1) negasit'
+ ENDIF
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T'
+ =Assert3('6-DOC1(EUR): randul T gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('7-DOC1(EUR): T.suma=756.00 ((4500-900)*21%)', suma, 756.00)
+ =Assert3('8-DOC1(EUR): T.suma_val=168.00 ((1000-200)*21%)', suma_val, 168.00)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO DvLog WITH ' FAIL 7-8: T (DOC1) negasit'
+ ENDIF
+
+ DO HarnessStep WITH 0, 'DOC1 (EUR) verificat'
+
+ *========================= DOC2: GBP, nSumaLei auto-calculat din curs =========================
+ PUBLIC gcDocKey2
+ DO AdaugaFacturaValuta WITH 17001, 'BRITISH TRADE LTD', 604, 826, 'GBP', 5.75, 500, 0, 60.00
+ SELECT introdc
+ LOCATE FOR nract = 17001 AND tip_rand == 'B'
+ IF FOUND()
+ gcDocKey2 = ALLTRIM(NVL(doc_key,''))
+ ENDIF
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey2 AND tip_rand == 'B'
+ =Assert3('9-DOC2(GBP): B.suma=2875.00 (auto ROUND(500*5.75,2))', suma, 2875.00)
+ =Assert3('10-DOC2(GBP): B.suma_val=500.00', suma_val, 500.00)
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey2 AND tip_rand == 'G'
+ =Assert3('11-DOC2(GBP): randul G gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('12-DOC2(GBP): G.suma=345.00', suma, 345.00)
+ =Assert3('13-DOC2(GBP): G.suma_val=60.00', suma_val, 60.00)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO DvLog WITH ' FAIL 12-13: G (DOC2) negasit'
+ ENDIF
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey2 AND tip_rand == 'T'
+ =Assert3('14-DOC2(GBP): randul T gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('15-DOC2(GBP): T.suma=531.30 ((2875-345)*21%)', suma, 531.30)
+ =Assert3('16-DOC2(GBP): T.suma_val=92.40 ((500-60)*21%)', suma_val, 92.40)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO DvLog WITH ' FAIL 15-16: T (DOC2) negasit'
+ ENDIF
+
+ DO HarnessStep WITH 1, 'DOC2 (GBP) verificat'
+
+ DO DvLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
+ IF pnPass = pnAsserts
+ DO DvLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
+ ELSE
+ DO DvLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
+ ENDIF
+
+ DO HarnessStep WITH 2, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
+ DO HarnessDone WITH 'done'
+
+CATCH TO loExc
+ DO DvLog 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 AdaugaFacturaValuta
+ *-- factura in valuta oarecare (id/nume/curs date), discount in ACEEASI valuta ca suma.
+ LPARAMETERS tnNract, tcPartener, tnIdPartener, tnIdValuta, tcValuta, tnCurs, tnSuma, tnSumaLei, tnDiscBazaVal
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = tnNract
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = tnIdPartener
+ goDlg.cPartener = tcPartener
+ goDlg.cExplicatia = 'Import marfa ' + tcPartener
+ goDlg.nSuma = tnSuma
+ goDlg.nSumaLei = tnSumaLei
+ goDlg.nCurs = tnCurs
+ goDlg.nIdValuta = tnIdValuta
+ goDlg.cValuta = tcValuta
+ goDlg.nIdExplicatieTva = 208
+ goDlg.cExplicatieTva = 'ACH. INT. 21%'
+ goDlg.optTipTva.Value = 1
+ goDlg.chkInValutaCont.Value = 1
+ goDlg.chkParticipaValuta.Value = 1
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO DvLog WITH 'DOC ' + TRANSFORM(tnNract) + ' (' + tcValuta + '): valideaza = ' + TRANSFORM(goDlg.valideaza())
+
+ goT = CREATEOBJECT('Empty')
+ =ADDPROPERTY(goT,'serie_act','')
+ =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.nSumaLei<>0,goDlg.nSumaLei,ROUND(goDlg.nSuma*goDlg.nCurs,gnPC)))
+ =ADDPROPERTY(goT,'suma_val',goDlg.nSuma)
+ =ADDPROPERTY(goT,'in_valuta',1)
+ =ADDPROPERTY(goT,'participa_valuta',.T.)
+ =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta)
+ =ADDPROPERTY(goT,'curs',goDlg.nCurs)
+ =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,'')))
+ =ADDPROPERTY(goT,'cTipTva','F')
+ =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva)
+ =ADDPROPERTY(goT,'dvi_serie','')
+ =ADDPROPERTY(goT,'dvi_nract',0)
+ =ADDPROPERTY(goT,'dvi_dataact',DATE())
+ =ADDPROPERTY(goT,'dvi_id_fdoc',0)
+ =ADDPROPERTY(goT,'dvi_fdoc','')
+ =ADDPROPERTY(goT,'dvi_id_partc',0)
+ =ADDPROPERTY(goT,'dvi_partc','')
+ =ADDPROPERTY(goT,'dvi_scc','401')
+ =ADDPROPERTY(goT,'dvi_tva_lei',0)
+ =ADDPROPERTY(goT,'dvi_tva_val',0)
+ =ADDPROPERTY(goT,'dvi_in_valuta',.F.)
+ =ADDPROPERTY(goT,'dvi_id_valuta',0)
+ =ADDPROPERTY(goT,'dvi_curs',0)
+ =ADDPROPERTY(goT,'dvi_nume_val','')
+ =ADDPROPERTY(goT,'dvi_valuta_proprie',0)
+ =ADDPROPERTY(goT,'disc_baza_lei',ROUND(tnDiscBazaVal*tnCurs,gnPC))
+ =ADDPROPERTY(goT,'disc_baza_val',tnDiscBazaVal)
+
+ DO DvLog WITH 'DOC ' + TRANSFORM(tnNract) + ' (' + tcValuta + '): do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT))
+ goDlg.Hide()
+ DOEVENTS FORCE
+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
+
+PROCEDURE CreeazaIntrodc
+ 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 Assert3
+ LPARAMETERS tcLabel, tuActual, tuExpected
+ pnAsserts = pnAsserts + 1
+ IF ABS(NVL(tuActual,0) - tuExpected) < 0.02
+ pnPass = pnPass + 1
+ DO DvLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
+ ELSE
+ DO DvLog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')'
+ ENDIF
+ENDPROC
+
+PROCEDURE DvErr
+ LPARAMETERS tnErr, tcMsg, tcProg, tnLine
+ DO DvLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
+ENDPROC
+
+PROCEDURE DvLog
+ 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
diff --git a/utile/Teste/achizitie_import/test_discount_valuta.ps1 b/utile/Teste/achizitie_import/test_discount_valuta.ps1
new file mode 100644
index 0000000..2dcc99a
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_discount_valuta.ps1
@@ -0,0 +1,12 @@
+# test_discount_valuta.ps1 - wrapper peste harness-ul generic pentru discountul financiar pe
+# factura de import in valuta (EUR/GBP) - suma/suma_val pe randurile G si T - Runda32.
+# powershell -ExecutionPolicy Bypass -File test_discount_valuta.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_discount_valuta.prg') `
+ -Steps @('doc1_eur','doc2_gbp','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_discount_valuta') `
+ -SyncDir (Join-Path $Teste 'uisync_discount_valuta') `
+ -StepTimeoutSec 180 `
+ -ReadyTimeoutSec 180
diff --git a/utile/Teste/achizitie_import/test_dvi_bifa_valuta.prg b/utile/Teste/achizitie_import/test_dvi_bifa_valuta.prg
new file mode 100644
index 0000000..48d7fec
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_dvi_bifa_valuta.prg
@@ -0,0 +1,613 @@
+* test_dvi_bifa_valuta.prg
+* Runda32 (control nou chkDviInValuta, sectiunea TVA DVI): factura de import IN VALUTA (EUR)
+* cu bifa "Valuta" a DVI-ului SCOASA - DVI-ul e platit doar in lei, desi factura insasi e in
+* valuta ("factura in valuta, DVI doar in lei", cazul nou din plan).
+*
+* Verifica:
+* - la Init (factura in valuta), bifa porneste BIFATA (chkInValutaCont=1, valuta <> RON);
+* - dupa scoaterea bifei: lblDviValuta/txtDviValuta/cmdDviValuta/lblDviCurs/txtDviCurs
+* ascunse, nDviCurs=1; txtDviTvaVal ramane vizibil, comuta pe lei (nDviTvaVal recalculat, nu 0);
+* - randul T (DVI) creat de do_adauga_factura: FARA valuta/curs/suma_val (in_valuta=0,
+* id_valuta=0, curs=0, nume_val='', suma_val=0), suma = nDviTvaLei (introdus direct);
+* - valuta_proprie=1 (starea de valuta a DVI-ului difera de a facturii - factura are valuta,
+* DVI nu mai are, dupa scoaterea bifei).
+*
+* Flux REAL: dialogul `import_adauga_factura` (toDlg construit inline in programul principal,
+* capcana l - CREATEOBJECT/ADDPROPERTY nu merg dintr-o procedura in acest runtime headless).
+*
+* CAPCANA l (mock_caut_valuta.prg, confirmata si in test_e2e_dvi_ron_discount.prg): apelul REAL
+* goDlg.construieste_todlg() arunca eroarea 11 pe primul Addproperty in acest runtime headless
+* (CREATEOBJECT/ADDPROPERTY nu merg corect apelate dintr-o METODA, doar din programul PRINCIPAL) -
+* nu poate fi exercitat direct. toDlg se construieste inline in program, cu formula COPIATA
+* EXACT din ointroduceri.vc2 PROCEDURE construieste_todlg (~6157-6202, verificata in cache dupa
+* ce lane-ul de dialog a terminat Runda32):
+* lcDviVal = Iif(lDviValutaDirty, cDviValuta, cValuta) -- dvi_valuta_efectiva()
+* llDviFaraVal = (chkDviInValuta.Value=0) Or Empty(lcDviVal) Or Upper(lcDviVal)=='RON'
+* llFactFaraVal = Empty(cValuta) Or Upper(cValuta)=='RON'
+* llDviPropriu = (dvi_id_valuta_efectiva()<>nIdValuta Or dvi_curs_efectiv()<>nCurs)
+* dvi_valuta_proprie = Iif(llDviFaraVal And llFactFaraVal, 0, Iif(llDviFaraVal<>llFactFaraVal, 1, Iif(llDviPropriu,1,0)))
+* IMPORTANT: dvi_curs_efectiv()/dvi_id_valuta_efectiva() NU citesc nDviCurs/nDviIdValuta direct -
+* doar cand lDviValutaDirty/lDviCursDirty sunt adevarate (alegere explicita prin picker/curs
+* tastat). In acest test bifa e scoasa fara sa se atinga picker-ul/cursul DVI, deci flagurile
+* dirty raman .F. si valorile EFECTIVE raman cele ale facturii (nIdValuta/nCurs), NU nDviCurs=1
+* fortat de actualizeaza_stare_dvi_valuta() pe widget - acel 1 e doar pentru afisaj, nefolosit
+* de formula toDlg.
+* SCOPUL testului ramane do_adauga_factura() (crearea randului T dintr-un toDlg dat) - NU
+* verifica daca dialogul real produce chiar acest toDlg (blocat de capcana l).
+*
+* Rulare:
+* powershell -ExecutionPolicy Bypass -File test_dvi_bifa_valuta.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_bifa_valuta_log.txt"
+gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_dvi_bifa_valuta\"
+STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
+
+ON ERROR DO BvErr 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 BvLog 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 BvLog 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 BvLog 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) -----
+ 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', 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% -----
+ 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, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221)
+ INSERT INTO jtva_coloane2 VALUES (2, 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', 220, 21, 'ACH. IMP. 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', 221, 21, 'TVA ACH. IMP. 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)
+
+ 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 BvLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)'
+ PUBLIC goObj
+ goObj = CREATEOBJECT('IMPORT_nota', .F.)
+ IF VARTYPE(goObj) <> 'O'
+ DO BvLog 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
+
+ *========================= DIALOG: factura EUR, mod TVA DVI =========================
+ PUBLIC goDlg
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = 18000
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = 601
+ goDlg.cPartener = 'FURNIZOR EXTERN GMBH'
+ goDlg.cExplicatia = 'Import marfa, DVI fara valuta proprie'
+ goDlg.nSuma = 1000
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 5
+ 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
+
+ goDlg.cSerieDvi = ''
+ goDlg.nNractDvi = 19000
+ goDlg.dDviData = DATE()
+ goDlg.nIdFdocDVI = 2
+ goDlg.cFelDocDvi = 'DVI'
+ goDlg.nDviIdPartener = 900
+ goDlg.cDviPartener = 'DIRECTIA VAMALA'
+
+ goDlg.optTipTva.Value = 2
+ goDlg.optTipTva.InteractiveChange()
+
+ *========================= bifa Valuta DVI: porneste BIFATA (factura are valuta) =========================
+ =Assert3('1-la Init, factura in valuta: chkDviInValuta.Value=1 (bifata)', goDlg.chkDviInValuta.Value, 1)
+ =Assert3('2-la Init: txtDviValuta.Visible=1 (sectiune vizibila)', IIF(goDlg.txtDviValuta.Visible,1,0), 1)
+
+ *========================= scoatere bifa: sectiunea valuta DVI se ascunde, curs=1, tva val=0 =========================
+ goDlg.chkDviInValuta.Value = 0
+ goDlg.chkDviInValuta.InteractiveChange()
+ =Assert3('3-dupa scoatere bifa: txtDviValuta.Visible=0', IIF(goDlg.txtDviValuta.Visible,1,0), 0)
+ =Assert3('4-dupa scoatere bifa: cmdDviValuta.Visible=0', IIF(goDlg.cmdDviValuta.Visible,1,0), 0)
+ =Assert3('5-dupa scoatere bifa: txtDviCurs.Visible=0', IIF(goDlg.txtDviCurs.Visible,1,0), 0)
+ =Assert3('6-dupa scoatere bifa: txtDviTvaVal.Visible=1 (ramane vizibil, comuta pe lei)', IIF(goDlg.txtDviTvaVal.Visible,1,0), 1)
+ =Assert3('7-dupa scoatere bifa: nDviCurs=1', goDlg.nDviCurs, 1)
+ =Assert3('8-dupa scoatere bifa: nDviTvaVal=1050 (TVA recalculat in lei, nu 0)', goDlg.nDviTvaVal, 1050)
+
+ *-- TVA DVI in lei, introdusa direct (proprietate reala, ca in restul suitei - vezi
+ *-- test_dvi_dialog_ui.prg scenariul F1)
+ goDlg.nDviTvaLei = 900.00
+
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO HarnessStep WITH 0, 'dialog completat, bifa Valuta DVI scoasa'
+
+ *========================= toDlg construit inline, do_adauga_factura REAL =========================
+ *-- formula copiata exact din construieste_todlg (vezi CAPCANA l in antet) - lDviValutaDirty/
+ *-- lDviCursDirty raman .F. (nu s-a atins picker-ul/cursul DVI), deci valorile efective ale
+ *-- DVI-ului raman cele mostenite de la factura (nIdValuta/nCurs), nu nDviCurs=1 fortat de
+ *-- actualizeaza_stare_dvi_valuta() pe widget.
+ PUBLIC goT
+ LOCAL lcDviValEfectiv, llDviFaraVal, llFactFaraVal, llDviPropriu, lnDviIdValutaEfectiv, lnDviCursEfectiv, llValutaProprie
+ lnDviIdValutaEfectiv = IIF(goDlg.lDviValutaDirty, goDlg.nDviIdValuta, goDlg.nIdValuta)
+ lnDviCursEfectiv = IIF(goDlg.lDviValutaDirty OR goDlg.lDviCursDirty, goDlg.nDviCurs, goDlg.nCurs)
+ lcDviValEfectiv = IIF(goDlg.lDviValutaDirty, ALLTRIM(NVL(goDlg.cDviValuta,'')), ALLTRIM(NVL(goDlg.cValuta,'')))
+ llDviFaraVal = (goDlg.chkDviInValuta.Value = 0) OR EMPTY(lcDviValEfectiv) OR UPPER(lcDviValEfectiv) == 'RON'
+ llFactFaraVal = (EMPTY(goDlg.cValuta) OR UPPER(ALLTRIM(goDlg.cValuta)) == 'RON')
+ llDviPropriu = (lnDviIdValutaEfectiv <> goDlg.nIdValuta OR lnDviCursEfectiv <> goDlg.nCurs)
+ llValutaProprie = IIF(llDviFaraVal AND llFactFaraVal, 0, IIF(llDviFaraVal <> llFactFaraVal, 1, IIF(llDviPropriu,1,0)))
+
+ goT = CREATEOBJECT('Empty')
+ =ADDPROPERTY(goT,'serie_act','')
+ =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC))
+ =ADDPROPERTY(goT,'suma_val',goDlg.nSuma)
+ =ADDPROPERTY(goT,'in_valuta',1)
+ =ADDPROPERTY(goT,'participa_valuta',.T.)
+ =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta)
+ =ADDPROPERTY(goT,'curs',goDlg.nCurs)
+ =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,'')))
+ =ADDPROPERTY(goT,'cTipTva','D')
+ =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva)
+ =ADDPROPERTY(goT,'dvi_serie',ALLTRIM(NVL(goDlg.cSerieDvi,'')))
+ =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)
+ *-- bifa scoasa => dvi_in_valuta=.F. (llDviFaraVal), indiferent de valuta efectiva mostenita
+ =ADDPROPERTY(goT,'dvi_in_valuta',!llDviFaraVal)
+ =ADDPROPERTY(goT,'dvi_id_valuta',lnDviIdValutaEfectiv)
+ =ADDPROPERTY(goT,'dvi_curs',lnDviCursEfectiv)
+ =ADDPROPERTY(goT,'dvi_nume_val',lcDviValEfectiv)
+ =ADDPROPERTY(goT,'dvi_valuta_proprie',llValutaProprie)
+ =ADDPROPERTY(goT,'disc_baza_lei',0)
+ =ADDPROPERTY(goT,'disc_baza_val',0)
+
+ LOCAL llOkAdauga
+ llOkAdauga = goObj.do_adauga_factura(goT)
+ =Assert3('9-do_adauga_factura(goT) reuseste', IIF(llOkAdauga,1,0), 1)
+ goDlg.Hide()
+ DOEVENTS FORCE
+ DO HarnessStep WITH 1, 'document creat, dupa Termin'
+
+ *========================= randul T (DVI): fara valuta/curs/suma_val =========================
+ SELECT introdc
+ SET ORDER TO
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ =Assert3('10-randul T-DVI (rand_dvi=1) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('11-T-DVI.suma=900.00 (nDviTvaLei introdus)', suma, 900.00)
+ =Assert3('12-T-DVI.suma_val=0 (fara valuta)', NVL(suma_val,0), 0)
+ =Assert3('13-T-DVI.in_valuta=0', NVL(in_valuta,0), 0)
+ =Assert3('14-T-DVI.id_valuta=0', NVL(id_valuta,0), 0)
+ =Assert3('15-T-DVI.curs=0', NVL(curs,0), 0)
+ =AssertStr('16-T-DVI.nume_val=""', ALLTRIM(NVL(nume_val,'?')), '')
+ =Assert3('17-T-DVI.valuta_proprie=1 (factura are valuta, DVI nu mai are)', NVL(valuta_proprie,0), 1)
+ ELSE
+ pnAsserts = pnAsserts + 7
+ DO BvLog WITH ' FAIL 11-17: T-DVI negasit'
+ ENDIF
+
+ *-- randul B (baza facturii) ramane in valuta - discountul/bifa DVI nu-l afecteaza
+ SELECT introdc
+ LOCATE FOR nract = 18000 AND tip_rand == 'B'
+ =Assert3('18-randul B (baza) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('19-B.in_valuta=1 (factura ramane in valuta)', NVL(in_valuta,0), 1)
+ =Assert3('20-B.suma_val=1000.00', NVL(suma_val,0), 1000.00)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO BvLog WITH ' FAIL 19-20: B negasit'
+ ENDIF
+
+ DO HarnessStep WITH 2, 'randul T-DVI fara valuta verificat - vezi log'
+
+ DO BvLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
+ IF pnPass = pnAsserts
+ DO BvLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
+ ELSE
+ DO BvLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
+ ENDIF
+
+ DO HarnessStep WITH 3, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
+ DO HarnessDone WITH 'done'
+
+CATCH TO loExc
+ DO BvLog 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
+ 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 Assert3
+ LPARAMETERS tcLabel, tuActual, tuExpected
+ pnAsserts = pnAsserts + 1
+ IF ABS(NVL(tuActual,0) - tuExpected) < 0.02
+ pnPass = pnPass + 1
+ DO BvLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
+ ELSE
+ DO BvLog 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 BvLog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])'
+ ELSE
+ DO BvLog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])'
+ ENDIF
+ENDPROC
+
+PROCEDURE BvErr
+ LPARAMETERS tnErr, tcMsg, tcProg, tnLine
+ DO BvLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
+ENDPROC
+
+PROCEDURE BvLog
+ 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 ('')
+ 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 (220, 'ACH. IMP. 21%', 1, 0, 'FO21B', 21, 221, 1, 1, 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, 2, 301204)
+ENDPROC
diff --git a/utile/Teste/achizitie_import/test_dvi_bifa_valuta.ps1 b/utile/Teste/achizitie_import/test_dvi_bifa_valuta.ps1
new file mode 100644
index 0000000..069b7fa
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_dvi_bifa_valuta.ps1
@@ -0,0 +1,12 @@
+# test_dvi_bifa_valuta.ps1 - wrapper peste harness-ul generic pentru bifa noua "Valuta" din
+# sectiunea TVA DVI (chkDviInValuta) - Runda32.
+# powershell -ExecutionPolicy Bypass -File test_dvi_bifa_valuta.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_dvi_bifa_valuta.prg') `
+ -Steps @('dialog_bifa_scoasa','document_creat','rand_t_dvi_verificat','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_dvi_bifa_valuta') `
+ -SyncDir (Join-Path $Teste 'uisync_dvi_bifa_valuta') `
+ -StepTimeoutSec 180 `
+ -ReadyTimeoutSec 180
diff --git a/utile/Teste/achizitie_import/test_dvi_dialog_ui.prg b/utile/Teste/achizitie_import/test_dvi_dialog_ui.prg
new file mode 100644
index 0000000..a197bdc
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_dvi_dialog_ui.prg
@@ -0,0 +1,794 @@
+* 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
\ No newline at end of file
diff --git a/utile/Teste/achizitie_import/test_dvi_dialog_ui.ps1 b/utile/Teste/achizitie_import/test_dvi_dialog_ui.ps1
new file mode 100644
index 0000000..bcf9abd
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_dvi_dialog_ui.ps1
@@ -0,0 +1,11 @@
+# test_dvi_dialog_ui.ps1 - wrapper peste harness-ul generic pentru testul dialogului DVI/discount.
+# Rulare: powershell -ExecutionPolicy Bypass -File test_dvi_dialog_ui.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_dvi_dialog_ui.prg') `
+ -Steps @('nota_goala','coada_fifo_mock','precompletare_dvi','ron_pe_dvi','garda_dirty_tva_dvi','discount_fara_bifa','dirty_curs_dvi','f1_dvi_curs_zero','f2_discount_negativ_sau_max','tab_fara_modificare','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_dvi_dialog') `
+ -SyncDir (Join-Path $Teste 'uisync_dvi_dialog') `
+ -StepTimeoutSec 180 `
+ -ReadyTimeoutSec 180
\ No newline at end of file
diff --git a/utile/Teste/achizitie_import/test_dvi_multicota.prg b/utile/Teste/achizitie_import/test_dvi_multicota.prg
new file mode 100644
index 0000000..eeac8ac
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_dvi_multicota.prg
@@ -0,0 +1,718 @@
+* test_dvi_multicota.prg
+* Scenariul raportat de Marius (28.07.2026): factura de import in EUR cu discount financiar,
+* TVA-ul platit in vama (DVI) in RON si articole pe DOUA cote (21% si 11%). Verifica pe fluxul
+* REAL (dialog import_adauga_factura + do_adauga_articol + sincronizeaza) ca toate cele trei
+* familii de randuri ale documentului ajung pe cotele articolelor, concordant:
+* - S (baza): cate un rand pe cont+cota, cu ptva-ul articolelor lui (creeaza_rand_s + tnCota);
+* - G (discount): spart proportional cu bazele pe cota (sparge_discount), total pastrat;
+* - T (TVA DVI, rand protejat valuta_proprie=1): spart pe cote cu pondere baza x cota
+* (sparge_tva_protejat), total pastrat = suma tastata de pe DVI.
+*
+* Cifre: 1500 EUR (1000@21% + 500@11%), curs 5, discount 150 EUR (10%), TVA DVI 1192.50 lei
+* (= TVA-ul corect pe baze diminuate: (1000-100)*21% + (500-50)*11% = 238.50 EUR x 5).
+* - G: 100 EUR (500 lei) pe 21% + 50 EUR (250 lei) pe 11%
+* - T: 1192.50 * 210/265 = 945.00 lei pe 21% + 1192.50 * 55/265 = 247.50 lei pe 11%
+* (ponderi: 1000*21% = 210, 500*11% = 55), suma_val = 0 pe ambele (DVI in RON).
+*
+* Rulare:
+* powershell -ExecutionPolicy Bypass -File test_dvi_multicota.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_multicota_log.txt"
+gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_dvi_multicota\"
+STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
+
+ON ERROR DO McErr 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 McLog 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 McLog 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\mock_cauta_nom_articole.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 McLog WITH 'SET PROCEDURE OK'
+
+ PUBLIC goMockValuta
+ goMockValuta = CREATEOBJECT('Custom')
+ goMockValuta.AddProperty('id_valuta', 978)
+ goMockValuta.AddProperty('nume_val', 'EUR')
+
+ *----- 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 gnButon
+ STORE 2 TO gnButon
+ PUBLIC gcMockArtCodmat, gcMockAcontCrt
+ gcMockArtCodmat = ''
+ gcMockAcontCrt = ''
+ PUBLIC gnMockRaspuns
+ gnMockRaspuns = 6
+
+ PUBLIC goExecutor, goApp
+ goExecutor = CREATEOBJECT('dummyexecutor')
+ goApp = CREATEOBJECT('dummyapp')
+
+ *----- poAct: antetul notei (moneda principala EUR, curs 5) -----
+ 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', 601)
+ poAct.AddProperty('partc', 'MULTI SUPPLY SRL')
+ 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: DOUA familii import (FO), 21% si 11% -----
+ 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, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221)
+ INSERT INTO jtva_coloane2 VALUES (2, 221, 'TVA ACH. IMP. 21%', 1, 0, 1, 'FO21T', '', 21, 0)
+ INSERT INTO jtva_coloane2 VALUES (3, 222, 'ACH. IMP. 11%', 1, 0, 1, 'FO11B', 'FO11T', 11, 223)
+ INSERT INTO jtva_coloane2 VALUES (4, 223, 'TVA ACH. IMP. 11%', 1, 0, 1, 'FO11T', '', 11, 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)
+ INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ;
+ VALUES ('301205-Import de bunuri cota 11%', 301205, '', 11, 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', 220, 21, 'ACH. IMP. 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', 221, 21, 'TVA ACH. IMP. 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)
+
+ 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 McLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)'
+ PUBLIC goObj
+ goObj = CREATEOBJECT('IMPORT_nota', .F.)
+ IF VARTYPE(goObj) <> 'O'
+ DO McLog 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
+
+ *========================= FACTURA: 1500 EUR (1000@21% + 500@11%), discount 150 EUR =========================
+ PUBLIC goDlg, goT, gcDocKey1
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = 17000
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = 601
+ goDlg.cPartener = 'MULTI SUPPLY SRL'
+ goDlg.cExplicatia = 'Import marfa multicota'
+ goDlg.nSuma = 1500
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 5
+ goDlg.nIdValuta = 978
+ goDlg.cValuta = 'EUR'
+ goDlg.nIdExplicatieTva = 220
+ goDlg.cExplicatieTva = 'ACH. IMP. 21%'
+ goDlg.optTipTva.Value = 2
+ goDlg.chkInValutaCont.Value = 1
+ goDlg.chkParticipaValuta.Value = 1
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO McLog WITH 'valideaza = ' + TRANSFORM(goDlg.valideaza())
+
+ goT = CREATEOBJECT('Empty')
+ =ADDPROPERTY(goT,'serie_act','')
+ =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC))
+ =ADDPROPERTY(goT,'suma_val',goDlg.nSuma)
+ =ADDPROPERTY(goT,'in_valuta',goDlg.chkInValutaCont.Value)
+ =ADDPROPERTY(goT,'participa_valuta',.T.)
+ =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta)
+ =ADDPROPERTY(goT,'curs',goDlg.nCurs)
+ =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,'')))
+ =ADDPROPERTY(goT,'cTipTva','D')
+ =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva)
+ =ADDPROPERTY(goT,'dvi_serie','')
+ =ADDPROPERTY(goT,'dvi_nract',9017)
+ =ADDPROPERTY(goT,'dvi_dataact',DATE())
+ =ADDPROPERTY(goT,'dvi_id_fdoc',2)
+ =ADDPROPERTY(goT,'dvi_fdoc','DVI')
+ =ADDPROPERTY(goT,'dvi_id_partc',901)
+ =ADDPROPERTY(goT,'dvi_partc','DIRECTIA VAMALA')
+ =ADDPROPERTY(goT,'dvi_scc','401')
+ =ADDPROPERTY(goT,'dvi_tva_lei',1192.50)
+ =ADDPROPERTY(goT,'dvi_tva_val',0)
+ =ADDPROPERTY(goT,'dvi_in_valuta',.F.)
+ =ADDPROPERTY(goT,'dvi_id_valuta',0)
+ =ADDPROPERTY(goT,'dvi_curs',0)
+ =ADDPROPERTY(goT,'dvi_nume_val','')
+ =ADDPROPERTY(goT,'dvi_valuta_proprie',1)
+ =ADDPROPERTY(goT,'disc_baza_lei',ROUND(150*5,gnPC))
+ =ADDPROPERTY(goT,'disc_baza_val',150)
+
+ LOCAL llOkAdauga
+ llOkAdauga = goObj.do_adauga_factura(goT)
+ =Assert3('1-do_adauga_factura(goT) reuseste', IIF(llOkAdauga,1,0), 1)
+ goDlg.Hide()
+ DOEVENTS FORCE
+
+ SELECT introdc
+ SET ORDER TO
+ LOCATE FOR nract = 17000 AND tip_rand == 'B'
+ IF FOUND()
+ gcDocKey1 = ALLTRIM(NVL(doc_key,''))
+ ENDIF
+ SELECT introdc
+ SET ORDER TO ord_doc
+
+ DO HarnessStep WITH 0, 'factura creata, doc_key=' + gcDocKey1
+
+ *========================= DOUA ARTICOLE, COTE DIFERITE (21% si 11%) =========================
+ gcMockArtCodmat = 'ART-BULD-212'
+ gcMockAcontCrt = ''
+ TRY
+ goObj.do_adauga_articol()
+ CATCH TO loExcA1
+ DO McLog WITH 'EROARE do_adauga_articol (1) ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212'
+ IF FOUND()
+ REPLACE cant WITH 1, pret_val WITH 1000, pretd WITH 1000, pret WITH ROUND(1000*5,4), ;
+ pret_lei WITH ROUND(1000*5,4), cota_tva WITH 21
+ ENDIF
+
+ gcMockArtCodmat = 'ART-A8-371'
+ TRY
+ goObj.do_adauga_articol()
+ CATCH TO loExcA2
+ DO McLog WITH 'EROARE do_adauga_articol (2) ' + TRANSFORM(loExcA2.ErrorNo) + ' [' + loExcA2.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371'
+ IF FOUND()
+ REPLACE cant WITH 1, pret_val WITH 500, pretd WITH 500, pret WITH ROUND(500*5,4), ;
+ pret_lei WITH ROUND(500*5,4), cota_tva WITH 11
+ ENDIF
+ goObj.gridart.Refresh()
+ DOEVENTS FORCE
+
+ =Assert3('2-doua articole in rul_temp', RECCOUNT_ACTIVE('rul_temp'), 2)
+
+ DO HarnessStep WITH 1, 'articole (21% si 11%) adaugate'
+
+ *========================= sincronizeaza() (declanseaza sparge_document) =========================
+ LOCAL llEroareSync
+ llEroareSync = .F.
+ TRY
+ goObj.sincronizeaza()
+ CATCH TO loExcS
+ llEroareSync = .T.
+ DO McLog WITH 'EROARE sincronizeaza() ' + TRANSFORM(loExcS.ErrorNo) + ' [' + loExcS.Message + '] in ' + loExcS.Procedure + ':' + TRANSFORM(loExcS.LineNo)
+ ENDTRY
+ DOEVENTS FORCE
+ =Assert3('3-sincronizeaza() fara eroare', IIF(llEroareSync,0,1), 1)
+
+ *========================= G: discountul se sparge pe cote (baza TVA-ului) =========================
+ LOCAL lnCntG, lnSumGVal, lnSumG
+ STORE 0 TO lnCntG, lnSumGVal, lnSumG
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G'
+ lnCntG = lnCntG + 1
+ lnSumGVal = lnSumGVal + suma_val
+ lnSumG = lnSumG + suma
+ ENDSCAN
+ =Assert3('4-doua randuri G (unul pe cota)', lnCntG, 2)
+ =Assert3('4a-total discount valuta pastrat', lnSumGVal, 150.00)
+ =Assert3('4b-total discount lei pastrat', lnSumG, 750.00)
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' AND ptva == 21
+ =Assert3('5-G(21%) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('5a-G(21%).suma_val=100.00 (150*1000/1500)', suma_val, 100.00)
+ =Assert3('5b-G(21%).suma=500.00', suma, 500.00)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO McLog WITH ' FAIL 5a-5b: G(21%) negasit'
+ ENDIF
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' AND ptva == 11
+ =Assert3('6-G(11%) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('6a-G(11%).suma_val=50.00 (150*500/1500)', suma_val, 50.00)
+ =Assert3('6b-G(11%).suma=250.00', suma, 250.00)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO McLog WITH ' FAIL 6a-6b: G(11%) negasit'
+ ENDIF
+
+ *========================= T-uri: TVA DVI in RON, protejat, spart pe cote =========================
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' AND ptva == 21
+ =Assert3('7-T(21%) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('8-T(21%).suma=945.00 (1192.50*210/265)', suma, 945.00)
+ =Assert3('8a-T(21%).suma_val=0 (TVA DVI in RON)', suma_val, 0)
+ =Assert3('8b-T(21%) ramane rand DVI protejat', NVL(rand_dvi,0)+NVL(valuta_proprie,0), 2)
+ =Assert3('9-T(21%) partener vamal', NVL(id_partc,0), 901)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO McLog WITH ' FAIL 8-9: T(21%) negasit'
+ ENDIF
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' AND ptva == 11
+ =Assert3('10-T(11%) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('11-T(11%).suma=247.50 (1192.50*55/265)', suma, 247.50)
+ =Assert3('11a-T(11%).suma_val=0 (TVA DVI in RON)', suma_val, 0)
+ =Assert3('12-T(11%) ramane rand DVI protejat', NVL(rand_dvi,0)+NVL(valuta_proprie,0), 2)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO McLog WITH ' FAIL 11-12: T(11%) negasit'
+ ENDIF
+
+ LOCAL lnCntT, lnSumTVal, lnSumT
+ STORE 0 TO lnCntT, lnSumTVal, lnSumT
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T'
+ lnCntT = lnCntT + 1
+ lnSumTVal = lnSumTVal + suma_val
+ lnSumT = lnSumT + suma
+ ENDSCAN
+ =Assert3('13-exact 2 randuri T (o cota fiecare)', lnCntT, 2)
+ =Assert3('14-suma T-urilor (valuta) = 0 (DVI in RON)', lnSumTVal, 0)
+ =Assert3('15-suma T-urilor (lei) = 1192.50 (totalul tastat pe DVI)', lnSumT, 1192.50)
+
+ *========================= S: cota randului de baza = cota articolelor lui =========================
+ LOCAL lnCntS
+ lnCntS = 0
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S'
+ lnCntS = lnCntS + 1
+ ENDSCAN
+ =Assert3('16-doua randuri S', lnCntS, 2)
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 21
+ =Assert3('17-S cu cota 21 (articolul de 1000)', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('17a-S(21%).suma_val=1000.00', suma_val, 1000.00)
+ ELSE
+ pnAsserts = pnAsserts + 1
+ DO McLog WITH ' FAIL 17a: S(21%) negasit'
+ ENDIF
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11
+ =Assert3('18-S cu cota 11 (articolul de 500)', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('18a-S(11%).suma_val=500.00', suma_val, 500.00)
+ ELSE
+ pnAsserts = pnAsserts + 1
+ DO McLog WITH ' FAIL 18a: S(11%) negasit'
+ ENDIF
+
+ DO HarnessStep WITH 2, 'T-uri DVI multicota verificate - suma val=' + TRANSFORM(lnSumTVal) + ' lei=' + TRANSFORM(lnSumT)
+
+ DO McLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
+ IF pnPass = pnAsserts
+ DO McLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
+ ELSE
+ DO McLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
+ ENDIF
+
+ DO HarnessStep WITH 3, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
+ DO HarnessDone WITH 'done'
+
+CATCH TO loExc
+ DO McLog 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 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
+
+PROCEDURE CreeazaIntrodc
+ 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 McLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
+ ELSE
+ DO McLog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')'
+ ENDIF
+ENDPROC
+
+PROCEDURE McErr
+ LPARAMETERS tnErr, tcMsg, tcProg, tnLine
+ DO McLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
+ENDPROC
+
+PROCEDURE McLog
+ 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 (220, 'ACH. IMP. 21%', 1, 0, 'FO21B', 21, 221, 1, 1, 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, 2, 301204)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ;
+ VALUES (222, 'ACH. IMP. 11%', 1, 0, 'FO11B', 11, 223, 1, 3, 301205)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ;
+ VALUES (223, 'TVA ACH. IMP. 11%', 1, 0, 'FO11T', 11, 1, 4, 301205)
+ENDPROC
diff --git a/utile/Teste/achizitie_import/test_dvi_multicota.ps1 b/utile/Teste/achizitie_import/test_dvi_multicota.ps1
new file mode 100644
index 0000000..3b1c43a
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_dvi_multicota.ps1
@@ -0,0 +1,12 @@
+# test_dvi_multicota.ps1 - wrapper peste harness-ul generic pentru TVA-ul pe DVI + discountul financiar
+# distribuite pe doua cote TVA (21%/11%).
+# powershell -ExecutionPolicy Bypass -File test_dvi_multicota.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_dvi_multicota.prg') `
+ -Steps @('factura_creata','articole_adaugate','sincronizare','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_dvi_multicota') `
+ -SyncDir (Join-Path $Teste 'uisync_dvi_multicota') `
+ -StepTimeoutSec 180 `
+ -ReadyTimeoutSec 180
diff --git a/utile/Teste/achizitie_import/test_dvi_tva_manual.prg b/utile/Teste/achizitie_import/test_dvi_tva_manual.prg
new file mode 100644
index 0000000..fe4aba6
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_dvi_tva_manual.prg
@@ -0,0 +1,648 @@
+* test_dvi_tva_manual.prg
+* Runda30 (F1, plan fizzy-imagining-parnas.md): TVA DVI editat MANUAL in dialog (valoare
+* diferita de baza*cota) trebuie sa supravietuiasca do_executa()/sincronizeaza() - motorul
+* trebuie sa marcheze randul T rezultat cu mod_manual=1 (semantica EXISTENTA, refolosita - vezi
+* garda deja prezenta in do_executa: "If Nvl(mod_manual,0) <> 1"), nu sa rescrie suma la
+* fiecare recalculare.
+* Verifica:
+* - DOC1 (TVA DVI manual, 1200.00 <> 1098.30 auto): randul T are mod_manual=1 si suma=1200.00,
+* verificat pe CURSORUL introdc (nu doar pe proprietatea din dialog), supravietuieste
+* do_executa() si sincronizeaza();
+* - DOC2 (control, TVA DVI = baza*cota, 1098.30 exact): randul T are mod_manual=0 (nu orice
+* rand DVI devine automat manual - doar cel cu valoare divergenta).
+*
+* ASUMPTIE (de confruntat cu implementarea reala): mod_manual se determina prin COMPARAREA
+* toDlg.dvi_tva_lei cu baza*cota (nu printr-un flag suplimentar de dirty in toDlg) - vezi
+* text plan sectiunea "F1 - modificari", do_adauga_factura.
+*
+* Rulare:
+* powershell -ExecutionPolicy Bypass -File test_dvi_tva_manual.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_tva_manual_log.txt"
+gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_dvi_tva_manual\"
+STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
+
+ON ERROR DO DcErr 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 DcLog 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 DcLog 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\mock_cauta_nom_articole.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 DcLog WITH 'SET PROCEDURE OK'
+
+ PUBLIC goMockValuta
+ goMockValuta = CREATEOBJECT('Custom')
+ goMockValuta.AddProperty('id_valuta', 978)
+ goMockValuta.AddProperty('nume_val', 'EUR')
+
+ *----- 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 gnButon
+ STORE 2 TO gnButon
+ PUBLIC gcMockArtCodmat, gcMockAcontCrt
+ gcMockArtCodmat = ''
+ gcMockAcontCrt = ''
+ PUBLIC gnMockRaspuns
+ gnMockRaspuns = 6
+
+ PUBLIC goExecutor, goApp
+ goExecutor = CREATEOBJECT('dummyexecutor')
+ goApp = CREATEOBJECT('dummyapp')
+
+ *----- poAct: antetul notei (moneda principala 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', 'RAJA')
+ 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% -----
+ 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)
+
+ 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 DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)'
+ PUBLIC goObj
+ goObj = CREATEOBJECT('IMPORT_nota', .F.)
+ IF VARTYPE(goObj) <> 'O'
+ DO DcLog 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
+
+ *========================= DOC1: TVA DVI MANUAL (1200.00, diferit de auto 1098.30) =========================
+ PUBLIC goDlg, goT
+ DO AdaugaDoc WITH 15000, 'RAJA', 601, 1200.00
+ DO HarnessStep WITH 0, 'dupa DOC1 (manual): introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri'
+
+ SELECT introdc
+ LOCATE FOR nract = 15086 AND Nvl(rand_dvi,0) = 1
+ =Assert3('1-DOC1: rand T-DVI gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ DO DcLog WITH 'DOC1 T-DVI: suma=' + TRANSFORM(suma) + ' mod_manual=' + TRANSFORM(NVL(mod_manual,0))
+ =Assert3('2-DOC1: T-DVI.suma=1200.00 (valoare manuala, NU 1098.30 auto)', suma, 1200.00)
+ =Assert3('3-DOC1: T-DVI.mod_manual=1 (dirty, valoare difera de baza*cota)', NVL(mod_manual,0), 1)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO DcLog WITH ' FAIL 2-3: T-DVI DOC1 negasit'
+ ENDIF
+
+ *-- garda do_executa (existenta - reutilizata prin mod_manual=1)
+ goObj.do_executa()
+ DOEVENTS FORCE
+ SELECT introdc
+ LOCATE FOR nract = 15086 AND Nvl(rand_dvi,0) = 1
+ =Assert3('4-DOC1: dupa do_executa() suma ramane 1200.00', IIF(FOUND(),suma,-1), 1200.00)
+
+ *-- sincronizare completa
+ LOCAL llEroareSync1
+ llEroareSync1 = .F.
+ TRY
+ goObj.sincronizeaza()
+ CATCH TO loExcS1
+ llEroareSync1 = .T.
+ DO DcLog WITH 'EROARE la sincronizeaza() DOC1 ' + TRANSFORM(loExcS1.ErrorNo) + ' [' + loExcS1.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ =Assert3('5-DOC1: sincronizeaza() fara eroare', IIF(llEroareSync1,0,1), 1)
+ SELECT introdc
+ LOCATE FOR nract = 15086 AND Nvl(rand_dvi,0) = 1
+ =Assert3('6-DOC1: dupa sincronizeaza() suma ramane 1200.00', IIF(FOUND(),suma,-1), 1200.00)
+ IF FOUND()
+ =Assert3('7-DOC1: dupa sincronizeaza() mod_manual ramane 1', NVL(mod_manual,0), 1)
+ ELSE
+ pnAsserts = pnAsserts + 1
+ ENDIF
+
+ DO HarnessStep WITH 1, 'DOC1 (TVA DVI manual) verificat - vezi log'
+
+ *========================= DOC2 (CONTROL): TVA DVI = baza*cota EXACT (1098.30) =========================
+ DO AdaugaDoc WITH 15001, 'TRANS OIL', 602, 1098.30
+ DO HarnessStep WITH 2, 'dupa DOC2 (control): introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri'
+
+ SELECT introdc
+ LOCATE FOR nract = 15087 AND Nvl(rand_dvi,0) = 1
+ =Assert3('8-DOC2: rand T-DVI gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ DO DcLog WITH 'DOC2 T-DVI: suma=' + TRANSFORM(suma) + ' mod_manual=' + TRANSFORM(NVL(mod_manual,0))
+ =Assert3('9-DOC2: T-DVI.suma=1098.30 (auto, coincide cu baza*cota)', suma, 1098.30)
+ =Assert3('10-DOC2: T-DVI.mod_manual=0 (nu e marcat manual - valoarea coincide cu auto-calc)', NVL(mod_manual,0), 0)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO DcLog WITH ' FAIL 9-10: T-DVI DOC2 negasit'
+ ENDIF
+
+ DO HarnessStep WITH 3, 'DOC2 (control, TVA auto) verificat - vezi log'
+
+ DO DcLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
+ IF pnPass = pnAsserts
+ DO DcLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
+ ELSE
+ DO DcLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
+ ENDIF
+
+ DO HarnessStep WITH 4, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
+ DO HarnessDone WITH 'done'
+
+CATCH TO loExc
+ DO DcLog 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 AdaugaDoc
+ *-- FACTURA EUR curs 5.23, 1000 EUR (5230 lei), TVA pe DVI cu valuta facturii (fara
+ *-- valuta_proprie - acest test tinteste STRICT supravietuirea valorii manuale, nu
+ *-- independenta valutara, acoperita in celelalte 2 fisiere de test).
+ LPARAMETERS tnNract, tcPartener, tnIdPartener, tnDviTvaLei
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = tnNract
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = tnIdPartener
+ goDlg.cPartener = tcPartener
+ goDlg.cExplicatia = 'Import marfa ' + tcPartener
+ goDlg.nSuma = 1000
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 5.23
+ goDlg.nIdValuta = 978
+ goDlg.cValuta = 'EUR'
+ goDlg.nIdExplicatieTva = 220
+ goDlg.cExplicatieTva = 'ACH. IMP. 21%'
+ goDlg.optTipTva.Value = 2 && D = DVI
+ goDlg.chkInValutaCont.Value = 1
+ goDlg.chkParticipaValuta.Value = 1
+ goDlg.cSerieDvi = ''
+ goDlg.nNractDvi = tnNract + 86
+ goDlg.dDviData = DATE()
+ goDlg.nIdFdocDVI = 2
+ goDlg.cFelDocDvi = 'DVI'
+ goDlg.nDviIdPartener = 900
+ goDlg.cDviPartener = 'BIROUL VAMAL'
+ goDlg.nDviTvaLei = tnDviTvaLei
+ goDlg.nDviTvaVal = ROUND(tnDviTvaLei/5.23,4)
+ *-- DVI cu valuta facturii (EUR) - fara valuta_proprie, ca sa izoleze testul pe mod_manual
+ goDlg.nDviIdValuta = 978
+ goDlg.cDviValuta = 'EUR'
+ goDlg.nDviCurs = 5.23
+ goDlg.actualizeaza_stare_dvi()
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO DcLog WITH 'DOC ' + TRANSFORM(tnNract) + ': valideaza = ' + TRANSFORM(goDlg.valideaza())
+ DO ConstruiesteToDlgF1F2
+ DO DcLog WITH 'DOC ' + TRANSFORM(tnNract) + ': do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT))
+ goDlg.Hide()
+ DOEVENTS FORCE
+ENDPROC
+
+PROCEDURE ConstruiesteToDlgF1F2
+ 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)
+ =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(NVL(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(NVL(goDlg.cDviValuta,'')))=='RON') OR !(EMPTY(goDlg.cValuta) OR UPPER(ALLTRIM(NVL(goDlg.cValuta,'')))=='RON'),IIF(goDlg.nDviIdValuta<>goDlg.nIdValuta OR goDlg.nDviCurs<>goDlg.nCurs,1,0),0))
+ =ADDPROPERTY(goT,'disc_baza_lei',0)
+ =ADDPROPERTY(goT,'disc_baza_val',0)
+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
+
+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 DcLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
+ ELSE
+ DO DcLog 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 DcLog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])'
+ ELSE
+ DO DcLog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])'
+ ENDIF
+ENDPROC
+
+PROCEDURE DcErr
+ LPARAMETERS tnErr, tcMsg, tcProg, tnLine
+ DO DcLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
+ENDPROC
+
+PROCEDURE DcLog
+ 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
diff --git a/utile/Teste/achizitie_import/test_dvi_tva_manual.ps1 b/utile/Teste/achizitie_import/test_dvi_tva_manual.ps1
new file mode 100644
index 0000000..1858f36
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_dvi_tva_manual.ps1
@@ -0,0 +1,12 @@
+# test_dvi_tva_manual.ps1 - wrapper peste harness-ul generic pentru TVA DVI editat manual in
+# dialog (supravietuieste do_executa/sincronizeaza) - F1, runda30.
+# powershell -ExecutionPolicy Bypass -File test_dvi_tva_manual.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_dvi_tva_manual.prg') `
+ -Steps @('doc1_manual_creat','doc1_manual_verificat','doc2_control_creat','doc2_control_verificat','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_dvi_tva_manual') `
+ -SyncDir (Join-Path $Teste 'uisync_dvi_tva_manual') `
+ -StepTimeoutSec 180 `
+ -ReadyTimeoutSec 180
diff --git a/utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.prg b/utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.prg
new file mode 100644
index 0000000..b5c9788
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.prg
@@ -0,0 +1,769 @@
+* test_dvi_valuta_proprie_usd.prg
+* Runda30 (F1, plan fizzy-imagining-parnas.md): factura import EUR (curs 5.23) cu TVA DVI in
+* USD (curs 4.00) - a treia valuta, aleasa direct pe blocul DVI din dialog, NU printr-un al
+* doilea document DVI separat (spre deosebire de test_valuta_dvi_usd.prg, care acopera fluxul
+* VECHI cu doua documente - ramane neatins, regresie separata).
+* Verifica:
+* - randul T (TVA DVI) poarta valuta/curs proprii (USD/4.00), rand_dvi=1, valuta_proprie=1;
+* - spargere pe cote (sparge_document, prin sincronizeaza cu articole): T-ul protejat ramane
+* neatins si NU se naste niciun rand T suplimentar pe factura - TVA-ul documentului e
+* integral cel de pe DVI (altfel iese TVA dubla: o data pe DVI, o data pe factura);
+* - caz "singurul T e cel protejat" cu o singura cota pe articole: randul protejat ramane
+* neschimbat (spargerea pe cote se face doar cand articolele au cote diferite);
+* - editarea cursului pe randul T protejat in grila NU modifica Thisform.oact.curs si NU
+* corupe preturile articolelor (rul_temp);
+* - revert valuta_proprie: re-alegerea valutei documentului (EUR) pe randul protejat il
+* reseteaza la valuta_proprie=0.
+*
+* ASUMPTII (de confruntat cu implementarea reala):
+* - proprietatile de dialog nDviIdValuta/cDviValuta/nDviCurs, setate direct (fara picker);
+* - randul protejat se identifica prin rand_dvi=1 (index ord_doc nu distinge intre T-uri);
+* - revert-ul valuta_proprie se declanseaza prin Grid1.cValuta.Text1.DblClick (caut_valuta),
+* mock_caut_valuta.prg (contract vechi, valoare fixa) intoarce EUR - suficient pentru acest
+* test, deoarece valuta de revenit e chiar valuta facturii.
+*
+* Rulare:
+* powershell -ExecutionPolicy Bypass -File test_dvi_valuta_proprie_usd.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_valuta_proprie_usd_log.txt"
+gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_dvi_valuta_proprie_usd\"
+STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
+
+ON ERROR DO DcErr 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 DcLog 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 DcLog 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\mock_cauta_nom_articole.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 DcLog WITH 'SET PROCEDURE OK'
+
+ *----- goMockValuta: fix EUR (valuta facturii) - suficient pentru revert (Grid1.cValuta
+ * DblClick alege valuta documentului). goMockValutaCoada pregatit pentru contractul nou. -----
+ PUBLIC goMockValuta, goMockValutaCoada
+ goMockValuta = CREATEOBJECT('Custom')
+ goMockValuta.AddProperty('id_valuta', 978)
+ goMockValuta.AddProperty('nume_val', 'EUR')
+ goMockValutaCoada = CREATEOBJECT('Collection')
+ LOCAL loValFact, loValDvi
+ loValFact = CREATEOBJECT('Custom')
+ loValFact.AddProperty('id_valuta', 978)
+ loValFact.AddProperty('nume_val', 'EUR')
+ goMockValutaCoada.Add(loValFact)
+ loValDvi = CREATEOBJECT('Custom')
+ loValDvi.AddProperty('id_valuta', 840)
+ loValDvi.AddProperty('nume_val', 'USD')
+ goMockValutaCoada.Add(loValDvi)
+
+ *----- 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 gnButon
+ STORE 2 TO gnButon
+ PUBLIC gcMockArtCodmat, gcMockAcontCrt
+ gcMockArtCodmat = ''
+ gcMockAcontCrt = ''
+ PUBLIC gnMockRaspuns
+ gnMockRaspuns = 6
+
+ PUBLIC goExecutor, goApp
+ goExecutor = CREATEOBJECT('dummyexecutor')
+ goApp = CREATEOBJECT('dummyapp')
+
+ *----- poAct: antetul notei (moneda principala 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', 'RAJA')
+ 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% -----
+ 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)
+
+ 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 DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)'
+ PUBLIC goObj
+ goObj = CREATEOBJECT('IMPORT_nota', .F.)
+ IF VARTYPE(goObj) <> 'O'
+ DO DcLog 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
+
+ *========================= DOC1: FACTURA EUR + TVA DVI in USD (valuta proprie) =========================
+ PUBLIC goDlg, goT, gcDocKey1
+ DO AdaugaDoc1
+ DO HarnessStep WITH 0, 'dupa AdaugaDoc1: introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri'
+
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ =Assert3('1-rand T-DVI gasit (rand_dvi=1)', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ gcDocKey1 = ALLTRIM(NVL(doc_key,''))
+ DO DcLog WITH 'T-DVI: doc_key=[' + gcDocKey1 + '] suma=' + TRANSFORM(suma) + ' suma_val=' + TRANSFORM(suma_val) + ' curs=' + TRANSFORM(curs) + ' nume_val=[' + ALLTRIM(NVL(nume_val,'')) + ']'
+ =Assert3('2-T-DVI.in_valuta=1 (USD e valuta)', NVL(in_valuta,0), 1)
+ =Assert3('3-T-DVI.valuta_proprie=1 (USD <> EUR factura)', NVL(valuta_proprie,0), 1)
+ =Assert3('4-T-DVI.id_valuta=840 (USD)', NVL(id_valuta,0), 840)
+ =Assert3('5-T-DVI.curs=4.00', NVL(curs,0), 4.00)
+ =AssertStr('6-T-DVI.nume_val=USD', ALLTRIM(NVL(nume_val,'?')), 'USD')
+ =Assert3('7-T-DVI.suma_val=274.58 (1098.30/4.00)', suma_val, 274.58)
+ ELSE
+ DO DcLog WITH ' FAIL: nu exista rand T-DVI - sar restul verificarilor dependente'
+ ENDIF
+
+ *========================= ARTICOLE (flux real do_adauga_articol) - documentul devine principal =========================
+ gcMockArtCodmat = 'ART-A8-371'
+ gcMockAcontCrt = '4'
+ TRY
+ goObj.do_adauga_articol()
+ CATCH TO loExcA1
+ DO DcLog WITH 'EROARE do_adauga_articol ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371'
+ IF FOUND()
+ REPLACE cant WITH 1, pret_val WITH 1000, pretd WITH 1000, pret WITH ROUND(1000*5.23,4), pret_lei WITH ROUND(1000*5.23,4)
+ ELSE
+ DO DcLog WITH 'FAIL: articolul nu a fost adaugat de do_adauga_articol()'
+ ENDIF
+ goObj.gridart.Refresh()
+ DOEVENTS FORCE
+
+ DO HarnessStep WITH 1, 'dupa adaugare articol, rul_temp=' + TRANSFORM(RECCOUNT_ACTIVE('rul_temp'))
+
+ *========================= SINCRONIZARE (declanseaza sparge_document: singurul T e cel protejat) =========================
+ LOCAL llEroareSync
+ llEroareSync = .F.
+ TRY
+ goObj.sincronizeaza()
+ CATCH TO loExcS1
+ llEroareSync = .T.
+ DO DcLog WITH 'EROARE la sincronizeaza() ' + TRANSFORM(loExcS1.ErrorNo) + ' [' + loExcS1.Message + '] in ' + loExcS1.Procedure + ':' + TRANSFORM(loExcS1.LineNo)
+ ENDTRY
+ DOEVENTS FORCE
+ =Assert3('8-sincronizeaza() fara eroare', IIF(llEroareSync,0,1), 1)
+ DO DumpIntrodc
+
+ DO HarnessStep WITH 2, 'dupa sincronizare: introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri'
+
+ *========================= T PROTEJAT SUPRAVIETUIESTE SPARGERII, NECOMASAT/NEATINS =========================
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ =Assert3('9-dupa sincronizare: T-DVI (rand_dvi=1) inca exista', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('10-T-DVI.suma_val neschimbata (274.58)', suma_val, 274.58)
+ =Assert3('11-T-DVI.curs neschimbat (4.00)', curs, 4.00)
+ =Assert3('12-T-DVI.valuta_proprie ramane 1', NVL(valuta_proprie,0), 1)
+ ELSE
+ pnAsserts = pnAsserts + 3
+ DO DcLog WITH ' FAIL 10-12: T-DVI a disparut dupa sincronizare (sparge_document l-a atins gresit)'
+ ENDIF
+
+ *========================= NICIUN T SUPLIMENTAR PE FACTURA (TVA-ul e integral cel de pe DVI) =========================
+ LOCAL lnCntTNormale, lnCntTTotal
+ lnCntTNormale = 0
+ lnCntTTotal = 0
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T'
+ lnCntTTotal = lnCntTTotal + 1
+ IF Nvl(rand_dvi,0) = 0
+ lnCntTNormale = lnCntTNormale + 1
+ DO DcLog WITH 'T-duplicat: suma=' + TRANSFORM(suma) + ' suma_val=' + TRANSFORM(suma_val) + ' scd=[' + ALLTRIM(NVL(scd,'')) + '] partc=[' + ALLTRIM(NVL(partc,'')) + '] nume_val=[' + ALLTRIM(NVL(nume_val,'')) + ']'
+ ENDIF
+ ENDSCAN
+ =Assert3('13-niciun rand T nou pe factura (TVA-ul e doar pe DVI)', lnCntTNormale, 0)
+ =Assert3('14-un singur rand T pe document (articolele au o singura cota)', lnCntTTotal, 1)
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T'
+ IF FOUND()
+ =Assert3('15-T-ul ramas e cel protejat (rand_dvi=1)', NVL(rand_dvi,0), 1)
+ =AssertStr('16-T pastreaza valuta proprie USD', ALLTRIM(NVL(nume_val,'?')), 'USD')
+ =Assert3('17-T pastreaza suma_val tastata (274.58)', suma_val, 274.58)
+ ELSE
+ pnAsserts = pnAsserts + 3
+ DO DcLog WITH ' FAIL 15-17: nu exista niciun rand T pe document'
+ ENDIF
+
+ DO HarnessStep WITH 3, 'TVA doar pe randul DVI protejat (' + TRANSFORM(lnCntTTotal) + ' rand T pe document) - vezi log'
+
+ *========================= EDITARE CURS PE T PROTEJAT IN GRILA: oact.curs SI preturi articole NEATINSE =========================
+ LOCAL lnCursInainte, lnPretInainte
+ lnCursInainte = goObj.oact.curs
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371'
+ lnPretInainte = IIF(FOUND(),pret,-1)
+
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ =Assert3('18-rand T-DVI gasit pentru editare curs in grila', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ goObj.grid1.cCurs.text1.Value = 4.50
+ goObj.grid1.cCurs.text1.Valid()
+ DOEVENTS FORCE
+ ENDIF
+
+ =Assert3('19-dupa editare curs pe T-DVI: oact.curs NESCHIMBAT (5.23)', goObj.oact.curs, lnCursInainte)
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371'
+ =Assert3('20-dupa editare curs pe T-DVI: pretul articolului NESCHIMBAT', IIF(FOUND(),pret,-1), lnPretInainte)
+
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ IF FOUND()
+ =Assert3('21-T-DVI.curs actualizat local (4.50)', curs, 4.50)
+ =Assert3('22-T-DVI.suma_val recalculata (1098.30/4.50=244.07)', suma_val, 244.07)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO DcLog WITH ' FAIL 21-22: T-DVI negasit dupa editare curs in grila'
+ ENDIF
+
+ DO HarnessStep WITH 4, 'editare curs pe T protejat verificata (oact.curs+preturi intacte) - vezi log'
+
+ *========================= REVERT valuta_proprie: re-alegerea valutei documentului (EUR) =========================
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ =Assert3('23-rand T-DVI gasit pentru revert valuta', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ TRY
+ goObj.grid1.cValuta.text1.DblClick()
+ CATCH TO loExcRevert
+ DO DcLog WITH 'INFO cValuta.text1.DblClick a aruncat eroare (poate necesita alt trigger): ' + loExcRevert.Message
+ ENDTRY
+ DOEVENTS FORCE
+ ENDIF
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ IF FOUND()
+ DO DcLog WITH 'dupa revert: id_valuta=' + TRANSFORM(NVL(id_valuta,0)) + ' nume_val=[' + ALLTRIM(NVL(nume_val,'')) + '] valuta_proprie=' + TRANSFORM(NVL(valuta_proprie,0))
+ =Assert3('24-dupa re-alegere valuta facturii (EUR) pe T-DVI: valuta_proprie reseteaza la 0', NVL(valuta_proprie,0), 0)
+ =Assert3('25-dupa revert: id_valuta devine 978 (EUR, valuta facturii)', NVL(id_valuta,0), 978)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO DcLog WITH ' FAIL 24-25: T-DVI negasit dupa incercarea de revert'
+ ENDIF
+
+ DO HarnessStep WITH 5, 'revert valuta_proprie verificat - vezi log'
+
+ DO DcLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
+ IF pnPass = pnAsserts
+ DO DcLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
+ ELSE
+ DO DcLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
+ ENDIF
+
+ DO HarnessStep WITH 6, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
+ DO HarnessDone WITH 'done'
+
+CATCH TO loExc
+ DO DcLog 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 AdaugaDoc1
+ *-- FACTURA 15000 RAJA, 1000 EUR curs 5.23 (5230 lei), TVA pe DVI ('D'): DVI 101 BIROUL
+ *-- VAMAL, tva 1098.30 lei / 274.58 USD (curs propriu 4.00) - a treia valuta, diferita de
+ *-- EUR (factura) si de RON.
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = 15000
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = 601
+ goDlg.cPartener = 'RAJA'
+ goDlg.cExplicatia = 'Import marfa RAJA'
+ goDlg.nSuma = 1000
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 5.23
+ goDlg.nIdValuta = 978
+ goDlg.cValuta = 'EUR'
+ goDlg.nIdExplicatieTva = 220
+ goDlg.cExplicatieTva = 'ACH. IMP. 21%'
+ goDlg.optTipTva.Value = 2 && D = DVI
+ goDlg.chkInValutaCont.Value = 1
+ goDlg.chkParticipaValuta.Value = 1
+ goDlg.cSerieDvi = ''
+ goDlg.nNractDvi = 101
+ goDlg.dDviData = DATE()
+ goDlg.nIdFdocDVI = 2
+ goDlg.cFelDocDvi = 'DVI'
+ goDlg.nDviIdPartener = 900
+ goDlg.cDviPartener = 'BIROUL VAMAL'
+ goDlg.nDviTvaLei = 1098.30
+ goDlg.nDviTvaVal = 274.58
+ *-- F1 NOU: valuta/curs proprii DVI - USD, a treia valuta (diferita de EUR/factura si de RON)
+ goDlg.nDviIdValuta = 840
+ goDlg.cDviValuta = 'USD'
+ goDlg.nDviCurs = 4.00
+ goDlg.actualizeaza_stare_dvi()
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO DcLog WITH 'DOC1: valideaza = ' + TRANSFORM(goDlg.valideaza())
+ DO ConstruiesteToDlgF1F2
+ DO DcLog WITH 'DOC1: do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT))
+ goDlg.Hide()
+ DOEVENTS FORCE
+ENDPROC
+
+PROCEDURE ConstruiesteToDlgF1F2
+ 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)
+ =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(NVL(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(NVL(goDlg.cDviValuta,'')))=='RON') OR !(EMPTY(goDlg.cValuta) OR UPPER(ALLTRIM(NVL(goDlg.cValuta,'')))=='RON'),IIF(goDlg.nDviIdValuta<>goDlg.nIdValuta OR goDlg.nDviCurs<>goDlg.nCurs,1,0),0))
+ =ADDPROPERTY(goT,'disc_baza_lei',0)
+ =ADDPROPERTY(goT,'disc_baza_val',0)
+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
+
+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 DumpIntrodc
+ LOCAL lnSel
+ lnSel = SELECT()
+ SELECT introdc
+ SCAN
+ DO DcLog WITH ' recno=' + TRANSFORM(RECNO()) + ' nr_doc=' + TRANSFORM(NVL(nr_doc,0)) + ' nract=' + TRANSFORM(nract) + ' fdoc=[' + ALLTRIM(NVL(fdoc,'')) + '] tip_rand=' + tip_rand + ;
+ ' scd=' + ALLTRIM(scd) + ' scc=' + ALLTRIM(scc) + ' suma=' + TRANSFORM(suma) + ' suma_val=' + TRANSFORM(suma_val) + ;
+ ' rand_dvi=' + TRANSFORM(NVL(rand_dvi,0)) + ' valuta_proprie=' + TRANSFORM(NVL(valuta_proprie,0)) + ' doc_key=[' + ALLTRIM(doc_key) + ']'
+ ENDSCAN
+ SELECT (lnSel)
+ENDPROC
+
+PROCEDURE Assert3
+ LPARAMETERS tcLabel, tuActual, tuExpected
+ pnAsserts = pnAsserts + 1
+ IF ABS(NVL(tuActual,0) - tuExpected) < 0.02
+ pnPass = pnPass + 1
+ DO DcLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
+ ELSE
+ DO DcLog 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 DcLog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])'
+ ELSE
+ DO DcLog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])'
+ ENDIF
+ENDPROC
+
+PROCEDURE DcErr
+ LPARAMETERS tnErr, tcMsg, tcProg, tnLine
+ DO DcLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
+ENDPROC
+
+PROCEDURE DcLog
+ 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
diff --git a/utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.ps1 b/utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.ps1
new file mode 100644
index 0000000..c1c69fd
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.ps1
@@ -0,0 +1,12 @@
+# test_dvi_valuta_proprie_usd.ps1 - wrapper peste harness-ul generic pentru TVA DVI in a treia
+# valuta (USD), proprie fata de factura (EUR) - F1, runda30.
+# powershell -ExecutionPolicy Bypass -File test_dvi_valuta_proprie_usd.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_dvi_valuta_proprie_usd.prg') `
+ -Steps @('doc1_creat','articol_adaugat','sync_sparge','tva_doar_pe_dvi','curs_grid_protejat','revert_valuta_proprie','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_dvi_valuta_proprie_usd') `
+ -SyncDir (Join-Path $Teste 'uisync_dvi_valuta_proprie_usd') `
+ -StepTimeoutSec 180 `
+ -ReadyTimeoutSec 180
diff --git a/utile/Teste/achizitie_import/test_dvi_valuta_ron.prg b/utile/Teste/achizitie_import/test_dvi_valuta_ron.prg
new file mode 100644
index 0000000..6fcb84a
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_dvi_valuta_ron.prg
@@ -0,0 +1,948 @@
+* test_dvi_valuta_ron.prg
+* Runda30 (F1, plan fizzy-imagining-parnas.md): factura import EUR (curs 5.23) cu TVA DVI
+* platita in RON (fara valuta proprie a DVI - selectie explicita, diferita de valuta facturii).
+* Verifica:
+* - randul T (TVA DVI) primeste rand_dvi=1, valuta_proprie=1 (RON <> EUR factura),
+* in_valuta=0, participa_valuta=.F.;
+* - suma T NU se schimba dupa do_executa()/sincronizeaza()/recalc_tva_document() explicit;
+* - suma T e imuna la schimbarea cursului facturii (copiaza_valoare sare randul protejat);
+* - footer TVA in valuta (recalculeaza/ntva_val) EXCLUDE randul T RON chiar daca suma_val
+* ar contine reziduu (assert direct pe filtrul participa_valuta din Sum);
+* - uneste_document (test izolat, cursor construit direct) nu comaseaza un rand T protejat;
+* - debifare in_valuta la nivel de document: randurile B/S se golesc de valuta, randul T
+* protejat ramane neschimbat (deja RON) si isi pastreaza valuta_proprie=1.
+*
+* ASUMPTII (de confruntat cu implementarea reala, vezi raportul catre orchestrator):
+* - proprietatile noi de dialog se numesc nDviIdValuta, cDviValuta, nDviCurs (RON = 0/''/0);
+* - toDlg.dvi_valuta_proprie e calculat de do_adauga_factura ca 1 cand valuta/curs DVI difera
+* de valuta/curs facturii (aici construit direct in ConstruiesteToDlgF1F2, ca proxy);
+* - recalc_tva_document primeste garda suplimentara Nvl(valuta_proprie,0)=0 langa mod_manual.
+*
+* Rulare:
+* powershell -ExecutionPolicy Bypass -File test_dvi_valuta_ron.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_valuta_ron_log.txt"
+gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_dvi_valuta_ron\"
+STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
+
+ON ERROR DO DcErr 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 DcLog 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 DcLog 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\mock_cauta_nom_articole.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 DcLog WITH 'SET PROCEDURE OK'
+
+ *----- goMockValuta (contract vechi, folosit ca fallback) + goMockValutaCoada (contract nou,
+ * coada FIFO - pregatit aici pentru cand mock_caut_valuta.prg va fi actualizat separat;
+ * acest test NU invoca picker-ul cmdValuta/cmdDviValuta.Click, seteaza id_valuta/curs
+ * direct pe dialog, ca in testele existente). -----
+ PUBLIC goMockValuta, goMockValutaCoada
+ goMockValuta = CREATEOBJECT('Custom')
+ goMockValuta.AddProperty('id_valuta', 978)
+ goMockValuta.AddProperty('nume_val', 'EUR')
+ goMockValutaCoada = CREATEOBJECT('Collection')
+ LOCAL loValFact, loValDvi
+ loValFact = CREATEOBJECT('Custom')
+ loValFact.AddProperty('id_valuta', 978)
+ loValFact.AddProperty('nume_val', 'EUR')
+ goMockValutaCoada.Add(loValFact)
+ loValDvi = CREATEOBJECT('Custom')
+ loValDvi.AddProperty('id_valuta', 1)
+ loValDvi.AddProperty('nume_val', 'RON')
+ goMockValutaCoada.Add(loValDvi)
+
+ *----- 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 gnButon
+ STORE 2 TO gnButon
+ PUBLIC gcMockArtCodmat, gcMockAcontCrt
+ gcMockArtCodmat = ''
+ gcMockAcontCrt = ''
+ PUBLIC gnMockRaspuns
+ gnMockRaspuns = 6
+
+ PUBLIC goExecutor, goApp
+ goExecutor = CREATEOBJECT('dummyexecutor')
+ goApp = CREATEOBJECT('dummyapp')
+
+ *----- poAct: antetul notei (moneda principala 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', 'RAJA')
+ 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% -----
+ 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
+
+ DO DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)'
+ PUBLIC goObj
+ goObj = CREATEOBJECT('IMPORT_nota', .F.)
+ IF VARTYPE(goObj) <> 'O'
+ DO DcLog 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
+
+ *========================= DOC1: FACTURA EUR + TVA DVI in RON =========================
+ PUBLIC goDlg, goT, gcDocKey1
+ DO AdaugaDoc1
+ DO HarnessStep WITH 0, 'dupa AdaugaDoc1: introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri'
+
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ =Assert3('1-rand T-DVI gasit (rand_dvi=1)', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ gcDocKey1 = ALLTRIM(NVL(doc_key,''))
+ DO DcLog WITH 'T-DVI: doc_key=[' + gcDocKey1 + '] suma=' + TRANSFORM(suma) + ' in_valuta=' + TRANSFORM(NVL(in_valuta,0)) + ' participa_valuta=' + TRANSFORM(participa_valuta) + ' valuta_proprie=' + TRANSFORM(NVL(valuta_proprie,0))
+ =Assert3('2-T-DVI.in_valuta=0', NVL(in_valuta,0), 0)
+ =Assert3('3-T-DVI.participa_valuta=.F.', IIF(participa_valuta,1,0), 0)
+ =Assert3('4-T-DVI.valuta_proprie=1', NVL(valuta_proprie,0), 1)
+ =Assert3('5-T-DVI.id_valuta=0', NVL(id_valuta,0), 0)
+ =Assert3('6-T-DVI.curs=0', NVL(curs,0), 0)
+ =AssertStr('7-T-DVI.nume_val=""', ALLTRIM(NVL(nume_val,'?')), '')
+ =Assert3('8-T-DVI.suma=1098.30 (baza*cota auto, nemanual)', suma, 1098.30)
+ =Assert3('9-T-DVI.mod_manual=0 (valoare auto)', NVL(mod_manual,0), 0)
+ ELSE
+ DO DcLog WITH ' FAIL: nu exista rand T-DVI - sar restul verificarilor dependente'
+ ENDIF
+
+ *========================= GARDA do_executa (nu rescrie T protejat) =========================
+ goObj.do_executa()
+ DOEVENTS FORCE
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ =Assert3('10-dupa do_executa(): T-DVI.suma neschimbata (1098.30)', IIF(FOUND(),suma,-1), 1098.30)
+
+ *========================= GARDA recalc_tva_document (nu rescrie T protejat) =========================
+ IF !EMPTY(gcDocKey1)
+ TRY
+ goObj.recalc_tva_document(gcDocKey1)
+ CATCH TO loExcRtd
+ DO DcLog WITH 'INFO recalc_tva_document a aruncat eroare (poate nu accepta parametru direct): ' + loExcRtd.Message
+ ENDTRY
+ DOEVENTS FORCE
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ =Assert3('11-dupa recalc_tva_document(): T-DVI.suma neschimbata (1098.30)', IIF(FOUND(),suma,-1), 1098.30)
+ ELSE
+ pnAsserts = pnAsserts + 1
+ DO DcLog WITH ' FAIL 11: gcDocKey1 gol, nu pot apela recalc_tva_document'
+ ENDIF
+
+ *========================= SINCRONIZARE completa (pipeline complet) =========================
+ LOCAL llEroareSync
+ llEroareSync = .F.
+ TRY
+ goObj.sincronizeaza()
+ CATCH TO loExcS1
+ llEroareSync = .T.
+ DO DcLog WITH 'EROARE la sincronizeaza() ' + TRANSFORM(loExcS1.ErrorNo) + ' [' + loExcS1.Message + '] in ' + loExcS1.Procedure + ':' + TRANSFORM(loExcS1.LineNo)
+ ENDTRY
+ DOEVENTS FORCE
+ =Assert3('12-sincronizeaza() fara eroare', IIF(llEroareSync,0,1), 1)
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ =Assert3('13-dupa sincronizeaza(): rand T-DVI inca gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('14-dupa sincronizeaza(): T-DVI.suma neschimbata (1098.30)', suma, 1098.30)
+ =Assert3('15-dupa sincronizeaza(): T-DVI.valuta_proprie ramane 1', NVL(valuta_proprie,0), 1)
+ =Assert3('16-dupa sincronizeaza(): T-DVI.participa_valuta ramane .F.', IIF(participa_valuta,1,0), 0)
+ ELSE
+ pnAsserts = pnAsserts + 3
+ DO DcLog WITH ' FAIL 14-16: T-DVI a disparut dupa sincronizare'
+ ENDIF
+
+ DO HarnessStep WITH 1, 'dupa garzi executie/recalc/sincronizare - vezi log'
+
+ *========================= FOOTER TVA VALUTA: participa_valuta exclude T-DVI din ntva_val =========================
+ *-- injectez artificial un suma_val nenul pe T-DVI (bypass motor) - daca filtrul pe
+ *-- participa_valuta e corect, ntva_val NU se schimba fata de o rulare fara injectie.
+ LOCAL lnNtvaValInainte, lnNtvaValDupa
+ goObj.recalculeaza()
+ lnNtvaValInainte = goObj.ntva_val
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ IF FOUND()
+ REPLACE suma_val WITH 999.99
+ goObj.recalculeaza()
+ lnNtvaValDupa = goObj.ntva_val
+ DO DcLog WITH 'FOOTER: ntva_val inainte=' + TRANSFORM(lnNtvaValInainte) + ' dupa injectie suma_val=999.99 pe T-DVI: ' + TRANSFORM(lnNtvaValDupa)
+ =Assert3('17-footer ntva_val NU include suma_val injectata pe T-DVI (participa_valuta=.F.)', ABS(lnNtvaValDupa - lnNtvaValInainte), 0)
+ *-- recalculeaza() e agregare read-only dar scaneaza cu SUM/CALCULATE (scope ALL), care
+ *-- muta pointerul de inregistrare la EOF - re-LOCATE inainte de REPLACE, altfel reset-ul
+ *-- de mai jos rateaza randul T-DVI (ramane cu suma_val=999.99 injectat mai sus).
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ REPLACE suma_val WITH 0
+ goObj.recalculeaza()
+ ELSE
+ pnAsserts = pnAsserts + 1
+ DO DcLog WITH ' FAIL 17: T-DVI negasit pentru testul de footer'
+ ENDIF
+
+ DO HarnessStep WITH 2, 'footer TVA valuta verificat - vezi log'
+
+ *========================= IMUNITATE LA SCHIMBAREA CURSULUI FACTURII (copiaza_valoare) =========================
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'B'
+ =Assert3('18-rand B gasit pentru schimbare curs', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ goObj.grid1.cCurs.text1.Value = 6.00
+ goObj.grid1.cCurs.text1.Valid()
+ DOEVENTS FORCE
+ ENDIF
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ IF FOUND()
+ =Assert3('19-dupa schimbare curs factura: T-DVI.curs ramane 0', NVL(curs,0), 0)
+ =Assert3('20-dupa schimbare curs factura: T-DVI.suma_val ramane 0', NVL(suma_val,0), 0)
+ =Assert3('21-dupa schimbare curs factura: T-DVI.suma neschimbata (1098.30)', suma, 1098.30)
+ ELSE
+ pnAsserts = pnAsserts + 3
+ DO DcLog WITH ' FAIL 19-21: T-DVI negasit dupa schimbare curs factura'
+ ENDIF
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'B'
+ IF FOUND()
+ =Assert3('22-randul B a primit noul curs (6.00, propagare normala)', curs, 6.00)
+ ENDIF
+
+ DO HarnessStep WITH 3, 'imunitate curs verificata - vezi log'
+
+ *========================= DEBIFARE in_valuta LA NIVEL DE DOCUMENT, CU T PROTEJAT =========================
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'B'
+ =Assert3('23-rand B gasit pentru debifare in_valuta', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ goObj.grid1.cInValuta.check1.Value = 0
+ goObj.grid1.cInValuta.check1.Valid()
+ =Assert3('24-armare lSyncPending dupa debifare (pre-DOEVENTS)', IIF(goObj.lSyncPending,1,0), 1)
+ DOEVENTS FORCE
+ =Assert3('25-sync consumat dupa debifare', IIF(goObj.lSyncPending,1,0), 0)
+ ENDIF
+ LOCAL lnCntBSGolite
+ lnCntBSGolite = 0
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND INLIST(tip_rand,'B','S')
+ lnCntBSGolite = lnCntBSGolite + 1
+ =Assert3('26.'+TRANSFORM(RECNO())+'-B/S.in_valuta=0 dupa debifare', NVL(in_valuta,0), 0)
+ =Assert3('27.'+TRANSFORM(RECNO())+'-B/S.curs=0 dupa debifare', NVL(curs,0), 0)
+ ENDSCAN
+ =Assert3('28-cel putin un rand B/S golit', IIF(lnCntBSGolite>0,1,0), 1)
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ IF FOUND()
+ =Assert3('29-T-DVI ramane in_valuta=0 dupa debifare document (nu s-a schimbat)', NVL(in_valuta,0), 0)
+ =Assert3('30-T-DVI ramane valuta_proprie=1 dupa debifare document (nu se reseteaza)', NVL(valuta_proprie,0), 1)
+ =Assert3('31-T-DVI.suma neschimbata (1098.30) dupa debifare document', suma, 1098.30)
+ ELSE
+ pnAsserts = pnAsserts + 3
+ DO DcLog WITH ' FAIL 29-31: T-DVI negasit dupa debifare document'
+ ENDIF
+
+ DO HarnessStep WITH 4, 'debifare in_valuta cu T protejat verificata - vezi log'
+
+ *========================= UNESTE_DOCUMENT CU RAND T PROTEJAT (cursor izolat, construit direct) =========================
+ DO TestUnesteDocumentCuProtejat
+
+ *========================= IDENTITATE PROPRIE PE RANDUL DVI (cursor izolat, construit direct) =========================
+ DO TestIdentitateDviProtejata
+
+ DO DcLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
+ IF pnPass = pnAsserts
+ DO DcLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
+ ELSE
+ DO DcLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
+ ENDIF
+
+ DO HarnessStep WITH 5, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
+ DO HarnessDone WITH 'done'
+
+CATCH TO loExc
+ DO DcLog 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 AdaugaDoc1
+ *-- FACTURA 15000 RAJA, 1000 EUR curs 5.23 (5230 lei), TVA pe DVI ('D'): DVI 101 BIROUL
+ *-- VAMAL, tva 1098.30 lei, dar platita in RON (fara valuta proprie DVI) - diferita de
+ *-- valuta facturii (EUR) => valuta_proprie=1 pe randul T rezultat.
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = 15000
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = 601
+ goDlg.cPartener = 'RAJA'
+ goDlg.cExplicatia = 'Import marfa RAJA'
+ goDlg.nSuma = 1000
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 5.23
+ goDlg.nIdValuta = 978
+ goDlg.cValuta = 'EUR'
+ goDlg.nIdExplicatieTva = 220
+ goDlg.cExplicatieTva = 'ACH. IMP. 21%'
+ goDlg.optTipTva.Value = 2 && D = DVI
+ goDlg.chkInValutaCont.Value = 1
+ goDlg.chkParticipaValuta.Value = 1
+ goDlg.cSerieDvi = ''
+ goDlg.nNractDvi = 101
+ goDlg.dDviData = DATE()
+ goDlg.nIdFdocDVI = 2
+ goDlg.cFelDocDvi = 'DVI'
+ goDlg.nDviIdPartener = 900
+ goDlg.cDviPartener = 'BIROUL VAMAL'
+ goDlg.nDviTvaLei = 1098.30
+ goDlg.nDviTvaVal = 0
+ *-- F1 NOU: valuta/curs proprii DVI - RON (fara valuta), explicit diferite de factura (EUR)
+ goDlg.nDviIdValuta = 0
+ goDlg.cDviValuta = ''
+ goDlg.nDviCurs = 0
+ goDlg.actualizeaza_stare_dvi()
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO DcLog WITH 'DOC1: valideaza = ' + TRANSFORM(goDlg.valideaza())
+ DO ConstruiesteToDlgF1F2
+ DO DcLog WITH 'DOC1: do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT))
+ goDlg.Hide()
+ DOEVENTS FORCE
+ENDPROC
+
+PROCEDURE ConstruiesteToDlgF1F2
+ *-- toDlg construit INLINE (capcana l) - camp de baza + extensiile F1 (dvi_*) si F2 (discount,
+ *-- neutre in acest test). Deciderul valutar al DVI e dvi_in_valuta (nu dvi_tva_val).
+ 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)
+ =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)
+ *-- F1 NOU: valuta/curs proprii ale DVI (deciderul e dvi_in_valuta, nu dvi_tva_val)
+ =ADDPROPERTY(goT,'dvi_in_valuta',!(EMPTY(goDlg.cDviValuta) OR UPPER(ALLTRIM(NVL(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(NVL(goDlg.cDviValuta,'')))=='RON') OR !(EMPTY(goDlg.cValuta) OR UPPER(ALLTRIM(NVL(goDlg.cValuta,'')))=='RON'),IIF(goDlg.nDviIdValuta<>goDlg.nIdValuta OR goDlg.nDviCurs<>goDlg.nCurs,1,0),0))
+ *-- Runda32 (neutru in acest test - fara discount)
+ =ADDPROPERTY(goT,'disc_baza_lei',0)
+ =ADDPROPERTY(goT,'disc_baza_val',0)
+ENDPROC
+
+PROCEDURE TestUnesteDocumentCuProtejat
+ *-- test izolat: cursor introdc construit DIRECT (nu prin dialog) cu un document ce are
+ *-- 2 randuri T "normale" (mod_manual=0, valuta_proprie=0, de comasat) + 1 rand T protejat
+ *-- (rand_dvi=1, valuta_proprie=1, mod_manual=0, NU trebuie comasat). Verifica ca
+ *-- uneste_document() lasa randul protejat intact si comaseaza doar restul.
+ LOCAL lcDocKeyX, lnCntTDupa
+ lcDocKeyX = 'X|900001|0|0'
+
+ SELECT introdc
+ APPEND BLANK
+ REPLACE tip_rand WITH 'S', scd WITH '371', scc WITH '401', suma WITH 1000, suma_val WITH 0, ;
+ nr_doc WITH 900001, nract WITH 900001, fdoc WITH 'Factura', doc_key WITH lcDocKeyX, ;
+ mod_manual WITH 0, rand_dvi WITH 0, valuta_proprie WITH 0
+
+ APPEND BLANK
+ REPLACE tip_rand WITH 'T', scd WITH '4426', scc WITH '401', suma WITH 100, suma_val WITH 0, ;
+ ptva WITH 21, nr_doc WITH 900001, nract WITH 900001, fdoc WITH 'Factura', doc_key WITH lcDocKeyX, ;
+ mod_manual WITH 0, rand_dvi WITH 0, valuta_proprie WITH 0
+
+ APPEND BLANK
+ REPLACE tip_rand WITH 'T', scd WITH '4426', scc WITH '4427', suma WITH 110, suma_val WITH 0, ;
+ ptva WITH 21, nr_doc WITH 900001, nract WITH 900001, fdoc WITH 'Factura', doc_key WITH lcDocKeyX, ;
+ mod_manual WITH 0, rand_dvi WITH 0, valuta_proprie WITH 0
+
+ APPEND BLANK
+ REPLACE tip_rand WITH 'T', scd WITH '4426', scc WITH '401', suma WITH 1098.30, suma_val WITH 0, ;
+ ptva WITH 21, nr_doc WITH 900001, nract WITH 101, fdoc WITH 'DVI', partc WITH 'BIROUL VAMAL', ;
+ doc_key WITH lcDocKeyX, mod_manual WITH 0, rand_dvi WITH 1, valuta_proprie WITH 1
+
+ TRY
+ goObj.uneste_document(PADR(lcDocKeyX, 80))
+ CATCH TO loExcU
+ DO DcLog WITH 'EROARE uneste_document ' + TRANSFORM(loExcU.ErrorNo) + ' [' + loExcU.Message + '] in ' + loExcU.Procedure + ':' + TRANSFORM(loExcU.LineNo)
+ ENDTRY
+
+ lnCntTDupa = 0
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyX AND tip_rand == 'T'
+ lnCntTDupa = lnCntTDupa + 1
+ DO DcLog WITH 'UNESTE: rand T ramas rand_dvi=' + TRANSFORM(NVL(rand_dvi,0)) + ' valuta_proprie=' + TRANSFORM(NVL(valuta_proprie,0)) + ' suma=' + TRANSFORM(suma)
+ ENDSCAN
+ =Assert3('32-uneste_document: raman EXACT 2 randuri T (1 comasat + 1 protejat)', lnCntTDupa, 2)
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyX AND tip_rand == 'T' AND Nvl(rand_dvi,0) = 1
+ =Assert3('33-uneste_document: randul protejat (rand_dvi=1) supravietuieste', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('34-uneste_document: randul protejat.suma neschimbata (1098.30)', suma, 1098.30)
+ =Assert3('35-uneste_document: randul protejat.valuta_proprie ramane 1', NVL(valuta_proprie,0), 1)
+ ELSE
+ pnAsserts = pnAsserts + 2
+ DO DcLog WITH ' FAIL 34-35: randul protejat negasit dupa uneste_document'
+ ENDIF
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyX AND tip_rand == 'T' AND Nvl(rand_dvi,0) = 0
+ =Assert3('36-uneste_document: randul comasat (nemanual, nevaluta_proprie) exista', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('37-uneste_document: randul comasat.suma = 100+110 = 210', suma, 210)
+ ELSE
+ pnAsserts = pnAsserts + 1
+ DO DcLog WITH ' FAIL 37: randul comasat negasit dupa uneste_document'
+ ENDIF
+ENDPROC
+
+PROCEDURE TestIdentitateDviProtejata
+ *-- test izolat: randul DVI (rand_dvi=1) trebuie sa isi pastreze identitatea PROPRIE
+ *-- (nract, serie_act, partc, fdoc, id_fdoc) cand copiaza_valoare() propaga aceste campuri
+ *-- pe grupul doc_key; un rand NORMAL din acelasi grup trebuie sa PRIMEASCA valoarea noua
+ *-- (assert dublu per camp - altfel testul ar trece si daca propagarea s-ar strica de tot).
+ *-- Verifica si coerenta doc_key pe grup dupa fiecare propagare (toate 5 campuri sunt chei -
+ *-- llCheie regenereaza doc_key pe tot grupul, inclusiv pe randul protejat).
+ LOCAL lcDocKeyX, lnRecnoB, lcDocKeyCrt
+ lcDocKeyX = 'IDPROT|5001|1|601'
+
+ SELECT introdc
+ APPEND BLANK
+ REPLACE tip_rand WITH 'B', scd WITH '371', scc WITH '401', suma WITH 1000, ;
+ nr_doc WITH 950001, nract WITH 5001, serie_act WITH 'FACT', id_fdoc WITH 1, fdoc WITH 'Factura', ;
+ id_partc WITH 601, partc WITH 'FURNIZOR ORIGINAL', doc_key WITH lcDocKeyX, ;
+ mod_manual WITH 0, rand_dvi WITH 0, valuta_proprie WITH 0
+
+ APPEND BLANK
+ REPLACE tip_rand WITH 'S', scd WITH '4426', scc WITH '401', suma WITH 190, ;
+ nr_doc WITH 950001, nract WITH 5001, serie_act WITH 'FACT', id_fdoc WITH 1, fdoc WITH 'Factura', ;
+ id_partc WITH 601, partc WITH 'FURNIZOR ORIGINAL', doc_key WITH lcDocKeyX, ;
+ mod_manual WITH 0, rand_dvi WITH 0, valuta_proprie WITH 0
+
+ APPEND BLANK
+ REPLACE tip_rand WITH 'T', scd WITH '4426', scc WITH '401', suma WITH 95, ;
+ nr_doc WITH 950001, nract WITH 9001, serie_act WITH 'VAMA', id_fdoc WITH 2, fdoc WITH 'DVI', ;
+ id_partc WITH 900, partc WITH 'DIRECTIA VAMALA', doc_key WITH lcDocKeyX, ;
+ mod_manual WITH 0, rand_dvi WITH 1, valuta_proprie WITH 1
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyX AND tip_rand == 'B'
+ =Assert3('38-IDP: randul B gasit pentru test identitate DVI', IIF(FOUND(),1,0), 1)
+ IF !FOUND()
+ pnAsserts = pnAsserts + 20
+ DO DcLog WITH ' FAIL 39-59: randul B negasit, sar restul testului de identitate DVI'
+ RETURN
+ ENDIF
+ lnRecnoB = RECNO()
+
+ *-- NOTA: introdc e cursor PARTAJAT intre scenariile fisierului - alte scenarii (AdaugaDoc1,
+ *-- TestUnesteDocumentCuProtejat) au deja propriile randuri rand_dvi=1/tip_rand='S' cu alt
+ *-- doc_key. Fiecare LOCATE de mai jos e SCOPAT pe lcDocKeyCrt (doc_key-ul CURENT al
+ *-- grupului, recalculat dupa fiecare propagare) - dublu rol: (a) evita sa gaseasca randul
+ *-- altui scenariu, (b) FOUND() dupa scopare e chiar dovada de coerenta - daca doc_key nu
+ *-- s-ar fi propagat uniform pe grup, randul n-ar mai fi gasit sub noul doc_key.
+
+ *-- 1. nract: 5001 -> 5002
+ GO lnRecnoB
+ REPLACE nract WITH 5002
+ goObj.copiaza_valoare('nract')
+ SELECT introdc
+ GO lnRecnoB
+ lcDocKeyCrt = ALLTRIM(NVL(doc_key,''))
+ =Assert3('39-IDP nract: B.nract=5002 (propriu, control)', nract, 5002)
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND Nvl(rand_dvi,0) = 1
+ =Assert3('40-IDP nract: DVI gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1)
+ =Assert3('41-IDP nract: DVI.nract ramane 9001 (protejat)', NVL(nract,0), 9001)
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND tip_rand == 'S'
+ =Assert3('42-IDP nract: S gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1)
+ =Assert3('43-IDP nract: S.nract=5002 (propagat pe randul normal)', NVL(nract,0), 5002)
+
+ *-- 2. serie_act: 'FACT' -> 'FACT2'
+ GO lnRecnoB
+ REPLACE serie_act WITH 'FACT2'
+ goObj.copiaza_valoare('serie_act')
+ GO lnRecnoB
+ lcDocKeyCrt = ALLTRIM(NVL(doc_key,''))
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND Nvl(rand_dvi,0) = 1
+ =Assert3('44-IDP serie_act: DVI gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1)
+ =AssertStr('45-IDP serie_act: DVI.serie_act ramane VAMA (protejat)', ALLTRIM(NVL(serie_act,'')), 'VAMA')
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND tip_rand == 'S'
+ =Assert3('46-IDP serie_act: S gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1)
+ =AssertStr('47-IDP serie_act: S.serie_act=FACT2 (propagat)', ALLTRIM(NVL(serie_act,'')), 'FACT2')
+
+ *-- 3. partc: 'FURNIZOR ORIGINAL' -> 'FURNIZOR NOU'
+ GO lnRecnoB
+ REPLACE partc WITH 'FURNIZOR NOU'
+ goObj.copiaza_valoare('partc')
+ GO lnRecnoB
+ lcDocKeyCrt = ALLTRIM(NVL(doc_key,''))
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND Nvl(rand_dvi,0) = 1
+ =Assert3('48-IDP partc: DVI gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1)
+ =AssertStr('49-IDP partc: DVI.partc ramane DIRECTIA VAMALA (protejat)', ALLTRIM(NVL(partc,'')), 'DIRECTIA VAMALA')
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND tip_rand == 'S'
+ =Assert3('50-IDP partc: S gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1)
+ =AssertStr('51-IDP partc: S.partc=FURNIZOR NOU (propagat)', ALLTRIM(NVL(partc,'')), 'FURNIZOR NOU')
+
+ *-- 4. fdoc: 'Factura' -> 'Factura Noua'
+ GO lnRecnoB
+ REPLACE fdoc WITH 'Factura Noua'
+ goObj.copiaza_valoare('fdoc')
+ GO lnRecnoB
+ lcDocKeyCrt = ALLTRIM(NVL(doc_key,''))
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND Nvl(rand_dvi,0) = 1
+ =Assert3('52-IDP fdoc: DVI gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1)
+ =AssertStr('53-IDP fdoc: DVI.fdoc ramane DVI (protejat)', ALLTRIM(NVL(fdoc,'')), 'DVI')
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND tip_rand == 'S'
+ =Assert3('54-IDP fdoc: S gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1)
+ =AssertStr('55-IDP fdoc: S.fdoc=Factura Noua (propagat)', ALLTRIM(NVL(fdoc,'')), 'Factura Noua')
+
+ *-- 5. id_fdoc: 1 -> 3
+ GO lnRecnoB
+ REPLACE id_fdoc WITH 3
+ goObj.copiaza_valoare('id_fdoc')
+ GO lnRecnoB
+ lcDocKeyCrt = ALLTRIM(NVL(doc_key,''))
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND Nvl(rand_dvi,0) = 1
+ =Assert3('56-IDP id_fdoc: DVI gasit sub doc_key curent (coerenta grup finala)', IIF(FOUND(),1,0), 1)
+ =Assert3('57-IDP id_fdoc: DVI.id_fdoc ramane 2 (protejat)', NVL(id_fdoc,0), 2)
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND tip_rand == 'S'
+ =Assert3('58-IDP id_fdoc: S gasit sub doc_key curent (coerenta grup finala)', IIF(FOUND(),1,0), 1)
+ =Assert3('59-IDP id_fdoc: S.id_fdoc=3 (propagat)', NVL(id_fdoc,0), 3)
+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
+
+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 DcLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
+ ELSE
+ DO DcLog 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 DcLog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])'
+ ELSE
+ DO DcLog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])'
+ ENDIF
+ENDPROC
+
+PROCEDURE DcErr
+ LPARAMETERS tnErr, tcMsg, tcProg, tnLine
+ DO DcLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
+ENDPROC
+
+PROCEDURE DcLog
+ 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
diff --git a/utile/Teste/achizitie_import/test_dvi_valuta_ron.ps1 b/utile/Teste/achizitie_import/test_dvi_valuta_ron.ps1
new file mode 100644
index 0000000..280c431
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_dvi_valuta_ron.ps1
@@ -0,0 +1,11 @@
+# test_dvi_valuta_ron.ps1 - wrapper peste harness-ul generic pentru TVA DVI in RON (F1, runda30).
+# powershell -ExecutionPolicy Bypass -File test_dvi_valuta_ron.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_dvi_valuta_ron.prg') `
+ -Steps @('doc1_creat','garzi_executie','footer_valuta','imunitate_curs','debifare_document','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_dvi_valuta_ron') `
+ -SyncDir (Join-Path $Teste 'uisync_dvi_valuta_ron') `
+ -StepTimeoutSec 180 `
+ -ReadyTimeoutSec 180
diff --git a/utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.prg b/utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.prg
new file mode 100644
index 0000000..6fae039
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.prg
@@ -0,0 +1,951 @@
+* test_e2e_dvi_ron_discount.prg
+* Runda30 (F1+F2) + Runda32 (model B/G/T, un singur rand G): test e2e pe SCENARIUL EXACT cerut
+* de Marius - factura de import in valuta (EUR), TVA DVI platit in RON (valuta proprie DVI,
+* diferita de a facturii), discount financiar (doar baza, fara bifa), articole adaugate, apoi
+* finalizare. Flux REAL: dialogul `import_adauga_factura` (nu insert direct in cursoare) +
+* `do_adauga_articol()` real + `sincronizeaza()` real.
+*
+* IMPORTANT: toDlg (contractul pentru do_adauga_factura) se construieste INLINE, in programul
+* PRINCIPAL, NU prin apelul `goDlg.construieste_todlg()` - capcana documentata deja in antetul
+* `mock_caut_valuta.prg` ("CREATEOBJECT/ADDPROPERTY nu merg corect apelate dintr-o procedura in
+* acest runtime"): confirmat prin diagnostic (28.07.2026) ca aceasta metoda arunca eroare 11
+* ("argument invalid") pe PRIMUL Addproperty, universal, pe orice instanta (inclusiv virgina),
+* dar EXACT ACELASI cod, apelat din programul principal cu goDlg.* in loc de This.*, functioneaza
+* corect. NU incerca sa "repari" apeland metoda direct - vezi handoff_dvi_discount.md pentru
+* dovezile complete (izolare fata de tip de date, mediu, mostenire de clasa, lungime de linie).
+*
+* Assert-uri rand cu rand pe `introdc` (sursa de adevar inainte de scrierea finala):
+* - randul B (baza factura): scd=371, suma=5000.00 (1000 EUR x curs 5), suma_val=1000.00,
+* in_valuta=1, id_valuta=978 (EUR), partener facturii;
+* - randul T-DVI (rand_dvi=1): scd=4426/scc=401, suma=840.00 (baza NETA lei x 21% =
+* (5000-1000)*21%, discountul scade baza DVI-ului), suma_val=0, in_valuta=0, id_valuta=0/
+* curs=0/nume_val='' (normalizare RON->fara valuta pe randul scris, desi pe dialog RON are
+* id real 1 - vezi conventia din handoff), participa_valuta=.F., partenerul vamal (DIRECTIA
+* VAMALA), mod_manual=1 (valoarea NETA difera de auto-calculul brut baza*cota=1050.00 facut
+* de do_adauga_factura la creare, deci randul e protejat de do_executa - vezi Runda32);
+* - randul G (discount, un singur rand, model B/G/T): scd = scc-ul randului B (analitic
+* mostenit), scc=767, suma=+1000.00, suma_val=+200.00 (POZITIV), id_partd = partenerul
+* facturii (de pe creditul B), participa_valuta=.F., cu_tva=0, ptva=0;
+* - pretul articolului (rul_temp) neafectat de discount: pret_lei=4000.00 (800 EUR x 5);
+* - randul D (diferenta), daca apare, e informativ (best-effort - nu il forteaza scenariul);
+* - totalurile din subsol (D4): txtftvalei/txtftvaval raman pe baza integrala (5000.00/
+* 1000.00); Text2/Text3 (cu TVA) scad discountul (4840.00 = 5000+840-1000, respectiv
+* 800.00 = 1000+0-200) - verificate imediat dupa Termin, inainte de a adauga articole
+* (documentul nu e inca spart pe randuri S, B ramane intreg pentru un calcul curat).
+*
+* Acoperea si cerinta FINALA (Runda32): factura de import in valuta + discount + TVA pe DVI,
+* cu assert-uri pe cele trei randuri (B/G/T) si pe totalurile din subsolul notei.
+*
+* PASUL FINAL "Terminat" (scrierea in `actactan` prin `import_nota.inainte_de_do_termin()`)
+* SE RULEAZA (nu mai e sarit). Acel cod deschide `Do Form verificare` (formular MODAL real,
+* `COMUN\ferestre\verificare.scx`, WindowType=1) - fara mock ar ramane blocat la nesfarsit.
+* Testul foloseste un STUB `verificare.scx` dedicat, in `stub_verificare\` (langa acest test,
+* NU peste formularul real) - form gol, `WindowType=0`, `Init` seteaza `gnButon=1` si
+* `Return .F.` (impiedica instantierea => `Do Form` revine imediat, fara afisare). Stub-ul
+* castiga rezolutia `Do Form` pentru ca `stub_verificare` e primul folder din `SET PATH`
+* (inaintea lui `COMUN\FERESTRE`, unde e formularul real) - confirmat empiric: `SET PATH`
+* rezolva pe ORDINEA din lista, primul folder cu fisierul cerut castiga.
+* Assert-uri suplimentare rand cu rand pe `actactan` (structura reala, fara `tip_rand`/
+* `rand_dvi` - randurile se identifica dupa scd/scc/semnul sumei): B (scd=371), T-DVI
+* (scd=4426, suma POZITIVA), G (scc=767, un singur rand) + niciun rand fals de finalizare NIR.
+*
+* Rulare:
+* powershell -ExecutionPolicy Bypass -File test_e2e_dvi_ron_discount.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_e2e_dvi_ron_discount_log.txt"
+gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_e2e_dvi_ron_discount\"
+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) -----
+ 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', 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
+
+ *-- import_nota.inainte_de_do_termin() citeste variabila BARA tlIntern (linia
+ *-- "Iif(tlIntern, 0, 100)"), nu This.lIntern - se bazeaza pe mostenirea PRIVATE de-a
+ *-- lungul stivei de apel de la achizitie_import(tnIdSet, tlIntern), procedura reala care
+ *-- ar instantia formularul (Show() modal, deci tlIntern ramane "vizibil" din metodele
+ *-- formularului). Testul ocoleste achizitie_import (CREATEOBJECT direct, ca toate
+ *-- celelalte teste din suita), deci tlIntern trebuie declarata explicit aici, cu ACEEASI
+ *-- valoare data la CREATEOBJECT (.F. = mod import) - nu e defect de cod, e o conventie de
+ *-- scop de variabila care presupune fluxul real prin achizitie_import.
+ PRIVATE tlIntern
+ tlIntern = .F.
+
+ *-- alt global de mediu real (roagest.prg la pornire) folosit de clase pentru export
+ *-- fisiere temporare (XML/PDF/index) - nedeclarat pana acum pentru ca pasul Terminat
+ *-- nu fusese exercitat headless inainte de stub-ul verificare.scx
+ PUBLIC gcTempPath
+ gcTempPath = ADDBS(SYS(2023))
+
+ *-- gnHandle: handle SQLCONNECT real (SQLSetprop/SQLExec native) folosit de
+ *-- oscrie_in_fisiere - -1 e conventia din dbaccesscontroller.prg pt. "fara conexiune";
+ *-- fara o conexiune Oracle reala, scrierea propriu-zisa in ACT nu poate fi validata aici
+ PUBLIC gnHandle
+ gnHandle = -1
+
+ *-- gnTipGest: citit bare la Do listare_nir With poAct.nnir, gnTipGest In oproceduri_listari,
+ *-- dupa oscrie_in_fisiere() cu succes - 0 = gestiune normala (nu declanseaza ramurile
+ *-- speciale gnTipGest=6/7 vazute in cod pentru marfa la pret de vanzare)
+ PUBLIC gnTipGest
+ gnTipGest = 0
+
+ *-- gcCondSucursala: fragment WHERE folosit la rapoarte multi-sucursala (listare_nir) -
+ *-- gol = fara filtrare (o singura sucursala, ca in test_init_env.prg)
+ 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 + TVA DVI in RON + discount financiar =========================
+ PUBLIC goDlg
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = 8001
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = 601
+ goDlg.cPartener = 'FURNIZOR EXTERN GMBH'
+ goDlg.cExplicatia = 'Marfa import cu DVI in RON si discount'
+ goDlg.nSuma = 1000
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 5
+ 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 (document vamal, partener vamal)
+ goDlg.cSerieDvi = ''
+ goDlg.nNractDvi = 9001
+ 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)
+ =Assert3('3-DVI TVA lei auto = baza_lei*21% = 1050.00', goDlg.nDviTvaLei, 1050.00)
+
+ *-- discount financiar (Runda32: doar baza, fara bifa) - Valid() reface imediat TVA DVI pe
+ *-- baza NETA (suma-discount), fara auto-calcul separat de "TVA discount"
+ goDlg.txtDiscBaza.Value = 200
+ goDlg.txtDiscBaza.Valid()
+ =Assert3('4-dupa discount: DVI TVA lei pe baza NETA = (5000-1000)*21% = 840.00', goDlg.nDviTvaLei, 840.00)
+
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO HarnessStep WITH 1, 'dialog completat: factura EUR 1000, DVI TVA RON 840.00 (baza neta), discount baza 200'
+
+ *-- valideaza() REAL de pe dialog (buton Termin apeleaza mereu asta primul)
+ LOCAL llOkValid
+ llOkValid = goDlg.valideaza()
+ =Assert3('6a-dialog valideaza() reuseste', IIF(llOkValid,1,0), 1)
+
+ *-- toDlg construit INLINE in programul PRINCIPAL, NU prin goDlg.construieste_todlg() -
+ *-- capcana l (vezi antetul mock_caut_valuta.prg): CREATEOBJECT/ADDPROPERTY nu merg corect
+ *-- apelate dintr-o PROCEDURA/METODA in acest runtime headless (confirmat: crapa universal,
+ *-- inclusiv pe o instanta virgina, cu eroarea 11 pe primul Addproperty din construieste_todlg;
+ *-- acelasi cod, apelat din programul principal cu goDlg.* in loc de This.*, functioneaza OK).
+ *-- Lista de campuri COPIATA din construieste_todlg (ointroduceri.vc2 ~6180) ca sa ramana
+ *-- fidela contractului - vezi si celelalte teste motor (test_dvi_valuta_ron.prg etc.), care
+ *-- folosesc acelasi tipar.
+ 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)
+ *-- dvi_in_valuta: LOGIC (nu numeric), derivat dupa NUME - fidel cu construieste_todlg
+ =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,'')))
+ *-- dvi_valuta_proprie: regula pe valuta EFECTIVA (fix task #9) - daca ambele parti sunt
+ *-- efectiv "fara valuta" (gol sau RON), rezultat 0; altfel compara id/curs ca inainte
+ =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('6-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'
+
+ *========================= ASSERT-URI RAND CU RAND PE introdc =========================
+ LOCAL lcSccB
+ SELECT introdc
+ LOCATE FOR nract = 8001 AND tip_rand == 'B'
+ =Assert3('7-randul B (baza factura) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ lcSccB = ALLTRIM(NVL(scc,''))
+ =AssertStr('8-B.scd=371', ALLTRIM(scd), '371')
+ =Assert3('9-B.suma=5000.00 (1000 EUR x curs 5)', suma, 5000.00)
+ =Assert3('10-B.suma_val=1000.00', suma_val, 1000.00)
+ =Assert3('11-B.in_valuta=1', NVL(in_valuta,0), 1)
+ =Assert3('12-B.id_valuta=978 (EUR)', NVL(id_valuta,0), 978)
+ =AssertStr('13-B.nume_val=EUR', ALLTRIM(NVL(nume_val,'')), 'EUR')
+ =Assert3('14-B.id_partc=601 (furnizorul facturii)', NVL(id_partc,0), 601)
+ =AssertStr('15-B.partc=FURNIZOR EXTERN GMBH', ALLTRIM(NVL(partc,'')), 'FURNIZOR EXTERN GMBH')
+ ELSE
+ pnAsserts = pnAsserts + 8
+ DO EeLog WITH ' FAIL 8-15: randul B negasit'
+ ENDIF
+
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ =Assert3('16-randul T-DVI (rand_dvi=1) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =AssertStr('17-T-DVI.scd=4426', ALLTRIM(scd), '4426')
+ =AssertStr('18-T-DVI.scc=401', ALLTRIM(scc), '401')
+ =Assert3('19-T-DVI.suma=840.00 (baza NETA lei x 21%, discount scazut din baza DVI)', suma, 840.00)
+ =Assert3('20-T-DVI.suma_val=0 (RON)', NVL(suma_val,0), 0)
+ =Assert3('21-T-DVI.in_valuta=0', NVL(in_valuta,0), 0)
+ =Assert3('22-T-DVI.id_valuta=0 (normalizare fara-valuta pe randul scris)', NVL(id_valuta,0), 0)
+ =Assert3('23-T-DVI.curs=0', NVL(curs,0), 0)
+ =AssertStr('24-T-DVI.nume_val="" ', ALLTRIM(NVL(nume_val,'?')), '')
+ =Assert3('25-T-DVI.participa_valuta=.F. (nu intra in footer valuta)', IIF(participa_valuta,1,0), 0)
+ =Assert3('26-T-DVI.valuta_proprie=1 (RON <> EUR factura)', NVL(valuta_proprie,0), 1)
+ =Assert3('27-T-DVI.id_partc=900 (Directia Vamala)', NVL(id_partc,0), 900)
+ =AssertStr('28-T-DVI.partc=DIRECTIA VAMALA', ALLTRIM(NVL(partc,'')), 'DIRECTIA VAMALA')
+ =Assert3('29-T-DVI.mod_manual=0 (TVA-ul tastat coincide cu auto-calculul pe baza neta 840.00)', NVL(mod_manual,0), 0)
+ ELSE
+ pnAsserts = pnAsserts + 12
+ DO EeLog WITH ' FAIL 17-29: randul T-DVI negasit'
+ ENDIF
+
+ LOCAL lnCntGDoc1
+ lnCntGDoc1 = 0
+ SELECT introdc
+ SCAN FOR nract = 8001 AND tip_rand == 'G'
+ lnCntGDoc1 = lnCntGDoc1 + 1
+ ENDSCAN
+ =Assert3('30b-exact un singur rand G (model B/G/T, Runda32)', lnCntGDoc1, 1)
+
+ SELECT introdc
+ LOCATE FOR nract = 8001 AND tip_rand == 'G' AND ALLTRIM(NVL(scc,'')) == '767'
+ =Assert3('30-randul G (discount, 401->767) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ IF !EMPTY(lcSccB)
+ =AssertStr('31-G.scd = analitic mostenit de pe creditul B', ALLTRIM(scd), lcSccB)
+ ENDIF
+ =Assert3('32-G.suma=+1000.00 (baza discount in lei, POZITIV)', suma, 1000.00)
+ =Assert3('33-G.suma_val=+200.00 (POZITIV)', suma_val, 200.00)
+ =Assert3('34-G.id_partd=601 (furnizorul facturii, de pe creditul B)', NVL(id_partd,0), 601)
+ =Assert3('35-G.participa_valuta=.F.', IIF(participa_valuta,1,0), 0)
+ =Assert3('36-G.cu_tva=1 (mostenit din linia de baza, runda33)', NVL(cu_tva,0), 1)
+ =Assert3('37-G.ptva=21 (aceeasi cota ca linia de baza, runda33)', NVL(ptva,0), 21)
+ ELSE
+ pnAsserts = pnAsserts + 6
+ DO EeLog WITH ' FAIL 31-37: randul G negasit'
+ ENDIF
+
+ *========================= TOTALURI SUBSOL (Runda32: total cu TVA scade discountul, =========================
+ *========================= total fara TVA ramane baza integrala - D4) - inainte de a adauga =========================
+ *========================= articole (document inca nespart, B ramane intreg) =========================
+ =Assert3('37b-subsol: txtftvalei (fara TVA) = baza integrala 5000.00', goObj.txtftvalei.Value, 5000.00)
+ =Assert3('37c-subsol: Text2 (cu TVA) = baza+TVA-discount = 5000+840-1000 = 4840.00', goObj.Text2.Value, 4840.00)
+ =Assert3('37d-subsol: txtftvaval (fara TVA, valuta) = baza integrala 1000.00', goObj.txtftvaval.Value, 1000.00)
+ =Assert3('37e-subsol: Text3 (cu TVA, valuta) = baza+TVA-discount = 1000+0-200 = 800.00', goObj.Text3.Value, 800.00)
+
+ *========================= 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('43-do_adauga_articol() fara eroare', IIF(llEroareArt,0,1), 1)
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212'
+ =Assert3('44-articolul BULDOEXCAVATOR 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,4), ;
+ pret_lei WITH ROUND(800*5,4), cota_tva WITH 21
+ ELSE
+ pnAsserts = pnAsserts + 1
+ DO EeLog WITH ' FAIL 44: articolul nu a fost adaugat'
+ ENDIF
+ goObj.gridart.Refresh()
+ DOEVENTS FORCE
+ DO HarnessStep WITH 3, 'articol adaugat (BULDOEXCAVATOR, 800 EUR)'
+
+ *========================= sincronizeaza() REAL =========================
+ 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('45-sincronizeaza() fara eroare', IIF(llEroareSync,0,1), 1)
+
+ *-- pretul articolului neafectat de discount (discount participa_valuta=.F., exclus din baze)
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212'
+ =Assert3('46-dupa sincronizeaza(): pret_lei articol neschimbat (4000.00)', IIF(FOUND(),pret_lei,-1), 4000.00)
+
+ *-- randurile T-DVI si G supravietuiesc sincronizarii (nu doar la creare)
+ SELECT introdc
+ LOCATE FOR Nvl(rand_dvi,0) = 1
+ =Assert3('47-dupa sincronizeaza(): T-DVI inca gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('48-dupa sincronizeaza(): T-DVI.suma neschimbata (840.00, baza neta, protejata de mod_manual=1)', suma, 840.00)
+ ELSE
+ pnAsserts = pnAsserts + 1
+ DO EeLog WITH ' FAIL 48: T-DVI a disparut dupa sincronizare'
+ ENDIF
+ SELECT introdc
+ LOCATE FOR nract = 8001 AND tip_rand == 'G' AND ALLTRIM(NVL(scc,'')) == '767'
+ =Assert3('49-dupa sincronizeaza(): G inca gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('50-dupa sincronizeaza(): G.suma neschimbata (+1000.00)', suma, 1000.00)
+ ELSE
+ pnAsserts = pnAsserts + 1
+ DO EeLog WITH ' FAIL 50: G a disparut dupa sincronizare'
+ ENDIF
+
+ *-- randul D (diferenta) - informativ, best-effort (nu e fortat de acest scenariu)
+ SELECT introdc
+ LOCATE FOR nract = 8001 AND tip_rand == 'D'
+ IF FOUND()
+ DO EeLog WITH 'INFO randul D (diferenta) exista: suma=' + TRANSFORM(suma) + ' - neafectat de discount (G exclus din bazele de calcul)'
+ ELSE
+ DO EeLog WITH 'INFO randul D (diferenta) nu apare in acest scenariu (numere curate, fara rotunjire reziduala) - nu e o cerinta a acestui test'
+ ENDIF
+
+ DO HarnessStep WITH 4, 'sincronizeaza() verificat - vezi log'
+
+ *========================= Terminat -> scriere in actactan (stub verificare.scx, vezi handoff) =========================
+ DO CreeazaActactan
+ LOCAL llEroareTermin
+ llEroareTermin = .F.
+ TRY
+ goObj.inainte_de_do_termin()
+ CATCH TO loExcTermin
+ llEroareTermin = .T.
+ DO EeLog WITH 'EROARE inainte_de_do_termin() ' + TRANSFORM(loExcTermin.ErrorNo) + ' [' + loExcTermin.Message + '] in ' + loExcTermin.Procedure + ':' + TRANSFORM(loExcTermin.LineNo)
+ ENDTRY
+ =Assert3('51-inainte_de_do_termin() fara eroare (Terminat)', IIF(llEroareTermin,0,1), 1)
+
+ *-- Randurile in actactan sunt scrise INAINTE de Do Form verificare/oscrie_in_fisiere/
+ *-- listare_nir (Scan For suma<>0 Or se_scrie=1 / Append/Gather, mult mai devreme in
+ *-- metoda) - o eroare TARZIE (ex. in raportarea NIR, dupa scriere) nu invalideaza datele
+ *-- deja scrise. De-aia verific actactan INDIFERENT de llEroareTermin.
+ IF USED('actactan')
+ DO EeLog WITH 'DIAG dump actactan dupa Terminat:'
+ SELECT actactan
+ SCAN
+ DO EeLog WITH ' recno=' + TRANSFORM(RECNO()) + ' nract=' + TRANSFORM(nract) + ' scd=' + ALLTRIM(NVL(scd,'')) + ' scc=' + ALLTRIM(NVL(scc,'')) + ;
+ ' suma=' + TRANSFORM(suma) + ' suma_val=' + TRANSFORM(NVL(suma_val,0)) + ' in_valuta=?' + ' id_valuta=' + TRANSFORM(NVL(id_valuta,0)) + ;
+ ' id_partd=' + TRANSFORM(NVL(id_partd,0)) + ' id_partc=' + TRANSFORM(NVL(id_partc,0)) + ' partc=[' + ALLTRIM(NVL(partc,'')) + ']'
+ ENDSCAN
+
+ =Assert3('52-actactan folosit dupa Terminat', IIF(USED('actactan'),1,0), 1)
+
+ *-- randul "B" (baza facturii) - sincronizeaza() redistribuie valoarea originala pe
+ *-- conturile REALE ale articolelor participante (212 = contul articolului BULDOEXCAVATOR,
+ *-- nu 371, placeholder-ul din sablon) - comportament PRE-EXISTENT de participare la pret,
+ *-- neschimbat de F1/F2. Nu (mai) pin-uiesc contul/suma exacta (ar cere sa refac math-ul
+ *-- complet de spargere pe cote) - verific doar ca valoarea facturii e reprezentata,
+ *-- atribuita corect furnizorului, in EUR.
+ SELECT actactan
+ LOCATE FOR nract = 8001 AND ALLTRIM(NVL(scc,'')) == '401' AND suma > 0 AND NVL(id_partc,0) = 601
+ =Assert3('53-actactan: cel putin un rand de baza (scc=401, furnizor) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('56-actactan randul de baza: id_valuta=978 (EUR)', NVL(id_valuta,0), 978)
+ =AssertStr('57-actactan randul de baza: nume_val=EUR', ALLTRIM(NVL(nume_val,'')), 'EUR')
+ =Assert3('58-actactan randul de baza: id_partc=601 (furnizorul facturii)', NVL(id_partc,0), 601)
+ ELSE
+ pnAsserts = pnAsserts + 3
+ DO EeLog WITH ' FAIL 56-58: niciun rand de baza gasit in actactan'
+ ENDIF
+ *-- NU verific suma totala exacta pe randurile de baza: cu un singur articol (800 EUR)
+ *-- fata de baza integrala a facturii (1000 EUR), sincronizeaza() mai scrie si un rand de
+ *-- diferenta/reconciliere (scd=6588) - matematica exacta de spargere pe conturi tine de
+ *-- participarea la pret (pre-existenta, neschimbata de F1/F2), nu de scopul acestui test.
+
+ SELECT actactan
+ LOCATE FOR ALLTRIM(NVL(scd,'')) == '4426' AND suma > 0
+ =Assert3('59-actactan randul T-DVI (scd=4426, suma pozitiva) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('60-actactan T-DVI.suma=840.00 (baza neta)', suma, 840.00)
+ =Assert3('61-actactan T-DVI.suma_val=0 (RON, in_valuta=0, necopiat)', NVL(suma_val,0), 0)
+ =Assert3('62-actactan T-DVI.id_valuta=0 (RON normalizat)', NVL(id_valuta,0), 0)
+ =Assert3('63-actactan T-DVI.id_partc=900 (Directia Vamala)', NVL(id_partc,0), 900)
+ =AssertStr('64-actactan T-DVI.partc=DIRECTIA VAMALA', ALLTRIM(NVL(partc,'')), 'DIRECTIA VAMALA')
+ ELSE
+ pnAsserts = pnAsserts + 4
+ DO EeLog WITH ' FAIL 60-64: randul T-DVI negasit in actactan'
+ ENDIF
+
+ SELECT actactan
+ LOCATE FOR nract = 8001 AND ALLTRIM(NVL(scc,'')) == '767'
+ =Assert3('65-actactan randul G (scc=767, discount baza) gasit', IIF(FOUND(),1,0), 1)
+ IF FOUND()
+ =Assert3('66-actactan G.suma=+1000.00 (POZITIV)', suma, 1000.00)
+ =Assert3('67-actactan G.suma_val=+200.00 (POZITIV, valuta mostenita de la B)', NVL(suma_val,0), 200.00)
+ =Assert3('68-actactan G.id_partd=601 (furnizorul facturii)', NVL(id_partd,0), 601)
+ ELSE
+ pnAsserts = pnAsserts + 3
+ DO EeLog WITH ' FAIL 66-68: randul G negasit in actactan'
+ ENDIF
+
+ *-- niciun rand fals de finalizare NIR: scd gol + scc=401 + suma=0, generat cand un rand cu_tva=0 (G) nu e exclus corect
+ SELECT actactan
+ LOCATE FOR EMPTY(NVL(scd,'')) AND ALLTRIM(NVL(scc,'')) == '401' AND NVL(suma,0) = 0
+ =Assert3('73-niciun rand fals de finalizare NIR in actactan', IIF(FOUND(),1,0), 0)
+ ELSE
+ pnAsserts = pnAsserts + 16
+ DO EeLog WITH ' FAIL 52-73: inainte_de_do_termin() a esuat sau actactan nu exista - assert-urile pe actactan sarite'
+ ENDIF
+
+ 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 HarnessStep WITH 5, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
+ 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 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
+
+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
+
+PROCEDURE CreeazaActactan
+ *-- structura minima ceruta de GATHER-urile
+ *-- din import_nota.inainte_de_do_termin() (Scan For suma<>0 Or se_scrie=1 / Append Blank /
+ *-- Gather Name poAct + Gather Name loFact Fields ...). Fara ea, GATHER FIELDS ar da eroare
+ *-- de camp inexistent inainte sa ajunga la Do Form verificare.
+ IF USED('actactan')
+ USE IN ('actactan')
+ ENDIF
+ CREATE CURSOR actactan ( ;
+ id_fdoc N(14), fdoc C(50), dataact D, serie_act C(10), nract N(14), ;
+ partc C(100), id_partc N(14), partd C(100), id_partd N(14), ;
+ suma N(18,4), suma_val N(18,4), explicatia C(100), explicatia4 C(50), explicatia5 C(50), ;
+ scd C(10), ascd C(20), scc C(10), ascc C(20), id_jtva_coloana N(14) NULL, taxcode N(6), ;
+ id_valuta N(14), curs N(14,4), nume_val C(10), proc_tva N(8,4), nnir N(14), ;
+ tva_incasare N(1), id_set N(14), id_gestin N(14))
+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)
+ *-- gol: niciun cont nu cere analitic in scenariul acestui test (371/401 folosite
+ *-- fara analitic, ca in restul suitei - vezi verificare_note_contabile)
+ CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20))
+ RETURN 1
+ ENDIF
+ IF 'VCONFIG_CONT_IREG' $ UPPER(m.tcSql)
+ *-- 401 recunoscut ca si cont cu parteneri (verificare_note_contabile) - altfel
+ *-- verif_part goleste id_partc/id_partd pe randurile T-DVI/G inainte de actactan
+ 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
diff --git a/utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.ps1 b/utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.ps1
new file mode 100644
index 0000000..f60fa44
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.ps1
@@ -0,0 +1,13 @@
+# test_e2e_dvi_ron_discount.ps1 - wrapper peste harness-ul generic pentru testul e2e
+# (factura import EUR + TVA DVI in RON + discount financiar + articol + sincronizare).
+# NU exercita pasul "Terminat" (scriere in actactan) - vezi antetul .prg pentru motiv.
+# Rulare: powershell -ExecutionPolicy Bypass -File test_e2e_dvi_ron_discount.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_e2e_dvi_ron_discount.prg') `
+ -Steps @('nota_goala','dialog_completat','dupa_termin_dialog','articol_adaugat','sincronizat','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_e2e_dvi_ron_discount') `
+ -SyncDir (Join-Path $Teste 'uisync_e2e_dvi_ron_discount') `
+ -StepTimeoutSec 180 `
+ -ReadyTimeoutSec 180
\ No newline at end of file
diff --git a/utile/Teste/achizitie_import/test_import_nota_total_ui.prg b/utile/Teste/achizitie_import/test_import_nota_total_ui.prg
index 56a22f0..e256c31 100644
--- a/utile/Teste/achizitie_import/test_import_nota_total_ui.prg
+++ b/utile/Teste/achizitie_import/test_import_nota_total_ui.prg
@@ -666,8 +666,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 DumpIntrodc
diff --git a/utile/Teste/achizitie_import/test_import_nota_ui.prg b/utile/Teste/achizitie_import/test_import_nota_ui.prg
index 74b0c59..125a736 100644
--- a/utile/Teste/achizitie_import/test_import_nota_ui.prg
+++ b/utile/Teste/achizitie_import/test_import_nota_ui.prg
@@ -285,8 +285,8 @@ TRY
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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))
*-- Document unic (nract=1001/serie A pentru toate randurile => acelasi doc_key). doc_key
*-- populat explicit (padded C(80) la stocare, ca in fluxul real) - vezi PAS 5: comparatia
diff --git a/utile/Teste/achizitie_import/test_manual_tva_footer.prg b/utile/Teste/achizitie_import/test_manual_tva_footer.prg
index 18b2e12..efb440a 100644
--- a/utile/Teste/achizitie_import/test_manual_tva_footer.prg
+++ b/utile/Teste/achizitie_import/test_manual_tva_footer.prg
@@ -250,7 +250,7 @@ TRY
*-- index ord_doc INAINTE de CREATEOBJECT - vezi docs/testare-ui-vfp.md capcana p.
SELECT introdc
- INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc
+ 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 MtLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)'
@@ -773,8 +773,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 VerificaPereche
diff --git a/utile/Teste/achizitie_import/test_ordine_randuri_document.prg b/utile/Teste/achizitie_import/test_ordine_randuri_document.prg
new file mode 100644
index 0000000..a88a681
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_ordine_randuri_document.prg
@@ -0,0 +1,682 @@
+* test_ordine_randuri_document.prg
+* Runda32 (model B/G/T): ordinea FIZICA de creare a randurilor unui document nou e B -> G -> T
+* (azi era B -> T -> G, cu G adaugat la sfarsit). Verifica RECNO() imediat dupa
+* do_adauga_factura(), cat timp documentul e singurul din cursor (nimic altceva interleaved):
+* - DOC1 (Furnizor, cu discount): 3 randuri contigue, in ordinea B, G, T;
+* - DOC2 (Furnizor, fara discount): 2 randuri contigue, B, T (G lipseste, nu strica ordinea);
+* - DOC3 (TVA DVI, cu discount): tot B, G, T - randul T e repurpozat pentru DVI (conturi/sume
+* din dvi_*), dar pozitia lui fizica ramane a treia, dupa G.
+* Verifica si ordinea DE AFISARE (index ord_doc: B, G, T) - vezi VerificaOrdineAfisare().
+*
+* Flux REAL: dialogul `import_adauga_factura` (toDlg construit inline in programul principal,
+* capcana l - CREATEOBJECT/ADDPROPERTY nu merg dintr-o procedura in acest runtime headless).
+*
+* Rulare:
+* powershell -ExecutionPolicy Bypass -File test_ordine_randuri_document.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_ordine_randuri_document_log.txt"
+gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_ordine_randuri\"
+STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
+
+ON ERROR DO OrErr 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 OrLog 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 OrLog 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 OrLog 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) -----
+ 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', 601)
+ poAct.AddProperty('partc', 'FURNIZOR ORDINE SRL')
+ 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% -----
+ 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, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221)
+ INSERT INTO jtva_coloane2 VALUES (2, 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', 220, 21, 'ACH. IMP. 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', 221, 21, 'TVA ACH. IMP. 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)
+
+ 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 OrLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)'
+ PUBLIC goObj
+ goObj = CREATEOBJECT('IMPORT_nota', .F.)
+ IF VARTYPE(goObj) <> 'O'
+ DO OrLog 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
+
+ *========================= DOC1: Furnizor + discount (B, G, T) =========================
+ PUBLIC goDlg, goT
+ DO AdaugaFacturaF WITH 20000, 100.00
+ SELECT introdc
+ SET ORDER TO
+ =VerificaOrdine('DOC1 (Furnizor+discount)', GasesteDocKey(20000), .T., 1)
+ =VerificaOrdineAfisare('DOC1 (Furnizor+discount)', GasesteNrDoc(20000), .T.)
+
+ DO HarnessStep WITH 0, 'DOC1 (Furnizor+discount) verificat'
+
+ *========================= DOC2: Furnizor, fara discount (B, T - fara G) =========================
+ DO AdaugaFacturaF WITH 20001, 0.00
+ =VerificaOrdine('DOC2 (Furnizor, fara discount)', GasesteDocKey(20001), .F., 2)
+ =VerificaOrdineAfisare('DOC2 (Furnizor, fara discount)', GasesteNrDoc(20001), .F.)
+
+ DO HarnessStep WITH 1, 'DOC2 (fara discount) verificat'
+
+ *========================= DOC3: TVA DVI + discount (B, G, T-DVI) =========================
+ *-- doc_key ramane al documentului-mama pe toata ramura DVI (ointroduceri.vc2 ~9096-9097);
+ *-- randul T primeste insa nract-ul DVI-ului (toDlg.dvi_nract), deci NU se poate localiza
+ *-- documentul dupa nract - vezi GasesteDocKey().
+ DO AdaugaFacturaDvi WITH 20002, 150.00
+ =VerificaOrdine('DOC3 (TVA DVI+discount)', GasesteDocKey(20002), .T., 3)
+ =VerificaOrdineAfisare('DOC3 (TVA DVI+discount)', GasesteNrDoc(20002), .T.)
+
+ DO HarnessStep WITH 2, 'DOC3 (DVI+discount) verificat'
+
+ DO OrLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
+ IF pnPass = pnAsserts
+ DO OrLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
+ ELSE
+ DO OrLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
+ ENDIF
+
+ DO HarnessStep WITH 3, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
+ DO HarnessDone WITH 'done'
+
+CATCH TO loExc
+ DO OrLog 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 AdaugaFacturaF
+ *-- factura EUR curs 5, mod Furnizor (F), discount optional (0 = fara discount).
+ LPARAMETERS tnNract, tnDiscBazaVal
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = tnNract
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = 601
+ goDlg.cPartener = 'FURNIZOR ORDINE SRL'
+ goDlg.cExplicatia = 'Import marfa ordine randuri'
+ goDlg.nSuma = 1000
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 5
+ goDlg.nIdValuta = 978
+ goDlg.cValuta = 'EUR'
+ goDlg.nIdExplicatieTva = 220
+ goDlg.cExplicatieTva = 'ACH. IMP. 21%'
+ goDlg.optTipTva.Value = 1
+ goDlg.chkInValutaCont.Value = 1
+ goDlg.chkParticipaValuta.Value = 1
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO OrLog WITH 'DOC ' + TRANSFORM(tnNract) + ': valideaza = ' + TRANSFORM(goDlg.valideaza())
+
+ goT = CREATEOBJECT('Empty')
+ =ADDPROPERTY(goT,'serie_act','')
+ =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC))
+ =ADDPROPERTY(goT,'suma_val',goDlg.nSuma)
+ =ADDPROPERTY(goT,'in_valuta',1)
+ =ADDPROPERTY(goT,'participa_valuta',.T.)
+ =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta)
+ =ADDPROPERTY(goT,'curs',goDlg.nCurs)
+ =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,'')))
+ =ADDPROPERTY(goT,'cTipTva','F')
+ =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva)
+ =ADDPROPERTY(goT,'dvi_serie','')
+ =ADDPROPERTY(goT,'dvi_nract',0)
+ =ADDPROPERTY(goT,'dvi_dataact',DATE())
+ =ADDPROPERTY(goT,'dvi_id_fdoc',0)
+ =ADDPROPERTY(goT,'dvi_fdoc','')
+ =ADDPROPERTY(goT,'dvi_id_partc',0)
+ =ADDPROPERTY(goT,'dvi_partc','')
+ =ADDPROPERTY(goT,'dvi_scc','401')
+ =ADDPROPERTY(goT,'dvi_tva_lei',0)
+ =ADDPROPERTY(goT,'dvi_tva_val',0)
+ =ADDPROPERTY(goT,'dvi_in_valuta',.F.)
+ =ADDPROPERTY(goT,'dvi_id_valuta',0)
+ =ADDPROPERTY(goT,'dvi_curs',0)
+ =ADDPROPERTY(goT,'dvi_nume_val','')
+ =ADDPROPERTY(goT,'dvi_valuta_proprie',0)
+ =ADDPROPERTY(goT,'disc_baza_lei',ROUND(tnDiscBazaVal*5,gnPC))
+ =ADDPROPERTY(goT,'disc_baza_val',tnDiscBazaVal)
+
+ DO OrLog WITH 'DOC ' + TRANSFORM(tnNract) + ': do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT))
+ goDlg.Hide()
+ DOEVENTS FORCE
+ENDPROC
+
+PROCEDURE AdaugaFacturaDvi
+ *-- factura EUR curs 5, mod TVA DVI (D), discount optional.
+ LPARAMETERS tnNract, tnDiscBazaVal
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = tnNract
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = 601
+ goDlg.cPartener = 'FURNIZOR ORDINE SRL'
+ goDlg.cExplicatia = 'Import marfa ordine randuri (DVI)'
+ goDlg.nSuma = 1000
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 5
+ goDlg.nIdValuta = 978
+ goDlg.cValuta = 'EUR'
+ goDlg.nIdExplicatieTva = 220
+ goDlg.cExplicatieTva = 'ACH. IMP. 21%'
+ goDlg.optTipTva.Value = 2
+ goDlg.chkInValutaCont.Value = 1
+ goDlg.chkParticipaValuta.Value = 1
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO OrLog WITH 'DOC ' + TRANSFORM(tnNract) + ' (DVI): valideaza = ' + TRANSFORM(goDlg.valideaza())
+
+ goT = CREATEOBJECT('Empty')
+ =ADDPROPERTY(goT,'serie_act','')
+ =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC))
+ =ADDPROPERTY(goT,'suma_val',goDlg.nSuma)
+ =ADDPROPERTY(goT,'in_valuta',1)
+ =ADDPROPERTY(goT,'participa_valuta',.T.)
+ =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta)
+ =ADDPROPERTY(goT,'curs',goDlg.nCurs)
+ =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,'')))
+ =ADDPROPERTY(goT,'cTipTva','D')
+ =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva)
+ =ADDPROPERTY(goT,'dvi_serie','')
+ =ADDPROPERTY(goT,'dvi_nract',tnNract+1000)
+ =ADDPROPERTY(goT,'dvi_dataact',DATE())
+ =ADDPROPERTY(goT,'dvi_id_fdoc',2)
+ =ADDPROPERTY(goT,'dvi_fdoc','DVI')
+ =ADDPROPERTY(goT,'dvi_id_partc',900)
+ =ADDPROPERTY(goT,'dvi_partc','DIRECTIA VAMALA')
+ =ADDPROPERTY(goT,'dvi_scc','401')
+ =ADDPROPERTY(goT,'dvi_tva_lei',1050.00)
+ =ADDPROPERTY(goT,'dvi_tva_val',0)
+ =ADDPROPERTY(goT,'dvi_in_valuta',.F.)
+ =ADDPROPERTY(goT,'dvi_id_valuta',0)
+ =ADDPROPERTY(goT,'dvi_curs',0)
+ =ADDPROPERTY(goT,'dvi_nume_val','')
+ =ADDPROPERTY(goT,'dvi_valuta_proprie',1)
+ =ADDPROPERTY(goT,'disc_baza_lei',ROUND(tnDiscBazaVal*5,gnPC))
+ =ADDPROPERTY(goT,'disc_baza_val',tnDiscBazaVal)
+
+ DO OrLog WITH 'DOC ' + TRANSFORM(tnNract) + ' (DVI): do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT))
+ goDlg.Hide()
+ DOEVENTS FORCE
+ENDPROC
+
+PROCEDURE GasesteDocKey
+ *-- doc_key ramane al documentului-mama pe toata ramura (inclusiv randul T repurpozat pentru
+ *-- DVI, care primeste alt nract - vezi ointroduceri.vc2 ~9096-9097) - localizeaza documentul
+ *-- prin randul B (singurul care pastreaza mereu nract-ul facturii) si intoarce doc_key.
+ LPARAMETERS tnNract
+ LOCAL lcDocKey
+ lcDocKey = ''
+ SELECT introdc
+ LOCATE FOR nract == tnNract AND tip_rand == 'B'
+ IF FOUND()
+ lcDocKey = ALLTRIM(NVL(doc_key,''))
+ ENDIF
+ RETURN lcDocKey
+ENDPROC
+
+PROCEDURE GasesteNrDoc
+ *-- nr_doc al randului B (identic pe toate randurile B/G/T ale aceluiasi document) - vezi ointroduceri.vc2 ~9032.
+ LPARAMETERS tnNract
+ LOCAL lnNrDoc
+ lnNrDoc = 0
+ SELECT introdc
+ LOCATE FOR nract == tnNract AND tip_rand == 'B'
+ IF FOUND()
+ lnNrDoc = nr_doc
+ ENDIF
+ RETURN lnNrDoc
+ENDPROC
+
+PROCEDURE VerificaOrdine
+ *-- verifica RECNO() fizic: B < [G <] T, contigue, imediat dupa creare documentului doc_key.
+ LPARAMETERS tcLabel, tcDocKey, tlAreG, tnPasIdx
+ LOCAL lnRecnoB, lnRecnoG, lnRecnoT
+ STORE 0 TO lnRecnoB, lnRecnoG, lnRecnoT
+ =Assert3(tcLabel + '-doc_key gasit (GasesteDocKey)', IIF(!EMPTY(tcDocKey),1,0), 1)
+ SELECT introdc
+ SCAN FOR ALLTRIM(NVL(doc_key,'')) == tcDocKey
+ DO CASE
+ CASE tip_rand == 'B' AND lnRecnoB = 0
+ lnRecnoB = RECNO()
+ CASE tip_rand == 'G'
+ lnRecnoG = RECNO()
+ CASE tip_rand == 'T' AND lnRecnoT = 0
+ lnRecnoT = RECNO()
+ ENDCASE
+ ENDSCAN
+ =Assert3(tcLabel + '-B gasit (recno>0)', IIF(lnRecnoB>0,1,0), 1)
+ =Assert3(tcLabel + '-T gasit (recno>0)', IIF(lnRecnoT>0,1,0), 1)
+ IF tlAreG
+ =Assert3(tcLabel + '-G gasit (recno>0)', IIF(lnRecnoG>0,1,0), 1)
+ =Assert3(tcLabel + '-ordine: RECNO(B) < RECNO(G)', IIF(lnRecnoB < lnRecnoG,1,0), 1)
+ =Assert3(tcLabel + '-ordine: RECNO(G) < RECNO(T)', IIF(lnRecnoG < lnRecnoT,1,0), 1)
+ =Assert3(tcLabel + '-contiguitate: RECNO(G)=RECNO(B)+1', IIF(lnRecnoG = lnRecnoB+1,1,0), 1)
+ =Assert3(tcLabel + '-contiguitate: RECNO(T)=RECNO(G)+1', IIF(lnRecnoT = lnRecnoG+1,1,0), 1)
+ ELSE
+ =Assert3(tcLabel + '-fara discount: niciun rand G', IIF(lnRecnoG=0,1,0), 1)
+ =Assert3(tcLabel + '-ordine: RECNO(B) < RECNO(T)', IIF(lnRecnoB < lnRecnoT,1,0), 1)
+ =Assert3(tcLabel + '-contiguitate: RECNO(T)=RECNO(B)+1', IIF(lnRecnoT = lnRecnoB+1,1,0), 1)
+ ENDIF
+ DO OrLog WITH tcLabel + ': RECNO(B)=' + TRANSFORM(lnRecnoB) + ' RECNO(G)=' + TRANSFORM(lnRecnoG) + ' RECNO(T)=' + TRANSFORM(lnRecnoT)
+ENDPROC
+
+PROCEDURE VerificaOrdineAfisare
+ *-- verifica ordinea DE AFISARE (Set Order To ord_doc): pentru acelasi nr_doc, succesiunea tip_rand.
+ LPARAMETERS tcLabel, tnNrDoc, tlAreG
+ LOCAL lcSecventa, lcAsteptat
+ lcSecventa = ''
+ SELECT introdc
+ SET ORDER TO ord_doc
+ GO TOP
+ SCAN FOR nr_doc == tnNrDoc
+ lcSecventa = lcSecventa + tip_rand
+ ENDSCAN
+ SET ORDER TO
+ lcAsteptat = IIF(tlAreG, 'BGT', 'BT')
+ =AssertStr(tcLabel + '-afisare: secventa tip_rand (ord_doc)', lcSecventa, lcAsteptat)
+ENDPROC
+
+PROCEDURE CreeazaIntrodc
+ 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 Assert3
+ LPARAMETERS tcLabel, tuActual, tuExpected
+ pnAsserts = pnAsserts + 1
+ IF ABS(NVL(tuActual,0) - tuExpected) < 0.02
+ pnPass = pnPass + 1
+ DO OrLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
+ ELSE
+ DO OrLog 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 OrLog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])'
+ ELSE
+ DO OrLog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])'
+ ENDIF
+ENDPROC
+
+PROCEDURE OrErr
+ LPARAMETERS tnErr, tcMsg, tcProg, tnLine
+ DO OrLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
+ENDPROC
+
+PROCEDURE OrLog
+ 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 ('')
+ 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 (220, 'ACH. IMP. 21%', 1, 0, 'FO21B', 21, 221, 1, 1, 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, 2, 301204)
+ENDPROC
diff --git a/utile/Teste/achizitie_import/test_ordine_randuri_document.ps1 b/utile/Teste/achizitie_import/test_ordine_randuri_document.ps1
new file mode 100644
index 0000000..f927745
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_ordine_randuri_document.ps1
@@ -0,0 +1,12 @@
+# test_ordine_randuri_document.ps1 - wrapper peste harness-ul generic pentru ordinea fizica de
+# creare a randurilor (B -> G -> T) la adaugarea unei facturi - Runda32.
+# powershell -ExecutionPolicy Bypass -File test_ordine_randuri_document.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_ordine_randuri_document.prg') `
+ -Steps @('doc1_furnizor_discount','doc2_furnizor_fara_discount','doc3_dvi_discount','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_ordine_randuri') `
+ -SyncDir (Join-Path $Teste 'uisync_ordine_randuri') `
+ -StepTimeoutSec 180 `
+ -ReadyTimeoutSec 180
diff --git a/utile/Teste/achizitie_import/test_picker_real_212.prg b/utile/Teste/achizitie_import/test_picker_real_212.prg
index 122258f..409e4e5 100644
--- a/utile/Teste/achizitie_import/test_picker_real_212.prg
+++ b/utile/Teste/achizitie_import/test_picker_real_212.prg
@@ -541,8 +541,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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
diff --git a/utile/Teste/achizitie_import/test_repro_import_nota.prg b/utile/Teste/achizitie_import/test_repro_import_nota.prg
index 7fa5fe9..8a54739 100644
--- a/utile/Teste/achizitie_import/test_repro_import_nota.prg
+++ b/utile/Teste/achizitie_import/test_repro_import_nota.prg
@@ -290,8 +290,8 @@ TRY
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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))
DO ReproLog WITH 'introdc creat (gol, ' + TRANSFORM(FCOUNT('introdc')) + ' campuri)'
*----- rul_temp: in fluxul real e creat abia in Init (T2); il cream aici INAINTE de
diff --git a/utile/Teste/achizitie_import/test_repro_tva11_explicatie.prg b/utile/Teste/achizitie_import/test_repro_tva11_explicatie.prg
new file mode 100644
index 0000000..27fa14c
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_repro_tva11_explicatie.prg
@@ -0,0 +1,1025 @@
+* test_repro_tva11_explicatie.prg
+* Repro (raportat de Marius) - formularul "Achizitie din import marfa/materiale" (import_nota,
+* COMUN\clase\ointroduceri.vcx), pe fluxul REAL de utilizator:
+* 1. factura de import cu notele initial pe cota 21% (DVI, ca in test_dvi_multicota.prg);
+* 2. se adauga 2 articole (unul 21%, unul 11%) - notele se defalca pe cote TVA la sincronizare;
+* nomenclatorul JTVA_COLOANE nu are inca perechea de import 11% (FO11B/FO11T - migrare
+* docs\handoff_tva11_nomenclator.md, neaplicata), deci randul T de 11% nu se poate crea;
+* randul S de 11% ramane cu explicatia mostenita de la baza (21%, gresita - creeaza_rand_s
+* seteaza ptva=11 dar NU schimba explicatie_tva/id_jtva_coloana daca gaseste_jtva_cota nu
+* gaseste perechea - vezi COMUN\clase\ointroduceri.vcx procedura creeaza_rand_s);
+* 3. pe randul S cu TVA%=11 se schimba explicatia TVA cu alta explicatie tot de 11% (dublu-click
+* pe celula "Explicatie TVA" -> formularul REAL de cautare, cauta_alfa_form; Oracle
+* nemock-uibil in cauta_alfa - shadow in mock_cauta_alfa_tva11.prg, vezi acel fisier).
+*
+* STARE (30/07/2026, dupa write-back cu txt2vcx.ps1, fidelity-check O,P1,E0,S1,X0): corectia de
+* cod E ACUM IN BINAR (COMUN\clase\ointroduceri.vcx) pentru AMBELE moduri - PRE si POST NU mai
+* difera prin cod, doar prin nomenclatorul JTVA_COLOANE mock (vezi docs\handoff_tva11_test.md):
+* (a) eroare VFP "Operator/operand type mismatch" (IMPORT_NOTA.GRID1.CSUMA.TEXT1.VALID) -
+* INCHISA de corectie, in AMBELE moduri (nu mai depinde de nomenclator).
+* (b) mesaj de coloana/explicatie TVA lipsa pentru o cota - depinde DOAR de nomenclator:
+* PRE (FO11B/FO11T lipsesc, docs\handoff_tva11_nomenclator.md, script neaplicat) -
+* mesajul apare (text nou: "Documentul are marfa la %, dar nu exista
+* explicatie TVA de % in seria '' - completati nomenclatorul de explicatii
+* TVA."); POST (FO11B/FO11T=236/237 adaugate in mock) - mesajul NU mai apare, finalizarea
+* se poate face.
+* gcPickChoice (fisier steag tva11_pick_other_series.flag) controleaza CE explicatie de 11%
+* alege utilizatorul la pasul 3: SAME (implicit) = din ACEEASI serie ca documentul (FO11B, doar
+* in POST - in PRE nu exista); OTHER = din ALTA serie (CE11CTB, bunuri CE, furnizor inregistrat TVA, EXISTENTA in ambele
+* moduri) - exact alegerea reala a lui Marius din captura lui.
+*
+* Rulare (mod PRE, implicit):
+* powershell -ExecutionPolicy Bypass -File test_repro_tva11_explicatie.ps1
+* Rulare (mod POST + alegere din ACEEASI serie): scrie fisierul-steag tva11_post_fix.flag,
+* sterge tva11_pick_other_series.flag daca exista, ruleaza acelasi .ps1.
+* Rulare (mod POST + alegere din ALTA serie, cazul real Marius): scrie AMBELE fisiere-steag
+* (tva11_post_fix.flag SI tva11_pick_other_series.flag), ruleaza acelasi .ps1.
+* Alternativ, linie de comanda directa (fara harness/screenshot-uri):
+* vfp9.exe -A "test_repro_tva11_explicatie.fxp" POST
+
+LPARAMETERS tcModTest
+
+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_tva11_explicatie_log.txt"
+gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_tva11_explicatie\"
+STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
+
+PUBLIC gcModTest
+IF TYPE('tcModTest') = 'C' AND UPPER(ALLTRIM(tcModTest)) == 'POST'
+ gcModTest = 'POST'
+ELSE
+ IF FILE("D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\tva11_post_fix.flag")
+ gcModTest = 'POST'
+ ELSE
+ gcModTest = 'PRE'
+ ENDIF
+ENDIF
+DO TvLog WITH 'MOD TEST = ' + gcModTest
+
+ON ERROR DO TvErr 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 TvLog 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 TvLog 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\mock_cauta_nom_articole.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\achizitie_import\mock_cauta_alfa_tva11.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 TvLog WITH 'SET PROCEDURE OK'
+
+ PUBLIC goMockValuta
+ goMockValuta = CREATEOBJECT('Custom')
+ goMockValuta.AddProperty('id_valuta', 978)
+ goMockValuta.AddProperty('nume_val', 'EUR')
+
+ *----- 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)
+
+ *-- gnTipGest: citit bare la Do listare_nir With poAct.nnir, gnTipGest In oproceduri_listari,
+ *-- dupa oscrie_in_fisiere() cu succes (inainte_de_do_termin) - 0 = gestiune normala.
+ PUBLIC gnTipGest
+ gnTipGest = 0
+ *-- gnHandle: conexiune Oracle reala, nefolosita direct (oscrie_in_fisiere e mock-uit), dar
+ *-- declarata defensiv ca in test_e2e_dvi_ron_discount.prg, ca sa nu lipseasca daca e citita.
+ PUBLIC gnHandle
+ gnHandle = -1
+ *-- restul mediului real (roagest.prg) cerut de pasul Terminat/listare_nir - preluat INTREG
+ *-- din test_e2e_dvi_ron_discount.prg (singurul test din suita care merge pana la capat pe
+ *-- acest drum), ca sa nu descoperim globale lipsa una cate una.
+ PUBLIC gcTempPath
+ gcTempPath = ADDBS(SYS(2023))
+ PUBLIC gcCondSucursala
+ gcCondSucursala = ''
+
+ PUBLIC gnButon
+ STORE 2 TO gnButon
+ PUBLIC gcMockArtCodmat, gcMockAcontCrt
+ gcMockArtCodmat = ''
+ gcMockAcontCrt = ''
+ PUBLIC gnMockRaspuns
+ gnMockRaspuns = 6
+ *-- capteaza textul exact al ultimului amessagebox (mock_amessagebox.prg) - pt. assert pe cmesajsync
+ PUBLIC gcMockUltimMesaj, gnMockUltimTip
+ gcMockUltimMesaj = ''
+ gnMockUltimTip = 0
+ *-- denumirea aleasa in dialogul de cautare explicatie TVA (mock_cauta_alfa_tva11.prg)
+ PUBLIC gcTestTvaAlege
+ gcTestTvaAlege = ''
+
+ PUBLIC goExecutor, goApp
+ goExecutor = CREATEOBJECT('dummyexecutor')
+ goApp = CREATEOBJECT('dummyapp')
+
+ *----- poAct: antetul notei (moneda principala EUR, curs 5) -----
+ 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', 601)
+ poAct.AddProperty('partc', 'MULTI SUPPLY SRL')
+ poAct.AddProperty('serie_act', '')
+ poAct.AddProperty('dataact', DATE())
+ poAct.AddProperty('tva_incasare', 0)
+ poAct.AddProperty('id_set', 1)
+ poAct.AddProperty('id_gestin', 1)
+
+ *----- gcPickChoice: care explicatie de 11% alege utilizatorul la pasul 3 - control primit de la
+ * team-lead (30/07/2026), din citire directa (read-only) pe JTVA_COLOANE real: SAME (implicit)
+ * = FO11B/236, din ACEEASI serie ca documentul (FO21B/220); OTHER = CE11CTB/232, din ALTA serie
+ * (bunuri CE, furnizor inregistrat TVA) - exact ce a ales Marius in captura lui. Fisier-steag, ca la gcModTest (harness-ul
+ * standard nu paseaza parametri liniei de comanda). -----
+ PUBLIC gcPickChoice
+ IF FILE("D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\tva11_pick_other_series.flag")
+ gcPickChoice = 'OTHER'
+ ELSE
+ gcPickChoice = 'SAME'
+ ENDIF
+ DO TvLog WITH 'PICK CHOICE (flag, relevant DOAR in POST - PRE alege intotdeauna din alta serie, FO11B nu exista) = ' + gcPickChoice
+
+ *----- jtva_coloane2 / saft_taxtable: id-uri si coloana_jc REALE (team-lead, interogare read-only
+ * pe JTVA_COLOANE, 30/07/2026): 220=FO21B/221=FO21T (import bunuri 21% - baza documentului,
+ * exista); 236=FO11B/237=FO11T (import bunuri 11% - FIX-ul migrarii, doar in modul POST);
+ * 226=CE21CTB/227=CE21CTT si 232=CE11CTB/233=CE11CTT (bunuri CE, furnizor inregistrat TVA 21%/11% - serie DIFERITA,
+ * EXISTENTA deja in ambele moduri, neconditionata de migrarea FO11x) - optiunea "alta serie"
+ * aleasa efectiv de Marius in captura lui (gcPickChoice='OTHER'). -----
+ 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, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221)
+ INSERT INTO jtva_coloane2 VALUES (2, 221, 'TVA ACH. IMP. 21%', 1, 0, 1, 'FO21T', '', 21, 0)
+ INSERT INTO jtva_coloane2 VALUES (3, 226, 'ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE21CTB', 'CE21CTT', 21, 227)
+ INSERT INTO jtva_coloane2 VALUES (4, 227, 'TVA ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE21CTT', '', 21, 0)
+ INSERT INTO jtva_coloane2 VALUES (5, 232, 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE11CTB', 'CE11CTT', 11, 233)
+ INSERT INTO jtva_coloane2 VALUES (6, 233, 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE11CTT', '', 11, 0)
+ IF gcModTest == 'POST'
+ INSERT INTO jtva_coloane2 VALUES (7, 236, 'ACH. IMP. 11%', 1, 0, 1, 'FO11B', 'FO11T', 11, 237)
+ INSERT INTO jtva_coloane2 VALUES (8, 237, 'TVA ACH. IMP. 11%', 1, 0, 1, 'FO11T', '', 11, 0)
+ DO TvLog WITH 'MOD POST: jtva_coloane2 ARE perechea FO11B/FO11T (236/237) - nomenclator migrat'
+ ELSE
+ DO TvLog WITH 'MOD PRE: jtva_coloane2 NU are perechea FO11B/FO11T (stare curenta din baza)'
+ ENDIF
+
+ 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)
+ INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ;
+ VALUES ('301205-Import de bunuri cota 11%', 301205, '', 11, 1, 0, 1, 0)
+ INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ;
+ VALUES ('300704-Achizitii de servicii intracomunitare, taxabile cu cota de 21%', 300704, '', 21, 1, 0, 1, 0)
+ INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ;
+ VALUES ('300705-Achizitii de servicii intracomunitare, taxabile cu cota de 11%', 300705, '', 11, 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', 220, 21, 'ACH. IMP. 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', 221, 21, 'TVA ACH. IMP. 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)
+
+ 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
+
+ *----- goDlgTva11: formularul REAL cauta_alfa_form pentru dialogul de explicatie TVA, pre-construit
+ * in main (capcana l - CREATEOBJECT dintr-o procedura da obiect stricat headless). Cursorul are
+ * EXACT coloanele SELECT-ate de do_modifica_explicatie_tva (id_jtva_coloana, denumire, cota_tva),
+ * filtrate la cota_tva=11 (ca vjtva_coloane in flux real): CE11CTB/CE11CTT (232/233, alta serie,
+ * EXISTENTA in ambele moduri) + FO11B/FO11T (236/237, aceeasi serie ca documentul, DOAR in POST). -----
+ IF USED('crsTva11cauta')
+ USE IN ('crsTva11cauta')
+ ENDIF
+ CREATE CURSOR crsTva11cauta (id_jtva_coloana N(14), denumire C(100), cota_tva N(6,2))
+ INSERT INTO crsTva11cauta VALUES (232, 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 11)
+ INSERT INTO crsTva11cauta VALUES (233, 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 11)
+ IF gcModTest == 'POST'
+ INSERT INTO crsTva11cauta VALUES (236, 'ACH. IMP. 11%', 11)
+ INSERT INTO crsTva11cauta VALUES (237, 'TVA ACH. IMP. 11%', 11)
+ ENDIF
+ GO TOP
+
+ PUBLIC goDlgTva11
+ goDlgTva11 = CREATEOBJECT('cauta_alfa_form', 'crsTva11cauta', '', 'Explicatie TVA,Cota TVA', ;
+ 'denumire,cota_tva', .F., '', 1)
+ goDlgTva11.crs_cursor = 'crsTva11cauta'
+ goDlgTva11.cIdColumn = 'id_jtva_coloana'
+ goDlgTva11.WindowType = 0
+ goDlgTva11.Show()
+ DOEVENTS FORCE
+ DO TvLog WITH 'goDlgTva11 construit (cauta_alfa_form REAL, mod single-select)'
+
+ DO TvLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)'
+ PUBLIC goObj
+ goObj = CREATEOBJECT('IMPORT_nota', .F.)
+ IF VARTYPE(goObj) <> 'O'
+ DO TvLog 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
+
+ *========================= PAS 1: FACTURA DE IMPORT, DVI, NOTE INITIAL PE 21% =========================
+ PUBLIC goDlg, goT, gcDocKey1
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = 19000
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = 601
+ goDlg.cPartener = 'MULTI SUPPLY SRL'
+ goDlg.cExplicatia = 'Import marfa multicota TVA11'
+ goDlg.nSuma = 1500
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 5
+ goDlg.nIdValuta = 978
+ goDlg.cValuta = 'EUR'
+ goDlg.nIdExplicatieTva = 220
+ goDlg.cExplicatieTva = 'ACH. IMP. 21%'
+ goDlg.optTipTva.Value = 2 && D = DVI
+ goDlg.chkInValutaCont.Value = 1
+ goDlg.chkParticipaValuta.Value = 1
+ goDlg.cSerieDvi = ''
+ goDlg.nNractDvi = 9019
+ goDlg.dDviData = DATE()
+ goDlg.nIdFdocDVI = 2
+ goDlg.cFelDocDvi = 'DVI'
+ goDlg.nDviIdPartener = 901
+ goDlg.cDviPartener = 'DIRECTIA VAMALA'
+ goDlg.nDviTvaLei = 1325.00
+ goDlg.nDviTvaVal = 0
+ goDlg.actualizeaza_stare_dvi()
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO TvLog WITH 'valideaza = ' + TRANSFORM(goDlg.valideaza())
+
+ goT = CREATEOBJECT('Empty')
+ =ADDPROPERTY(goT,'serie_act','')
+ =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC))
+ =ADDPROPERTY(goT,'suma_val',goDlg.nSuma)
+ =ADDPROPERTY(goT,'in_valuta',goDlg.chkInValutaCont.Value)
+ =ADDPROPERTY(goT,'participa_valuta',.T.)
+ =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta)
+ =ADDPROPERTY(goT,'curs',goDlg.nCurs)
+ =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,'')))
+ =ADDPROPERTY(goT,'cTipTva','D')
+ =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva)
+ =ADDPROPERTY(goT,'dvi_serie','')
+ =ADDPROPERTY(goT,'dvi_nract',goDlg.nNractDvi)
+ =ADDPROPERTY(goT,'dvi_dataact',DATE())
+ =ADDPROPERTY(goT,'dvi_id_fdoc',2)
+ =ADDPROPERTY(goT,'dvi_fdoc','DVI')
+ =ADDPROPERTY(goT,'dvi_id_partc',901)
+ =ADDPROPERTY(goT,'dvi_partc','DIRECTIA VAMALA')
+ =ADDPROPERTY(goT,'dvi_scc','401')
+ =ADDPROPERTY(goT,'dvi_tva_lei',1325.00)
+ =ADDPROPERTY(goT,'dvi_tva_val',0)
+ =ADDPROPERTY(goT,'dvi_in_valuta',.F.)
+ =ADDPROPERTY(goT,'dvi_id_valuta',0)
+ =ADDPROPERTY(goT,'dvi_curs',0)
+ =ADDPROPERTY(goT,'dvi_nume_val','')
+ =ADDPROPERTY(goT,'dvi_valuta_proprie',1)
+ =ADDPROPERTY(goT,'disc_baza_lei',0)
+ =ADDPROPERTY(goT,'disc_baza_val',0)
+
+ LOCAL llOkAdauga
+ llOkAdauga = goObj.do_adauga_factura(goT)
+ =Assert3('1-do_adauga_factura(goT) reuseste', IIF(llOkAdauga,1,0), 1)
+ goDlg.Hide()
+ DOEVENTS FORCE
+
+ SELECT introdc
+ SET ORDER TO
+ LOCATE FOR nract = 19000 AND tip_rand == 'B'
+ IF FOUND()
+ gcDocKey1 = ALLTRIM(NVL(doc_key,''))
+ ENDIF
+ SELECT introdc
+ SET ORDER TO ord_doc
+
+ DO HarnessStep WITH 0, 'factura DVI creata (note initial 21%), doc_key=' + gcDocKey1
+
+ *========================= PAS 2: 2 ARTICOLE (21% si 11%) - defalcare pe cote la sincronizare =========================
+ gcMockArtCodmat = 'ART-BULD-212'
+ gcMockAcontCrt = ''
+ TRY
+ goObj.do_adauga_articol()
+ CATCH TO loExcA1
+ DO TvLog WITH 'EROARE do_adauga_articol (1, 21%) ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212'
+ IF FOUND()
+ REPLACE cant WITH 1, pret_val WITH 1000, pretd WITH 1000, pret WITH ROUND(1000*5,4), ;
+ pret_lei WITH ROUND(1000*5,4), cota_tva WITH 21
+ ENDIF
+
+ gcMockArtCodmat = 'ART-A8-371'
+ *-- contul 371 are analitice predefinite (FCONTURI_ANALITICE) - completez acont-ul, altfel
+ *-- ramane un mesaj permanent in cmesajsync ("analiticul nu e completat"), care ar bloca
+ *-- finalizarea INDIFERENT de fixul TVA testat aici (vezi docs\handoff_tva11_test.md)
+ gcMockAcontCrt = '4'
+ TRY
+ goObj.do_adauga_articol()
+ CATCH TO loExcA2
+ DO TvLog WITH 'EROARE do_adauga_articol (2, 11%) ' + TRANSFORM(loExcA2.ErrorNo) + ' [' + loExcA2.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371'
+ IF FOUND()
+ REPLACE cant WITH 1, pret_val WITH 500, pretd WITH 500, pret WITH ROUND(500*5,4), ;
+ pret_lei WITH ROUND(500*5,4), cota_tva WITH 11
+ ENDIF
+ goObj.gridart.Refresh()
+ DOEVENTS FORCE
+
+ =Assert3('2-doua articole in rul_temp (21% + 11%)', RECCOUNT_ACTIVE('rul_temp'), 2)
+
+ DO HarnessStep WITH 1, 'articole (21% si 11%) adaugate'
+
+ *-- prima sincronizare (defalcarea pe cote ceruta de utilizator la pasul 2)
+ LOCAL llEroareSync1
+ llEroareSync1 = .F.
+ TRY
+ goObj.sincronizeaza()
+ CATCH TO loExcS1
+ llEroareSync1 = .T.
+ DO TvLog WITH 'EROARE sincronizeaza() #1 ' + TRANSFORM(loExcS1.ErrorNo) + ' [' + loExcS1.Message + '] in ' + loExcS1.Procedure + ':' + TRANSFORM(loExcS1.LineNo)
+ ENDTRY
+ DOEVENTS FORCE
+ =Assert3('3-sincronizeaza() #1 fara eroare VFP', IIF(llEroareSync1,0,1), 1)
+
+ DO TvLog WITH 'cmesajsync dupa sincronizare #1 = [' + STRTRAN(STRTRAN(NVL(goObj.cmesajsync,''),CHR(13),' '),CHR(10),' | ') + ']'
+
+ *========================= SIMPTOM (b): mesaj coloana TVA lipsa pentru cota 11% (document DVI) =========================
+ LOCAL lcMesajSync1
+ lcMesajSync1 = UPPER(NVL(goObj.cmesajsync,''))
+ IF gcModTest == 'PRE'
+ =AssertContains('4-cmesajsync PRE: contine "11%"', lcMesajSync1, '11%')
+ =AssertContainsOr('4a-cmesajsync PRE: contine "COLOANA TVA" sau "EXPLICATIE TVA"', lcMesajSync1, 'COLOANA TVA', 'EXPLICATIE TVA')
+ =AssertContains('4b-cmesajsync PRE: mentioneaza documentul DVI', lcMesajSync1, 'DVI')
+ ELSE
+ =Assert3('4-cmesajsync POST: gol sau fara mentiune de 11% lipsa (nomenclator migrat)', IIF('11%' $ lcMesajSync1 AND ('COLOANA TVA' $ lcMesajSync1 OR 'EXPLICATIE TVA' $ lcMesajSync1),0,1), 1)
+ ENDIF
+
+ *========================= PAS 3: randul S cu TVA%=11 - explicatia mostenita (gresita) de la baza 21% =========================
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11
+ LOCAL llGasitS11
+ llGasitS11 = FOUND()
+ =Assert3('5-exista rand S cu ptva=11', IIF(llGasitS11,1,0), 1)
+ IF llGasitS11
+ DO TvLog WITH 'rand S(11%) INAINTE de editare: explicatie_tva=[' + ALLTRIM(NVL(explicatie_tva,'')) + '] id_jtva_coloana=' + TRANSFORM(NVL(id_jtva_coloana,0)) + ' recno=' + TRANSFORM(RECNO())
+ ELSE
+ DO TvLog WITH 'FAIL: nu exista rand S cu ptva=11 - opresc scenariul explicatiei TVA'
+ ENDIF
+
+ IF llGasitS11
+ *========================= PAS 3: dublu-click pe celula "Explicatie TVA" -> alta explicatie tot de 11% =========================
+ *-- SIMPTOM (a): apel programatic (fara SetFocus/GotFocus real pe celula) - ca gestul de
+ *-- dublu-click al utilizatorului, care sare direct pe celula Explicatie TVA fara sa fi
+ *-- trecut normal prin celelalte celule ale randului (vezi test_repro_valuta_dblclick.prg,
+ *-- PAS A - acelasi tipar de reproducere pentru bug-uri legate de focus in acest grid).
+ *-- PRE: FO11B nu exista inca - Marius e nevoit sa aleaga din alta serie (CE11CTB, exact ce a
+ *-- ales el real). POST+SAME: alege FO11B (aceeasi serie ca documentul, 220/FO21B). POST+OTHER:
+ *-- repeta alegerea din alta serie (CE11CTB), ca sa vedem daca fixul rezista si la alegerea gresita.
+ DO CASE
+ CASE gcModTest == 'PRE'
+ gcTestTvaAlege = 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA'
+ CASE gcModTest == 'POST' AND gcPickChoice == 'OTHER'
+ gcTestTvaAlege = 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA'
+ OTHERWISE
+ gcTestTvaAlege = 'ACH. IMP. 11%'
+ ENDCASE
+ STORE 0 TO gnButon
+ DO TvLog WITH '--- INAINTE de dublu-click pe Explicatie TVA (rand S/11%), aleg [' + gcTestTvaAlege + '] ---'
+
+ LOCAL llEroareDblClick
+ llEroareDblClick = .F.
+ TRY
+ goObj.grid1.cExplicatieTva.Text1.DblClick()
+ CATCH TO loExcDbl
+ llEroareDblClick = .T.
+ DO TvLog WITH 'EROARE (in TRY, NU se propaga la ON ERROR) la DblClick explicatie TVA: ' + TRANSFORM(loExcDbl.ErrorNo) + ' [' + loExcDbl.Message + '] in ' + loExcDbl.Procedure + ':' + TRANSFORM(loExcDbl.LineNo) + ' LineContents=[' + ALLTRIM(loExcDbl.LineContents) + ']'
+ LOCAL lnStackI
+ FOR lnStackI = 1 TO 15
+ IF EMPTY(PROGRAM(lnStackI))
+ EXIT
+ ENDIF
+ DO TvLog WITH ' STACK[' + TRANSFORM(lnStackI) + ']=' + PROGRAM(lnStackI)
+ ENDFOR
+ ENDTRY
+ DOEVENTS FORCE
+ DO TvLog WITH '--- DUPA dublu-click pe Explicatie TVA (eroare prinsa in TRY local=' + TRANSFORM(llEroareDblClick) + ') ---'
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ALLTRIM(NVL(scd,'')) == '371'
+ LOCAL llGasitS371Dupa
+ llGasitS371Dupa = FOUND()
+ DO TvLog WITH 'rand S(371) DUPA dublu-click: gasit=' + TRANSFORM(llGasitS371Dupa) + ' explicatie_tva=[' + ALLTRIM(NVL(explicatie_tva,'')) + '] ptva=' + TRANSFORM(NVL(ptva,0)) + ' id_jtva_coloana=' + TRANSFORM(NVL(id_jtva_coloana,0))
+ *-- corectia de cod (fara crash mid-flux) e in ambele moduri - astept acelasi rezultat corect
+ *-- imediat dupa dublu-click, indiferent de mod (PRE sau POST).
+ =Assert3('5b-rand S(371) gasit dupa dublu-click', IIF(llGasitS371Dupa,1,0), 1)
+ IF llGasitS371Dupa
+ =Assert3('5c-rand S/371 pastreaza ptva=11 dupa dublu-click', NVL(ptva,0), 11)
+ =AssertContains('5d-rand S/371 pastreaza explicatie_tva aleasa (contine "11%")', UPPER(NVL(explicatie_tva,'')), '11%')
+ ENDIF
+
+ DO HarnessStep WITH 2, 'dupa dublu-click Explicatie TVA (rand S/11%) - vezi log pentru eroarea VFP'
+
+ *-- timerul tmrSync ar re-sincroniza (armat de do_executa/aplica_explicatie_tva) - il declansez
+ *-- explicit, FARA TRY/CATCH, ca eroarea VFP (daca apare) sa ajunga la ON ERROR (ca la utilizator)
+ DO TvLog WITH '--- INAINTE de sincronizeaza() #2 (declansata de editarea explicatiei TVA, FARA TRY - eroarea trebuie sa ajunga la ON ERROR daca apare) ---'
+ goObj.sincronizeaza()
+ DOEVENTS FORCE
+ DO TvLog WITH '--- DUPA sincronizeaza() #2 ---'
+ ENDIF
+
+ *========================= PAS 3b: coerenta S/T pe familia de explicatii dupa resincronizare =========================
+ IF llGasitS11
+ DO TvLog WITH 'familii dupa sincronizare #2: S(21)=' + TRANSFORM(CampRand('S',21,'id_jtva_coloana')) + ' T(21)=' + TRANSFORM(CampRand('T',21,'id_jtva_coloana')) + ' S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana'))
+ *-- randul T urmeaza familia randului S de aceeasi cota, indiferent din ce serie a ales
+ *-- utilizatorul explicatia pe randul S de 11%
+ =Assert3('8-rand S(21%) ramane in familia documentului (220/FO21B)', CampRand('S',21,'id_jtva_coloana'), 220)
+ =Assert3('8a-rand T(21%) aliniat la perechea S(21%) (221/FO21T)', CampRand('T',21,'id_jtva_coloana'), 221)
+ IF gcModTest == 'POST'
+ =Assert3('8b-rand S(11%) POST: 236/FO11B', CampRand('S',11,'id_jtva_coloana'), 236)
+ =Assert3('8c-rand T(11%) POST: aliniat la perechea S(11%) (237/FO11T)', CampRand('T',11,'id_jtva_coloana'), 237)
+ ELSE
+ *-- PRE: FO11B/FO11T lipsesc, randul S de 11% ramane pe explicatia de 21% mostenita, deci nu
+ *-- exista pereche de aliniat - randul T de 11% pastreaza explicatia aleasa de utilizator
+ =Assert3('8b-rand T(11%) PRE: ramane pe explicatia aleasa (233/CE11CTT)', CampRand('T',11,'id_jtva_coloana'), 233)
+ ENDIF
+ ENDIF
+
+ *========================= PAS 4: explicatie aleasa MANUAL pe randul T - supravietuieste resincronizarii =========================
+ IF llGasitS11
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' AND ptva == 11
+ IF FOUND()
+ DO TvLog WITH 'rand T(11%) INAINTE de alegerea manuala: id_jtva_coloana=' + TRANSFORM(NVL(id_jtva_coloana,0)) + ' expl_manual=' + TRANSFORM(NVL(expl_manual,0))
+ gcTestTvaAlege = 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA'
+ STORE 0 TO gnButon
+ *-- dialogul de cautare se elibereaza singur la prima folosire (do_termin) - il reconstruiesc
+ goDlgTva11 = CREATEOBJECT('cauta_alfa_form', 'crsTva11cauta', '', 'Explicatie TVA,Cota TVA', ;
+ 'denumire,cota_tva', .F., '', 1)
+ goDlgTva11.crs_cursor = 'crsTva11cauta'
+ goDlgTva11.cIdColumn = 'id_jtva_coloana'
+ goDlgTva11.WindowType = 0
+ goDlgTva11.Show()
+ DOEVENTS FORCE
+ TRY
+ goObj.grid1.cExplicatieTva.Text1.DblClick()
+ CATCH TO loExcDblT
+ DO TvLog WITH 'EROARE la DblClick explicatie TVA pe randul T: ' + TRANSFORM(loExcDblT.ErrorNo) + ' [' + loExcDblT.Message + '] in ' + loExcDblT.Procedure + ':' + TRANSFORM(loExcDblT.LineNo)
+ ENDTRY
+ DOEVENTS FORCE
+ DO TvLog WITH 'rand T(11%) DUPA alegerea manuala: id_jtva_coloana=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' expl_manual=' + TRANSFORM(CampRand('T',11,'expl_manual'))
+ =Assert3('9-rand T(11%) preia explicatia aleasa manual (233/CE11CTT)', CampRand('T',11,'id_jtva_coloana'), 233)
+ =Assert3('9a-rand T(11%) marcat ca ales manual (expl_manual=1)', CampRand('T',11,'expl_manual'), 1)
+
+ goObj.sincronizeaza()
+ DOEVENTS FORCE
+ DO TvLog WITH 'familii dupa sincronizare #3: S(21)=' + TRANSFORM(CampRand('S',21,'id_jtva_coloana')) + ' T(21)=' + TRANSFORM(CampRand('T',21,'id_jtva_coloana')) + ' S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana'))
+ =Assert3('9b-rand T(11%) pastreaza explicatia manuala dupa resincronizare', CampRand('T',11,'id_jtva_coloana'), 233)
+ =Assert3('9c-rand T(21%) ramane aliniat la perechea S(21%) (221/FO21T)', CampRand('T',21,'id_jtva_coloana'), 221)
+ IF gcModTest == 'POST'
+ =Assert3('9d-rand S(11%) neatins de alegerea de pe randul T (236/FO11B)', CampRand('S',11,'id_jtva_coloana'), 236)
+ ENDIF
+ ELSE
+ DO TvLog WITH 'nu exista rand T cu ptva=11 - sar peste scenariul de eticheta manuala'
+ ENDIF
+ ENDIF
+
+ DO HarnessStep WITH 3, 'dupa sincronizare #2 - vezi log pentru eroarea VFP si cmesajsync'
+
+ *========================= VERIFICARE SIMPTOM (a): eroare VFP "Operator/operand type mismatch" =========================
+ LOCAL lcLogIntreg
+ lcLogIntreg = UPPER(FILETOSTR(gcUILog))
+ LOCAL llGasitMismatch
+ llGasitMismatch = ('OPERATOR/OPERAND TYPE MISMATCH' $ lcLogIntreg)
+ *-- corectia de COD (Grid1.cSuma/cSumaVal.Text1.Valid) e in binar pentru AMBELE moduri - PRE si
+ *-- POST NU mai difera prin cod, doar prin nomenclatorul JTVA_COLOANE mock (confirmat de
+ *-- team-lead, 30/07/2026). Deci aceeasi asteptare (NU mai apare) in ambele moduri.
+ =Assert3('6-eroare "Operator/operand type mismatch" NU mai apare (corectie de cod, ambele moduri)', IIF(llGasitMismatch,0,1), 1)
+
+ *========================= VERIFICARE: finalizarea e blocata cat timp cmesajsync e nevid =========================
+ *-- inainte_de_do_termin() scrie in actactan si deschide Do Form verificare (modal real) daca
+ *-- trece de gardele de sincronizare - fara actactan/stub, GATHER-ul de acolo da eroare 13
+ *-- "Alias not found" INAINTE sa ajunga la vreun Return, deci valoarea implicita de mai jos
+ *-- (.T.) ar fi FALSA daca ar ramane neschimbata - de-aia NU o mai initializez optimist.
+ DO CreeazaActactan
+ *-- cerut explicit de team-lead: cmesajsync CHIAR INAINTE de apelul inainte_de_do_termin(),
+ *-- ca sa se stie sigur daca banda de sincronizare era deja goala sau nu in acest moment.
+ DO TvLog WITH 'cmesajsync INAINTE de inainte_de_do_termin() = [' + STRTRAN(STRTRAN(NVL(goObj.cmesajsync,''),CHR(13),' '),CHR(10),' | ') + ']'
+ gcMockUltimMesaj = ''
+ LOCAL llPoateTermina, llEroareTermin
+ llEroareTermin = .F.
+ TRY
+ llPoateTermina = goObj.inainte_de_do_termin()
+ CATCH TO loExcTermin
+ llEroareTermin = .T.
+ llPoateTermina = .NULL.
+ DO TvLog WITH 'EROARE inainte_de_do_termin() ' + TRANSFORM(loExcTermin.ErrorNo) + ' [' + loExcTermin.Message + '] in ' + loExcTermin.Procedure + ':' + TRANSFORM(loExcTermin.LineNo)
+ ENDTRY
+ DOEVENTS FORCE
+ DO TvLog WITH 'inainte_de_do_termin() = ' + TRANSFORM(NVL(llPoateTermina,-1)) + ' (eroare=' + TRANSFORM(llEroareTermin) + '); cmesajsync=[' + STRTRAN(STRTRAN(NVL(goObj.cmesajsync,''),CHR(13),' '),CHR(10),' | ') + ']; mesaj amessagebox=[' + gcMockUltimMesaj + ']'
+
+ *-- PAS-CHEIE (confirmat de team-lead, 30/07/2026): dupa ce utilizatorul alege MANUAL o
+ *-- explicatie de 11% care CHIAR EXISTA in nomenclator (fie din aceeasi serie FO11B/236 -
+ *-- posibil DOAR in POST, fie dintr-o alta serie CE11CTB/232 - posibila in AMBELE moduri),
+ *-- finalizarea NU mai e blocata, INDIFERENT de mod - asta e chiar alegerea "manuala" pe care
+ *-- Marius a facut-o real ca sa ocoleasca lipsa FO11B. Blocarea PRE se verifica DOAR inainte
+ *-- de aceasta alegere (assert 4/4a/4b, imediat dupa sincronizare #1) - nu mai are sens sa
+ *-- astept blocare AICI (dupa editare), in niciun mod.
+ =Assert3('7-inainte_de_do_termin()=.T. dupa alegerea unei explicatii VALIDE (indiferent de mod)', IIF(!llEroareTermin AND llPoateTermina,1,0), 1)
+ =Assert3('7b-cmesajsync gol dupa editarea explicatiei TVA (indiferent de mod)', IIF(EMPTY(goObj.cmesajsync),1,0), 1)
+
+ DO TvLog WITH 'dump introdc FINAL:'
+ DO DumpIntrodc
+
+ DO TvLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS (mod=' + gcModTest + ')'
+ IF pnPass = pnAsserts
+ DO TvLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
+ ELSE
+ DO TvLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
+ ENDIF
+
+ DO HarnessStep WITH 4, 'final (mod=' + gcModTest + '): ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
+ DO HarnessDone WITH 'done'
+
+CATCH TO loExc
+ DO TvLog 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
+ LOCAL lnSel
+ lnSel = SELECT()
+ SELECT introdc
+ SET ORDER TO
+ SCAN FOR !DELETED()
+ DO TvLog WITH ' nract=' + TRANSFORM(NVL(nract,0)) + ' tip=' + tip_rand + ' scd=' + ALLTRIM(NVL(scd,'')) + ' scc=' + ALLTRIM(NVL(scc,'')) + ;
+ ' ptva=' + TRANSFORM(NVL(ptva,0)) + ' explicatie_tva=[' + ALLTRIM(NVL(explicatie_tva,'')) + ']' + ;
+ ' id_jtva_coloana=' + TRANSFORM(NVL(id_jtva_coloana,0)) + ;
+ ' suma=' + TRANSFORM(NVL(suma,0)) + ' suma_val=' + TRANSFORM(NVL(suma_val,0)) + ' doc_key=[' + ALLTRIM(NVL(doc_key,'')) + ']'
+ ENDSCAN
+ SELECT introdc
+ SET ORDER TO ord_doc
+ SELECT (lnSel)
+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
+
+PROCEDURE CreeazaIntrodc
+ 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 CreeazaActactan
+ *-- structura minima ceruta de GATHER-urile din import_nota.inainte_de_do_termin() (Scan For
+ *-- suma<>0 Or se_scrie=1 / Append Blank / Gather Name poAct + Gather Name loFact Fields ...) -
+ *-- acelasi tipar ca test_e2e_dvi_ron_discount.prg (CreeazaActactan), impreuna cu stub_verificare
+ *-- (SET PATH) si mock_oscrie_in_fisiere.prg, ca inainte_de_do_termin() sa ruleze pana la capat
+ *-- (Do Form verificare e modal real, WindowType=1 - fara stub ar bloca headless la nesfarsit).
+ IF USED('actactan')
+ USE IN ('actactan')
+ ENDIF
+ CREATE CURSOR actactan ( ;
+ id_fdoc N(14), fdoc C(50), dataact D, serie_act C(10), nract N(14), ;
+ partc C(100), id_partc N(14), partd C(100), id_partd N(14), ;
+ suma N(18,4), suma_val N(18,4), explicatia C(100), explicatia4 C(50), explicatia5 C(50), ;
+ scd C(10), ascd C(20), scc C(10), ascc C(20), id_jtva_coloana N(14) NULL, taxcode N(6), ;
+ id_valuta N(14), curs N(14,4), nume_val C(10), proc_tva N(8,4), nnir N(14), ;
+ tva_incasare N(1), id_set N(14), id_gestin N(14))
+ENDPROC
+
+*-- valoarea numerica a campului tcCamp de pe randul (tcTipRand, tnCota) al documentului gcDocKey1;
+*-- -1 daca randul nu exista. Pozitia curenta in introdc se restaureaza la iesire.
+FUNCTION CampRand
+ LPARAMETERS tcTipRand, tnCota, tcCamp
+ LOCAL lnSel, lnRec, lnVal
+ lnSel = SELECT()
+ SELECT introdc
+ lnRec = IIF(EOF() OR BOF(), 0, RECNO())
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == tcTipRand AND ptva == tnCota
+ lnVal = IIF(FOUND(), NVL(EVALUATE('introdc.' + tcCamp), 0), -1)
+ IF BETWEEN(lnRec, 1, RECCOUNT('introdc'))
+ GO lnRec
+ ENDIF
+ SELECT (lnSel)
+ RETURN lnVal
+ENDFUNC
+
+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 TvLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
+ ELSE
+ DO TvLog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')'
+ ENDIF
+ENDPROC
+
+PROCEDURE AssertContains
+ LPARAMETERS tcLabel, tcHaystackUpper, tcNeedleUpper
+ pnAsserts = pnAsserts + 1
+ IF UPPER(tcNeedleUpper) $ UPPER(NVL(tcHaystackUpper,''))
+ pnPass = pnPass + 1
+ DO TvLog WITH ' PASS ' + tcLabel
+ ELSE
+ DO TvLog WITH ' FAIL ' + tcLabel + ' (nu contine [' + tcNeedleUpper + '] in [' + tcHaystackUpper + '])'
+ ENDIF
+ENDPROC
+
+PROCEDURE AssertContainsOr
+ LPARAMETERS tcLabel, tcHaystackUpper, tcNeedle1, tcNeedle2
+ pnAsserts = pnAsserts + 1
+ IF UPPER(tcNeedle1) $ UPPER(NVL(tcHaystackUpper,'')) OR UPPER(tcNeedle2) $ UPPER(NVL(tcHaystackUpper,''))
+ pnPass = pnPass + 1
+ DO TvLog WITH ' PASS ' + tcLabel
+ ELSE
+ DO TvLog WITH ' FAIL ' + tcLabel + ' (nu contine [' + tcNeedle1 + '] nici [' + tcNeedle2 + '] in [' + tcHaystackUpper + '])'
+ ENDIF
+ENDPROC
+
+PROCEDURE TvErr
+ LPARAMETERS tnErr, tcMsg, tcProg, tnLine
+ DO TvLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
+ENDPROC
+
+PROCEDURE TvLog
+ 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
+ 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))
+ INDEX ON id_jtva_coloana TAG id_jtva
+ 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 (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)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ;
+ VALUES (226, 'ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE21CTB', 21, 227, 1, 5, 300704)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ;
+ VALUES (227, 'TVA ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE21CTT', 21, 1, 6, 300704)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ;
+ VALUES (232, 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE11CTB', 11, 233, 1, 7, 300705)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ;
+ VALUES (233, 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE11CTT', 11, 1, 8, 300705)
+ IF gcModTest == 'POST'
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ;
+ VALUES (236, 'ACH. IMP. 11%', 1, 0, 'FO11B', 11, 237, 1, 39, 301205)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ;
+ VALUES (237, 'TVA ACH. IMP. 11%', 1, 0, 'FO11T', 11, 1, 40, 301205)
+ ENDIF
+ENDPROC
diff --git a/utile/Teste/achizitie_import/test_repro_tva11_explicatie.ps1 b/utile/Teste/achizitie_import/test_repro_tva11_explicatie.ps1
new file mode 100644
index 0000000..469f9d3
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_repro_tva11_explicatie.ps1
@@ -0,0 +1,15 @@
+# test_repro_tva11_explicatie.ps1 - wrapper peste harness-ul generic pentru reproducerea bug-ului
+# TVA 11% pe "Achizitie din import" (mesaj coloana TVA lipsa + eroare VFP la editarea explicatiei
+# TVA din grid). Harness-ul standard NU paseaza parametri liniei de comanda catre .fxp; modul
+# PRE/POST se controleaza din fisierul-steag tva11_post_fix.flag (vezi antetul .prg si
+# docs\handoff_tva11_test.md) - creeaza-l/sterge-l INAINTE de a rula acest .ps1.
+# powershell -ExecutionPolicy Bypass -File test_repro_tva11_explicatie.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_repro_tva11_explicatie.prg') `
+ -Steps @('factura_dvi_creata','articole_adaugate','dupa_dblclick_explicatie_tva','dupa_sincronizare2','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_tva11_explicatie') `
+ -SyncDir (Join-Path $Teste 'uisync_tva11_explicatie') `
+ -StepTimeoutSec 180 `
+ -ReadyTimeoutSec 180
diff --git a/utile/Teste/achizitie_import/test_repro_valuta_dblclick.prg b/utile/Teste/achizitie_import/test_repro_valuta_dblclick.prg
index ff79cb2..d789650 100644
--- a/utile/Teste/achizitie_import/test_repro_valuta_dblclick.prg
+++ b/utile/Teste/achizitie_import/test_repro_valuta_dblclick.prg
@@ -275,8 +275,8 @@ TRY
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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))
*-- randul B (baza): suma 1000 lei, suma_val 219.30 USD (curs 4.56)
INSERT INTO introdc (tip_rand, scd, scc, ascc, suma, suma_val, id_jtva_coloana, ptva, explicatie_tva, ;
diff --git a/utile/Teste/achizitie_import/test_runda11_diferenta_participa.prg b/utile/Teste/achizitie_import/test_runda11_diferenta_participa.prg
index f6fc6d9..6ce44a2 100644
--- a/utile/Teste/achizitie_import/test_runda11_diferenta_participa.prg
+++ b/utile/Teste/achizitie_import/test_runda11_diferenta_participa.prg
@@ -252,7 +252,7 @@ TRY
*-- F1 (ointroduceri.prg): index ord_doc INAINTE de CREATEOBJECT - vezi docs/testare-ui-vfp.md capcana p.
SELECT introdc
- INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc
+ 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 R11Log WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)'
@@ -651,8 +651,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 DumpIntrodc
diff --git a/utile/Teste/achizitie_import/test_runda7_diferente.prg b/utile/Teste/achizitie_import/test_runda7_diferente.prg
index 336ed05..2dac160 100644
--- a/utile/Teste/achizitie_import/test_runda7_diferente.prg
+++ b/utile/Teste/achizitie_import/test_runda7_diferente.prg
@@ -266,7 +266,7 @@ TRY
*-- nefactura-principala. Cu indexul, ordinea e mereu dupa nr_doc (S-urile mostenesc nr_doc-ul
*-- principalei), deci documentul principal ramane stabil la sincronizari repetate.
SELECT introdc
- INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc
+ 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
PUBLIC goObjA
goObjA = CREATEOBJECT('IMPORT_nota', .F.)
@@ -491,7 +491,7 @@ TRY
VALUES ('PLACEHOLDER', 'PH', 1, 1, 1, '371', 21)
SELECT introdc
- INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc
+ 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
PUBLIC goObjB
goObjB = CREATEOBJECT('IMPORT_nota', .F.)
@@ -694,8 +694,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 VerificaRandD
diff --git a/utile/Teste/achizitie_import/test_scenariu_dvi_complet.prg b/utile/Teste/achizitie_import/test_scenariu_dvi_complet.prg
index 2479d8e..6957af9 100644
--- a/utile/Teste/achizitie_import/test_scenariu_dvi_complet.prg
+++ b/utile/Teste/achizitie_import/test_scenariu_dvi_complet.prg
@@ -257,7 +257,7 @@ TRY
*-- F1 (ointroduceri.prg): index ord_doc INAINTE de CREATEOBJECT - vezi docs/testare-ui-vfp.md capcana p.
SELECT introdc
- INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc
+ 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 DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)'
@@ -798,8 +798,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 VerificaPereche
diff --git a/utile/Teste/achizitie_import/test_scenariu_import_212.prg b/utile/Teste/achizitie_import/test_scenariu_import_212.prg
index bf8cf85..c2114b3 100644
--- a/utile/Teste/achizitie_import/test_scenariu_import_212.prg
+++ b/utile/Teste/achizitie_import/test_scenariu_import_212.prg
@@ -582,14 +582,16 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 VerificaPereche
- *-- verifica perechea B+T adaugata (dupa nract): sume lei/valuta, valuta pe baza
+ *-- verifica perechea B+T adaugata (dupa nract): sume lei/valuta, valuta pe baza. Randul T se
+ *-- cauta dupa doc_key (nu dupa nract): pe ramura DVI do_adauga_factura rescrie nract pe randul
+ *-- T cu numarul DVI-ului, dar pastreaza doc_key-ul documentului-mama.
LPARAMETERS tnNract, tnBazaLei, tnBazaVal, tcVal
- LOCAL lnSel, lcMsg, llB, llT, lnBS, lnBSV, lcNV
+ LOCAL lnSel, lcMsg, llB, llT, lnBS, lnBSV, lcNV, lcDocKey
lnSel = SELECT()
SELECT introdc
LOCATE FOR nract = tnNract AND tip_rand == 'B'
@@ -598,8 +600,11 @@ PROCEDURE VerificaPereche
lnBS = suma
lnBSV = suma_val
lcNV = ALLTRIM(NVL(nume_val,''))
+ lcDocKey = doc_key
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == ALLTRIM(NVL(lcDocKey,'')) AND tip_rand == 'T'
+ ELSE
+ LOCATE FOR nract = tnNract AND tip_rand == 'T'
ENDIF
- LOCATE FOR nract = tnNract AND tip_rand == 'T'
llT = FOUND()
IF llB AND llT AND ABS(lnBS - tnBazaLei) < 0.01 AND ABS(lnBSV - tnBazaVal) < 0.01 AND ALLTRIM(NVL(lcNV,'')) == tcVal
lcMsg = 'PASS pereche nract=' + TRANSFORM(tnNract) + ': B(suma=' + TRANSFORM(lnBS) + ' val=' + TRANSFORM(lnBSV) + ' ' + lcNV + ') + randT gasit'
diff --git a/utile/Teste/achizitie_import/test_secundara_debifata_pret.prg b/utile/Teste/achizitie_import/test_secundara_debifata_pret.prg
index 7d40dbd..ee5a8e8 100644
--- a/utile/Teste/achizitie_import/test_secundara_debifata_pret.prg
+++ b/utile/Teste/achizitie_import/test_secundara_debifata_pret.prg
@@ -15,7 +15,7 @@
* rul_temp.pretd = 1000.00 (pretul valuta NU include cei 523 lei ai secundarei)
* rul_temp.pret = 5230.00 (pretul lei NU mai include cei 523 lei)
* goObj.procent_lei = 100, goObj.procent_val = 100
-* rand D (diferenta) cu suma = 523.00, cont dominant clasa 3 = 371 (scd D = 607)
+* FARA rand D: documentul debifat nu intra in diferenta (v2.11.11)
* explicatia4/explicatia5 goale pe randul secundarei (371, doc2)
* valideaza_sume() = .T., cmesajsync gol
*
@@ -274,7 +274,7 @@ TRY
*-- F1 (ointroduceri.prg): index ord_doc INAINTE de CREATEOBJECT - vezi docs/testare-ui-vfp.md capcana p.
SELECT introdc
- INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc
+ 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 DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)'
@@ -405,12 +405,13 @@ TRY
LOCATE FOR tip_rand == 'D'
IF FOUND()
DO DcLog WITH 'randul D (diferenta): scd=' + ALLTRIM(scd) + ' scc=' + ALLTRIM(scc) + ' suma=' + TRANSFORM(suma)
- DO Assert3 WITH '4a-randul D exista cu suma=523.00 (diferenta absorbita)', suma, 523.00
- DO AssertStr WITH '4b-randul D cont dominant clasa 3 (scc=371)', ALLTRIM(scc), '371'
+ DO Assert3 WITH '4a-randul D nu mai preia documentul debifat (astept suma 0)', suma, 0
ELSE
- pnAsserts = pnAsserts + 2
- DO DcLog WITH ' FAIL 4a/4b: nu exista randul D (diferenta) - asteptat suma=523.00'
+ pnAsserts = pnAsserts + 1
+ pnPass = pnPass + 1
+ DO DcLog WITH ' PASS 4a-nu exista rand D: documentul debifat nu intra in diferenta'
ENDIF
+ DO Assert3 WITH '4b-ndif_lei (astept 0, documentul debifat nu incarca pretul)', goObj.ndif_lei, 0
SELECT introdc
LOCATE FOR nract == 201 AND ALLTRIM(scd) == '371' AND INLIST(tip_rand,'B','S')
@@ -595,8 +596,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 VerificaPereche
diff --git a/utile/Teste/achizitie_import/test_sparge_secundare.prg b/utile/Teste/achizitie_import/test_sparge_secundare.prg
index de1091d..7bcfe4f 100644
--- a/utile/Teste/achizitie_import/test_sparge_secundare.prg
+++ b/utile/Teste/achizitie_import/test_sparge_secundare.prg
@@ -256,7 +256,7 @@ TRY
*-- F1 (ointroduceri.prg): index ord_doc INAINTE de CREATEOBJECT - vezi docs/testare-ui-vfp.md capcana p.
SELECT introdc
- INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc
+ 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 DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)'
@@ -537,8 +537,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 Sincronizeaza
diff --git a/utile/Teste/achizitie_import/test_taxcode_scc_aliniere.prg b/utile/Teste/achizitie_import/test_taxcode_scc_aliniere.prg
new file mode 100644
index 0000000..5741c91
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_taxcode_scc_aliniere.prg
@@ -0,0 +1,937 @@
+* test_taxcode_scc_aliniere.prg
+* aliniaza_tva_la_baza (COMUN\clase\ointroduceri.vcx, import_nota) reface taxcode (SAFT) si
+* comutarea scc/ascc 4427/creditor S pe randurile T realiniate la familia S-ului. Scenariul se
+* produce integral prin fluxul REAL de utilizator (model: test_repro_tva11_explicatie.prg):
+* factura de import DVI (21%), 2 articole (21% si 11%), sincronizare, apoi pe randul S de 11%:
+* 1. dublu-click Explicatie TVA -> alege familia CE (taxare inversa, eligibila 4427) ->
+* dupa resincronizare T(11%) trebuie sa aiba scc='4427', ascc=''.
+* 2. editare manuala S(11%).scc/ascc prin Grid1.cScc/cAscc.Text1 (ca in test_tva_creditori.prg)
+* la un creditor DIFERIT de '401' -> T(11%) ramane pe scc='4427' (regula 4427 domina
+* creditorul, cat timp familia e eligibila).
+* 3. dublu-click Explicatie TVA din nou -> revine la familia documentului (FO, neeligibila
+* 4427) -> T(11%) trebuie sa revina la creditorul CURENT al S(11%) (cel editat la pasul 2,
+* NU '401' fix - vezi TVA pe creditori).
+* taxcode (SAFT, gl406 activ) verificat la fiecare pas cu valoarea EXACTA din nomenclator.
+*
+* Rulare: powershell -ExecutionPolicy Bypass -File test_taxcode_scc_aliniere.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_taxcode_scc_aliniere_log.txt"
+gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_taxcode_scc_aliniere\"
+STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
+
+ON ERROR DO TvErr 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 TvLog 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 TvLog 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\mock_cauta_nom_articole.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\achizitie_import\mock_cauta_alfa_tva11.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 TvLog WITH 'SET PROCEDURE OK'
+
+ PUBLIC goMockValuta
+ goMockValuta = CREATEOBJECT('Custom')
+ goMockValuta.AddProperty('id_valuta', 978)
+ goMockValuta.AddProperty('nume_val', 'EUR')
+
+ *----- 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 gnTipGest
+ gnTipGest = 0
+ PUBLIC gnHandle
+ gnHandle = -1
+ PUBLIC gcTempPath
+ gcTempPath = ADDBS(SYS(2023))
+ PUBLIC gcCondSucursala
+ gcCondSucursala = ''
+
+ PUBLIC gnButon
+ STORE 2 TO gnButon
+ PUBLIC gcMockArtCodmat, gcMockAcontCrt
+ gcMockArtCodmat = ''
+ gcMockAcontCrt = ''
+ PUBLIC gnMockRaspuns
+ gnMockRaspuns = 6
+ PUBLIC gcMockUltimMesaj, gnMockUltimTip
+ gcMockUltimMesaj = ''
+ gnMockUltimTip = 0
+ *-- denumirea aleasa in dialogul de cautare explicatie TVA (mock_cauta_alfa_tva11.prg)
+ PUBLIC gcTestTvaAlege
+ gcTestTvaAlege = ''
+
+ PUBLIC goExecutor, goApp
+ goExecutor = CREATEOBJECT('dummyexecutor')
+ goApp = CREATEOBJECT('dummyapp')
+
+ *----- poAct: antetul notei (moneda principala EUR, curs 5) -----
+ 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', 601)
+ poAct.AddProperty('partc', 'MULTI SUPPLY SRL')
+ 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: FO21B/T (220/221, familia documentului) + CE21CTB/T (226/227) +
+ * CE11CTB/T (232/233, familia CE 11% - eligibila 4427). FO11B/T (236/237, familia
+ * documentului la 11% - NEeligibila 4427) LIPSESC deliberat aici (gol de nomenclator,
+ * ca in test_repro_tva11_explicatie.prg mod PRE) - se adauga mai jos, chiar inainte de
+ * PAS 5, cand utilizatorul "completeaza nomenclatorul" (vezi flux-achizitie-import.md).
+ * Fara acest gol, gaseste_jtva_cota ar rezolva cota 11% pe familia documentului la orice
+ * resincronizare si alegerea manuala (CE, branch A) nu ar mai ramane (nu exista protectie
+ * de tip expl_manual pe randul S, doar pe T). -----
+ 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, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221)
+ INSERT INTO jtva_coloane2 VALUES (2, 221, 'TVA ACH. IMP. 21%', 1, 0, 1, 'FO21T', '', 21, 0)
+ INSERT INTO jtva_coloane2 VALUES (3, 226, 'ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE21CTB', 'CE21CTT', 21, 227)
+ INSERT INTO jtva_coloane2 VALUES (4, 227, 'TVA ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE21CTT', '', 21, 0)
+ INSERT INTO jtva_coloane2 VALUES (5, 232, 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE11CTB', 'CE11CTT', 11, 233)
+ INSERT INTO jtva_coloane2 VALUES (6, 233, 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE11CTT', '', 11, 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)
+ INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ;
+ VALUES ('301205-Import de bunuri cota 11%', 301205, '', 11, 1, 0, 1, 0)
+ INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ;
+ VALUES ('300704-Achizitii de bunuri CE 21%', 300704, '', 21, 1, 0, 1, 0)
+ INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ;
+ VALUES ('300705-Achizitii de bunuri CE 11%', 300705, '', 11, 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', 220, 21, 'ACH. IMP. 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', 221, 21, 'TVA ACH. IMP. 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)
+
+ 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
+
+ *----- goDlgTva11: formularul REAL cauta_alfa_form pentru dialogul de explicatie TVA -----
+ IF USED('crsTva11cauta')
+ USE IN ('crsTva11cauta')
+ ENDIF
+ CREATE CURSOR crsTva11cauta (id_jtva_coloana N(14), denumire C(100), cota_tva N(6,2))
+ INSERT INTO crsTva11cauta VALUES (232, 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 11)
+ INSERT INTO crsTva11cauta VALUES (233, 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 11)
+ GO TOP
+
+ PUBLIC goDlgTva11
+ goDlgTva11 = CREATEOBJECT('cauta_alfa_form', 'crsTva11cauta', '', 'Explicatie TVA,Cota TVA', ;
+ 'denumire,cota_tva', .F., '', 1)
+ goDlgTva11.crs_cursor = 'crsTva11cauta'
+ goDlgTva11.cIdColumn = 'id_jtva_coloana'
+ goDlgTva11.WindowType = 0
+ goDlgTva11.Show()
+ DOEVENTS FORCE
+ DO TvLog WITH 'goDlgTva11 construit (cauta_alfa_form REAL, mod single-select)'
+
+ DO TvLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)'
+ PUBLIC goObj
+ goObj = CREATEOBJECT('IMPORT_nota', .F.)
+ IF VARTYPE(goObj) <> 'O'
+ DO TvLog 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
+
+ *-- cJtvaCol4427: Init l-a creat gol (mock pe goExecutor.oExecuta) - il repopulez cu acelasi
+ *-- filtru REAL folosit in productie, aplicat pe jtva_coloane2 (infrastructura de nomenclator,
+ *-- nu pasul de flux testat): CE11CTT (233) si CE21CTT (227) se califica, FO11T/FO21T nu.
+ IF USED('cJtvaCol4427')
+ USE IN ('cJtvaCol4427')
+ ENDIF
+ SELECT id_jtva_coloana FROM jtva_coloane2 ;
+ WHERE (coloana_jc LIKE 'TI%T' OR coloana_jc LIKE 'XX%TIT') ;
+ OR (coloana_jc LIKE 'CE%T' AND coloana_jc NOT LIKE 'CE%FTT') ;
+ INTO CURSOR cJtvaCol4427
+ INDEX ON id_jtva_coloana TAG id_jtva
+ DO TvLog WITH 'cJtvaCol4427 repopulat: ' + TRANSFORM(RECCOUNT('cJtvaCol4427')) + ' randuri (astept 2: 227,233)'
+
+ PRIVATE pnAsserts, pnPass
+ STORE 0 TO pnAsserts, pnPass
+
+ *========================= PAS 1: FACTURA DE IMPORT, DVI, NOTE INITIAL PE 21% =========================
+ PUBLIC goDlg, goT, gcDocKey1
+ goDlg = CREATEOBJECT('import_adauga_factura', goObj)
+ goDlg.cFelDoc = 'Factura'
+ goDlg.nIdFdoc = 1
+ goDlg.nNract = 19500
+ goDlg.dDataAct = DATE()
+ goDlg.nIdPartener = 601
+ goDlg.cPartener = 'MULTI SUPPLY SRL'
+ goDlg.cExplicatia = 'Import marfa multicota TVA scc/taxcode'
+ goDlg.nSuma = 1500
+ goDlg.nSumaLei = 0
+ goDlg.nCurs = 5
+ goDlg.nIdValuta = 978
+ goDlg.cValuta = 'EUR'
+ goDlg.nIdExplicatieTva = 220
+ goDlg.cExplicatieTva = 'ACH. IMP. 21%'
+ goDlg.optTipTva.Value = 2 && D = DVI
+ goDlg.chkInValutaCont.Value = 1
+ goDlg.chkParticipaValuta.Value = 1
+ goDlg.cSerieDvi = ''
+ goDlg.nNractDvi = 9519
+ goDlg.dDviData = DATE()
+ goDlg.nIdFdocDVI = 2
+ goDlg.cFelDocDvi = 'DVI'
+ goDlg.nDviIdPartener = 901
+ goDlg.cDviPartener = 'DIRECTIA VAMALA'
+ goDlg.nDviTvaLei = 1325.00
+ goDlg.nDviTvaVal = 0
+ goDlg.actualizeaza_stare_dvi()
+ goDlg.WindowType = 0
+ goDlg.Visible = .T.
+ goDlg.Show()
+ DOEVENTS FORCE
+ DO TvLog WITH 'valideaza = ' + TRANSFORM(goDlg.valideaza())
+
+ goT = CREATEOBJECT('Empty')
+ =ADDPROPERTY(goT,'serie_act','')
+ =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC))
+ =ADDPROPERTY(goT,'suma_val',goDlg.nSuma)
+ =ADDPROPERTY(goT,'in_valuta',goDlg.chkInValutaCont.Value)
+ =ADDPROPERTY(goT,'participa_valuta',.T.)
+ =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta)
+ =ADDPROPERTY(goT,'curs',goDlg.nCurs)
+ =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,'')))
+ =ADDPROPERTY(goT,'cTipTva','D')
+ =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva)
+ =ADDPROPERTY(goT,'dvi_serie','')
+ =ADDPROPERTY(goT,'dvi_nract',goDlg.nNractDvi)
+ =ADDPROPERTY(goT,'dvi_dataact',DATE())
+ =ADDPROPERTY(goT,'dvi_id_fdoc',2)
+ =ADDPROPERTY(goT,'dvi_fdoc','DVI')
+ =ADDPROPERTY(goT,'dvi_id_partc',901)
+ =ADDPROPERTY(goT,'dvi_partc','DIRECTIA VAMALA')
+ =ADDPROPERTY(goT,'dvi_scc','401')
+ =ADDPROPERTY(goT,'dvi_tva_lei',1325.00)
+ =ADDPROPERTY(goT,'dvi_tva_val',0)
+ =ADDPROPERTY(goT,'dvi_in_valuta',.F.)
+ =ADDPROPERTY(goT,'dvi_id_valuta',0)
+ =ADDPROPERTY(goT,'dvi_curs',0)
+ =ADDPROPERTY(goT,'dvi_nume_val','')
+ =ADDPROPERTY(goT,'dvi_valuta_proprie',1)
+ =ADDPROPERTY(goT,'disc_baza_lei',0)
+ =ADDPROPERTY(goT,'disc_baza_val',0)
+
+ LOCAL llOkAdauga
+ llOkAdauga = goObj.do_adauga_factura(goT)
+ =Assert3('1-do_adauga_factura(goT) reuseste', IIF(llOkAdauga,1,0), 1)
+ goDlg.Hide()
+ DOEVENTS FORCE
+
+ SELECT introdc
+ SET ORDER TO
+ LOCATE FOR nract = 19500 AND tip_rand == 'B'
+ IF FOUND()
+ gcDocKey1 = ALLTRIM(NVL(doc_key,''))
+ ENDIF
+ SELECT introdc
+ SET ORDER TO ord_doc
+
+ DO HarnessStep WITH 0, 'factura DVI creata (note initial 21%), doc_key=' + gcDocKey1
+
+ *========================= PAS 2: 2 ARTICOLE (21% si 11%) - defalcare pe cote la sincronizare =========================
+ gcMockArtCodmat = 'ART-BULD-212'
+ gcMockAcontCrt = ''
+ TRY
+ goObj.do_adauga_articol()
+ CATCH TO loExcA1
+ DO TvLog WITH 'EROARE do_adauga_articol (1, 21%) ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212'
+ IF FOUND()
+ REPLACE cant WITH 1, pret_val WITH 1000, pretd WITH 1000, pret WITH ROUND(1000*5,4), ;
+ pret_lei WITH ROUND(1000*5,4), cota_tva WITH 21
+ ENDIF
+
+ gcMockArtCodmat = 'ART-A8-371'
+ gcMockAcontCrt = '4'
+ TRY
+ goObj.do_adauga_articol()
+ CATCH TO loExcA2
+ DO TvLog WITH 'EROARE do_adauga_articol (2, 11%) ' + TRANSFORM(loExcA2.ErrorNo) + ' [' + loExcA2.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ SELECT rul_temp
+ LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371'
+ IF FOUND()
+ REPLACE cant WITH 1, pret_val WITH 500, pretd WITH 500, pret WITH ROUND(500*5,4), ;
+ pret_lei WITH ROUND(500*5,4), cota_tva WITH 11
+ ENDIF
+ goObj.gridart.Refresh()
+ DOEVENTS FORCE
+
+ =Assert3('2-doua articole in rul_temp (21% + 11%)', RECCOUNT_ACTIVE('rul_temp'), 2)
+
+ DO HarnessStep WITH 1, 'articole (21% si 11%) adaugate'
+
+ LOCAL llEroareSync1
+ llEroareSync1 = .F.
+ TRY
+ goObj.sincronizeaza()
+ CATCH TO loExcS1
+ llEroareSync1 = .T.
+ DO TvLog WITH 'EROARE sincronizeaza() #1 ' + TRANSFORM(loExcS1.ErrorNo) + ' [' + loExcS1.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ =Assert3('3-sincronizeaza() #1 fara eroare VFP', IIF(llEroareSync1,0,1), 1)
+
+ *-- baseline: FO11B/FO11T LIPSESC (gol de nomenclator, deliberat) - gaseste_jtva_cota nu
+ *-- gaseste perechea de 11% in familia documentului (FO), deci S(11%) ramane cu explicatia
+ *-- mostenita de la baza (21%) si T(11%) e posibil sa nu existe inca - doar diagnostic aici,
+ *-- fara assert-uri (starea exacta conteaza mai putin decat rezultatul dupa alegerea manuala).
+ DO TvLog WITH 'familii dupa sincronizare #1 (baseline, gol de nomenclator la 11%): S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' T(11).scc=[' + CampRandC('T',11,'scc') + ']'
+
+ DO HarnessStep WITH 2, 'sincronizare#1 (baseline, gol nomenclator): S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana'))
+
+ *========================= PAS 3 (BRANCH A): dublu-click Explicatie TVA pe S(11%) -> familia CE (4427) =========================
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11
+ LOCAL llGasitS11
+ llGasitS11 = FOUND()
+ =Assert3('5-exista rand S cu ptva=11', IIF(llGasitS11,1,0), 1)
+
+ IF llGasitS11
+ gcTestTvaAlege = 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA'
+ STORE 0 TO gnButon
+ TRY
+ goObj.grid1.cExplicatieTva.Text1.DblClick()
+ CATCH TO loExcDbl1
+ DO TvLog WITH 'EROARE DblClick (CE) ' + TRANSFORM(loExcDbl1.ErrorNo) + ' [' + loExcDbl1.Message + '] in ' + loExcDbl1.Procedure + ':' + TRANSFORM(loExcDbl1.LineNo)
+ ENDTRY
+ DOEVENTS FORCE
+ goObj.sincronizeaza()
+ DOEVENTS FORCE
+
+ DO TvLog WITH 'dupa alegere CE + sincronizare#2: S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' T(11).scc=[' + CampRandC('T',11,'scc') + '] T(11).ascc=[' + CampRandC('T',11,'ascc') + '] T(11).taxcode=' + TRANSFORM(CampRand('T',11,'taxcode'))
+ *-- S(11%) revine la familia mostenita de la baza (220) la fiecare resincronizare (creeaza_rand_s
+ *-- nu pastreaza o alegere manuala pe randul S - doar randul T are protectia expl_manual) -
+ *-- comportament PREEXISTENT, nu obiectul acestui test; conteaza DOAR rezultatul pe randul T.
+ =Assert3('7-T(11%) aliniat la familia CE (233/CE11CTT)', CampRand('T',11,'id_jtva_coloana'), 233)
+ =Assert3('8-T(11%) familie 4427-eligibila -> scc=4427', IIF(CampRandC('T',11,'scc')=='4427',1,0), 1)
+ =Assert3('9-T(11%) ascc golit cand scc=4427', IIF(EMPTY(CampRandC('T',11,'ascc')),1,0), 1)
+ =Assert3('10-T(11%) taxcode recalculat (301205->300705, familia CE11)', CampRand('T',11,'taxcode'), 300705)
+ ENDIF
+
+ DO HarnessStep WITH 3, 'dupa alegere CE (4427): T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' scc=' + CampRandC('T',11,'scc')
+
+ *========================= PAS 4: editare manuala S(11%).scc/ascc (creditor diferit de 401) =========================
+ *-- ca in test_tva_creditori.prg: GotFocus (retine valoarea veche in Thisform.cOldVal),
+ *-- schimba Value, apoi Valid() REAL (fara replicare manuala a logicii din spate).
+ IF llGasitS11
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11
+ IF FOUND()
+ goObj.Grid1.cScc.Text1.Value = scc
+ goObj.Grid1.cScc.Text1.GotFocus()
+ goObj.Grid1.cScc.Text1.Value = '407'
+ TRY
+ goObj.Grid1.cScc.Text1.Valid()
+ CATCH TO loExcScc
+ DO TvLog WITH 'EROARE Valid scc ' + TRANSFORM(loExcScc.ErrorNo) + ' [' + loExcScc.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11
+ goObj.Grid1.cAscc.Text1.Value = ascc
+ goObj.Grid1.cAscc.Text1.GotFocus()
+ goObj.Grid1.cAscc.Text1.Value = '9'
+ TRY
+ goObj.Grid1.cAscc.Text1.Valid()
+ CATCH TO loExcAscc
+ DO TvLog WITH 'EROARE Valid ascc ' + TRANSFORM(loExcAscc.ErrorNo) + ' [' + loExcAscc.Message + ']'
+ ENDTRY
+ DOEVENTS FORCE
+ ENDIF
+ goObj.sincronizeaza()
+ DOEVENTS FORCE
+
+ DO TvLog WITH 'dupa editare creditor S(11%) (407/9) + sincronizare#3: S(11).scc=[' + CampRandC('S',11,'scc') + '] T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' T(11).scc=[' + CampRandC('T',11,'scc') + '] T(11).ascc=[' + CampRandC('T',11,'ascc') + ']'
+ =Assert3('11-S(11%).scc editat (407)', IIF(CampRandC('S',11,'scc')=='407',1,0), 1)
+ =Assert3('12-T(11%) ramane pe familia CE (233) - editarea creditorului nu schimba explicatia', CampRand('T',11,'id_jtva_coloana'), 233)
+ =Assert3('13-T(11%) ramane scc=4427 (regula 4427 domina creditorul S, cat timp familia e eligibila)', IIF(CampRandC('T',11,'scc')=='4427',1,0), 1)
+ ENDIF
+
+ DO HarnessStep WITH 4, 'dupa editare creditor S(11%): scc S=' + CampRandC('S',11,'scc') + ' T ramane 4427=' + TRANSFORM(IIF(CampRandC('T',11,'scc')=='4427',1,0))
+
+ *-- "completarea nomenclatorului": FO11B/FO11T (236/237) devin disponibile - abia acum
+ *-- utilizatorul poate alege familia documentului la 11% (nu exista mai devreme, vezi
+ *-- comentariul de la crearea lui jtva_coloane2).
+ INSERT INTO jtva_coloane2 VALUES (7, 236, 'ACH. IMP. 11%', 1, 0, 1, 'FO11B', 'FO11T', 11, 237)
+ INSERT INTO jtva_coloane2 VALUES (8, 237, 'TVA ACH. IMP. 11%', 1, 0, 1, 'FO11T', '', 11, 0)
+ SELECT crsTva11cauta
+ INSERT INTO crsTva11cauta VALUES (236, 'ACH. IMP. 11%', 11)
+ INSERT INTO crsTva11cauta VALUES (237, 'TVA ACH. IMP. 11%', 11)
+
+ *========================= PAS 5 (BRANCH B): resincronizare (F5) dupa completarea nomenclatorului =========================
+ *-- utilizatorul observa (cmesajsync/mesajul de nomenclator incomplet a disparut) ca lipsa a
+ *-- fost rezolvata si reincearca sincronizarea (F5 - KeyPress -4 apeleaza direct sincronizeaza(),
+ *-- vezi ointroduceri.vcx PROCEDURE KeyPress) - NU mai e nevoie de dublu-click, familia
+ *-- documentului (FO) se rezolva acum natural pentru cota 11%, la fel ca la cota 21%.
+ IF llGasitS11
+ goObj.sincronizeaza()
+ DOEVENTS FORCE
+
+ DO TvLog WITH 'dupa completare nomenclator + sincronizare#4 (F5): S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' T(11).scc=[' + CampRandC('T',11,'scc') + '] T(11).ascc=[' + CampRandC('T',11,'ascc') + '] T(11).taxcode=' + TRANSFORM(CampRand('T',11,'taxcode'))
+ =Assert3('14-S(11%) revine la familia documentului (236/FO11B)', CampRand('S',11,'id_jtva_coloana'), 236)
+ =Assert3('15-T(11%) aliniat la familia FO (237/FO11T)', CampRand('T',11,'id_jtva_coloana'), 237)
+ =Assert3('16-T(11%) familie NEeligibila 4427 -> scc revine la creditorul S(11%) (407, NU 401 fix)', IIF(CampRandC('T',11,'scc')=='407',1,0), 1)
+ =Assert3('17-T(11%) ascc revine la ascc-ul S(11%) (9)', IIF(CampRandC('T',11,'ascc')=='9',1,0), 1)
+ =Assert3('18-T(11%) taxcode recalculat (300705->301205, familia FO11)', CampRand('T',11,'taxcode'), 301205)
+ ENDIF
+
+ DO HarnessStep WITH 5, 'dupa revenire la FO: T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' scc=' + CampRandC('T',11,'scc') + ' taxcode=' + TRANSFORM(CampRand('T',11,'taxcode'))
+
+ *========================= PAS 6: al DOILEA dublu-click pe S(11%), familia FO (NEeligibila 4427) =========================
+ *-- alegerea de pe randul S se aplica pe randurile T de ACEEASI cota si nu forteaza '401':
+ *-- T(11%) isi pastreaza creditorul editat (407/9), T(21%) ramane neatins. Un creditor
+ *-- suprascris aici PERSISTA - resincronizarea nu il repara, fiindca explicatia randului T
+ *-- e deja cea corecta (aliniaza_tva_la_baza atinge scc doar cand schimba explicatia).
+ LOCAL lnT21Expl, lcT21Scc, lnT21Taxcode
+ lnT21Expl = CampRand('T',21,'id_jtva_coloana')
+ lcT21Scc = CampRandC('T',21,'scc')
+ lnT21Taxcode = CampRand('T',21,'taxcode')
+ DO TvLog WITH 'baseline inainte de PAS 6: T(11).scc=[' + CampRandC('T',11,'scc') + '] T(21)=' + TRANSFORM(lnT21Expl) + ' T(21).scc=[' + lcT21Scc + '] T(21).taxcode=' + TRANSFORM(lnT21Taxcode)
+
+ IF llGasitS11
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11
+ gcTestTvaAlege = 'ACH. IMP. 11%'
+ STORE 0 TO gnButon
+ *-- do_termin consuma formularul dialogului: se reconstruieste inaintea fiecarei alegeri
+ goDlgTva11 = CREATEOBJECT('cauta_alfa_form', 'crsTva11cauta', '', 'Explicatie TVA,Cota TVA', ;
+ 'denumire,cota_tva', .F., '', 1)
+ goDlgTva11.crs_cursor = 'crsTva11cauta'
+ goDlgTva11.cIdColumn = 'id_jtva_coloana'
+ goDlgTva11.WindowType = 0
+ goDlgTva11.Show()
+ DOEVENTS FORCE
+ TRY
+ goObj.grid1.cExplicatieTva.Text1.DblClick()
+ CATCH TO loExcDbl2
+ DO TvLog WITH 'EROARE DblClick #2 (FO) ' + TRANSFORM(loExcDbl2.ErrorNo) + ' [' + loExcDbl2.Message + '] in ' + loExcDbl2.Procedure + ':' + TRANSFORM(loExcDbl2.LineNo)
+ ENDTRY
+ DOEVENTS FORCE
+ goObj.sincronizeaza()
+ DOEVENTS FORCE
+
+ DO TvLog WITH 'dupa dublu-click #2 (FO): T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' T(11).scc=[' + CampRandC('T',11,'scc') + '] T(11).ascc=[' + CampRandC('T',11,'ascc') + '] T(11).taxcode=' + TRANSFORM(CampRand('T',11,'taxcode')) + ' T(21)=' + TRANSFORM(CampRand('T',21,'id_jtva_coloana')) + ' T(21).scc=[' + CampRandC('T',21,'scc') + ']'
+ =Assert3('19-T(11%) ramane pe perechea FO (237)', CampRand('T',11,'id_jtva_coloana'), 237)
+ =Assert3('20-T(11%) pastreaza creditorul REAL al S(11%) (407, NU 401 fix)', IIF(CampRandC('T',11,'scc')=='407',1,0), 1)
+ =Assert3('21-T(11%) pastreaza ascc-ul S(11%) (9)', IIF(CampRandC('T',11,'ascc')=='9',1,0), 1)
+ =Assert3('22-T(11%) taxcode ramane al familiei FO11 (301205)', CampRand('T',11,'taxcode'), 301205)
+ =Assert3('23-T(21%) neatins: explicatia ramane a familiei de 21%', CampRand('T',21,'id_jtva_coloana'), lnT21Expl)
+ =Assert3('24-T(21%) neatins: taxcode ramane al cotei 21%', CampRand('T',21,'taxcode'), lnT21Taxcode)
+ =Assert3('24a-T(21%) neatins: creditorul ramane al cotei lui, nu al randului T de 11%', IIF(CampRandC('T',21,'scc')==lcT21Scc,1,0), 1)
+ ENDIF
+
+ DO HarnessStep WITH 6, 'dublu-click #2 (FO): T(11).scc=' + CampRandC('T',11,'scc') + ' T(21)=' + TRANSFORM(CampRand('T',21,'id_jtva_coloana'))
+
+ *========================= PAS 7: al TREILEA dublu-click pe S(11%) -> familia CE (eligibila 4427) =========================
+ *-- cu nomenclatorul complet, cota 11% se rezolva la resincronizare pe familia documentului,
+ *-- deci alegerea CE de pe randul S nu supravietuieste (randul S nu are protectie de tip
+ *-- expl_manual); conteaza ca randul T ramane coerent cu S, cu creditorul lui, si ca randul
+ *-- T de 21% nu e atins de trecerea prin 4427.
+ IF llGasitS11
+ SELECT introdc
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11
+ gcTestTvaAlege = 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA'
+ STORE 0 TO gnButon
+ *-- do_termin consuma formularul dialogului: se reconstruieste inaintea fiecarei alegeri
+ goDlgTva11 = CREATEOBJECT('cauta_alfa_form', 'crsTva11cauta', '', 'Explicatie TVA,Cota TVA', ;
+ 'denumire,cota_tva', .F., '', 1)
+ goDlgTva11.crs_cursor = 'crsTva11cauta'
+ goDlgTva11.cIdColumn = 'id_jtva_coloana'
+ goDlgTva11.WindowType = 0
+ goDlgTva11.Show()
+ DOEVENTS FORCE
+ TRY
+ goObj.grid1.cExplicatieTva.Text1.DblClick()
+ CATCH TO loExcDbl3
+ DO TvLog WITH 'EROARE DblClick #3 (CE) ' + TRANSFORM(loExcDbl3.ErrorNo) + ' [' + loExcDbl3.Message + '] in ' + loExcDbl3.Procedure + ':' + TRANSFORM(loExcDbl3.LineNo)
+ ENDTRY
+ DOEVENTS FORCE
+ goObj.sincronizeaza()
+ DOEVENTS FORCE
+
+ DO TvLog WITH 'dupa dublu-click #3 (CE): S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' T(11).scc=[' + CampRandC('T',11,'scc') + '] T(21)=' + TRANSFORM(CampRand('T',21,'id_jtva_coloana')) + ' T(21).scc=[' + CampRandC('T',21,'scc') + ']'
+ =Assert3('25-T(11%) coerent cu familia S(11%) dupa resincronizare (237)', CampRand('T',11,'id_jtva_coloana'), 237)
+ =Assert3('26-T(11%) pastreaza creditorul S(11%) (407) dupa trecerea prin CE', IIF(CampRandC('T',11,'scc')=='407',1,0), 1)
+ =Assert3('27-T(21%) neatins de trecerea prin 4427: explicatia ramane 221', CampRand('T',21,'id_jtva_coloana'), lnT21Expl)
+ =Assert3('28-T(21%) neatins de trecerea prin 4427: taxcode ramane 301204', CampRand('T',21,'taxcode'), lnT21Taxcode)
+ =Assert3('28a-T(21%) neatins de trecerea prin 4427: creditorul ramane al cotei lui', IIF(CampRandC('T',21,'scc')==lcT21Scc,1,0), 1)
+ ENDIF
+
+ DO HarnessStep WITH 7, 'dublu-click #3 (CE): T(11).scc=' + CampRandC('T',11,'scc') + ' T(21).taxcode=' + TRANSFORM(CampRand('T',21,'taxcode'))
+
+ DO TvLog WITH 'dump introdc FINAL:'
+ DO DumpIntrodc
+
+ DO TvLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
+ IF pnPass = pnAsserts
+ DO TvLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
+ ELSE
+ DO TvLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
+ ENDIF
+
+ DO HarnessStep WITH 8, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
+ DO HarnessDone WITH 'done'
+
+CATCH TO loExc
+ DO TvLog 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
+ LOCAL lnSel
+ lnSel = SELECT()
+ SELECT introdc
+ SCAN
+ DO TvLog WITH ' nract=' + TRANSFORM(NVL(nract,0)) + ' tip=' + tip_rand + ' scd=' + ALLTRIM(NVL(scd,'')) + ' scc=' + ALLTRIM(NVL(scc,'')) + ' ascc=' + ALLTRIM(NVL(ascc,'')) + ' ptva=' + TRANSFORM(NVL(ptva,0)) + ' id_jtva=' + TRANSFORM(NVL(id_jtva_coloana,0)) + ' taxcode=' + TRANSFORM(NVL(taxcode,0)) + ' expl=[' + ALLTRIM(NVL(explicatie_tva,'')) + ']'
+ ENDSCAN
+ SELECT (lnSel)
+ENDPROC
+
+PROCEDURE CreeazaRulTemp
+ *-- structura reala a rul_temp (vezi ointroduceri.vc2:11030 si test_adauga_repere_212.prg) -
+ *-- GridArt e legat de rul_temp prin RecordSource inca din Init, deci trebuie sa existe cu
+ *-- schema completa INAINTE de CREATEOBJECT('IMPORT_nota',...), altfel bind-ul grilei ramane
+ *-- pe schema minimala creata de mock (goExecutor.oExecute) si formularul nu mai ajunge la Show().
+ 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
+
+PROCEDURE CreeazaIntrodc
+ 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 CampRand
+ LPARAMETERS tcTipRand, tnCota, tcCamp
+ LOCAL lnSel, lnRec, lnVal
+ lnSel = SELECT()
+ SELECT introdc
+ lnRec = IIF(EOF() OR BOF(), 0, RECNO())
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == tcTipRand AND ptva == tnCota
+ lnVal = IIF(FOUND(), NVL(EVALUATE('introdc.' + tcCamp), 0), -1)
+ IF BETWEEN(lnRec, 1, RECCOUNT('introdc'))
+ GO lnRec
+ ENDIF
+ SELECT (lnSel)
+ RETURN lnVal
+ENDFUNC
+
+FUNCTION CampRandC
+ *-- varianta CampRand pentru campuri caracter (scc/ascc) - NVL numeric ar da eroare de tip.
+ LPARAMETERS tcTipRand, tnCota, tcCamp
+ LOCAL lnSel, lnRec, lcVal
+ lnSel = SELECT()
+ SELECT introdc
+ lnRec = IIF(EOF() OR BOF(), 0, RECNO())
+ LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == tcTipRand AND ptva == tnCota
+ lcVal = IIF(FOUND(), ALLTRIM(NVL(EVALUATE('introdc.' + tcCamp), '')), '?')
+ IF BETWEEN(lnRec, 1, RECCOUNT('introdc'))
+ GO lnRec
+ ENDIF
+ SELECT (lnSel)
+ RETURN lcVal
+ENDFUNC
+
+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 TvLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')'
+ ELSE
+ DO TvLog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')'
+ ENDIF
+ENDPROC
+
+PROCEDURE TvErr
+ LPARAMETERS tnErr, tcMsg, tcProg, tnLine
+ DO TvLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
+ENDPROC
+
+PROCEDURE TvLog
+ LPARAMETERS tcMsg
+ SET SAFETY OFF
+ LOCAL lcL
+ lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
+ STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog)
+ENDPROC
+
+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 (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)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ;
+ VALUES (226, 'ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE21CTB', 21, 227, 1, 5, 300704)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ;
+ VALUES (227, 'TVA ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE21CTT', 21, 1, 6, 300704)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ;
+ VALUES (232, 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE11CTB', 11, 233, 1, 7, 300705)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ;
+ VALUES (233, 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE11CTT', 11, 1, 8, 300705)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ;
+ VALUES (236, 'ACH. IMP. 11%', 1, 0, 'FO11B', 11, 237, 1, 39, 301205)
+ INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ;
+ VALUES (237, 'TVA ACH. IMP. 11%', 1, 0, 'FO11T', 11, 1, 40, 301205)
+ENDPROC
+
+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
+ 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))
+ INDEX ON id_jtva_coloana TAG id_jtva
+ 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
+
+DEFINE CLASS dummyapp AS Custom
+ cStartupMenu = ''
+ PROCEDURE ReadIni
+ LPARAMETERS tcSection, tcKey
+ RETURN ''
+ ENDPROC
+ PROCEDURE WriteIni
+ LPARAMETERS tcSection, tcKey, tcValue
+ RETURN .T.
+ ENDPROC
+ENDDEFINE
diff --git a/utile/Teste/achizitie_import/test_taxcode_scc_aliniere.ps1 b/utile/Teste/achizitie_import/test_taxcode_scc_aliniere.ps1
new file mode 100644
index 0000000..8ac21d6
--- /dev/null
+++ b/utile/Teste/achizitie_import/test_taxcode_scc_aliniere.ps1
@@ -0,0 +1,14 @@
+# test_taxcode_scc_aliniere.ps1 - wrapper subtire peste harness-ul generic vfp_ui_harness.ps1.
+# aliniaza_tva_la_baza reface taxcode (SAFT) si comutarea scc/ascc 4427/creditor S pe randurile T
+# realiniate la familia S-ului - scenariu produs prin fluxul REAL (DVI+articole+dublu-click
+# Explicatie TVA+editare creditor prin grid), ca in test_repro_tva11_explicatie.prg.
+# Rulare: powershell -ExecutionPolicy Bypass -File test_taxcode_scc_aliniere.ps1
+$ErrorActionPreference = 'Stop'
+$Teste = $PSScriptRoot
+& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
+ -TestPrg (Join-Path $Teste 'test_taxcode_scc_aliniere.prg') `
+ -Steps @('factura_dvi','articole_adaugate','sync1_baseline','alegere_ce_4427','editare_creditor_s','revenire_fo','dblclick_fo','dblclick_ce','final') `
+ -ShotsDir (Join-Path $Teste 'screenshots_taxcode_scc_aliniere') `
+ -SyncDir (Join-Path $Teste 'uisync_taxcode_scc_aliniere') `
+ -StepTimeoutSec 220 `
+ -ReadyTimeoutSec 220
diff --git a/utile/Teste/achizitie_import/test_termin_partener.prg b/utile/Teste/achizitie_import/test_termin_partener.prg
index 5e26184..85da5ac 100644
--- a/utile/Teste/achizitie_import/test_termin_partener.prg
+++ b/utile/Teste/achizitie_import/test_termin_partener.prg
@@ -253,7 +253,7 @@ TRY
*-- F1 (ointroduceri.prg): index ord_doc INAINTE de CREATEOBJECT - vezi docs/testare-ui-vfp.md capcana p.
SELECT introdc
- INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc
+ 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 DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)'
@@ -541,8 +541,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 VerificaExistaS212Si371
diff --git a/utile/Teste/achizitie_import/test_tva_creditori.prg b/utile/Teste/achizitie_import/test_tva_creditori.prg
index a6efbd6..c18692d 100644
--- a/utile/Teste/achizitie_import/test_tva_creditori.prg
+++ b/utile/Teste/achizitie_import/test_tva_creditori.prg
@@ -643,8 +643,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 DumpIntrodc
diff --git a/utile/Teste/achizitie_import/test_tva_secundare.prg b/utile/Teste/achizitie_import/test_tva_secundare.prg
index 6d2efb7..ee62305 100644
--- a/utile/Teste/achizitie_import/test_tva_secundare.prg
+++ b/utile/Teste/achizitie_import/test_tva_secundare.prg
@@ -249,7 +249,7 @@ TRY
*-- documente (principala+secundara) pot pierde identitatea documentului "principal" dupa
*-- ce S-urile sunt sterse/reasezate la coada de fiecare sparge_document().
SELECT introdc
- INDEX ON STR(NVL(nr_doc,0),8) + ICASE(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + PADR(NVL(scd,''),10) TAG ord_doc
+ 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
*----- introdc_sablon: perechea-sablon (B 371/401 + T 4426/401) pe care do_adauga_factura o
@@ -817,8 +817,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 DumpIntrodc
diff --git a/utile/Teste/achizitie_import/test_valuta_dvi_usd.prg b/utile/Teste/achizitie_import/test_valuta_dvi_usd.prg
index 7db9830..87445ea 100644
--- a/utile/Teste/achizitie_import/test_valuta_dvi_usd.prg
+++ b/utile/Teste/achizitie_import/test_valuta_dvi_usd.prg
@@ -268,7 +268,7 @@ TRY
*-- F1 (ointroduceri.prg): index ord_doc INAINTE de CREATEOBJECT - vezi docs/testare-ui-vfp.md capcana p.
SELECT introdc
- INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc
+ 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 DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)'
@@ -674,8 +674,8 @@ PROCEDURE CreeazaIntrodc
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), ;
- scd_orig C(20), ascd_orig C(20))
+ 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 VerificaPereche
diff --git a/utile/Teste/partener_anaf/shot_dialog_anaf.ps1 b/utile/Teste/partener_anaf/shot_dialog_anaf.ps1
index 2699dca..3737eb3 100644
--- a/utile/Teste/partener_anaf/shot_dialog_anaf.ps1
+++ b/utile/Teste/partener_anaf/shot_dialog_anaf.ps1
@@ -116,15 +116,24 @@ function Take-Screenshot([IntPtr]$Hwnd, [string]$Path) {
$bmp.Dispose()
}
+# omoara doar vfp9 proprii (linia de comanda contine folderul testului), nu instante straine
+function Stop-VfpProprii([string]$Marker) {
+ Get-CimInstance Win32_Process -Filter "Name='vfp9.exe'" -ErrorAction SilentlyContinue | ForEach-Object {
+ if ($_.CommandLine -and $_.CommandLine.ToLower().Contains($Marker.ToLower())) {
+ Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue
+ }
+ }
+}
+
New-Item -ItemType Directory -Force -Path (Split-Path $OutPng -Parent) | Out-Null
if (Test-Path $SyncDir) { Get-ChildItem $SyncDir -File | Remove-Item -Force -ErrorAction SilentlyContinue } else { New-Item -ItemType Directory -Path $SyncDir | Out-Null }
Write-Host "Precompilez .fxp (izolat): $Precompile -Prg $Prg"
-Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
+Stop-VfpProprii $TestDir
Start-Sleep -Milliseconds 500
Start-Process powershell -WindowStyle Hidden -ArgumentList @('-ExecutionPolicy','Bypass','-File',"`"$Precompile`"",'-Prg',"`"$Prg`"") -Wait | Out-Null
Start-Sleep -Seconds 2
-Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
+Stop-VfpProprii $TestDir
Start-Sleep -Seconds 2
if (-not (Test-Path $TestFxp)) { Write-Warning "Nu s-a generat $TestFxp - compilare esuata."; exit 1 }
@@ -140,7 +149,7 @@ Push-Offscreen $hwnd
if (-not (Wait-File $ready0 $ReadyTimeoutSec $hwnd)) {
Write-Warning "Nu am primit ready_0 in ${ReadyTimeoutSec}s. Ultima linie log: '$(Get-Content $TestLog -Tail 1 -ErrorAction SilentlyContinue)'"
if (-not $proc.HasExited) { try { $proc.Kill() } catch {} }
- Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
+ Stop-VfpProprii $TestDir
exit 1
}
Write-Host "ready_0 primit - astept fereastra MESSAGEBOX() nativa (clasa #32770, acelasi PID)"
@@ -156,7 +165,7 @@ while ((Get-Date) -lt $deadline -and $dlgHwnd -eq [IntPtr]::Zero) {
if ($dlgHwnd -eq [IntPtr]::Zero) {
Write-Warning "Fereastra dialogului nu a aparut in ${DialogTimeoutSec}s."
if (-not $proc.HasExited) { try { $proc.Kill() } catch {} }
- Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
+ Stop-VfpProprii $TestDir
exit 1
}
Write-Host ("dialog gasit: hwnd={0} titlu=[{1}]" -f $dlgHwnd, [Win32Dlg]::GetTitle($dlgHwnd))
@@ -173,5 +182,5 @@ $done = Join-Path $SyncDir 'done.txt'
if (Wait-File $done 30 $hwnd) { Write-Host "done: $((Get-Content $done -Raw).Trim())" } else { Write-Warning "Nu am primit done.txt dupa inchiderea dialogului." }
Start-Sleep -Milliseconds 500
if (-not $proc.HasExited) { try { $proc.Kill() } catch {} }
-Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
+Stop-VfpProprii $TestDir
Write-Host "GATA. Screenshot in $OutPng"
diff --git a/utile/Teste/raport_teste.ps1 b/utile/Teste/raport_teste.ps1
new file mode 100644
index 0000000..c1b4ff2
--- /dev/null
+++ b/utile/Teste/raport_teste.ps1
@@ -0,0 +1,54 @@
+# raport_teste.ps1 - sinteza rularilor dintr-un folder de teste: afiseaza DOAR esecurile + un total.
+# Regula din COMUN\docs\orchestrare-subagenti.md: orchestratorul nu citeste log-uri brute.
+# Tabelul complet (-Tot) se citeste o singura data, la baseline.
+#
+# powershell -ExecutionPolicy Bypass -File raport_teste.ps1 -Dir [-Tot] [-Baseline ]
+#
+# -Baseline: fisier salvat anterior cu -Tot; iesirea marcheaza NOU fata de baseline
+# (adica regresie) vs. esec preexistent.
+param(
+ [string]$Dir = (Join-Path $PSScriptRoot 'achizitie_import'),
+ [switch]$Tot,
+ [string]$Baseline
+)
+
+$vechi = @{}
+if ($Baseline -and (Test-Path $Baseline)) {
+ foreach ($ln in Get-Content $Baseline) {
+ if ($ln -match '^\s*(\S+?)\s+PASS=(\d+)\s+FAIL=(\d+)') { $vechi[$Matches[1]] = [int]$Matches[3] }
+ }
+}
+
+$rez = @()
+foreach ($lg in (Get-ChildItem $Dir -Filter '*_log.txt' -Recurse -ErrorAction SilentlyContinue | Sort-Object Name)) {
+ $t = Get-Content $lg.FullName -Encoding Default -ErrorAction SilentlyContinue
+ if (-not $t) { continue }
+ $nume = $lg.BaseName -replace '_log$', ''
+ $pass = @($t | Select-String -Pattern '^\s*PASS').Count
+ $fail = @($t | Select-String -Pattern '^\s*(FAIL|BUG)\b' | Where-Object { $_.Line -notmatch '^\s*FAIL asteptat' })
+ $rez += [pscustomobject]@{
+ Nume = $nume; Pass = $pass; Fail = $fail.Count
+ Linii = $fail | ForEach-Object { $_.Line.Trim() }
+ Varsta = [int]((Get-Date) - $lg.LastWriteTime).TotalMinutes
+ }
+}
+
+$ok = @($rez | Where-Object { $_.Fail -eq 0 }).Count
+$ko = @($rez | Where-Object { $_.Fail -gt 0 })
+
+if ($Tot) {
+ foreach ($r in $rez) { "{0,-34} PASS={1,-4} FAIL={2,-3} varsta={3}min" -f $r.Nume, $r.Pass, $r.Fail, $r.Varsta }
+ ''
+}
+
+"$ok OK, $($ko.Count) FAIL (din $($rez.Count) rulari)"
+foreach ($r in $ko) {
+ $eticheta = ''
+ if ($vechi.Count -gt 0) {
+ if ($vechi.ContainsKey($r.Nume) -and $vechi[$r.Nume] -ge $r.Fail) { $eticheta = ' [preexistent]' }
+ else { $eticheta = ' [NOU - REGRESIE]' }
+ }
+ " {0} ({1} esecuri){2}" -f $r.Nume, $r.Fail, $eticheta
+ foreach ($x in $r.Linii) { ' ' + $x }
+}
+if ($ko.Count -eq 0) { ' (nimic de raportat)' }
diff --git a/utile/Teste/vfp_ui_harness.ps1 b/utile/Teste/vfp_ui_harness.ps1
index 7d90de6..5356ce9 100644
--- a/utile/Teste/vfp_ui_harness.ps1
+++ b/utile/Teste/vfp_ui_harness.ps1
@@ -130,17 +130,26 @@ function Take-Screenshot([IntPtr]$Hwnd, [string]$Path) {
$bmp.Dispose()
}
+# omoara doar vfp9 proprii (linia de comanda contine folderul testului), nu instante straine
+function Stop-VfpProprii([string]$Marker) {
+ Get-CimInstance Win32_Process -Filter "Name='vfp9.exe'" -ErrorAction SilentlyContinue | ForEach-Object {
+ if ($_.CommandLine -and $_.CommandLine.ToLower().Contains($Marker.ToLower())) {
+ Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue
+ }
+ }
+}
+
Clear-Dir $SyncDir
Clear-Dir $ShotsDir
# 1) Precompilare izolata (proces copil complet, ca sa nu otraveasca sesiunea de lansare).
# -WindowStyle Hidden pe consola powershell copil (sigur - e consola, nu GUI VFP).
Write-Host "Precompilez .fxp (izolat): $Precompile -Prg $TestPrg"
-Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
+Stop-VfpProprii $TestDir
Start-Sleep -Milliseconds 500
$pc = Start-Process powershell -WindowStyle Hidden -ArgumentList @('-ExecutionPolicy','Bypass','-File', "`"$Precompile`"", '-Prg', "`"$TestPrg`"") -Wait -PassThru
Start-Sleep -Seconds 2
-Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
+Stop-VfpProprii $TestDir
Start-Sleep -Seconds 2
if (-not (Test-Path $TestFxp)) { Write-Warning "Nu s-a generat $TestFxp - compilare esuata." }
@@ -175,7 +184,7 @@ foreach ($try in 1..8) {
if ($started) { break }
Write-Warning "Incercarea ${try}: testul nu a scris START in 30s (instanta moarta); relansez."
if ($proc -and -not $proc.HasExited) { try { $proc.Kill() } catch {} }
- Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
+ Stop-VfpProprii $TestDir
Start-Sleep -Milliseconds 1500
$hwnd = [IntPtr]::Zero
}
@@ -218,5 +227,5 @@ if ($ok) {
}
Start-Sleep -Milliseconds 800
if ($proc -and -not $proc.HasExited) { try { $proc.Kill() } catch {} }
-Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
+Stop-VfpProprii $TestDir
Write-Host "GATA. Screenshots in $ShotsDir"