#6 editare factura emisa: S4 runda 3 completa (pagina de articole editabila)

frm_modific2024, pgfArticole.PAGE3 - editare in memorie, fara scriere in Oracle
(aceea ramane S5).

- sub-blocul A: cantitate/pret/pret_cu_tva editabile inline, marcaj lmodificat
  pe linie, coloana valoare pe linie
- sub-blocul B: stergere logica de linii (sters/DynamicForeColor gri) si adaugare
  de linii prin frm_articol_factura, cu alegerea articolului prin caut_articol()
- sub-blocul C: bara de totaluri sub grid (total linii convertit RON la cursul
  documentului, discount de antet editabil, total net), ascunsa pe
  transfer/custodie; verdict de corelatie ACT/RUL informativ, cu 3 stari
- suma ACT: sold net debit-credit, cont pe tip de document (4111 / 418 / 461,
  iar pe rate/contract 4111, 411 sau 461)
- suma RUL: doar ID_TIP_RULAJ = 0, adica miscarile reale; perechile
  ID_TIP_RULAJ = 3 sunt virtuale (tin locul procesului verbal de schimbare de
  pret) si nu intra in suma. Corectie cu liniile nestocate, marcata "ajustat"
- adaugarea de linii pe document in valuta: dialogul primeste tip_valuta si
  cursul documentului de pe tvanz, deci pretul se introduce direct in valuta;
  ofacturare.vc2 ramane neatins
- cei 5 apelanti frm_modific2024 (afisjurcom, anaf_efactura, cele doua .sc2 de
  import) pregatesc cursorul de articole inainte de Createobject, gardat pe
  SET PROCEDURE - registrul jurnal din ROACONT/ROAGEST ramane neschimbat

Teste headless pe MARIUSM_AUTO, suite care isi descopera singure documentele:
test_page3_articole 14/2 (cele 2 = artefact de grid nematerializat headless,
acoperit pe ecran), test_incarca_vanzare_din_nota 5/0,
test_adauga_linie_articol 20/0, test_adauga_linie_valuta 16/0,
test_ui_sterge_linie 8/0, test_verdict_act_rul 26/0.

docs/todos.txt: punctele 13 si 20, scrise de Marius.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
This commit is contained in:
2026-08-09 20:48:42 +03:00
parent 13b4f65723
commit b9eba29ebe
26 changed files with 3310 additions and 172 deletions

View File

@@ -13081,6 +13081,9 @@ DEFINE CLASS frm_import_efactura AS _frmbase OF "_frm_base.vcx"
Select trul
Go Top
IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure"))
PregatesteArticoleFacturaEditare('tact')
ENDIF
Omodif = Createobject([frm_modific2024], m.lnIdSet)
*!* DO FORM frm_modific2024 NAME omodif LINKED WITH m.lnIdSet NOSHOW
Omodif.Show()
@@ -13134,6 +13137,7 @@ DEFINE CLASS frm_import_efactura AS _frmbase OF "_frm_base.vcx"
Use In (Select('rul_temp'))
Use In (Select('trul_obinv'))
Use In (Select('rul_temp_obinv'))
Use In (Select('crsArticoleFactura'))
USE IN (SELECT('crsJtvaTemp'))
ENDPROC

View File

@@ -2432,6 +2432,9 @@ DEFINE CLASS afisjurcom AS _frmbase OF "_frm_base.vcx"
*Select a.*,Iif(Isnull(id_jtva_coloana),0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Select a.*,Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
*!* modificare ROACONT v 2.0.78 ^
IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure"))
PregatesteArticoleFacturaEditare('tact')
ENDIF
* Omodif = Createobject([frm_modific2007],lnIdSet)
Omodif = Createobject([frm_modific2024],lnIdSet)
* DO FORM frm_modific2024 NAME omodif LINKED WITH m.lnIdSet NOSHOW
@@ -2558,6 +2561,9 @@ DEFINE CLASS afisjurcom AS _frmbase OF "_frm_base.vcx"
If Used('trul_obinv')
Use In trul_obinv
Endif
If Used('crsArticoleFactura')
Use In crsArticoleFactura
Endif
ENDPROC

View File

@@ -150,7 +150,7 @@ DEFINE CLASS frm_borderou_facturi AS _frmbase OF "_frm_base.vcx"
ADD OBJECT 'Cmd_executa1' AS cmd_executa WITH ;
Anchor = 6, ;
Caption = "Marcheaz<61> \<trimis", ;
Caption = "Marcheaz<61> \<trimis", ;
ForeColor = 0,128,0, ;
Height = 27, ;
Left = 140, ;
@@ -1334,7 +1334,6 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="But_attach1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="But_listare1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="But_verifica1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="But_editare1" UniqueID="" Timestamp="" />
*<DefinedPropArrayMethod>
*m: do_editare_factura
@@ -1352,7 +1351,7 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
*<PropValue>
BorderStyle = 1
cbuton2 = but_listare1;but_listare2;But_listare3
cbuton3 = but_modifica1;but_modifica2;But_editare1
cbuton3 = but_modifica1;but_modifica2
cfiltru_initial =
cgridsortlist = grid_facturi,grid_detalii
DoCreate = .T.
@@ -1412,17 +1411,6 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
Visible = .F.
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'But_editare1' AS but_modifica WITH ;
Anchor = 12, ;
caction = do_editare_factura, ;
Caption = "", ;
Left = 650, ;
Name = "But_editare1", ;
TabIndex = 29, ;
ToolTipText = "Editare factura (articole, cantitati, preturi)", ;
Top = 341
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'But_listare1' AS but_listare WITH ;
Anchor = 8, ;
Left = 698, ;
@@ -3484,7 +3472,7 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
Anchor = 12, ;
AutoSize = .T., ;
BackStyle = 0, ;
Caption = "Total <20>n valuta", ;
Caption = "Total <20>n valuta", ;
FontSize = 10, ;
Height = 18, ;
Left = 311, ;
@@ -3798,6 +3786,12 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
update_jtva_coloane("", "crsJtvaTemp", 0)
*!* articolele se incarca ACUM, inainte de Createobject - grid-ul din pagina 3
*!* se leaga o singura data, la construire, pe cursorul deja plin
IncarcaArticoleFactura(m.lnIdVanzare, 'crsArticoleFactura')
Select tact
Omodif = Createobject([frm_modific2024], lnIdSet)
Omodif.Show()
@@ -3858,6 +3852,12 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
If Used('trul_obinv')
Use In trul_obinv
Endif
If Used('crsJtvaTemp')
Use In crsJtvaTemp
Endif
If Used('crsArticoleFactura')
Use In crsArticoleFactura
Endif
Endif
Select crsfacturi
@@ -4922,6 +4922,17 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
USE IN (SELECT('crsCoduriFiscale'))
ENDPROC
PROCEDURE inainte_de_do_modifica
Local lnOptiune
lnOptiune = xmenu('Modificare \<date factura;Editare \<factura (articole, cantitati, preturi)')
Do Case
Case lnOptiune = 1
This.do_modifica()
Case lnOptiune = 2
This.do_editare_factura()
Endcase
ENDPROC
PROCEDURE Init
Local lcData, lcFiltruInitial
*:Global gcAcces
@@ -5145,7 +5156,7 @@ DEFINE CLASS frm_modifica_articol_factura AS frm_termin_renunt OF "_frm_child.vc
_shape2.Top = 0
_shape2.Width = 64
_shape2.ZOrderSet = 2
Lb_titlu_alb_b121.Caption = "Modific<69> explica<63>ie articol"
Lb_titlu_alb_b121.Caption = "Modific<69> explica<63>ie articol"
Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121"
Lb_titlu_alb_b121.TabIndex = 5
Lb_titlu_alb_b121.ZOrderSet = 3
@@ -5203,7 +5214,7 @@ DEFINE CLASS frm_modifica_articol_factura AS frm_termin_renunt OF "_frm_child.vc
_edbase1.Name = "_edbase1", ;
_edbase1.Top = 23, ;
_edbase1.Width = 325, ;
_lbbase1.Caption = "Explica<63>ie", ;
_lbbase1.Caption = "Explica<63>ie", ;
_lbbase1.Name = "_lbbase1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
@@ -5437,7 +5448,7 @@ DEFINE CLASS frm_modifica_factura AS frm_termin_renunt OF "_frm_child.vcx"
Text_simplu1.Name = "Text_simplu1", ;
Text_simplu1.Top = 3, ;
Text_simplu1.Width = 177, ;
Lb_simplu1.Caption = "Data <20>i ora expedierii", ;
Lb_simplu1.Caption = "Data <20>i ora expedierii", ;
Lb_simplu1.Name = "Lb_simplu1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
@@ -5487,7 +5498,7 @@ DEFINE CLASS frm_modifica_factura AS frm_termin_renunt OF "_frm_child.vcx"
Top = 128, ;
ZOrderSet = 9, ;
img_cautare.Name = "img_cautare", ;
clb_tx_cautare.Lb_simplu1.Caption = "Ma<4D>ina", ;
clb_tx_cautare.Lb_simplu1.Caption = "Ma<4D>ina", ;
clb_tx_cautare.Lb_simplu1.Name = "Lb_simplu1", ;
clb_tx_cautare.Name = "clb_tx_cautare", ;
clb_tx_cautare.Text_simplu1.Left = 133, ;
@@ -6977,7 +6988,7 @@ DEFINE CLASS frm_proforme AS _frmbase OF "_frm_base.vcx"
Anchor = 12, ;
AutoSize = .T., ;
BackStyle = 0, ;
Caption = "Total <20>n valuta", ;
Caption = "Total <20>n valuta", ;
FontSize = 10, ;
Height = 18, ;
Left = 311, ;
@@ -7009,7 +7020,7 @@ DEFINE CLASS frm_proforme AS _frmbase OF "_frm_base.vcx"
OPTION1.Top = 5, ;
OPTION1.Value = 1, ;
OPTION2.AutoSize = .T., ;
OPTION2.Caption = "<22>n valuta", ;
OPTION2.Caption = "<22>n valuta", ;
OPTION2.FontCharSet = 238, ;
OPTION2.FontSize = 10, ;
OPTION2.Left = 55, ;
@@ -7017,7 +7028,7 @@ DEFINE CLASS frm_proforme AS _frmbase OF "_frm_base.vcx"
OPTION2.Top = 5, ;
Option3.AutoSize = .T., ;
Option3.BackStyle = 0, ;
Option3.Caption = "<22>n RON", ;
Option3.Caption = "<22>n RON", ;
Option3.FontCharSet = 238, ;
Option3.FontSize = 10, ;
Option3.Height = 18, ;
@@ -7048,7 +7059,7 @@ DEFINE CLASS frm_proforme AS _frmbase OF "_frm_base.vcx"
OPTION1.Top = 5, ;
OPTION1.Value = 0, ;
OPTION2.AutoSize = .T., ;
OPTION2.Caption = "<22>terse", ;
OPTION2.Caption = "<22>terse", ;
OPTION2.FontCharSet = 238, ;
OPTION2.FontSize = 10, ;
OPTION2.ForeColor = 255,0,0, ;
@@ -7057,7 +7068,7 @@ DEFINE CLASS frm_proforme AS _frmbase OF "_frm_base.vcx"
OPTION2.Top = 5, ;
Option3.AutoSize = .T., ;
Option3.BackStyle = 0, ;
Option3.Caption = "Ne<4E>terse", ;
Option3.Caption = "Ne<4E>terse", ;
Option3.FontCharSet = 238, ;
Option3.FontSize = 10, ;
Option3.Height = 18, ;

View File

@@ -6642,7 +6642,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cPretArt.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cPretArt.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt._checkbox1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cProcTvavArt.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cProcTvavArt.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cDiscountUnitarArt.Header1" UniqueID="" Timestamp="" />
@@ -6655,6 +6655,23 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cExplicatieArt.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cTaxcodeArt.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cTaxcodeArt.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cValoareArt.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cValoareArt.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.cmdStergeArticol" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.cmdAdaugaArticol" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblTotalLiniiArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalLiniiArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblDiscountArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtDiscountArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblTotalNetArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalNetArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblTotalSalvatArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalSalvatArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblTotalActArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalActArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblTotalRulArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalRulArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblVerdictArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE2.grdRulajeObinv.cvaloarevcTVA.cvaloarevcTVA" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE2.grdRulajeObinv.cvaloarevcTVA.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Grid1" UniqueID="" Timestamp="" />
@@ -6775,6 +6792,8 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="But_copiazaR" UniqueID="" Timestamp="" />
*<DefinedPropArrayMethod>
*m: actualizeazabaratotaluri
*m: actualizeazaverdictactrul
*m: afiseaza_rulaje
*m: alege_partener
*m: aleg_document_pereche
@@ -6806,6 +6825,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*p: leditare
*p: lmodificare
*p: lnotanoua
*p: lrulajustat
*p: lverificare
*p: lvizualizare
*p: nidvanzare
@@ -6816,6 +6836,10 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*p: nsuma && Total suma inregistrari
*p: ntaxcode
*p: ntipvanzare
*p: ntotalactron
*p: ntotalliniiron
*p: ntotalnetron
*p: ntotalrulron
*p: obackupxml
*p: oldvalue
*p: oset
@@ -6834,12 +6858,13 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
cpaymentcode =
DoCreate = .T.
FontCharSet = 238
Height = 508
Height = 530
larearticolevanzari = .F.
lavertizatexigibilizare = .F.
leditare = .F.
lmodificare = .F.
lnotanoua = .F.
lrulajustat = .F.
lverificare = .F.
lvizualizare = .F.
Name = "frm_modific2024"
@@ -6851,6 +6876,10 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
nsuma = 0
ntaxcode = 0
ntipvanzare = 0
ntotalactron = 0
ntotalliniiron = 0
ntotalnetron = 0
ntotalrulron = 0
obackupxml = NULL
oldvalue =
oset = NULL
@@ -6908,7 +6937,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
caction = afiseaza_rulaje, ;
Left = 773, ;
Name = "but_afiseaza_rulaje", ;
Top = 471
Top = 493
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'But_copiaza1' AS but_copiaza WITH ;
@@ -6929,7 +6958,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Name = "But_copiazaR", ;
TabIndex = 15, ;
ToolTipText = "Copiere - Se copiaza toate campurile din inregistrarea curenta", ;
Top = 368, ;
Top = 390, ;
ZOrderSet = 30
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
@@ -6937,7 +6966,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Anchor = 12, ;
Left = 773, ;
Name = "But_modificaR", ;
Top = 396, ;
Top = 418, ;
Visible = .T., ;
ZOrderSet = 31
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
@@ -6999,7 +7028,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Left = 773, ;
Name = "But_stergeR", ;
TabIndex = 14, ;
Top = 424, ;
Top = 446, ;
Visible = .T., ;
ZOrderSet = 29
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
@@ -8660,7 +8689,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
ADD OBJECT 'pgfArticole' AS _pageframe WITH ;
Anchor = 15, ;
ErasePage = .T., ;
Height = 142, ;
Height = 164, ;
Left = 5, ;
Name = "pgfArticole", ;
PageCount = 3, ;
@@ -12254,99 +12283,167 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
SelectedBackColor = 100,185,255
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'pgfArticole.PAGE3.cmdAdaugaArticol' AS commandbutton WITH ;
Anchor = 8, ;
AutoSize = .F., ;
Caption = "Adauga articol", ;
FontCharSet = 238, ;
FontSize = 9, ;
ForeColor = 0,0,64, ;
Height = 22, ;
Left = 175, ;
Name = "cmdAdaugaArticol", ;
TabIndex = 5, ;
Top = 0, ;
Width = 170, ;
ZOrderSet = 0
*< END OBJECT: BaseClass="commandbutton" />
ADD OBJECT 'pgfArticole.PAGE3.cmdStergeArticol' AS commandbutton WITH ;
Anchor = 8, ;
AutoSize = .F., ;
Caption = "Sterge / Restaureaza linie", ;
FontCharSet = 238, ;
FontSize = 9, ;
ForeColor = 0,0,64, ;
Height = 22, ;
Left = 0, ;
Name = "cmdStergeArticol", ;
TabIndex = 3, ;
Top = 0, ;
Width = 170, ;
ZOrderSet = 0
*< END OBJECT: BaseClass="commandbutton" />
ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura' AS _grdrow WITH ;
Anchor = 15, ;
ColumnCount = 13, ;
ColumnCount = 14, ;
DeleteMark = .F., ;
FontSize = 10, ;
GridLineColor = 128,128,128, ;
HeaderHeight = 35, ;
Height = 107, ;
Height = 81, ;
lcamptextneeditabil = .F., ;
Left = 0, ;
Name = "grdArticoleFactura", ;
ReadOnly = .T., ;
nrgbrow = 0, ;
ReadOnly = .F., ;
RecordSource = "tvd", ;
RowHeight = 19, ;
TabIndex = 4, ;
Tag = "RESIZABLE", ;
Top = 0, ;
Top = 26, ;
Width = 759, ;
ZOrderSet = 1, ;
Column1.ControlSource = "tvd.denumire", ;
Column1.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column1.FontName = "Arial", ;
Column1.FontSize = 10, ;
Column1.Name = "cDenumireArt", ;
Column1.ReadOnly = .T., ;
Column1.Width = 170, ;
Column2.ControlSource = "tvd.codmat", ;
Column2.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column2.FontName = "Arial", ;
Column2.FontSize = 10, ;
Column2.Name = "cCodmatArt", ;
Column2.ReadOnly = .T., ;
Column2.Width = 90, ;
Column3.ControlSource = "tvd.serie", ;
Column3.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column3.FontName = "Arial", ;
Column3.FontSize = 10, ;
Column3.Name = "cSerieArt", ;
Column3.ReadOnly = .T., ;
Column3.Width = 70, ;
Column4.ControlSource = "tvd.lot", ;
Column4.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column4.FontName = "Arial", ;
Column4.FontSize = 10, ;
Column4.Name = "cLotArt", ;
Column4.ReadOnly = .T., ;
Column4.Width = 60, ;
Column5.ControlSource = "tvd.cantitate", ;
Column5.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column5.FontName = "Arial", ;
Column5.FontSize = 10, ;
Column5.Format = "R", ;
Column5.InputMask = (get_mask(12,gnPCANT)), ;
Column5.Name = "cCantitateArt", ;
Column5.ReadOnly = .F., ;
Column5.Width = 70, ;
Column6.ControlSource = "tvd.pret", ;
Column6.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column6.FontName = "Arial", ;
Column6.FontSize = 10, ;
Column6.Format = "R", ;
Column6.InputMask = (get_mask(12,gnPPRET)), ;
Column6.Name = "cPretArt", ;
Column6.ReadOnly = .F., ;
Column6.Width = 70, ;
Column7.ControlSource = "tvd.pret_cu_tva", ;
Column7.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column7.FontName = "Arial", ;
Column7.FontSize = 10, ;
Column7.Format = "R", ;
Column7.InputMask = (get_mask(12,gnPPRET)), ;
Column7.Name = "cPretCuTvaArt", ;
Column7.ReadOnly = .F., ;
Column7.Sparse = .F., ;
Column7.Width = 80, ;
Column8.ControlSource = "tvd.proc_tvav", ;
Column8.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column8.FontName = "Arial", ;
Column8.FontSize = 10, ;
Column8.Format = "R", ;
Column8.InputMask = "9.99", ;
Column8.Name = "cProcTvavArt", ;
Column8.ReadOnly = .T., ;
Column8.Width = 55, ;
Column9.ControlSource = "tvd.discount_unitar", ;
Column9.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column9.FontName = "Arial", ;
Column9.FontSize = 10, ;
Column9.Format = "R", ;
Column9.InputMask = (get_mask(12,gnPPRET)), ;
Column9.Name = "cDiscountUnitarArt", ;
Column9.ReadOnly = .T., ;
Column9.Width = 90, ;
Column10.ControlSource = "tvd.nume_gestiune", ;
Column10.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column10.FontName = "Arial", ;
Column10.FontSize = 10, ;
Column10.Name = "cGestiuneArt", ;
Column10.ReadOnly = .T., ;
Column10.Width = 90, ;
Column11.ControlSource = "tvd.nume_val", ;
Column11.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column11.FontName = "Arial", ;
Column11.FontSize = 10, ;
Column11.Name = "cValutaArt", ;
Column11.ReadOnly = .T., ;
Column11.Width = 60, ;
Column12.ControlSource = "tvd.explicatie", ;
Column12.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column12.FontName = "Arial", ;
Column12.FontSize = 10, ;
Column12.Name = "cExplicatieArt", ;
Column12.ReadOnly = .T., ;
Column12.Width = 150, ;
Column13.ControlSource = "tvd.taxcode", ;
Column13.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column13.FontName = "Arial", ;
Column13.FontSize = 10, ;
Column13.Name = "cTaxcodeArt", ;
Column13.Width = 60
Column13.ReadOnly = .T., ;
Column13.Width = 60, ;
Column14.ControlSource = "tvd.valoare", ;
Column14.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ;
Column14.FontName = "Arial", ;
Column14.FontSize = 10, ;
Column14.Format = "R", ;
Column14.InputMask = (get_mask(14,gnPa)), ;
Column14.Name = "cValoareArt", ;
Column14.ReadOnly = .T., ;
Column14.Width = 90
*< END OBJECT: ClassLib="_grd_base.vcx" BaseClass="grid" />
ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cCantitateArt.Header1' AS header WITH ;
@@ -12359,14 +12456,14 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cCantitateArt.Text1' AS textbox WITH ;
BackColor = 225,225,225, ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial", ;
FontSize = 10, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T., ;
ReadOnly = .F., ;
SelectedBackColor = 100,185,255
*< END OBJECT: BaseClass="textbox" />
@@ -12506,17 +12603,27 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cPretArt.Text1' AS textbox WITH ;
BackColor = 225,225,225, ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial", ;
FontSize = 10, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T., ;
ReadOnly = .F., ;
SelectedBackColor = 100,185,255
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt._checkbox1' AS _checkbox WITH ;
Alignment = 2, ;
Caption = "", ;
Centered = .T., ;
FontName = "Arial", ;
FontSize = 10, ;
Name = "_checkbox1", ;
ReadOnly = .F.
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" />
ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Pret cu TVA", ;
@@ -12526,18 +12633,6 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
WordWrap = .T.
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt.Text1' AS textbox WITH ;
BackColor = 225,225,225, ;
BorderStyle = 0, ;
FontName = "Arial", ;
FontSize = 10, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T., ;
SelectedBackColor = 100,185,255
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cProcTvavArt.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "TVA %", ;
@@ -12601,6 +12696,27 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
SelectedBackColor = 100,185,255
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cValoareArt.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Valoare", ;
FontName = "Arial", ;
FontSize = 10, ;
Name = "Header1", ;
WordWrap = .T.
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cValoareArt.Text1' AS textbox WITH ;
BackColor = 225,225,225, ;
BorderStyle = 0, ;
FontName = "Arial", ;
FontSize = 10, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T., ;
SelectedBackColor = 100,185,255
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cValutaArt.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Valuta", ;
@@ -12622,6 +12738,174 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
SelectedBackColor = 100,185,255
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'pgfArticole.PAGE3.lblDiscountArt' AS _label WITH ;
AutoSize = .F., ;
Caption = "Discount:", ;
FontBold = .T., ;
Height = 17, ;
Left = 190, ;
Name = "lblDiscountArt", ;
Top = 114, ;
Width = 65, ;
ZOrderSet = 4
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'pgfArticole.PAGE3.lblTotalActArt' AS _label WITH ;
AutoSize = .F., ;
Caption = "Total ACT:", ;
FontBold = .T., ;
Height = 17, ;
Left = 0, ;
Name = "lblTotalActArt", ;
Top = 136, ;
Width = 90, ;
ZOrderSet = 10
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'pgfArticole.PAGE3.lblTotalLiniiArt' AS _label WITH ;
AutoSize = .F., ;
Caption = "Total linii:", ;
FontBold = .T., ;
Height = 17, ;
Left = 0, ;
Name = "lblTotalLiniiArt", ;
Top = 114, ;
Width = 90, ;
ZOrderSet = 2
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'pgfArticole.PAGE3.lblTotalNetArt' AS _label WITH ;
AutoSize = .F., ;
Caption = "Total net:", ;
FontBold = .T., ;
Height = 17, ;
Left = 340, ;
Name = "lblTotalNetArt", ;
Top = 114, ;
Width = 80, ;
ZOrderSet = 6
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'pgfArticole.PAGE3.lblTotalRulArt' AS _label WITH ;
AutoSize = .F., ;
Caption = "Total RUL:", ;
FontBold = .T., ;
Height = 17, ;
Left = 190, ;
Name = "lblTotalRulArt", ;
Top = 136, ;
Width = 90, ;
ZOrderSet = 12
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'pgfArticole.PAGE3.lblTotalSalvatArt' AS _label WITH ;
AutoSize = .F., ;
Caption = "Total salvat:", ;
FontBold = .T., ;
Height = 17, ;
Left = 520, ;
Name = "lblTotalSalvatArt", ;
Top = 114, ;
Width = 85, ;
ZOrderSet = 8
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'pgfArticole.PAGE3.lblVerdictArt' AS _label WITH ;
AutoSize = .F., ;
Caption = "", ;
FontBold = .T., ;
Height = 17, ;
Left = 380, ;
Name = "lblVerdictArt", ;
Top = 136, ;
Width = 350, ;
ZOrderSet = 14
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'pgfArticole.PAGE3.txtDiscountArt' AS _textbox WITH ;
Alignment = 1, ;
ControlSource = "tvanz.discount", ;
Format = "R", ;
Height = 21, ;
InputMask = (get_mask(12,gnPa)), ;
Left = 257, ;
Name = "txtDiscountArt", ;
ReadOnly = .F., ;
Top = 110, ;
Width = 75, ;
ZOrderSet = 5
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'pgfArticole.PAGE3.txtTotalActArt' AS _textbox WITH ;
Alignment = 1, ;
ControlSource = "thisform.nTotalActRon", ;
Format = "R", ;
Height = 21, ;
InputMask = (get_mask(14,gnPa)), ;
Left = 92, ;
Name = "txtTotalActArt", ;
ReadOnly = .T., ;
Top = 132, ;
Width = 90, ;
ZOrderSet = 11
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'pgfArticole.PAGE3.txtTotalLiniiArt' AS _textbox WITH ;
Alignment = 1, ;
ControlSource = "thisform.nTotalLiniiRon", ;
Format = "R", ;
Height = 21, ;
InputMask = (get_mask(14,gnPa)), ;
Left = 92, ;
Name = "txtTotalLiniiArt", ;
ReadOnly = .T., ;
Top = 110, ;
Width = 90, ;
ZOrderSet = 3
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'pgfArticole.PAGE3.txtTotalNetArt' AS _textbox WITH ;
Alignment = 1, ;
ControlSource = "thisform.nTotalNetRon", ;
Format = "R", ;
Height = 21, ;
InputMask = (get_mask(14,gnPa)), ;
Left = 422, ;
Name = "txtTotalNetArt", ;
ReadOnly = .T., ;
Top = 110, ;
Width = 90, ;
ZOrderSet = 7
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'pgfArticole.PAGE3.txtTotalRulArt' AS _textbox WITH ;
Alignment = 1, ;
ControlSource = "thisform.nTotalRulRon", ;
Format = "R", ;
Height = 21, ;
InputMask = (get_mask(14,gnPa)), ;
Left = 282, ;
Name = "txtTotalRulArt", ;
ReadOnly = .T., ;
Top = 132, ;
Width = 90, ;
ZOrderSet = 13
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'pgfArticole.PAGE3.txtTotalSalvatArt' AS _textbox WITH ;
Alignment = 1, ;
ControlSource = "tvanz.total_cu_tva", ;
Format = "R", ;
Height = 21, ;
InputMask = (get_mask(14,gnPa)), ;
Left = 607, ;
Name = "txtTotalSalvatArt", ;
ReadOnly = .T., ;
Top = 110, ;
Width = 90, ;
ZOrderSet = 9
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'txtSuma' AS _textbox WITH ;
Alignment = 3, ;
Anchor = 8, ;
@@ -12647,6 +12931,195 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
ENDIF
ENDPROC
PROCEDURE ActualizeazaBaraTotaluri
*!* recalculeaza totalul liniilor active convertit in RON la cursul documentului (decizia 33) si arata/ascunde bara pe tipurile fara suma comparabila (decizia 22)
LOCAL lnCurs, lnMultiplicator, lnTotal, llAscunde, lnWorkArea, lnRecnoTvd
IF !This.lAreArticoleVanzari OR !Used('tvd') OR !Used('tvanz') OR Reccount('tvanz') = 0
RETURN
ENDIF
lnCurs = Nvl(tvanz.curs, 1)
lnMultiplicator = Nvl(tvanz.multiplicator, 1)
IF m.lnMultiplicator = 0
m.lnMultiplicator = 1
ENDIF
lnTotal = 0
lnWorkArea = Select()
lnRecnoTvd = Recno('tvd')
SELECT tvd
SUM valoare TO lnTotal FOR Nvl(sters,0) <> 1
*!* SUM muta pointerul in tvd - se restaureaza, ca apelantul (ex. calculeaza_valori_articol) sa ramana pe randul editat
IF Between(m.lnRecnoTvd, 1, Reccount('tvd'))
GO (m.lnRecnoTvd) IN tvd
ENDIF
IF m.lnWorkArea > 0
SELECT (m.lnWorkArea)
ENDIF
This.nTotalLiniiRon = ROUND(m.lnTotal * m.lnCurs / m.lnMultiplicator, 2)
This.nTotalNetRon = This.nTotalLiniiRon - Nvl(tvanz.discount, 0)
llAscunde = INLIST(This.nTipVanzare, 23, 25, 27, 30, 41, 42, 47)
WITH This.pgfArticole.PAGE3
.lblTotalLiniiArt.Visible = !m.llAscunde
.txtTotalLiniiArt.Visible = !m.llAscunde
.lblDiscountArt.Visible = !m.llAscunde
.txtDiscountArt.Visible = !m.llAscunde
.lblTotalNetArt.Visible = !m.llAscunde
.txtTotalNetArt.Visible = !m.llAscunde
.lblTotalSalvatArt.Visible = !m.llAscunde
.txtTotalSalvatArt.Visible = !m.llAscunde
ENDWITH
This.ActualizeazaVerdictActRul(m.lnCurs, m.lnMultiplicator, !m.llAscunde)
This.pgfArticole.PAGE3.Refresh()
ENDPROC
PROCEDURE ActualizeazaVerdictActRul
*!* verdict informativ de corelatie ACT/RUL (docs\cercetare\rec_suma_act.md) - niciodata verdict
*!* automat de eroare, pentru ca ACT n-are coloana de origine a randului (un rand adaugat manual
*!* e indistinctibil de unul generat). Contul de referinta se alege pe tipul documentului, suma
*!* ACT e soldul net debit-credit pe cod+an+luna+sters=0, suma RUL se corecteaza cu valoarea
*!* liniilor nestocate (in_stoc=0) convertita in RON la cursul documentului, ca la restul barei
LPARAMETERS tnCurs, tnMultiplicator, tlAplicabil
LOCAL lcCont, lnTotalAct, lnTotalRul, lnCorectieNestocate, lnWorkArea, lnRecnoTact, lnRecnoTrul, lnRecnoTvd
LOCAL llAjustat, llVerdictSigur, lcVerdict, lnForeColor
This.lRulAjustat = .F.
This.nTotalActRon = 0
This.nTotalRulRon = 0
WITH This.pgfArticole.PAGE3
.lblTotalActArt.Visible = m.tlAplicabil
.txtTotalActArt.Visible = m.tlAplicabil
.lblTotalRulArt.Visible = m.tlAplicabil
.txtTotalRulArt.Visible = m.tlAplicabil
.lblVerdictArt.Visible = m.tlAplicabil
ENDWITH
IF !m.tlAplicabil OR !Used('tact') OR !Used('trul') OR !Used('tvd')
RETURN
ENDIF
DO CASE
CASE INLIST(This.nTipVanzare, 28, 29)
lcCont = ',461,'
CASE INLIST(This.nTipVanzare, 21, 22, 24, 26)
lcCont = ',418,'
CASE INLIST(This.nTipVanzare, 2, 6, 52)
lcCont = ',4111,411,461,'
OTHERWISE
lcCont = ',4111,'
ENDCASE
lnTotalAct = 0
lnTotalRul = 0
lnCorectieNestocate = 0
lnWorkArea = Select()
IF Reccount('tact') > 0
lnRecnoTact = Recno('tact')
SELECT tact
SUM (IIF((','+Alltrim(Nvl(scd,''))+',') $ m.lcCont, Nvl(suma,0), ;
IIF((','+Alltrim(Nvl(scc,''))+',') $ m.lcCont AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126'), -Nvl(suma,0), 0))) ;
TO lnTotalAct FOR Nvl(sters,0) = 0
IF Between(m.lnRecnoTact, 1, Reccount('tact'))
GO (m.lnRecnoTact) IN tact
ENDIF
ENDIF
IF Reccount('trul') > 0
lnRecnoTrul = Recno('trul')
SELECT trul
SUM (Nvl(cant,0) + Nvl(cante,0)) * Nvl(pretvtva,0) ;
TO lnTotalRul FOR Nvl(sters,0) = 0 AND Nvl(id_tip_rulaj,0) = 0
IF Between(m.lnRecnoTrul, 1, Reccount('trul'))
GO (m.lnRecnoTrul) IN trul
ENDIF
ENDIF
lnRecnoTvd = Recno('tvd')
SELECT tvd
SUM valoare TO lnCorectieNestocate FOR Nvl(sters,0) <> 1 AND Nvl(in_stoc,1) = 0
IF Between(m.lnRecnoTvd, 1, Reccount('tvd'))
GO (m.lnRecnoTvd) IN tvd
ENDIF
IF m.lnWorkArea > 0
SELECT (m.lnWorkArea)
ENDIF
This.nTotalActRon = Round(Nvl(m.lnTotalAct,0), 2)
llAjustat = (Round(Nvl(m.lnCorectieNestocate,0), 2) <> 0)
This.lRulAjustat = m.llAjustat
This.nTotalRulRon = Round(Nvl(m.lnTotalRul,0) + Nvl(m.lnCorectieNestocate,0) * m.tnCurs / m.tnMultiplicator, 2)
*!* tip=51 (ROAACNPRO): contul e stabil, dar comparatia ramane nesigura pe date de import
*!* denormalizate (docs\cercetare\rec_suma_act.md) - divergenta nu e de formula
llVerdictSigur = (This.nTipVanzare <> 51)
DO CASE
CASE !m.llVerdictSigur
lcVerdict = 'Verdict ACT/RUL: nu se aplica (informativ, date de import)'
lnForeColor = RGB(90,90,90)
CASE Abs(This.nTotalActRon - This.nTotalRulRon) <= 0.02
lcVerdict = 'Verdict ACT/RUL: sincronizat (informativ)'
lnForeColor = RGB(0,128,0)
OTHERWISE
lcVerdict = 'Verdict ACT/RUL: divergent (informativ, nu e eroare)'
lnForeColor = RGB(180,120,0)
ENDCASE
WITH This.pgfArticole.PAGE3
.lblTotalRulArt.Caption = IIF(This.lRulAjustat, 'Total RUL (ajustat):', 'Total RUL:')
.lblVerdictArt.Caption = m.lcVerdict
.lblVerdictArt.ForeColor = m.lnForeColor
ENDWITH
ENDPROC
PROCEDURE AdaugaLinieTvdDinArticol
*!* adauga in tvd o linie noua (id_vanzare_det=0) din obiectul poArticol deja completat de
*!* frm_articol_factura (sau, in test, construit direct) - separata de Click ca sa fie testabila
*!* fara sa deschida dialogul modal. Pe ramura RON (tip_valuta=0) pretul si discountul se
*!* convertesc in valuta documentului (tvanz.curs/multiplicator); pe ramura valuta (tip_valuta=1)
*!* se citesc direct campurile _val, deja exprimate in valuta documentului, fara reconversie
LPARAMETERS toArticol
LOCAL lnCursDoc, lnMultDoc, lnPretRon, lnDiscountRon, lnPret, lnDiscount
lnCursDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.curs, 1), 1)
lnMultDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.multiplicator, 1), 1)
IF m.lnCursDoc = 0
m.lnCursDoc = 1
ENDIF
IF m.lnMultDoc = 0
m.lnMultDoc = 1
ENDIF
IF toArticol.tip_valuta = 1
lnPret = Iif(toArticol.preturi_cu_tva = 0, toArticol.pretftva_val, toArticol.pretctva_val)
lnDiscount = Iif(toArticol.preturi_cu_tva = 0, toArticol.discount_unitar_val, toArticol.discount_unitar_ctva_val)
ELSE
lnPretRon = Iif(toArticol.preturi_cu_tva = 0, toArticol.pretftva, toArticol.pretctva)
lnDiscountRon = Iif(toArticol.preturi_cu_tva = 0, toArticol.discount_unitar, toArticol.discount_unitar_ctva)
lnPret = m.lnPretRon * m.lnMultDoc / m.lnCursDoc
lnDiscount = m.lnDiscountRon * m.lnMultDoc / m.lnCursDoc
ENDIF
SELECT tvd
APPEND BLANK
REPLACE id_vanzare WITH This.nIdVanzare, id_vanzare_det WITH 0, id_articol WITH toArticol.id_articol, ;
cantitate WITH toArticol.cantitate, ;
pret WITH m.lnPret, ;
pret_cu_tva WITH toArticol.preturi_cu_tva, ;
proc_tvav WITH toArticol.proc_tvav, ;
discount_unitar WITH m.lnDiscount, ;
id_gestiune WITH toArticol.id_gestiune, cont WITH toArticol.Cont, ;
id_valuta WITH Iif(Used('tvanz') And Reccount('tvanz') > 0, tvanz.id_valuta, .Null.), ;
id_jtva_coloana WITH toArticol.id_jtva_coloana, serie WITH toArticol.serie, ;
explicatie WITH toArticol.explicatie, taxcode WITH toArticol.taxcode, lot WITH toArticol.lot, ;
sters WITH 0, denumire WITH toArticol.denumire, codmat WITH toArticol.codmat, ;
nume_gestiune WITH '', nume_val WITH Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.nume_val,''), toArticol.nume_val), lmodificat WITH .T.
Thisform.calculeaza_valori_articol()
ENDPROC
PROCEDURE afiseaza_rulaje
* COLAPSEAZA SAU MARESTE PAGEFRAME-UL RULAJE
* Daca butonul are imaginea sus, inseamna ca pageframe-ul cu rulaje este ascuns
@@ -12921,6 +13394,20 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
ENDPROC
PROCEDURE calculeaza_valori_articol
LOCAL lnCantitate, lnPretNet, lnProcTvav, lnValoare
SELECT tvd
lnCantitate = NVL(cantitate, 0)
lnPretNet = NVL(pret, 0) - NVL(discount_unitar, 0)
lnProcTvav = NVL(proc_tvav, 1)
*!* pret_cu_tva e flag (0/1): daca e 0, pretul e fara TVA si valoarea cu TVA se calculeaza cu proc_tvav
lnValoare = ROUND(m.lnCantitate * IIF(NVL(pret_cu_tva, 0) = 0, m.lnPretNet * m.lnProcTvav, m.lnPretNet), m.gnPC)
REPLACE lmodificat WITH .T., valoare WITH m.lnValoare
Thisform.ActualizeazaBaraTotaluri()
ENDPROC
PROCEDURE calculeaza_valori_rul
LPARAMETERS tcControlSource
LOCAL lcRul, lnPagina
@@ -14073,14 +14560,33 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
update_saft_mecanisme_plati()
ENDIF
*!* cursorul tvd, gol - din functia comuna daca ofacturare_editare.prg e incarcat
If !Used('tvd')
IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure"))
CreeazaCursorTvdGol()
ELSE
*!* structura se repeta: in ROACONT/ROAGEST functia comuna nu e incarcata
CREATE CURSOR tvd (id_vanzare I, id_vanzare_det I, id_articol I, cantitate N(12,3), pret N(14,4), pret_cu_tva N(14,4), proc_tvav N(6,4), discount_unitar N(14,4), id_gestiune I, cont C(20), id_valuta I, id_jtva_coloana I, serie C(20), explicatie C(60), taxcode I, lot C(20), sters I, denumire C(100), codmat C(30), nume_gestiune C(60), nume_val C(20))
*!* cursorul tvd - structura canonica, recreat mereu (grid-ul se leaga o singura data, la construire)
IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure"))
CreeazaCursorTvdGol()
ELSE
*!* structura se repeta: in ROACONT/ROAGEST functia comuna nu e incarcata
IF Used('tvd')
Use In tvd
ENDIF
CREATE CURSOR tvd (id_vanzare I NULL, id_vanzare_det I NULL, id_articol I NULL, cantitate N(12,3) NULL, pret N(14,4) NULL, pret_cu_tva N(14,4) NULL, proc_tvav N(6,4) NULL, discount_unitar N(14,4) NULL, id_gestiune I NULL, cont C(20) NULL, id_valuta I NULL, id_jtva_coloana I NULL, serie C(20) NULL, explicatie C(60) NULL, taxcode I NULL, lot C(20) NULL, sters I NULL, denumire C(100) NULL, codmat C(30) NULL, nume_gestiune C(60) NULL, nume_val C(20) NULL, lmodificat L, valoare N(14,2), in_stoc I NULL)
ENDIF
*!* cursorul tvanz - placeholder gol, ca bara de totaluri (ControlSource pe tvanz.discount) sa se lege la construire
IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure"))
CreeazaCursorTvanzGol()
ELSE
IF Used('tvanz')
Use In tvanz
ENDIF
CREATE CURSOR tvanz (id_vanzare I, tip I, discount N(12,2), total_fara_tva N(14,2), total_tva N(14,2), total_cu_tva N(14,2), curs N(10,4), multiplicator N(10,4))
ENDIF
*!* daca apelantul a pregatit deja articolele inainte de Createobject (ex. do_editare_factura) -
*!* grid-ul se leaga la construire pe tvd deja plin, nu se mai recreeaza in Show()
IF Used('crsArticoleFactura')
SELECT tvd
APPEND FROM DBF('crsArticoleFactura')
GO TOP
ENDIF
ENDPROC
@@ -14184,8 +14690,14 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
ENDIF
IF This.lAreArticoleVanzari
IncarcaArticoleFactura(This.nIdVanzare)
*!* apelantii care pregatesc articolele inainte de Createobject (ex. do_editare_factura)
*!* au deja tvd plin, incarcat de Load() - apelul ramane doar ca fallback pentru restul
IF Reccount('tvd') = 0
IncarcaArticoleFactura(This.nIdVanzare)
ENDIF
This.pgfArticole.PageCount = 3
This.pgfArticole.PAGE3.grdArticoleFactura.Refresh()
This.ActualizeazaBaraTotaluri()
ELSE
This.pgfArticole.PageCount = 2
ENDIF
@@ -14197,10 +14709,10 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Thisform.but_modificaR.Enabled = .F.
This.WindowState = 2
* Ascund pageframe rulaje daca nu am rulaje
IF RECCOUNT('trul') = 0 AND RECCOUNT('trul_obinv') = 0
* Ascund pageframe rulaje daca nu am rulaje si nici articole
IF RECCOUNT('trul') = 0 AND RECCOUNT('trul_obinv') = 0 AND (!USED('tvd') OR RECCOUNT('tvd') = 0)
* pageframe rulaje este afisat
* daca nu exista inregistrari in trul sau trul_obinv, ascund pageframe-ul rulaje
* daca nu exista inregistrari in trul, trul_obinv sau tvd, ascund pageframe-ul rulaje
* si maresc gridul cu note contabile
This.afiseaza_rulaje()
ENDIF
@@ -15859,4 +16371,94 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*Nu sterge
ENDPROC
PROCEDURE pgfArticole.PAGE3.cmdAdaugaArticol.Click
*!* alege un articol din nomenclator (fara stoc, fara politica de preturi - decizia 34) si il
*!* adauga ca linie noua in tvd (id_vanzare_det=0), prin dialogul real frm_articol_factura;
*!* daca documentul e in valuta (tvanz.in_valuta=1), poArticol.tip_valuta/Curs/multiplicator/
*!* nume_val/id_valuta se populeaza cu valorile documentului, ca dialogul sa lucreze in valuta
LOCAL loArticolAles, lnIdArticol, llInValutaDoc, lnCursDoc, lnMultDoc, lcNumeValDoc, lnIdValutaDoc
IF !Used('tvd') OR !This.lAreArticoleVanzari
RETURN
ENDIF
loArticolAles = caut_articol()
lnIdArticol = Nvl(loArticolAles.id_articol, 0)
IF Empty(m.lnIdArticol)
RETURN
ENDIF
llInValutaDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.in_valuta, 0) = 1, .F.)
lnCursDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.curs, 1), 1)
lnMultDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.multiplicator, 1), 1)
lcNumeValDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.nume_val, ''), '')
lnIdValutaDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, tvanz.id_valuta, .Null.)
PRIVATE poArticol, poDate, gnScadereStoc
poArticol = CreeazaPoArticolNouTvd(m.lnIdArticol, loArticolAles.codmat, loArticolAles.denumire, loArticolAles.um, loArticolAles.cont, ;
m.llInValutaDoc, m.lnCursDoc, m.lnMultDoc, m.lcNumeValDoc, m.lnIdValutaDoc)
poDate = Createobject('Empty')
AddProperty(poDate, 'tip', This.nTipVanzare)
AddProperty(poDate, 'in_valuta', 0)
AddProperty(poDate, 'dataact', Iif(Used('tact') And Reccount('tact') > 0, Nvl(tact.dataact, Date()), Date()))
gnScadereStoc = 0
PUBLIC gnButon
gnButon = 2
LOCAL loDlg
loDlg = Createobject('frm_articol_factura', 1, .F.)
loDlg.Show(1)
IF m.gnButon = 1
Thisform.AdaugaLinieTvdDinArticol(poArticol)
Thisform.pgfArticole.PAGE3.grdArticoleFactura.Refresh()
ENDIF
Release loDlg
ENDPROC
PROCEDURE pgfArticole.PAGE3.cmdStergeArticol.Click
*!* comuta flagul sters pe linia curenta din tvd - stergerea e logica, ramane vizibila (grizata) pana la salvare
IF !Used('tvd') OR Reccount('tvd') = 0
RETURN
ENDIF
SELECT tvd
REPLACE sters WITH IIF(Nvl(sters,0) = 1, 0, 1), lmodificat WITH .T.
Thisform.pgfArticole.PAGE3.grdArticoleFactura.Refresh()
Thisform.ActualizeazaBaraTotaluri()
ENDPROC
PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cCantitateArt.Text1.Valid
IF NVL(Thisform.oldvalue, 0) <> NVL(This.Value, 0)
Thisform.calculeaza_valori_articol()
Thisform.oldvalue = This.Value
ENDIF
ENDPROC
PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cCantitateArt.Text1.When
Thisform.oldvalue = This.Value
ENDPROC
PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cPretArt.Text1.Valid
IF NVL(Thisform.oldvalue, 0) <> NVL(This.Value, 0)
Thisform.calculeaza_valori_articol()
Thisform.oldvalue = This.Value
ENDIF
ENDPROC
PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cPretArt.Text1.When
Thisform.oldvalue = This.Value
ENDPROC
PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt._checkbox1.InteractiveChange
LOCAL lnFlag
*!* in InteractiveChange, ControlSource nu e inca actualizat - flagul se ia din control
lnFlag = IIF(Vartype(This.Value) = 'L', IIF(This.Value, 1, 0), Nvl(This.Value, 0))
SELECT tvd
REPLACE pret_cu_tva WITH m.lnFlag
Thisform.calculeaza_valori_articol()
This.Parent.Parent.Refresh()
ENDPROC
PROCEDURE pgfArticole.PAGE3.txtDiscountArt.Valid
Thisform.ActualizeazaBaraTotaluri()
ENDPROC
ENDDEFINE

View File

@@ -1,40 +1,66 @@
# Capcană: corupere diacritice la editarea `.sc2`/`.vc2` (encoding cp1252)
# Capcană: corupere diacritice la editarea `.sc2`/`.vc2`
Partajat între proiectele ROA* — capcana ține de formatul `.sc2`/`.vc2` produs de FoxBin2Prg,
nu de un proiect anume.
## De ce se întâmplă
Fișierele `.sc2`/`.vc2` sunt **cp1252** (Windows-1252), nu UTF-8 (vezi antetul: `CPID="1252"`).
Fișierele `.sc2`/`.vc2` sunt **cp1250** (Windows-1250, Europa Centrală), nu UTF-8 — deși
antetul FoxBin2Prg declară `CPID="1252"`. Eticheta din antet nu corespunde conținutului:
controalele care poartă text cu diacritice au `FontCharSet = 238` (Europa de Est), adică VFP
le randează tot ca cp1250. Diferența nu e cosmetică — un `ă` real scris prin cp1252 nu are
echivalent în acel codepage și s-ar pierde; scris prin cp1250 (encoding-ul real al fișierului)
e pur și simplu octetul `0xE3`, corect și stabil.
Dacă un editor/tool citește fișierul ca UTF-8, fiecare byte >= 0x80 (diacritic) devine invalid
ca secvență UTF-8 și e înlocuit cu U+FFFD. Dacă tool-ul apoi **salvează tot ca UTF-8**, acel
U+FFFD e scris ca 3 octeți (`0xEF 0xBF 0xBD`) — care, citiți înapoi ca cp1252 (cum face
U+FFFD e scris ca 3 octeți (`0xEF 0xBF 0xBD`) — care, citiți înapoi ca cp1250 (cum face
FoxBin2Prg la write-back), apar ca `�`. Caracterul original e **ireversibil pierdut**
(recuperabil DOAR din altă sursă: git history, backup).
Codebase-ul ROA "reciclează" caractere cp1252 fără echivalent direct pentru Ș/ă/ț:
Octeții diacriticelor din codebase-ul ROA, cu adevărul (cp1250) și aparența dacă îi decodezi
greșit ca cp1252:
| Literă românească | Caracter folosit (cp1252) | Byte |
| Literă românească | Byte | Aparență dacă decodezi ca cp1252 |
|---|---|---|
| ă | ã (a-tilde) | `0xE3` |
| Ă | Ã | `0xC3` |
| ț | þ (thorn minuscul) | `0xFE` |
| Ș (majusculă) | ª (ordinal masculin) | `0xAA` |
| ș (minusculă) | º (ordinal feminin) | `0xBA` |
| î, â | î, â (native cp1252) | `0xEE`, `0xE2` |
| ă | `0xE3` | ã (a-tilde) |
| Ă | `0xC3` | Ã |
| î | `0xEE` | î (identic — zonă comună cp1250/cp1252) |
| Î | `0xCE` | Î (identic — zonă comună cp1250/cp1252) |
| â | `0xE2` | â (identic — zonă comună cp1250/cp1252) |
| ț | `0xFE` | þ (thorn minuscul) |
| Ș (majusculă) | `0xAA` | ª (ordinal masculin) |
| ș (minusculă) | `0xBA` | º (ordinal feminin) |
Par "gunoi"/typo într-un editor UTF-8 (`ã`, `þ`, `ª`, `º`) — **sunt corecte, nu le "corecta"
fără să verifici encoding-ul.**
Decodate cp1250 (encoding-ul real), aceste litere sunt diacritice românești normale — exact
ce apare în formular când fișierul e sănătos. Par "gunoi"/typo (`ã`, `þ`, `ª`, `º`) **doar
dacă le decodezi cu codepage-ul greșit** — nu le "corecta" fără să verifici encoding-ul real.
## Cum se verifică dacă un fișier `.sc2`/`.vc2` e corupt
Verificarea se face **pe octeți**, nu pe text decodat: un codepage single-byte (1250 sau 1252)
mapează fiecare octet la un caracter, deci nu produce niciodată U+FFFD — o căutare de
`[char]0xFFFD` în textul decodat nu găsește nimic nici pe un fișier stricat. Ce se caută e
secvența de trei octeți pe care a lăsat-o tool-ul care a stricat fișierul:
```powershell
$bytes = [System.IO.File]::ReadAllBytes("<path>.vc2")
$text = [System.Text.Encoding]::GetEncoding(1252).GetString($bytes)
$text -split "`r`n" | Select-String ([char]0xFFFD) # cauta caracterul de replacement
$b = [System.IO.File]::ReadAllBytes("<path>.vc2")
$n = 0
for ($i = 0; $i -lt $b.Length - 2; $i++) {
if ($b[$i] -eq 0xEF -and $b[$i+1] -eq 0xBF -and $b[$i+2] -eq 0xBD) { $n++; $i += 2 }
}
"EF BF BD (U+FFFD) x $n" # orice valoare > 0 = fisier stricat
```
Dacă apare `�` (sau `$text` conține U+FFFD) — fișierul are corupere de encoding.
Echivalentul din Bash, util și pentru censul complet înainte/după orice editare (vezi
`reguli_lucru.md`, punctul 7):
```bash
od -An -tx1 <path>.vc2 | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq -c
```
Censul **crește** la stricare — un octet cp1250 devine trei octeți de U+FFFD — deci nu urmări
doar scăderile. Decodat cp1250, `EF BF BD` apare ca `ďż˝` în caption.
## Cum se repară
@@ -46,22 +72,26 @@ Dacă apare `�` (sau `$text` conține U+FFFD) — fișierul are corupere de
git show HEAD:<cale>.vct > /tmp/head.vct # (sau .VCT, dupa caz)
powershell -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Source /tmp/head.vcx -CacheRoot /tmp/head_out
```
apoi decodează ambele fișiere (HEAD curat + curent corupt) ca cp1252 și compară linie cu
linie (PowerShell, nu `diff`/Bash direct — nu decodează cp1252 corect la afișare, deși
Dacă și HEAD e deja corupt (corupera a fost comisă), caută ultima versiune curată cu
`git cat-file blob <commit>:<cale>` (din Bash, niciodată cu `>` din PowerShell 5.1 — adaugă
BOM și re-encodează) sau `svn cat <fișier>` — ambele surse independente de encoding-ul
curent al fișierului.
Apoi decodează ambele fișiere (versiunea curată + curent corupt) ca cp1250 și compară linie
cu linie (PowerShell, nu `diff`/Bash direct — nu decodează cp1250 corect la afișare, deși
detectează totuși diferența de octeți).
3. Reconstruiește fișierul text pornind de la versiunea HEAD (curată), reaplicând DOAR
modificările intenționate din sesiunea curentă (nu invers — nu cârpi fișierul corupt
caracter cu caracter).
4. Scrie rezultatul înapoi ca bytes cp1252
(`[System.Text.Encoding]::GetEncoding(1252).GetBytes(...)`), NU ca string UTF-8/`Out-File`
3. Reconstruiește fișierul text pornind de la versiunea curată, reaplicând DOAR modificările
intenționate din sesiunea curentă (nu invers — nu cârpi fișierul corupt caracter cu
caracter).
4. Scrie rezultatul înapoi ca bytes cp1250
(`[System.Text.Encoding]::GetEncoding(1250).GetBytes(...)`), NU ca string UTF-8/`Out-File`
implicit.
5. Rulează write-back (`txt2vcx.ps1 -Force`) și verifică fidelity check = zero diferențe.
## Cum se evită pe viitor
Când editezi `.sc2`/`.vc2` cu tool-uri text (Read/Edit/Write), verifică întâi dacă fișierul
conține diacritice (`ã`, `þ`, `ª`, `º`, `î`, `â` etc.) — dacă da, **orice rescrie completă
trebuie făcută la nivel de octeți cu encoding cp1252 explicit**, nu presupunând UTF-8.
conține diacritice (`ă`, `ț`, `Ș`, `ș`, `î`, `â` etc.) — dacă da, **orice rescrie completă
trebuie făcută la nivel de octeți cu encoding cp1250 explicit**, nu presupunând UTF-8.
Editările punctuale (Edit tool, string replace) sunt sigure DOAR dacă tool-ul păstrează restul
fișierului byte-identic (nu rescrie tot fișierul reîncodat).

View File

@@ -32,7 +32,9 @@ fals `roundtrip text1 != text2`. Ruleaza atunci cu lista rebazata:
`vcx2txt.ps1 -Project <pjx> -ProjectRoot <root> -CacheRoot <cache> -Types vcx,scx`
1. Baseline: `Copy-Item <f>.vc2 <f>.vc2.pre_runda<N>.bak` (in cache; la runde succesive
necomise, diff-ul fata de HEAD ar amesteca rundele).
2. Editare byte-safe: PowerShell `[IO.File]::ReadAllText/WriteAllText(..., GetEncoding(1252))`;
2. Editare byte-safe: PowerShell `[IO.File]::ReadAllText/WriteAllText(..., GetEncoding(1252))` -
doar pentru round-trip pe octeti, NU pentru retastat literal diacritice (antetul zice
`CPID="1252"`, dar octetii diacriticelor sunt de fapt cp1250: `conventie_encoding_cp1252.md`).
NU tool-ul Edit/Write (UTF-8 strica diacriticele). Continut nou ASCII, TAB-uri ca in jur,
fara reflow (format position-sensitive, proprietati alfabetizate). Valabil si pentru `.prg`.
3. Patch review: `git diff --no-index <bak> <editat> > docs/diff_runda<N>_<subiect>.patch`

View File

@@ -45,7 +45,7 @@
de element comun nedocumentat.
4. Testare headless (fara IDE): `vfp9.exe -A -T "<script.prg>" <param>` din PowerShell.
Mediu, sabloane, capcane, depanare: `depanare_testare_vfp.md`.
5. Editare .vcx/.scx pe text (cache, cp1252 byte-safe, fidelity-check): `flux-editare-vfp-text.md`.
5. Editare .vcx/.scx pe text (cache, cp1250 byte-safe, fidelity-check): `flux-editare-vfp-text.md`.
Cautare in binare: `cautare_vcx_vct.md`. Versiunile `.??2` sunt instantanee, pot fi mai vechi
decat binarul — verifica mtime inainte de concluzii; continutul real e in `.PJX`.
6. Delegare: implementarile, testele, verificarile si cercetarile se dau unor subagenti Sonnet in
@@ -68,17 +68,30 @@
- **spune-i ca poate infirma briefingul.** Altfel implementeaza corectia ceruta chiar cand a
descoperit ca nu e nevoie de ea.
7. Conventii obligatorii, de citit cand atingi zona respectiva:
- editezi fisiere cu octeti cp1252 - `.vc2`/`.sc2`, dar si `.prg` (ex. `programe\ocautare.prg`,
unde `s`-urile cu virgula din `masina`/`si contul`/`transa` sunt octetul `0xBA`) ->
`conventie_encoding_cp1252.md`. Orice write cu un tool ce nu scrie cp1252 nativ (Edit/Write)
corupe caracterele >= 0x80 din TOT fisierul (`0xBA` -> `EF BF BD`), chiar la o singura linie
schimbata, si o repeta la FIECARE scriere — editeaza tot ce ai de editat, verifica byte-level
si repara o singura data DUPA ultima scriere. Verificare: `perl -ne 'print "$.\n" if
- editezi fisiere `.vc2`/`.sc2`, dar si `.prg` (ex. `programe\ocautare.prg`, unde `s`-urile cu
virgula din `masina`/`si contul`/`transa` sunt octetul `0xBA`) -> `conventie_encoding_cp1252.md`.
Antetul FoxBin2Prg declara `CPID="1252"`, dar octetii diacriticelor sunt de fapt **cp1250**
(`0xE3`=a cu caciula, `0xFE`=t cu virgula, `0xAA`=S majuscul cu virgula, `0xBA`=s minuscul cu
virgula) - nu trata eticheta din antet ca adevarul despre encoding. Orice write cu un tool ce
nu pastreaza octetii nativ (Edit/Write) corupe caracterele >= 0x80 din TOT fisierul (`0xBA` ->
`EF BF BD`), chiar la o singura linie schimbata, si o repeta la FIECARE scriere - **nu
re-encoda niciodata fisierul: lucreaza pe octeti (`byte[]`) sau scrie strict ASCII in
continutul nou**; editeaza tot ce ai de editat, verifica byte-level si repara o singura data
DUPA ultima scriere.
Cens obligatoriu **inainte SI dupa** fiecare editare, care trebuie sa ramana identic:
`od -An -tx1 <fisier> | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq -c`. Atentie
la sens: la stricare censul **CRESTE**, nu scade - un octet cp1250 devine 3 octeti `EF BF BD`
(U+FFFD) la o re-encodare UTF-8 gresita; cauta explicit secventa `EF BF BD`, nu doar tiparul
generic de mojibake `C3`/`C4`/`C5`/`C8` + octet de continuare (acela da fals-pozitiv pe text
UTF-8 legitim sau pe comentarii intr-o alta limba, deja intalnite in cod). Verificare veche
(orice octet >=0x80, utila cand cauti pozitia exacta): `perl -ne 'print "$.\n" if
/[\x80-\xFF]/' <fisier>`; reparare (pt. `0xBA`): `perl -e
'binmode(STDIN);binmode(STDOUT);local $/;$_=<STDIN>;s/\xEF\xBF\xBD/\xBA/g;print' < f > f.tmp`.
`EF BF BD` nu spune ce caracter s-a pierdut - toate diacriticele devin la fel; ia octetul corect
per pozitie din `svn cat <fisier>` (necorupt) inainte sa inlocuiesti - o inlocuire oarba cu
`0xBA` strica `a`/`t` cu caciula (`0xE3`, `0xFE`) din alte fisiere;
per pozitie din `svn cat <fisier>` (necorupt) sau din git history (`git cat-file blob
<commit>:<cale>`, **din Bash, niciodata cu `>` din PowerShell 5.1** - adauga BOM si
re-encodeaza) inainte sa inlocuiesti - o inlocuire oarba cu `0xBA` strica `a`/`t` cu caciula
(`0xE3`, `0xFE`) din alte fisiere;
- adaugi/rearanjezi controale pe formulare sau coloane in grid -> `conventie_ux_formulare.md`;
- grid needitabil pe formular cu 2+ grid-uri -> `capcana_grid_controlsource.md`;
- adaugi o coloana intr-un grid deja livrat (ordinea din clasa e neutralizata de

View File

@@ -36,7 +36,7 @@ Ideea este sa se poata face configurarea mult mai repede, eficient, dintr-un sin
13. ROAFACTURARE - FORMULARUL DE FACTURARE SA INCLUDA SI FORMULARUL DATE_FACTURA/DATE_AVIZ ETC. SI SA NU MAI INCARCE DE PE SERVER TOATE ARTICOLELE DIN TOATE POLITICELE DE PRETURI - INTRUCAT ESTE POSIBIL SA FIE SI MII DE ARTICOLE SI DUREAZA MULT SA LE ADUCA DE PE SERVER. AM INCEPUT DEJA MAI DEMULT UN FORMULAR UNIFICAT frm_facturare_articole2, DAR ERA MULT DE INTEGRAT DIN FORMULARUL VECHI.
FRONTEND SIMILAR PE CARE IL DORESC ESTE IN ROAACPRO > FACTURA, SAU IN IMPORTUL DE EFACTURA, IN CARE AM INTEGRAT DATELE FACTURI, DOAR CA FACTURAREA DIN ROAFACTURARE ESTE MAI COMPLEXA - ESTE FOLOSITA SI PENTRU POLITICI DE PRETURI SI PENTRU CONTRACT/COMANDA/AVIZ/RETUR ETC.
INTERESUL MEU ESTE SA SIMPLIFIC INTERFATA, SA FIE MAI EFICIENTA, SA NU FIE 2 FORMULARE PENTRU FACTURA, SA FAC MAI RAPID.
INTERESUL MEU ESTE SA SIMPLIFIC INTERFATA, SA FIE MAI EFICIENTA, SA NU FIE 2 FORMULARE PENTRU FACTURA, SA FAC MAI RAPID. in plus vreau si editare factura/aviz in toate variantele (politici preturi, comanda, contract, aviz etc) prin regenerare, adica sa arate formularul completat ca si cum ar fi inainte de salvarea initiala, ca sa pot sa fac editari ca si cum as fi la introducerea initiala - bineinteles cu stergerea facturii initiale (sters = 1) si salvarea celei noi, pentru a se vedea ce s-a modificat
14. ROACONT - efactura se salveaza xml detaliat si xml zip efactura si ocupa mult spatiu. vreau sa stiu cand nu mai este nevoie de xml detaliat si daca se poate curata tabelul ca sa nu mai ocupe spatiu, cel putin pentru facturi mai vechi. este important zip pentru ca este factura originala anaf.
@@ -49,3 +49,6 @@ INTERESUL MEU ESTE SA SIMPLIFIC INTERFATA, SA FIE MAI EFICIENTA, SA NU FIE 2 FOR
18. ROAFACTURARE - EMITERE FACTURA DIN PROFORMA
19. ROAFACTURARE - EDITARE PROFORMA
20. ROAFACTURARE - FACTURA DIN COMANDA, COMANDA SE CONSIDERA FACTURATA DACA EXISTA FACTURI CU ACELEASI CANTITATI. AS VREA SA PUN MARKER DE FACTURAT PE COMANDA, CA SA NU MAI CAUT FACTURI - ESTE COSTISITOR. DOAR CA TREBUIE SA FII ATENT CA O COMANDA SE POATE FACTURA TOTAL/PARTIAL, SAU DIN MAI MULTE FACTURI, SAU SE POATE INCHIDE FORTAT. ACUM INCHIDEREA FORTATA ADAUGA CANTITATI NEGATIVE PE COMANDA, CA SA FACA CANTITATILE NEFACTURATE ZERO.

View File

@@ -892,6 +892,9 @@ DEFINE CLASS form1 AS form
Go Top
llNotaNoua = .T.
llMaximize = .T.
IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure"))
PregatesteArticoleFacturaEditare('tact')
ENDIF
loForm = Createobject([frm_modific2024], m.lnIdSet, m.llNotaNoua)
loForm.lb_titlu_alb_b121.Caption = 'Initializare solduri'
Select tact
@@ -931,6 +934,7 @@ DEFINE CLASS form1 AS form
Use In (Select('rul_temp'))
Use In (Select('trul_obinv'))
Use In (Select('rul_temp_obinv'))
Use In (Select('crsArticoleFactura'))
USE IN (SELECT('crsJtvaTemp'))

View File

@@ -1800,6 +1800,9 @@ DEFINE CLASS form1 AS form
Go Top
llNotaNoua = .T.
llMaximize = .T.
IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure"))
PregatesteArticoleFacturaEditare('tact')
ENDIF
loForm = Createobject([frm_modific2024], m.lnIdSet, m.llNotaNoua)
loForm.lb_titlu_alb_b121.Caption = 'Initializare solduri'
Select tact
@@ -1840,6 +1843,7 @@ DEFINE CLASS form1 AS form
Use In (Select('rul_temp'))
Use In (Select('trul_obinv'))
Use In (Select('rul_temp_obinv'))
Use In (Select('crsArticoleFactura'))
USE IN (SELECT('crsJtvaTemp'))

View File

@@ -1,9 +1,13 @@
*** ofacturare_editare
*!* 08.08.2026
*!* 09.08.2026
*!* marius.mutu
*!* helpere comune pentru editarea unei facturi emise: garda eFactura, cursoarele notei si ale rulajelor,
*!* randul de vanzare corespunzator notei si liniile de articole pentru pagina de articole factura
*!* randul de vanzare corespunzator notei (inclusiv valuta documentului: in_valuta/id_valuta/nume_val),
*!* liniile de articole pentru pagina de articole factura (inclusiv in_stoc, pentru corectia verdictului
*!* RUL pe liniile nestocate), pregatirea cursorului de articole inainte de Createobject(frm_modific2024)
*!* si construirea obiectului poArticol pentru adaugarea unei linii noi prin dialogul frm_articol_factura,
*!* populat cu valuta documentului cand acesta e in valuta
*!* parametru: id_fact
@@ -145,7 +149,8 @@ FUNCTION CreeazaCursorTvanzGol
IF Used('tvanz')
Use In tvanz
ENDIF
CREATE CURSOR tvanz (id_vanzare I, tip I, discount N(12,2), total_fara_tva N(14,2), total_tva N(14,2), total_cu_tva N(14,2))
CREATE CURSOR tvanz (id_vanzare I, tip I, discount N(12,2), total_fara_tva N(14,2), total_tva N(14,2), total_cu_tva N(14,2), curs N(10,4), multiplicator N(10,4), ;
in_valuta I NULL, id_valuta I NULL, nume_val C(20) NULL)
ENDFUNC && CreeazaCursorTvanzGol
@@ -168,9 +173,10 @@ FUNCTION IncarcaVanzareNota
lcSerieAct = Alltrim(Nvl(m.tcSerieAct,""))
lcSql = [select id_vanzare, tip, discount, total_fara_tva, total_tva, total_cu_tva from vanzari where cod = ] + Transform(m.tnCod) + ;
[ and Nvl(numar_act,-1) = ] + Transform(Nvl(m.tnNract,-1)) + ;
[ and Nvl(serie_act,'') = '] + m.lcSerieAct + [' and trunc(data_act) = to_date('] + Dtoc(m.tdDataAct,1) + [','YYYYMMDD') and sters = 0]
lcSql = [select v.id_vanzare, v.tip, v.discount, v.total_fara_tva, v.total_tva, v.total_cu_tva, v.curs, v.multiplicator, ] + ;
[v.in_valuta, v.id_valuta, nv.nume_val from vanzari v left join nom_valute nv on nv.id_valuta = v.id_valuta where v.cod = ] + Transform(m.tnCod) + ;
[ and Nvl(v.numar_act,-1) = ] + Transform(Nvl(m.tnNract,-1)) + ;
[ and Nvl(v.serie_act,'') = '] + m.lcSerieAct + [' and trunc(v.data_act) = to_date('] + Dtoc(m.tdDataAct,1) + [','YYYYMMDD') and v.sters = 0]
lnSucces = goExecutor.oExecute(lcSql,[v_vanz])
goExecutor.oReset()
@@ -252,45 +258,200 @@ FUNCTION IncarcaVanzareDinNota
ENDFUNC && IncarcaVanzareDinNota
*!* parametru: alias destinatie (implicit tvd)
*!* creeaza gol, sub acel alias, un cursor cu structura view-ului VVANZARI_ARTICOLE
FUNCTION CreeazaCursorArticoleGol
LPARAMETERS tcAlias
LOCAL lcAlias
lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'tvd')
IF Used(m.lcAlias)
Use In (m.lcAlias)
ENDIF
CREATE CURSOR (m.lcAlias) (id_vanzare I NULL, id_vanzare_det I NULL, id_articol I NULL, cantitate N(12,3) NULL, pret N(14,4) NULL, pret_cu_tva N(14,4) NULL, proc_tvav N(6,4) NULL, ;
discount_unitar N(14,4) NULL, id_gestiune I NULL, cont C(20) NULL, id_valuta I NULL, id_jtva_coloana I NULL, serie C(20) NULL, explicatie C(60) NULL, ;
taxcode I NULL, lot C(20) NULL, sters I NULL, denumire C(100) NULL, codmat C(30) NULL, nume_gestiune C(60) NULL, nume_val C(20) NULL, ;
lmodificat L, valoare N(14,2), in_stoc I NULL)
ENDFUNC && CreeazaCursorArticoleGol
*!* creeaza cursorul tvd gol, cu structura view-ului VVANZARI_ARTICOLE
FUNCTION CreeazaCursorTvdGol
IF Used('tvd')
Use In tvd
ENDIF
CREATE CURSOR tvd (id_vanzare I, id_vanzare_det I, id_articol I, cantitate N(12,3), pret N(14,4), pret_cu_tva N(14,4), proc_tvav N(6,4), ;
discount_unitar N(14,4), id_gestiune I, cont C(20), id_valuta I, id_jtva_coloana I, serie C(20), explicatie C(60), ;
taxcode I, lot C(20), sters I, denumire C(100), codmat C(30), nume_gestiune C(60), nume_val C(20))
CreeazaCursorArticoleGol('tvd')
ENDFUNC && CreeazaCursorTvdGol
*!* parametru: id_vanzare
*!* incarca in tvd liniile active (sters=0) ale vanzarii, din VVANZARI_ARTICOLE
*!* tvd ramane deschis READWRITE, cu 0 randuri la eroare Oracle
*!* parametri: id_vanzare, alias destinatie (implicit tvd)
*!* incarca in alias liniile active (sters=0) ale vanzarii, din VVANZARI_ARTICOLE
*!* aliasul ramane deschis READWRITE, cu 0 randuri la eroare Oracle
FUNCTION IncarcaArticoleFactura
LPARAMETERS tnIdVanzare
LPARAMETERS tnIdVanzare, tcAliasDestinatie
LOCAL lcSql, lnSucces
LOCAL lcSql, lnSucces, lcAlias
lcAlias = IIF(Type('tcAliasDestinatie') = 'C' AND !Empty(m.tcAliasDestinatie), m.tcAliasDestinatie, 'tvd')
IF Used('v_vd')
Use In v_vd
ENDIF
lcSql = [select * from vvanzari_articole where id_vanzare = ] + Transform(Nvl(m.tnIdVanzare,0)) + [ and sters = 0 order by id_vanzare_det]
*!* in_stoc vine din NOM_ARTICOLE (viewul nu-l expune) - corectia verdictului RUL pe liniile nestocate
lcSql = [select v.*, na.in_stoc from vvanzari_articole v left join nom_articole na on na.id_articol = v.id_articol ] + ;
[where v.id_vanzare = ] + Transform(Nvl(m.tnIdVanzare,0)) + [ and v.sters = 0 order by v.id_vanzare_det]
lnSucces = goExecutor.oExecute(lcSql,[v_vd])
goExecutor.oReset()
IF lnSucces < 0
AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare")
CreeazaCursorTvdGol()
CreeazaCursorArticoleGol(m.lcAlias)
RETURN .T.
ENDIF
IF Used('tvd')
Use In tvd
IF Used(m.lcAlias)
Use In (m.lcAlias)
ENDIF
SELECT * FROM v_vd INTO CURSOR tvd READWRITE
*!* valoarea cu TVA pe linie, cu discountul unitar scazut: pret_cu_tva e flag (0/1), nu pret -
*!* formula difera dupa el, ca la calculeaza_valori_articol
SELECT *, .F. AS lmodificat, ;
ROUND(NVL(cantitate,0) * IIF(NVL(pret_cu_tva,0) = 0, (NVL(pret,0) - NVL(discount_unitar,0)) * NVL(proc_tvav,1), ;
NVL(pret,0) - NVL(discount_unitar,0)), gnPC) AS valoare ;
FROM v_vd INTO CURSOR (m.lcAlias) READWRITE
USE IN v_vd
RETURN .T.
ENDFUNC && IncarcaArticoleFactura
*!* parametru: alias cu randurile notei (tact)
*!* descopera randul din VANZARI corespunzator notei (IncarcaVanzareDinNota) si, daca il gaseste,
*!* pre-incarca liniile in crsArticoleFactura - apelat inainte de Createobject([frm_modific2024]),
*!* ca Load() sa lege grid-ul o singura data pe cursorul deja plin; daca nu gaseste randul nu
*!* creeaza crsArticoleFactura, Show() ramane fallback-ul; nu strica workarea/pozitia apelantului
FUNCTION PregatesteArticoleFacturaEditare
LPARAMETERS tcAliasAct
LOCAL lnAreaOrigine, llGasit
lnAreaOrigine = Select()
llGasit = IncarcaVanzareDinNota(m.tcAliasAct)
IF m.llGasit
IncarcaArticoleFactura(tvanz.id_vanzare, 'crsArticoleFactura')
ENDIF
IF m.lnAreaOrigine > 0
SELECT (m.lnAreaOrigine)
ENDIF
RETURN m.llGasit
ENDFUNC && PregatesteArticoleFacturaEditare
*!* parametri: id_articol/codmat/denumire/um/cont, alese din nomenclator (caut_articol, fara stoc);
*!* optional, cand documentul e in valuta: in_valuta/curs/multiplicator/nume_val/id_valuta
*!* construieste obiectul poArticol gol, cu toate proprietatile citite de frm_articol_factura
*!* (Createobject/Init/inainte_de_do_termin) - articol nou, cantitate implicita 1, fara TVA aleasa
*!* (proc_tvav ramane NULL, ca Init sa aleaga singur cota standard curenta); daca in_valuta e adevarat,
*!* tip_valuta/Curs/multiplicator/nume_val/id_valuta se populeaza cu valorile documentului
FUNCTION CreeazaPoArticolNouTvd
LPARAMETERS tnIdArticol, tcCodmat, tcDenumire, tcUm, tcCont, tlInValutaDoc, tnCursDoc, tnMultDoc, tcNumeValDoc, tnIdValutaDoc
LOCAL loArticol, lnI
LOCAL ARRAY laPropN(49)
laPropN( 1)='id_articol'
laPropN( 2)='Id_Pol'
laPropN( 3)='id_gestiune'
laPropN( 4)='id_c'
laPropN( 5)='id_ctr'
laPropN( 6)='id_valuta'
laPropN( 7)='id_valuta_d'
laPropN( 8)='id_lucrare_rez'
laPropN( 9)='id_part_rez'
laPropN(10)='id_jtva_coloana'
laPropN(11)='taxcode'
laPropN(12)='opt_facturare'
laPropN(13)='gestionabil'
laPropN(14)='tip_valuta'
laPropN(15)='cantitate'
laPropN(16)='Curs'
laPropN(17)='multiplicator'
laPropN(18)='pret_achizitie'
laPropN(19)='pretv_orig'
laPropN(20)='pretd'
laPropN(21)='proc_tvav'
laPropN(22)='preturi_cu_tva'
laPropN(23)='pretftva'
laPropN(24)='pretftva_val'
laPropN(25)='pretctva'
laPropN(26)='pretctva_val'
laPropN(27)='tva'
laPropN(28)='tva_val'
laPropN(29)='discount_unitar'
laPropN(30)='discount_unitar_val'
laPropN(31)='discount_unitar_ctva'
laPropN(32)='discount_unitar_ctva_val'
laPropN(33)='valftva'
laPropN(34)='valtva'
laPropN(35)='valctva'
laPropN(36)='valdiscountftva'
laPropN(37)='valdiscounttva'
laPropN(38)='valdiscountctva'
laPropN(39)='valdiminuatftva'
laPropN(40)='valdiminuattva'
laPropN(41)='valdiminuatctva'
laPropN(42)='vvalftva'
laPropN(43)='vvaltva'
laPropN(44)='vvalctva'
laPropN(45)='vvaldiscountftva'
laPropN(46)='vvaldiscounttva'
laPropN(47)='vvaldiscountctva'
laPropN(48)='vvaldiminuatftva'
laPropN(49)='vvaldiminuattva'
LOCAL ARRAY laPropC(11)
laPropC( 1)='codmat'
laPropC( 2)='codmatf'
laPropC( 3)='denumire'
laPropC( 4)='um'
laPropC( 5)='serie'
laPropC( 6)='lot'
laPropC( 7)='explicatie'
laPropC( 8)='numar_contract'
laPropC( 9)='codbare'
laPropC(10)='nume_val'
laPropC(11)='Cont'
loArticol = Createobject('Empty')
FOR lnI = 1 TO ALEN(laPropN)
=AddProperty(loArticol, laPropN(lnI), 0)
ENDFOR
=AddProperty(loArticol, 'vvaldiminuatctva', 0)
FOR lnI = 1 TO ALEN(laPropC)
=AddProperty(loArticol, laPropC(lnI), '')
ENDFOR
loArticol.id_articol = Nvl(m.tnIdArticol, 0)
loArticol.id_ctr = .Null.
loArticol.id_gestiune = -1000
loArticol.gestionabil = 0
loArticol.tip_valuta = 0
loArticol.Curs = 1
loArticol.multiplicator = 1
loArticol.cantitate = 1
loArticol.codmat = Nvl(m.tcCodmat, '')
loArticol.denumire = Nvl(m.tcDenumire, '')
loArticol.um = Nvl(m.tcUm, '')
loArticol.Cont = Nvl(m.tcCont, '')
loArticol.preturi_cu_tva = 0
loArticol.proc_tvav = .Null.
IF m.tlInValutaDoc
loArticol.tip_valuta = 1
loArticol.Curs = m.tnCursDoc
loArticol.multiplicator = m.tnMultDoc
loArticol.nume_val = Nvl(m.tcNumeValDoc, '')
loArticol.id_valuta = m.tnIdValutaDoc
ENDIF
RETURN loArticol
ENDFUNC && CreeazaPoArticolNouTvd

View File

@@ -0,0 +1,159 @@
* descopera_caz_test.prg
* Alege la rulare documentul de test pentru suitele de editare factura, dupa PROPRIETATEA ceruta de
* asertie, nu dupa identitatea lui. VANZARI.COD se realoca la fiecare salvare a notei
* (pack_contafin.finalizeaza_modificare_nota -> pack_facturare.actualizeaza_vanzari), deci orice
* ancorare pe cod moare tacut; ID_VANZARE ramane, dar nici el nu e cunoscut dinainte.
*
* DescoperaCazTest(<nume caz>, <alias destinatie>) -> .T. daca a gasit un document, lasand in alias
* un singur rand cu cod, an, luna, id_vanzare, tip, nlin (plus nract/serie_act/dataact/nract_fara
* pentru cazul de coliziune). Pe .F. aliasul ramane cu 0 randuri.
*
* Interogarile merg pe VACT_TOT / VRUL_TOT / VANZARI / VANZARI_DETALII, adica pe alt drum decat
* functiile verificate (IncarcaVanzareNota, IncarcaVanzareDinNota, IncarcaArticoleFactura): valorile
* asteptate raman independente de codul aflat sub test.
*
* Cazuri:
* FACTURA_ARTICOLE factura (tip=1) activa, cu linii active, a carei nota are PRIMUL rand
* (min id_act) pe acelasi (nract, serie_act, dataact) ca vanzarea
* NEFACTURA_ARTICOLE la fel, dar tip <> 1 (detectia merge pe orice tip de document)
* FARA_RULAJE document cu linii active si ZERO rulaje active pe (cod, an, luna)
* PRIM_RAND_ORB nota al carei PRIM rand NU duce la vanzare, dar un triplet ulterior da
* COLIZIUNE_COD la fel, plus cod cu 2+ randuri active in VANZARI si un nract din nota
* fara corespondent in VANZARI
* NOTA_FARA_VANZARI nota activa fara rand in VANZARI pe niciun triplet
FUNCTION DescoperaCazTest
LPARAMETERS tcCaz, tcAlias
LOCAL lcAlias, lcNlin, lcPrim, lcJoinP, lcTriplete, lcJoinT, lcOrb, lcNractFara, lcSql, lnSucces
lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'crscaz')
lcNlin = [(select count(*) from vanzari_detalii d where d.id_vanzare=v.id_vanzare and d.sters=0)]
*!* p = primul rand al fiecarei note (min id_act), adica exact randul pe care cade un Go Top In tact
lcPrim = [(select n.cod, n.an, n.luna, x.nract, x.serie_act, x.dataact from ] + ;
[(select cod, an, luna, min(id_act) idmin from vact_tot where sters=0 group by cod, an, luna) n ] + ;
[join vact_tot x on x.id_act = n.idmin) p]
*!* p = toate tripletele distincte ale notei, ca in IncarcaVanzareDinNota
lcTriplete = [(select distinct cod, an, luna, nract, serie_act, dataact from vact_tot where sters=0) p]
lcJoinP = [join vanzari v on v.cod=p.cod and nvl(v.numar_act,-1)=nvl(p.nract,-1) ] + ;
[and nvl(v.serie_act,' ')=nvl(p.serie_act,' ') and trunc(v.data_act)=trunc(p.dataact) and v.sters=0]
*!* nota la care primul rand nu se potriveste cu niciun rand din VANZARI
lcOrb = [not exists (select 1 from ] + ;
[(select cod, an, luna, min(id_act) idmin from vact_tot where sters=0 group by cod, an, luna) n ] + ;
[join vact_tot x on x.id_act=n.idmin ] + ;
[join vanzari w on w.cod=x.cod and nvl(w.numar_act,-1)=nvl(x.nract,-1) ] + ;
[and nvl(w.serie_act,' ')=nvl(x.serie_act,' ') and trunc(w.data_act)=trunc(x.dataact) and w.sters=0 ] + ;
[where n.cod=p.cod and n.an=p.an and n.luna=p.luna)]
*!* tripletul din nota care NU are corespondent in VANZARI - cazul negativ al filtrului compus;
*!* cele trei coloane trebuie luate de pe ACELASI rand, de aceea "keep (dense_rank first ...)"
lcNractFara = [(select min(y.<COL>) keep (dense_rank first order by y.nract) from ] + ;
[(select distinct cod, an, luna, nract, serie_act, dataact from vact_tot where sters=0) y ] + ;
[where y.cod=p.cod and y.an=p.an and y.luna=p.luna and not exists ] + ;
[(select 1 from vanzari w where w.cod=y.cod and nvl(w.numar_act,-1)=nvl(y.nract,-1) ] + ;
[and nvl(w.serie_act,' ')=nvl(y.serie_act,' ') and trunc(w.data_act)=trunc(y.dataact) and w.sters=0))]
DO CASE
CASE Upper(Alltrim(m.tcCaz)) == 'FACTURA_ARTICOLE'
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ;
m.lcPrim + [ ] + m.lcJoinP + [ where v.tip = 1 and ] + m.lcNlin + [ > 0 ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'NEFACTURA_ARTICOLE'
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ;
m.lcPrim + [ ] + m.lcJoinP + [ where v.tip <> 1 and ] + m.lcNlin + [ > 0 ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'FARA_RULAJE'
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ;
m.lcPrim + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 ] + ;
[and not exists (select 1 from vrul_tot r where r.cod=p.cod and r.an=p.an and r.luna=p.luna and r.sters=0) ] + ;
[and not exists (select 1 from vrul_obinv_tot r where r.cod=p.cod and r.an=p.an and r.luna=p.luna and r.sters=0) ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'PRIM_RAND_ORB'
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ;
m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'COLIZIUNE_COD'
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin, ] + ;
[p.nract, p.serie_act, p.dataact, ] + ;
Strtran(m.lcNractFara, [<COL>], [nract]) + [ nract_fara, ] + ;
Strtran(m.lcNractFara, [<COL>], [serie_act]) + [ serie_fara, ] + ;
Strtran(m.lcNractFara, [<COL>], [dataact]) + [ data_fara from ] + ;
m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ ] + ;
[and (select count(distinct v2.id_vanzare) from vanzari v2 where v2.cod=p.cod and v2.sters=0) >= 2 ] + ;
[and ] + Strtran(m.lcNractFara, [<COL>], [nract]) + [ is not null ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'NOTA_FARA_VANZARI'
lcSql = [select * from (select p.cod, p.an, p.luna, 0 id_vanzare, 0 tip, 0 nlin from ] + ;
[(select cod, an, luna from vact_tot where sters=0 and cod > 0 group by cod, an, luna) p ] + ;
[where not exists (select 1 from vact_tot x ] + ;
[join vanzari v on v.cod=x.cod and nvl(v.numar_act,-1)=nvl(x.nract,-1) ] + ;
[and nvl(v.serie_act,' ')=nvl(x.serie_act,' ') and trunc(v.data_act)=trunc(x.dataact) and v.sters=0 ] + ;
[where x.cod=p.cod and x.an=p.an and x.luna=p.luna and x.sters=0) ] + ;
[order by p.an desc, p.luna desc, p.cod desc) where rownum = 1]
OTHERWISE
CreeazaCursorCazGol(m.lcAlias)
RETURN .F.
ENDCASE
IF Used('v_caz')
Use In v_caz
ENDIF
lnSucces = goExecutor.oExecute(m.lcSql, [v_caz])
goExecutor.oReset()
IF m.lnSucces < 0
CreeazaCursorCazGol(m.lcAlias)
RETURN .F.
ENDIF
IF Used(m.lcAlias)
Use In (m.lcAlias)
ENDIF
SELECT * FROM v_caz INTO CURSOR (m.lcAlias) READWRITE
USE IN v_caz
RETURN (Reccount(m.lcAlias) = 1)
ENDFUNC && DescoperaCazTest
FUNCTION CreeazaCursorCazGol
LPARAMETERS tcAlias
LOCAL lcAlias
lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'crscaz')
IF Used(m.lcAlias)
Use In (m.lcAlias)
ENDIF
CREATE CURSOR (m.lcAlias) (id_vanzare I, cod I, an I, luna I, tip I, nlin I)
ENDFUNC && CreeazaCursorCazGol
*!* descrierea pe o linie a cazului descoperit, pentru log
FUNCTION DescrieCazTest
LPARAMETERS tcCaz, tcAlias, tlGasit
IF !m.tlGasit
RETURN ' ' + Padr(m.tcCaz, 20) + ' NEGASIT - niciun document nu satisface conditia'
ENDIF
RETURN ' ' + Padr(m.tcCaz, 20) + ' cod=' + Transform(Evaluate(m.tcAlias + '.cod')) + ;
' an=' + Transform(Evaluate(m.tcAlias + '.an')) + ;
' luna=' + Transform(Evaluate(m.tcAlias + '.luna')) + ;
' id_vanzare=' + Transform(Evaluate(m.tcAlias + '.id_vanzare')) + ;
' tip=' + Transform(Evaluate(m.tcAlias + '.tip')) + ;
' linii=' + Transform(Evaluate(m.tcAlias + '.nlin'))
ENDFUNC && DescrieCazTest

View File

@@ -0,0 +1,173 @@
* test_adauga_linie_articol.prg
* Verifica S4 runda 3, sub-blocul B partea 2 (adaugarea de linii pe pagina de articole):
* - CreeazaPoArticolNouTvd (ofacturare_editare.prg): obiectul poArticol gol, cu proprietatile
* cerute de frm_articol_factura, valori implicite corecte (cantitate=1, gestionabil=0,
* preturi_cu_tva=0, proc_tvav NULL - ca Init sa aleaga singur cota standard)
* - Thisform.AdaugaLinieTvdDinArticol (omodificari.vc2, frm_modific2024): adauga in tvd o linie
* noua cu id_vanzare_det=0 dintr-un poArticol deja completat (simuleaza ce lasa dialogul dupa
* OK, fara sa deschida dialogul modal - netestabil headless, vezi raportul) - valoarea, flagul
* pret_cu_tva, lmodificat si bara de totaluri (ActualizeazaBaraTotaluri) trebuie actualizate
* Documentul nu e ancorat pe cod (se realoca la fiecare salvare) - descoperit prin descopera_caz_test.prg.
* Nu scrie in Oracle - doar in cursorul tvd, in memorie. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_adauga_linie_articol_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE
*!* test_init_env_auto incarca clasa omodificari din working copy-ul ROACONT (alt SET PATH) -
*!* o eliberam si o reincarcam pe cea de sub test, cu cale completa
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
PUBLIC gnPass, gnFail
gnPass = 0
gnFail = 0
*========================= 1) CreeazaPoArticolNouTvd - obiect gol, valori implicite =========================
LOCAL loArt
loArt = CreeazaPoArticolNouTvd(9999, 'ART999', 'ARTICOL TEST NOU', 'BUC', '707')
DO asserteaza WITH 'id_articol preluat', loArt.id_articol == 9999, TRANSFORM(loArt.id_articol)
DO asserteaza WITH 'codmat preluat', ALLTRIM(loArt.codmat) == 'ART999', loArt.codmat
DO asserteaza WITH 'denumire preluata', ALLTRIM(loArt.denumire) == 'ARTICOL TEST NOU', loArt.denumire
DO asserteaza WITH 'cantitate implicita = 1', loArt.cantitate == 1, TRANSFORM(loArt.cantitate)
DO asserteaza WITH 'gestionabil = 0 (fara verificare de stoc - decizia 15)', loArt.gestionabil == 0, TRANSFORM(loArt.gestionabil)
DO asserteaza WITH 'preturi_cu_tva = 0 (implicit fara TVA)', loArt.preturi_cu_tva == 0, TRANSFORM(loArt.preturi_cu_tva)
DO asserteaza WITH 'proc_tvav NULL (Init alege singur cota standard)', ISNULL(loArt.proc_tvav), TRANSFORM(loArt.proc_tvav)
DO asserteaza WITH 'discount_unitar = 0', loArt.discount_unitar == 0, TRANSFORM(loArt.discount_unitar)
DO asserteaza WITH 'tip_valuta = 0 (RON)', loArt.tip_valuta == 0, TRANSFORM(loArt.tip_valuta)
*========================= 2) AdaugaLinieTvdDinArticol - pe un document real cu articole =========================
LOCAL llCazA
llCazA = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_a')
IF !llCazA
STRTOFILE('EROARE: cazul FACTURA_ARTICOLE nu a fost gasit' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
STRTOFILE('caz A: cod=' + TRANSFORM(crscaz_a.cod) + ' id_vanzare=' + TRANSFORM(crscaz_a.id_vanzare) + ' nlin=' + TRANSFORM(crscaz_a.nlin) + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL llOk, lnIdSet, loForm, lnReccountInitial, lnReccountDupa, lnTotalInitial, lnTotalDupa
LOCAL loArtNou, lnValoareAsteptata
llOk = IncarcaCursoareModificareNota(crscaz_a.cod, crscaz_a.an, crscaz_a.luna, .F.)
IF !llOk OR !Used('tact') OR Reccount('tact') = 0
STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe caz A' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
DO asserteaza WITH 'formularul are articole (lAreArticoleVanzari)', loForm.lAreArticoleVanzari, TRANSFORM(loForm.lAreArticoleVanzari)
lnReccountInitial = Reccount('tvd')
loForm.ActualizeazaBaraTotaluri()
lnTotalInitial = loForm.nTotalLiniiRon
*!* poArticol construit ca dupa un OK de dialog: cantitate=2, pret fara TVA=100, TVA 19%
loArtNou = CreeazaPoArticolNouTvd(8001, 'ART001NOU', 'ARTICOL ADAUGAT TEST', 'BUC', '707')
loArtNou.cantitate = 2
loArtNou.preturi_cu_tva = 0
loArtNou.proc_tvav = 1.19
loArtNou.pretftva = 100
loArtNou.discount_unitar = 0
loArtNou.id_jtva_coloana = 1
loForm.AdaugaLinieTvdDinArticol(loArtNou)
lnReccountDupa = Reccount('tvd')
DO asserteaza WITH 'Reccount(tvd) creste cu 1', lnReccountDupa == lnReccountInitial + 1, TRANSFORM(lnReccountDupa) + ' (initial ' + TRANSFORM(lnReccountInitial) + ')'
SELECT tvd
GO BOTTOM
DO asserteaza WITH 'linia noua: id_vanzare_det = 0', NVL(tvd.id_vanzare_det, -1) == 0, TRANSFORM(NVL(tvd.id_vanzare_det, -1))
DO asserteaza WITH 'linia noua: id_vanzare = nIdVanzare', tvd.id_vanzare == loForm.nIdVanzare, TRANSFORM(tvd.id_vanzare)
DO asserteaza WITH 'linia noua: id_articol preluat', tvd.id_articol == 8001, TRANSFORM(tvd.id_articol)
DO asserteaza WITH 'linia noua: cantitate = 2', tvd.cantitate == 2, TRANSFORM(tvd.cantitate)
DO asserteaza WITH 'linia noua: pret = 100 (pretftva, flag=0)', ROUND(tvd.pret, 2) == 100, TRANSFORM(tvd.pret)
DO asserteaza WITH 'linia noua: sters = 0', NVL(tvd.sters, -1) == 0, TRANSFORM(NVL(tvd.sters, -1))
DO asserteaza WITH 'linia noua: lmodificat = .T.', tvd.lmodificat == .T., TRANSFORM(tvd.lmodificat)
lnValoareAsteptata = ROUND(2 * 100 * 1.19, 2)
DO asserteaza WITH 'linia noua: valoare = cantitate*pret*proc_tvav', ROUND(tvd.valoare, 2) == m.lnValoareAsteptata, TRANSFORM(tvd.valoare) + ' (asteptat ' + TRANSFORM(m.lnValoareAsteptata) + ')'
loForm.ActualizeazaBaraTotaluri()
lnTotalDupa = loForm.nTotalLiniiRon
DO asserteaza WITH 'bara de totaluri creste exact cu valoarea liniei noi', ROUND(lnTotalDupa - lnTotalInitial, 2) == m.lnValoareAsteptata, TRANSFORM(lnTotalDupa) + ' (initial ' + TRANSFORM(lnTotalInitial) + ')'
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
loForm.Release()
IF Used('actactan')
Use In actactan
ENDIF
IF Used('tact')
Use In tact
ENDIF
IF Used('rul_temp')
Use In rul_temp
ENDIF
IF Used('trul')
Use In trul
ENDIF
IF Used('rul_temp_obinv')
Use In rul_temp_obinv
ENDIF
IF Used('trul_obinv')
Use In trul_obinv
ENDIF
IF Used('tvanz')
Use In tvanz
ENDIF
IF Used('tvd')
Use In tvd
ENDIF
QUIT
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,190 @@
* test_adauga_linie_valuta.prg
* Verifica AdaugaLinieTvdDinArticol pe un document in valuta, in ambele ramuri ale poArticol:
* scenariul A (tip_valuta=0, dialogul a lucrat in RON) converteste pretul/discountul in valuta
* documentului (tvanz.curs/multiplicator); scenariul B (tip_valuta=1, intrare directa in valuta)
* citeste pretftva_val/discount_unitar_val direct, fara sa le mai reconverteasca. Ambele verifica
* si preluarea id_valuta/nume_val de pe tvanz si recalculul corect al barei de totaluri RON.
* Documentul e un caz real (FACTURA_ARTICOLE, gasit prin descopera_caz_test.prg), cu tvanz
* suprascris manual dupa Show() ca sa simuleze un document in valuta (EURO, curs 5.2688) -
* nu exista in schema un caz descoperibil prin tact/ACT care sa fie simultan "cu articole" si
* "in valuta reala"; conversia se testeaza izolat, pe cursorul tvanz deja incarcat de formular.
* Nu scrie in Oracle - doar in cursoare, in memorie. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_adauga_linie_valuta_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE
*!* test_init_env_auto incarca clasa omodificari din working copy-ul ROACONT (alt SET PATH) -
*!* o eliberam si o reincarcam pe cea de sub test, cu cale completa
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
PUBLIC gnPass, gnFail
gnPass = 0
gnFail = 0
LOCAL llCazA
llCazA = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_a')
IF !llCazA
STRTOFILE('EROARE: cazul FACTURA_ARTICOLE nu a fost gasit' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
STRTOFILE('caz A: cod=' + TRANSFORM(crscaz_a.cod) + ' id_vanzare=' + TRANSFORM(crscaz_a.id_vanzare) + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL llOk, lnIdSet, loForm, loArtNou, lnTotalInitial, lnTotalDupa, lnPretRonAsteptat
llOk = IncarcaCursoareModificareNota(crscaz_a.cod, crscaz_a.an, crscaz_a.luna, .F.)
IF !llOk OR !Used('tact') OR Reccount('tact') = 0
STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe caz A' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
DO asserteaza WITH 'formularul are articole (lAreArticoleVanzari)', loForm.lAreArticoleVanzari, TRANSFORM(loForm.lAreArticoleVanzari)
*!* simuleaza un document in valuta (EURO, id_valuta=2 - confirmat pe date reale, id_vanzare=1037)
SELECT tvanz
REPLACE curs WITH 5.2688, multiplicator WITH 1, in_valuta WITH 1, id_valuta WITH 2, nume_val WITH 'EURO'
loForm.ActualizeazaBaraTotaluri()
lnTotalInitial = loForm.nTotalLiniiRon
*!* poArticol construit ca dupa un OK de dialog (dialogul lucreaza in RON): pret fara TVA = 1053.76
*!* RON, echivalentul a 200 EUR la cursul 5.2688 - cantitate=1, fara discount, fara TVA (proc_tvav=1)
loArtNou = CreeazaPoArticolNouTvd(8002, 'ART002VAL', 'ARTICOL VALUTA TEST', 'BUC', '707')
loArtNou.cantitate = 1
loArtNou.preturi_cu_tva = 0
loArtNou.proc_tvav = 1
loArtNou.pretftva = 1053.76
loArtNou.discount_unitar = 0
loArtNou.id_jtva_coloana = 1
loForm.AdaugaLinieTvdDinArticol(loArtNou)
SELECT tvd
GO BOTTOM
lnPretRonAsteptat = 1053.76
DO asserteaza WITH 'linia noua: pret convertit in valuta documentului (200 EUR la curs 5.2688)', ROUND(tvd.pret, 2) == 200.00, TRANSFORM(tvd.pret)
DO asserteaza WITH 'linia noua: id_valuta preluat de pe tvanz', NVL(tvd.id_valuta, -1) == 2, TRANSFORM(NVL(tvd.id_valuta, -1))
DO asserteaza WITH 'linia noua: nume_val preluat de pe tvanz', ALLTRIM(NVL(tvd.nume_val, '')) == 'EURO', tvd.nume_val
DO asserteaza WITH 'linia noua: valoare in valuta documentului (200, fara TVA/discount)', ROUND(tvd.valoare, 2) == 200.00, TRANSFORM(tvd.valoare)
loForm.ActualizeazaBaraTotaluri()
lnTotalDupa = loForm.nTotalLiniiRon
DO asserteaza WITH 'bara de totaluri creste cu echivalentul RON corect (200 EUR * 5.2688)', ROUND(lnTotalDupa - lnTotalInitial, 2) == m.lnPretRonAsteptat, TRANSFORM(lnTotalDupa) + ' (initial ' + TRANSFORM(lnTotalInitial) + ')'
*!* decizia 35: intrare directa in valuta - CreeazaPoArticolNouTvd populat cu tip_valuta=1 si
*!* Curs/multiplicator/nume_val/id_valuta ale documentului (tiparul frm_facturare_articole);
*!* AdaugaLinieTvdDinArticol trebuie sa citeasca pretftva_val direct, FARA sa il mai reconverteasca
*!* prin curs/multiplicator (ar fi o dubla conversie: valuta -> RON -> valuta)
LOCAL loArtNou2, lnTotalInitial2, lnTotalDupa2
loArtNou2 = CreeazaPoArticolNouTvd(8003, 'ART003VAL', 'ARTICOL VALUTA DIRECTA TEST', 'BUC', '707', ;
.T., tvanz.curs, tvanz.multiplicator, tvanz.nume_val, tvanz.id_valuta)
DO asserteaza WITH 'CreeazaPoArticolNouTvd: tip_valuta=1 cand documentul e in valuta', loArtNou2.tip_valuta == 1, TRANSFORM(loArtNou2.tip_valuta)
DO asserteaza WITH 'CreeazaPoArticolNouTvd: Curs preluat din tvanz', loArtNou2.Curs == 5.2688, TRANSFORM(loArtNou2.Curs)
DO asserteaza WITH 'CreeazaPoArticolNouTvd: multiplicator preluat din tvanz', loArtNou2.multiplicator == 1, TRANSFORM(loArtNou2.multiplicator)
DO asserteaza WITH 'CreeazaPoArticolNouTvd: nume_val preluat din tvanz', ALLTRIM(loArtNou2.nume_val) == 'EURO', loArtNou2.nume_val
DO asserteaza WITH 'CreeazaPoArticolNouTvd: id_valuta preluat din tvanz', loArtNou2.id_valuta == 2, TRANSFORM(loArtNou2.id_valuta)
*!* pretul introdus de utilizator DIRECT in valuta (200 EUR) - nu se mai completeaza pretftva (RON),
*!* exact ca la un dialog real cu tip_valuta=1 unde userul editeaza campul _val
loArtNou2.cantitate = 1
loArtNou2.preturi_cu_tva = 0
loArtNou2.proc_tvav = 1
loArtNou2.pretftva_val = 200.00
loArtNou2.discount_unitar_val = 0
loArtNou2.id_jtva_coloana = 1
lnTotalInitial2 = loForm.nTotalLiniiRon
loForm.AdaugaLinieTvdDinArticol(loArtNou2)
SELECT tvd
GO BOTTOM
DO asserteaza WITH 'linia in valuta directa: pret in tvd ramane 200 (fara dubla conversie)', ROUND(tvd.pret, 2) == 200.00, TRANSFORM(tvd.pret)
DO asserteaza WITH 'linia in valuta directa: id_valuta preluat de pe tvanz', NVL(tvd.id_valuta, -1) == 2, TRANSFORM(NVL(tvd.id_valuta, -1))
DO asserteaza WITH 'linia in valuta directa: nume_val preluat de pe tvanz', ALLTRIM(NVL(tvd.nume_val, '')) == 'EURO', tvd.nume_val
DO asserteaza WITH 'linia in valuta directa: valoare in valuta documentului (200, fara TVA/discount)', ROUND(tvd.valoare, 2) == 200.00, TRANSFORM(tvd.valoare)
loForm.ActualizeazaBaraTotaluri()
lnTotalDupa2 = loForm.nTotalLiniiRon
DO asserteaza WITH 'bara de totaluri creste cu echivalentul RON corect (200 EUR * 5.2688, valuta directa)', ROUND(lnTotalDupa2 - lnTotalInitial2, 2) == 1053.76, TRANSFORM(lnTotalDupa2) + ' (initial ' + TRANSFORM(lnTotalInitial2) + ')'
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
loForm.Release()
IF Used('actactan')
Use In actactan
ENDIF
IF Used('tact')
Use In tact
ENDIF
IF Used('rul_temp')
Use In rul_temp
ENDIF
IF Used('trul')
Use In trul
ENDIF
IF Used('rul_temp_obinv')
Use In rul_temp_obinv
ENDIF
IF Used('trul_obinv')
Use In trul_obinv
ENDIF
IF Used('tvanz')
Use In tvanz
ENDIF
IF Used('tvd')
Use In tvd
ENDIF
QUIT
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,117 @@
* test_defect1_crsjtvatemp.prg
* Verifica fix-ul din frm_facturi.do_editare_factura (ofacturare_comun.vc2:3799-3804): inainte de
* Createobject('frm_modific2024',...), metoda precreeaza crsJtvaTemp cu update_jtva_coloane("",
* "crsJtvaTemp", 0) - acelasi tipar folosit de ooperatii_comune.prg:113 (viz_act, calea ROACONT
* "registru jurnal > modificare" care functiona deja corect). Fara aceasta linie,
* Column63.ControlSource din grid (Seek(...,'crsJtvaTemp','id_jtva')) crapa la constructia
* formularului, fiindca cursorul nu exista inca.
* Nu scrie in Oracle - doar SELECT-uri prin goExecutor si citiri de proprietati. QUIT la final.
SET SAFETY OFF
SET TALK OFF
LOCAL lcLog
lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_defect1_crsjtvatemp_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), lcLog)
PUBLIC gcErrLog
gcErrLog = lcLog
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1)
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
*!* test_init_env_auto:139 incarca omodificari din copia ROACONT (alt working copy) - o eliberam
*!* si o reincarcam pe cea DE SUB TEST, cu cale completa
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
DO verifica_defect1 WITH 1139934, 2021, 12, lcLog, 3, .T., 882
STRTOFILE('done' + CHR(13) + CHR(10), lcLog, 1)
QUIT
PROCEDURE verifica_defect1
LPARAMETERS tnCod, tnAn, tnLuna, tcLog, tnPageCountAsteptat, tlAreArticoleAsteptat, tnIdVanzareAsteptat
LOCAL llOk, lnIdSet, loForm, llCrsJtvaInchisInainte, llCrsJtvaCreatDupa, lnPageCount, llAreArticole, lnIdVanzare
IF USED('crsJtvaTemp')
USE IN crsJtvaTemp
ENDIF
llCrsJtvaInchisInainte = !USED('crsJtvaTemp')
llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.)
lnPageCount = -1
llAreArticole = .F.
lnIdVanzare = 0
llCrsJtvaCreatDupa = .F.
IF llOk AND USED('tact') AND RECCOUNT('tact') > 0
SELECT a.*, IIF(NVL(id_jtva_coloana,0)=0,0,1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE
GO TOP IN tact
lnIdSet = tact.id_set
*-- linia din fix (ofacturare_comun.vc2:3801) - fara ea, grid-ul din frm_modific2024
*-- crapa la constructie pe crsJtvaTemp lipsa
update_jtva_coloane("", "crsJtvaTemp", 0)
llCrsJtvaCreatDupa = USED('crsJtvaTemp') AND RECCOUNT('crsJtvaTemp') >= 0
SELECT tact
TRY
loForm = CREATEOBJECT([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
lnPageCount = loForm.pgfArticole.PageCount
llAreArticole = loForm.lAreArticoleVanzari
lnIdVanzare = loForm.nIdVanzare
loForm.Release()
CATCH TO loExc
STRTOFILE(' EXCEPTIE la Createobject/Show frm_modific2024: ' + TRANSFORM(loExc.ErrorNo) + ;
' [' + loExc.Message + ']' + CHR(13) + CHR(10), tcLog, 1)
ENDTRY
ENDIF
STRTOFILE('--- Defect 1 (crsJtvaTemp), cod=' + TRANSFORM(tnCod) + ' ---' + CHR(13) + CHR(10) + ;
' crsJtvaTemp inchis inainte de apel = ' + TRANSFORM(llCrsJtvaInchisInainte) + CHR(13) + CHR(10) + ;
' crsJtvaTemp creat de update_jtva_coloane (Used+Reccount>=0) = ' + TRANSFORM(llCrsJtvaCreatDupa) + CHR(13) + CHR(10) + ;
' PageCount = ' + TRANSFORM(lnPageCount) + ' (asteptat ' + TRANSFORM(tnPageCountAsteptat) + ')' + CHR(13) + CHR(10) + ;
' lAreArticoleVanzari = ' + TRANSFORM(llAreArticole) + ' (asteptat ' + TRANSFORM(tlAreArticoleAsteptat) + ')' + CHR(13) + CHR(10) + ;
' nIdVanzare = ' + TRANSFORM(lnIdVanzare) + ' (asteptat ' + TRANSFORM(tnIdVanzareAsteptat) + ')' + CHR(13) + CHR(10) + ;
' ' + IIF(llCrsJtvaInchisInainte AND llCrsJtvaCreatDupa AND lnPageCount == tnPageCountAsteptat AND llAreArticole == tlAreArticoleAsteptat AND lnIdVanzare == tnIdVanzareAsteptat, 'PASS', 'FAIL') + CHR(13) + CHR(10), tcLog, 1)
IF USED('actactan')
USE IN actactan
ENDIF
IF USED('tact')
USE IN tact
ENDIF
IF USED('rul_temp')
USE IN rul_temp
ENDIF
IF USED('trul')
USE IN trul
ENDIF
IF USED('rul_temp_obinv')
USE IN rul_temp_obinv
ENDIF
IF USED('trul_obinv')
USE IN trul_obinv
ENDIF
IF USED('crsJtvaTemp')
USE IN crsJtvaTemp
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -1,11 +1,13 @@
* test_incarca_vanzare_din_nota.prg
* Smoke test izolat pentru IncarcaVanzareDinNota (ofacturare_editare.prg), inainte de a atinge
* omodificari.vc2 runda 2. Verifica pe cazurile de regresie ale bugului "Go Top orb pe tact":
* cod=1137874/an=2009/luna=8 -> trebuie sa gaseasca id_vanzare=506 (azi, cu Go Top orb, da 0 randuri)
* cod=1139934/an=2021/luna=12 -> id_vanzare=882 (coliziune VANZARI.COD deja cunoscuta)
* plus regresie pe cazurile vechi: cod=1140888 -> id_vanzare=1050; cod=1125486 -> nu gaseste (tact fara VANZARI)
* o nota al carei prim rand nu duce la vanzare (cu Go Top orb da 0 randuri)
* aceeasi situatie pe un cod cu coliziune in VANZARI
* plus regresie pe o factura normala si pe o nota fara rand in VANZARI
* plus cazul EOF: tact pozitionat deliberat la EOF (ca dupa CalculeazaTotal() din Show()) inainte de
* apel - dovedeste ca "cod" se ia din cursorul de triplete (SELECT DISTINCT), nu de pe randul curent
* Documentele nu sunt ancorate pe cod: VANZARI.COD se realoca la fiecare salvare a notei, deci se
* descopera la rulare dupa proprietatea ceruta de asertie (descopera_caz_test.prg).
* Nu atinge Oracle in scriere - doar SELECT-uri prin goExecutor. QUIT la final.
SET SAFETY OFF
@@ -26,17 +28,61 @@ IF gnHandle <= 0
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE
DO verifica WITH 1137874, 2009, 8, 'blocant Go Top - prim rand INCASARE', lcLog, .T., 506
DO verifica WITH 1139934, 2021, 12, 'coliziune VANZARI.COD', lcLog, .T., 882
DO verifica WITH 1140888, (gnAn), (gnLuna), 'regresie runda 1 - factura normala', lcLog, .T., 1050
DO verifica WITH 1125486, 2008, 2, 'regresie runda 1 - fara VANZARI', lcLog, .F., 0
DO verifica_eof WITH 1137874, 2009, 8, lcLog, 506
*!* cazurile de test, descoperite pe proprietate (nu ancorate pe cod - codul se realoca la salvare)
LOCAL llCazA, llCazC, llCazD, llCazE
llCazA = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_a')
llCazC = DescoperaCazTest('NOTA_FARA_VANZARI', 'crscaz_c')
llCazD = DescoperaCazTest('PRIM_RAND_ORB', 'crscaz_d')
llCazE = DescoperaCazTest('COLIZIUNE_COD', 'crscaz_e')
STRTOFILE('--- cazuri de test descoperite ---' + CHR(13) + CHR(10) + ;
DescrieCazTest('FACTURA_ARTICOLE', 'crscaz_a', llCazA) + CHR(13) + CHR(10) + ;
DescrieCazTest('NOTA_FARA_VANZARI', 'crscaz_c', llCazC) + CHR(13) + CHR(10) + ;
DescrieCazTest('PRIM_RAND_ORB', 'crscaz_d', llCazD) + CHR(13) + CHR(10) + ;
DescrieCazTest('COLIZIUNE_COD', 'crscaz_e', llCazE) + CHR(13) + CHR(10), lcLog, 1)
IF llCazD
DO verifica WITH (crscaz_d.cod), (crscaz_d.an), (crscaz_d.luna), 'blocant Go Top - prim rand fara vanzare', lcLog, .T., (crscaz_d.id_vanzare)
ELSE
DO caz_negasit WITH 'blocant Go Top - prim rand fara vanzare', lcLog
ENDIF
IF llCazE
DO verifica WITH (crscaz_e.cod), (crscaz_e.an), (crscaz_e.luna), 'coliziune VANZARI.COD', lcLog, .T., (crscaz_e.id_vanzare)
ELSE
DO caz_negasit WITH 'coliziune VANZARI.COD', lcLog
ENDIF
IF llCazA
DO verifica WITH (crscaz_a.cod), (crscaz_a.an), (crscaz_a.luna), 'regresie runda 1 - factura normala', lcLog, .T., (crscaz_a.id_vanzare)
ELSE
DO caz_negasit WITH 'regresie runda 1 - factura normala', lcLog
ENDIF
IF llCazC
DO verifica WITH (crscaz_c.cod), (crscaz_c.an), (crscaz_c.luna), 'regresie runda 1 - fara VANZARI', lcLog, .F., 0
ELSE
DO caz_negasit WITH 'regresie runda 1 - fara VANZARI', lcLog
ENDIF
IF llCazD
DO verifica_eof WITH (crscaz_d.cod), (crscaz_d.an), (crscaz_d.luna), lcLog, (crscaz_d.id_vanzare)
ELSE
DO caz_negasit WITH 'EOF pe tact', lcLog
ENDIF
STRTOFILE('done' + CHR(13) + CHR(10), lcLog, 1)
QUIT
*!* cazul cerut de asertie nu exista in datele schemei - se raporteaza FAIL, nu se sare peste
PROCEDURE caz_negasit
LPARAMETERS tcEticheta, tcLog
STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10) + ;
' niciun document din schema nu satisface conditia cazului' + CHR(13) + CHR(10) + ;
' FAIL' + CHR(13) + CHR(10), tcLog, 1)
ENDPROC
* pozitioneaza tact deliberat la EOF (Go Bottom + Skip) inainte de IncarcaVanzareDinNota - dovedeste
* ca "cod" nu se mai citeste de pe randul curent al aliasului (corectia care a inlocuit Evaluate(alias.cod))
PROCEDURE verifica_eof

View File

@@ -0,0 +1,32 @@
*!* test izolat: verifica daca VFP accepta un camp de cursor numit "_modificat"
SET SAFETY OFF
SET TALK OFF
LOCAL lcLog
lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_nume_coloana_modificat.log'
IF FILE(m.lcLog)
DELETE FILE (m.lcLog)
ENDIF
ON ERROR DO logeaza WITH 'EROARE: ' + Message() + ' (linia ' + Transform(Lineno()) + ')'
CREATE CURSOR tprobA (id_vanzare_det I, _modificat L)
APPEND BLANK
REPLACE _modificat WITH .T.
STRTOFILE('tprobA OK, _modificat=' + Transform(tprobA._modificat) + CHR(13) + CHR(10), m.lcLog, 1)
USE IN tprobA
CREATE CURSOR tprobB (id_vanzare_det I, lmodificat L)
APPEND BLANK
REPLACE lmodificat WITH .T.
STRTOFILE('tprobB OK, lmodificat=' + Transform(tprobB.lmodificat) + CHR(13) + CHR(10), m.lcLog, 1)
USE IN tprobB
STRTOFILE('TERMINAT' + CHR(13) + CHR(10), m.lcLog, 1)
QUIT
PROCEDURE logeaza
LPARAMETERS tcMesaj
STRTOFILE(m.tcMesaj + CHR(13) + CHR(10), 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_nume_coloana_modificat.log', 1)
RETURN
ENDPROC

View File

@@ -1,17 +1,19 @@
* test_page3_articole.prg
* Verifica S4 runda 1+2 (PAGE3, view VVANZARI_ARTICOLE, pozitionare in tact, garda ROACONT/ROAGEST) pe date reale:
* - IncarcaVanzareNota/IncarcaArticoleFactura (ofacturare_editare.prg) direct, pe cod=1140888,
* cod=1140885 (au rand in VANZARI) si cod=1125486 (nota fara rand in VANZARI)
* - cazul de coliziune pe cod: cod=1139934 are 4 randuri VANZARI cu acelasi cod - verifica ca
* filtrul compus (cod+nract+serie_act+data_act) gaseste exact randul corect si NU gaseste
* nimic pentru un nract fara corespondent (evitarea unei potriviri gresite)
* - IncarcaVanzareNota/IncarcaArticoleFactura (ofacturare_editare.prg) direct, pe o factura si pe
* un document de alt tip (amandoua cu rand in VANZARI) si pe o nota fara rand in VANZARI
* - cazul de coliziune pe cod: un cod cu mai multe randuri VANZARI - verifica ca filtrul compus
* (cod+nract+serie_act+data_act) gaseste exact randul corect si NU gaseste nimic pentru un
* nract fara corespondent (evitarea unei potriviri gresite)
* - frm_modific2024 instantiat ca in do_editare_factura (Createobject+Show): PageCount ajunge 3
* pe documente cu rand in VANZARI, ramane 2 pe o nota fara VANZARI
* - regresie runda 2: cod=1137874/an=2009/luna=8 si cod=1139934/an=2021/luna=12, unde primul
* rand din tact e o INCASARE - Go Top orb (runda 1) rata id_vanzare, IncarcaVanzareDinNota il
* gaseste prin toate tripletele distincte (nract,serie_act,dataact) din tact
* - regresie runda 2: note al caror prim rand din tact nu duce la vanzare (tipic o INCASARE) -
* Go Top orb (runda 1) rata id_vanzare, IncarcaVanzareDinNota il gaseste prin toate tripletele
* distincte (nract,serie_act,dataact) din tact
* - garda ROACONT/ROAGEST: cu ofacturare_editare.prg eliberat din SET PROCEDURE, Show() degradeaza
* curat la PageCount=2, fara eroare
* Documentele nu sunt ancorate pe cod: VANZARI.COD se realoca la fiecare salvare a notei, deci se
* descopera la rulare dupa proprietatea ceruta de asertie (descopera_caz_test.prg).
* Nu atinge Oracle in scriere - doar SELECT-uri prin goExecutor. QUIT la final.
SET SAFETY OFF
@@ -32,6 +34,7 @@ IF gnHandle <= 0
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE
*!* OBLIGATORIU: test_init_env_auto:139 face "Set Classlib To omodificari Additive", iar SET PATH
*!* e pe D:\ROA\ROACONT\..., deci se incarca copia ROACONT a clasei (alt working copy, fara
@@ -40,34 +43,128 @@ SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDIT
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
*!* 0) cazurile de test, descoperite pe proprietate (nu ancorate pe cod - codul se realoca la salvare)
LOCAL llCazA, llCazB, llCazC, llCazD, llCazE, llCazF
llCazA = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_a')
llCazB = DescoperaCazTest('NEFACTURA_ARTICOLE', 'crscaz_b')
llCazC = DescoperaCazTest('NOTA_FARA_VANZARI', 'crscaz_c')
llCazD = DescoperaCazTest('PRIM_RAND_ORB', 'crscaz_d')
llCazE = DescoperaCazTest('COLIZIUNE_COD', 'crscaz_e')
llCazF = DescoperaCazTest('FARA_RULAJE', 'crscaz_f')
STRTOFILE('--- cazuri de test descoperite ---' + CHR(13) + CHR(10) + ;
DescrieCazTest('FACTURA_ARTICOLE', 'crscaz_a', llCazA) + CHR(13) + CHR(10) + ;
DescrieCazTest('NEFACTURA_ARTICOLE', 'crscaz_b', llCazB) + CHR(13) + CHR(10) + ;
DescrieCazTest('NOTA_FARA_VANZARI', 'crscaz_c', llCazC) + CHR(13) + CHR(10) + ;
DescrieCazTest('PRIM_RAND_ORB', 'crscaz_d', llCazD) + CHR(13) + CHR(10) + ;
DescrieCazTest('COLIZIUNE_COD', 'crscaz_e', llCazE) + CHR(13) + CHR(10) + ;
DescrieCazTest('FARA_RULAJE', 'crscaz_f', llCazF) + CHR(13) + CHR(10), lcLog, 1)
*!* 1) IncarcaVanzareNota / IncarcaArticoleFactura direct, pe documente reale
*!* (gnAn)/(gnLuna) in paranteze = pasare PRIN VALOARE: DO ... WITH paseaza prin REFERINTA, iar o
*!* valorile in paranteze = pasare PRIN VALOARE: DO ... WITH paseaza prin REFERINTA, iar o
*!* variabila pasata prin referinta devine invizibila sub numele ei propriu in procedura apelata -
*!* de acolo venea dialogul nativ "View Parameter: Enter the value for gnAn" (?gnAn din SQL passthrough)
DO verifica_vanzare_nota WITH 1140888, (gnAn), (gnLuna), 'A (factura, cu articole)', lcLog, .T., 1050, 1, 4
DO verifica_vanzare_nota WITH 1140885, (gnAn), (gnLuna), 'B (aviz/tip -12, cu rand in VANZARI)', lcLog, .T., 1047, -12, -1
DO verifica_vanzare_nota WITH 1125486, 2008, 2, 'C (nota fara rand in VANZARI)', lcLog, .F., 0, 0, -1
IF llCazA
DO verifica_vanzare_nota WITH (crscaz_a.cod), (crscaz_a.an), (crscaz_a.luna), 'A (factura, cu articole)', lcLog, .T., (crscaz_a.id_vanzare), (crscaz_a.tip), (crscaz_a.nlin)
ELSE
DO caz_negasit WITH 'A (factura, cu articole)', lcLog
ENDIF
IF llCazB
DO verifica_vanzare_nota WITH (crscaz_b.cod), (crscaz_b.an), (crscaz_b.luna), 'B (tip <> 1, cu rand in VANZARI)', lcLog, .T., (crscaz_b.id_vanzare), (crscaz_b.tip), (crscaz_b.nlin)
ELSE
DO caz_negasit WITH 'B (tip <> 1, cu rand in VANZARI)', lcLog
ENDIF
IF llCazC
DO verifica_vanzare_nota WITH (crscaz_c.cod), (crscaz_c.an), (crscaz_c.luna), 'C (nota fara rand in VANZARI)', lcLog, .F., 0, 0, -1
ELSE
DO caz_negasit WITH 'C (nota fara rand in VANZARI)', lcLog
ENDIF
*!* 2) cazul de coliziune pe cod=1139934 (4 randuri VANZARI cu acelasi cod) - filtrul compus
DO verifica_coliziune_cod WITH lcLog
*!* 2) cazul de coliziune pe cod (mai multe randuri VANZARI cu acelasi cod) - filtrul compus
IF llCazE
DO verifica_coliziune_cod WITH lcLog, (crscaz_e.cod), (crscaz_e.nract), (crscaz_e.serie_act), (crscaz_e.dataact), (crscaz_e.id_vanzare), ;
(crscaz_e.nract_fara), (crscaz_e.serie_fara), (crscaz_e.data_fara)
ELSE
DO caz_negasit WITH 'coliziune pe cod', lcLog
ENDIF
*!* 3) frm_modific2024 - PageCount pe factura reala (cod=1140888) si pe nota fara VANZARI (cod=1125486)
DO verifica_pagecount_form WITH 1140888, (gnAn), (gnLuna), 'A (factura reala)', lcLog, 3, .T., 1050
DO verifica_pagecount_form WITH 1125486, 2008, 2, 'C (nota fara VANZARI)', lcLog, 2, .F., 0
*!* 3) frm_modific2024 - PageCount pe factura reala si pe nota fara VANZARI
IF llCazA
DO verifica_pagecount_form WITH (crscaz_a.cod), (crscaz_a.an), (crscaz_a.luna), 'A (factura reala)', lcLog, 3, .T., (crscaz_a.id_vanzare)
ELSE
DO caz_negasit WITH 'frm_modific2024 A (factura reala)', lcLog
ENDIF
IF llCazC
DO verifica_pagecount_form WITH (crscaz_c.cod), (crscaz_c.an), (crscaz_c.luna), 'C (nota fara VANZARI)', lcLog, 2, .F., 0
ELSE
DO caz_negasit WITH 'frm_modific2024 C (nota fara VANZARI)', lcLog
ENDIF
*!* 4) regresie runda 2 - blocantul "Go Top orb pe tact": prim rand din tact e o INCASARE, cu
*!* nract/serie_act/dataact diferite de randul facturii - Go Top orb (runda 1) rata id_vanzare
DO verifica_pagecount_form WITH 1137874, 2009, 8, 'D (Go Top orb - blocant runda 2)', lcLog, 3, .T., 506
DO verifica_pagecount_form WITH 1139934, 2021, 12, 'E (coliziune cod + Go Top orb)', lcLog, 3, .T., 882
*!* 4) regresie runda 2 - blocantul "Go Top orb pe tact": prim rand din tact nu duce la vanzare
*!* (tipic o INCASARE, cu nract/serie_act/dataact diferite) - Go Top orb (runda 1) rata id_vanzare
IF llCazD
DO verifica_pagecount_form WITH (crscaz_d.cod), (crscaz_d.an), (crscaz_d.luna), 'D (Go Top orb - blocant runda 2)', lcLog, 3, .T., (crscaz_d.id_vanzare)
ELSE
DO caz_negasit WITH 'frm_modific2024 D (Go Top orb)', lcLog
ENDIF
IF llCazE
DO verifica_pagecount_form WITH (crscaz_e.cod), (crscaz_e.an), (crscaz_e.luna), 'E (coliziune cod + Go Top orb)', lcLog, 3, .T., (crscaz_e.id_vanzare)
ELSE
DO caz_negasit WITH 'frm_modific2024 E (coliziune cod + Go Top orb)', lcLog
ENDIF
*!* 4a) punctul A: pageframe vizibil cand exista doar articole (zero rulaje)
IF llCazF
DO verifica_pageframe_vizibil WITH (crscaz_f.cod), (crscaz_f.an), (crscaz_f.luna), lcLog
ELSE
DO caz_negasit WITH 'pgfArticole.Visible (zero rulaje)', lcLog
ENDIF
*!* 4b) S4 runda 3A: coloane editabile (cantitate/pret/pret_cu_tva), marcaj lmodificat, valoare
IF llCazA
DO verifica_editare_grid WITH (crscaz_a.cod), (crscaz_a.an), (crscaz_a.luna), lcLog
ELSE
DO caz_negasit WITH 'S4 runda 3A, editare grid', lcLog
ENDIF
*!* 4c) grid blank raportat de Marius: RecordSource-ul grdArticoleFactura dupa Show() - IncarcaArticoleFactura
*!* inchide si recreeaza cursorul tvd (workarea noua), care rupe legatura grid-ului cu cursorul placeholder de la Load.
*!* Inaintea gardei (5): garda elibereaza definitiv ofacturare_editare.prg, unde e definita IncarcaCursoareModificareNota
IF llCazF
DO verifica_recordsource_grid WITH (crscaz_f.cod), (crscaz_f.an), (crscaz_f.luna), lcLog
ENDIF
*!* 4d) PregatesteArticoleFacturaEditare (helper cei 5 apelanti): apelat ca la afisjurcom.do_modifica -
*!* inainte de Createobject, pe tact deja incarcat - workarea tvd trebuie sa ramana identica intre
*!* Load si Show (fallback-ul din Show nu se mai declanseaza, la fel ca la do_editare_factura)
IF llCazA
DO verifica_precarcare_articole WITH (crscaz_a.cod), (crscaz_a.an), (crscaz_a.luna), lcLog
ELSE
DO caz_negasit WITH 'PregatesteArticoleFacturaEditare (cei 5 apelanti)', lcLog
ENDIF
*!* 5) garda ROACONT/ROAGEST: cu ofacturare_editare.prg eliberat, Show() nu mai gaseste garda si
*!* degradeaza curat la PageCount=2 - ultimul test, elibereaza procedura definitiv pentru restul rularii
DO verifica_garda_procedura_lipsa WITH 1140888, (gnAn), (gnLuna), lcLog
IF llCazA
DO verifica_garda_procedura_lipsa WITH (crscaz_a.cod), (crscaz_a.an), (crscaz_a.luna), lcLog
ELSE
DO caz_negasit WITH 'garda ofacturare_editare.prg lipsa', lcLog
ENDIF
STRTOFILE('done' + CHR(13) + CHR(10), lcLog, 1)
QUIT
*!* cazul cerut de asertie nu exista in datele schemei - se raporteaza FAIL, nu se sare peste
PROCEDURE caz_negasit
LPARAMETERS tcEticheta, tcLog
STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10) + ;
' niciun document din schema nu satisface conditia cazului' + CHR(13) + CHR(10) + ;
' FAIL' + CHR(13) + CHR(10), tcLog, 1)
ENDPROC
PROCEDURE verifica_vanzare_nota
LPARAMETERS tnCod, tnAn, tnLuna, tcEticheta, tcLog, tlAsteptatGasit, tnIdVanzareAsteptat, tnTipAsteptat, tnLiniiAsteptate
@@ -133,33 +230,29 @@ PROCEDURE verifica_vanzare_nota
ENDPROC
* cod=1139934 are 4 randuri active in VANZARI cu acelasi cod (verificat pe MARIUSM_AUTO):
* id_vanzare=882 numar_act=375/SSS, 883=24/PF, 884=25/PF, 885=26/PF - filtrul pe cod singur
* ar fi ambiguu; filtrul compus (cod+nract+serie_act+data_act) trebuie sa gaseasca exact
* randul cerut si sa NU gaseasca nimic pentru un nract fara corespondent in VANZARI (ACT are
* randuri cu nract=13 pe acelasi cod, fara VANZARI corespunzator)
* pe un cod cu 2+ randuri active in VANZARI, filtrul pe cod singur ar fi ambiguu; filtrul compus
* (cod+nract+serie_act+data_act) trebuie sa gaseasca exact randul cerut si sa NU gaseasca nimic
* pentru un nract prezent in nota, dar fara corespondent in VANZARI
PROCEDURE verifica_coliziune_cod
LPARAMETERS tcLog
LPARAMETERS tcLog, tnCod, tnNract, tcSerieAct, tdDataAct, tnIdVanzareAsteptat, tnNractFara, tcSerieFara, tdDataFara
LOCAL ldDataAct, llOk1, llOk2
LOCAL llOk1, llOk2
ldDataAct = DATE(2021,12,31)
IncarcaVanzareNota(1139934, 375, 'SSS', ldDataAct)
llOk1 = (Reccount('tvanz') = 1 AND tvanz.id_vanzare == 882)
IncarcaVanzareNota(tnCod, tnNract, tcSerieAct, tdDataAct)
llOk1 = (Reccount('tvanz') = 1 AND tvanz.id_vanzare == tnIdVanzareAsteptat)
IF Used('tvanz')
Use In tvanz
ENDIF
IncarcaVanzareNota(1139934, 13, '', ldDataAct)
IncarcaVanzareNota(tnCod, tnNractFara, tcSerieFara, tdDataFara)
llOk2 = (Reccount('tvanz') = 0)
IF Used('tvanz')
Use In tvanz
ENDIF
STRTOFILE('--- coliziune cod=1139934 (4 randuri VANZARI cu acelasi cod) ---' + CHR(13) + CHR(10) + ;
' nract=375/SSS => gaseste id_vanzare=882: ' + IIF(llOk1, 'PASS', 'FAIL') + CHR(13) + CHR(10) + ;
' nract=13 (fara corespondent) => 0 randuri: ' + IIF(llOk2, 'PASS', 'FAIL') + CHR(13) + CHR(10), tcLog, 1)
STRTOFILE('--- coliziune cod=' + TRANSFORM(tnCod) + ' (mai multe randuri VANZARI cu acelasi cod) ---' + CHR(13) + CHR(10) + ;
' nract=' + TRANSFORM(tnNract) + '/' + ALLTRIM(NVL(tcSerieAct,'')) + ' => gaseste id_vanzare=' + TRANSFORM(tnIdVanzareAsteptat) + ': ' + IIF(llOk1, 'PASS', 'FAIL') + CHR(13) + CHR(10) + ;
' nract=' + TRANSFORM(tnNractFara) + ' (fara corespondent) => 0 randuri: ' + IIF(llOk2, 'PASS', 'FAIL') + CHR(13) + CHR(10), tcLog, 1)
ENDPROC
@@ -232,6 +325,164 @@ PROCEDURE verifica_pagecount_form
ENDPROC
* S4 runda 3A: grdArticoleFactura editabil pe cantitate/pret/pret_cu_tva, marcaj lmodificat pe
* linia atinsa, valoare recalculata (cantitate * (pret - discount_unitar), inmultit cu proc_tvav
* cand pret_cu_tva = 0 - pret_cu_tva e flag, nu pret). Nu scrie in Oracle - doar in cursorul tvd.
PROCEDURE verifica_editare_grid
LPARAMETERS tnCod, tnAn, tnLuna, tcLog
LOCAL llOk, lnIdSet, loForm, loGrid, llStructuraOk, llReadOnlyOk, llInitOk, llDupaEditareOk
LOCAL lnCantitateVeche, lnValoareAsteptata, lnCantitateNoua, lnPretNet
llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.)
llStructuraOk = .F.
llReadOnlyOk = .F.
llInitOk = .F.
llDupaEditareOk = .F.
IF llOk AND Used('tact') AND Reccount('tact') > 0
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
loGrid = loForm.pgfArticole.Page3.grdArticoleFactura
llStructuraOk = (loGrid.ColumnCount == 14) AND ;
(Type('tvd.lmodificat') == 'L') AND (Type('tvd.valoare') == 'N')
llReadOnlyOk = (loGrid.Column5.ReadOnly == .F.) AND (loGrid.Column6.ReadOnly == .F.) AND ;
(loGrid.Column7.ReadOnly == .F.) AND (Pemstatus(loGrid.Column7, '_checkbox1', 5)) AND ;
(loGrid.Column1.ReadOnly == .T.) AND (loGrid.Column14.ReadOnly == .T.)
IF Reccount('tvd') > 0
Go Top In tvd
lnPretNet = Nvl(tvd.pret, 0) - Nvl(tvd.discount_unitar, 0)
llInitOk = (tvd.lmodificat == .F.) AND ;
(Round(tvd.valoare, 2) == Round(tvd.cantitate * Iif(tvd.pret_cu_tva = 0, lnPretNet * tvd.proc_tvav, lnPretNet), 2))
lnCantitateVeche = tvd.cantitate
lnCantitateNoua = lnCantitateVeche + 1
Replace cantitate With lnCantitateNoua In tvd
loForm.calculeaza_valori_articol()
lnValoareAsteptata = Round(lnCantitateNoua * Iif(tvd.pret_cu_tva = 0, lnPretNet * tvd.proc_tvav, lnPretNet), 2)
llDupaEditareOk = (tvd.lmodificat == .T.) AND (Round(tvd.valoare, 2) == lnValoareAsteptata)
ENDIF
loForm.Release()
ENDIF
STRTOFILE('--- S4 runda 3A, editare grid, cod=' + TRANSFORM(tnCod) + ' ---' + CHR(13) + CHR(10) + ;
' structura grid/cursor (ColumnCount=14, lmodificat L, valoare N) = ' + IIF(llStructuraOk, 'PASS', 'FAIL') + CHR(13) + CHR(10) + ;
' ReadOnly (cantitate/pret/pret_cu_tva editabile, checkbox pe pret_cu_tva, restul readonly) = ' + IIF(llReadOnlyOk, 'PASS', 'FAIL') + CHR(13) + CHR(10) + ;
' stare initiala (lmodificat=.F., valoare calculata corect) = ' + IIF(llInitOk, 'PASS', 'FAIL') + CHR(13) + CHR(10) + ;
' dupa editare cantitate (lmodificat=.T., valoare recalculata) = ' + IIF(llDupaEditareOk, 'PASS', 'FAIL') + CHR(13) + CHR(10), tcLog, 1)
IF Used('actactan')
Use In actactan
ENDIF
IF Used('tact')
Use In tact
ENDIF
IF Used('rul_temp')
Use In rul_temp
ENDIF
IF Used('trul')
Use In trul
ENDIF
IF Used('rul_temp_obinv')
Use In rul_temp_obinv
ENDIF
IF Used('trul_obinv')
Use In trul_obinv
ENDIF
IF Used('tvanz')
Use In tvanz
ENDIF
IF Used('tvd')
Use In tvd
ENDIF
ENDPROC
* punctul A: pe un document fara rulaje (trul si trul_obinv goale), afiseaza_rulaje() colapseaza
* this.pgfArticole.Visible - inainte de fix, asta ascundea si PAGE3 desi tvd are randuri; dupa fix,
* conditia din Show() tine cont si de Reccount('tvd')
PROCEDURE verifica_pageframe_vizibil
LPARAMETERS tnCod, tnAn, tnLuna, tcLog
LOCAL llOk, lnIdSet, loForm, llVizibilAsteptat, llVizibil, lnReccountTvd, lnReccountTrul, lnReccountTrulObinv
llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.)
llVizibil = .F.
lnReccountTvd = -1
lnReccountTrul = -1
lnReccountTrulObinv = -1
IF llOk AND Used('tact') AND Reccount('tact') > 0
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
llVizibil = loForm.pgfArticole.Visible
lnReccountTvd = Reccount('tvd')
lnReccountTrul = Reccount('trul')
lnReccountTrulObinv = Reccount('trul_obinv')
loForm.Release()
ENDIF
*!* oglinda conditiei de colaps din Show(): vizibil daca oricare din trul/trul_obinv/tvd are randuri
llVizibilAsteptat = !(lnReccountTrul = 0 AND lnReccountTrulObinv = 0 AND lnReccountTvd <= 0)
STRTOFILE('--- pgfArticole.Visible, cod=' + TRANSFORM(tnCod) + ' (zero rulaje, doar articole) ---' + CHR(13) + CHR(10) + ;
' Reccount(trul)=' + TRANSFORM(lnReccountTrul) + ', Reccount(trul_obinv)=' + TRANSFORM(lnReccountTrulObinv) + ;
', Reccount(tvd)=' + TRANSFORM(lnReccountTvd) + CHR(13) + CHR(10) + ;
' pgfArticole.Visible = ' + TRANSFORM(llVizibil) + ' (asteptat ' + TRANSFORM(llVizibilAsteptat) + ')' + CHR(13) + CHR(10) + ;
' ' + IIF(llVizibil == llVizibilAsteptat, 'PASS', 'FAIL') + CHR(13) + CHR(10), tcLog, 1)
IF Used('actactan')
Use In actactan
ENDIF
IF Used('tact')
Use In tact
ENDIF
IF Used('rul_temp')
Use In rul_temp
ENDIF
IF Used('trul')
Use In trul
ENDIF
IF Used('rul_temp_obinv')
Use In rul_temp_obinv
ENDIF
IF Used('trul_obinv')
Use In trul_obinv
ENDIF
IF Used('tvanz')
Use In tvanz
ENDIF
IF Used('tvd')
Use In tvd
ENDIF
ENDPROC
* verifica garda ROACONT/ROAGEST: cu ofacturare_editare.prg eliberat din SET PROCEDURE, Show()
* trebuie sa degradeze curat la PageCount=2, fara eroare - ultimul test din suita, procedura
* ramane eliberata pentru restul rularii (QUIT urmeaza imediat)
@@ -298,6 +549,157 @@ PROCEDURE verifica_garda_procedura_lipsa
ENDPROC
*!* verifica ipoteza grid blank: grdArticoleFactura se leaga la construire pe workarea cursorului
*!* placeholder tvd creat de Load; IncarcaArticoleFactura (apelat din Show) face Use In tvd + Select
*!* Into Cursor tvd, care schimba workarea si rupe legatura, desi tvd ramane deschis cu date
PROCEDURE verifica_recordsource_grid
LPARAMETERS tnCod, tnAn, tnLuna, tcLog
LOCAL llOk, lnIdSet, loForm, lnWorkareaLoad, lnWorkareaShow, lcRecordSourceShow, lnReccountTvd, llUsedTvd
llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.)
lnWorkareaLoad = 0
lnWorkareaShow = 0
lcRecordSourceShow = '?'
lnReccountTvd = -1
llUsedTvd = .F.
IF llOk AND Used('tact') AND Reccount('tact') > 0
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
*!* dupa Createobject (Load), inainte de Show: tvd e cursorul placeholder gol, pe care s-a legat grid-ul
lnWorkareaLoad = Select('tvd')
loForm.Show()
lnWorkareaShow = Select('tvd')
lcRecordSourceShow = loForm.pgfArticole.Page3.grdArticoleFactura.RecordSource
lnReccountTvd = Reccount('tvd')
llUsedTvd = Used('tvd')
loForm.Release()
ENDIF
STRTOFILE('--- verificare RecordSource grid, cod=' + TRANSFORM(tnCod) + ' ---' + CHR(13) + CHR(10) + ;
' workarea tvd dupa Load (inainte de Show) = ' + TRANSFORM(lnWorkareaLoad) + CHR(13) + CHR(10) + ;
' workarea tvd dupa Show = ' + TRANSFORM(lnWorkareaShow) + CHR(13) + CHR(10) + ;
' RecordSource grid dupa Show = [' + lcRecordSourceShow + ']' + CHR(13) + CHR(10) + ;
' Used(tvd) dupa Show = ' + TRANSFORM(llUsedTvd) + ', Reccount(tvd) = ' + TRANSFORM(lnReccountTvd) + CHR(13) + CHR(10), tcLog, 1)
IF Used('actactan')
Use In actactan
ENDIF
IF Used('tact')
Use In tact
ENDIF
IF Used('rul_temp')
Use In rul_temp
ENDIF
IF Used('trul')
Use In trul
ENDIF
IF Used('rul_temp_obinv')
Use In rul_temp_obinv
ENDIF
IF Used('trul_obinv')
Use In trul_obinv
ENDIF
IF Used('tvanz')
Use In tvanz
ENDIF
IF Used('tvd')
Use In tvd
ENDIF
ENDPROC
*!* apelul nou al celor 5 apelanti (afisjurcom.do_modifica, importmodifica, modificanote): tact deja
*!* incarcat, PregatesteArticoleFacturaEditare('tact') inainte de Createobject - trebuie sa lege grid-ul
*!* pe tvd deja plin, la fel ca do_editare_factura, fara ca fallback-ul din Show sa mai reinchida cursorul
PROCEDURE verifica_precarcare_articole
LPARAMETERS tnCod, tnAn, tnLuna, tcLog
LOCAL llOk, lnIdSet, loForm, lnWorkareaLoad, lnWorkareaShow, lnReccountTvd, llUsedTvd
llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.)
lnWorkareaLoad = 0
lnWorkareaShow = 0
lnReccountTvd = -1
llUsedTvd = .F.
IF llOk AND Used('tact') AND Reccount('tact') > 0
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
PregatesteArticoleFacturaEditare('tact')
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
*!* dupa Createobject (Load): daca precarcarea a gasit articole, tvd e deja plin cu ele
lnWorkareaLoad = Select('tvd')
loForm.Show()
lnWorkareaShow = Select('tvd')
lnReccountTvd = Reccount('tvd')
llUsedTvd = Used('tvd')
loForm.Release()
ENDIF
STRTOFILE('--- PregatesteArticoleFacturaEditare, cod=' + TRANSFORM(tnCod) + ' ---' + CHR(13) + CHR(10) + ;
' workarea tvd dupa Load (cu precarcare) = ' + TRANSFORM(lnWorkareaLoad) + CHR(13) + CHR(10) + ;
' workarea tvd dupa Show = ' + TRANSFORM(lnWorkareaShow) + ' (asteptat identica cu cea de dupa Load)' + CHR(13) + CHR(10) + ;
' Used(tvd)=' + TRANSFORM(llUsedTvd) + ', Reccount(tvd)=' + TRANSFORM(lnReccountTvd) + CHR(13) + CHR(10) + ;
' ' + IIF(lnWorkareaLoad == lnWorkareaShow AND lnWorkareaLoad > 0 AND lnReccountTvd > 0, 'PASS', 'FAIL') + CHR(13) + CHR(10), tcLog, 1)
IF Used('actactan')
Use In actactan
ENDIF
IF Used('tact')
Use In tact
ENDIF
IF Used('rul_temp')
Use In rul_temp
ENDIF
IF Used('trul')
Use In trul
ENDIF
IF Used('rul_temp_obinv')
Use In rul_temp_obinv
ENDIF
IF Used('trul_obinv')
Use In trul_obinv
ENDIF
IF Used('tvanz')
Use In tvanz
ENDIF
IF Used('tvd')
Use In tvd
ENDIF
IF Used('crsArticoleFactura')
Use In crsArticoleFactura
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo

View File

@@ -0,0 +1,138 @@
* test_ui_bara_totaluri.prg - verifica pe formular vizibil (nu headless) bara de totaluri de pe
* PAGE3 (sub-blocul C): totalul liniilor active convertit in RON la cursul documentului (decizia 33),
* discountul de antet editabil (tvanz.discount, decizia 17), si ascunderea barei pe tipurile fara
* suma comparabila (decizia 22). Document: cod=1139934/an=2021/luna=12 (id_vanzare=882, are si
* rulaje, altfel Show() ascunde tot pgfArticole). Nu scrie in Oracle. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir
gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync4\'
gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_bara_totaluri_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcUILog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
PUBLIC gnPass, gnFail
gnPass = 0
gnFail = 0
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE
DO HarnessInit
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
*!* test_init_env_auto incarca intai copia omodificari din ROACONT - o eliberam si o reincarcam pe cea de sub test
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
LOCAL llOk, lnIdSet, loForm, loBara
LOCAL lnTotalAsteptat, lnCurs, lnMultiplicator, lnDiscountVechi, lnDiscountNou
llOk = IncarcaCursoareModificareNota(1139934, 2021, 12, .F.)
IF !llOk OR !Used('tact') OR Reccount('tact') = 0
STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1139934' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
IncarcaArticoleFactura(882, 'crsArticoleFactura')
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
loForm.pgfArticole.ActivePage = 3
DOEVENTS FORCE
loBara = loForm.pgfArticole.Page3
DO asserteaza WITH 'bara vizibila (tip comparabil)', loBara.lblTotalLiniiArt.Visible = .T., TRANSFORM(loBara.lblTotalLiniiArt.Visible)
DO asserteaza WITH 'discount editabil', loBara.txtDiscountArt.ReadOnly = .F., TRANSFORM(loBara.txtDiscountArt.ReadOnly)
DO asserteaza WITH 'total linii readonly', loBara.txtTotalLiniiArt.ReadOnly = .T., TRANSFORM(loBara.txtTotalLiniiArt.ReadOnly)
*!* totalul asteptat: suma liniilor active (tvd.sters<>1) convertita RON la cursul documentului
lnCurs = NVL(tvanz.curs, 1)
lnMultiplicator = NVL(tvanz.multiplicator, 1)
IF m.lnMultiplicator = 0
m.lnMultiplicator = 1
ENDIF
SELECT tvd
SUM valoare TO lnTotalAsteptat FOR NVL(sters,0) <> 1
lnTotalAsteptat = ROUND(m.lnTotalAsteptat * m.lnCurs / m.lnMultiplicator, 2)
STRTOFILE('curs=' + TRANSFORM(m.lnCurs) + ' multiplicator=' + TRANSFORM(m.lnMultiplicator) + ;
' total_asteptat=' + TRANSFORM(m.lnTotalAsteptat) + ' bara.nTotalLiniiRon=' + TRANSFORM(loForm.nTotalLiniiRon) + CHR(13) + CHR(10), gcUILog, 1)
DO asserteaza WITH 'total linii RON calculat corect', loForm.nTotalLiniiRon = m.lnTotalAsteptat, TRANSFORM(loForm.nTotalLiniiRon) + ' vs ' + TRANSFORM(m.lnTotalAsteptat)
*!* editarea discountului recalculeaza totalul net, fara sa atinga Oracle
lnDiscountVechi = NVL(tvanz.discount, 0)
lnDiscountNou = m.lnDiscountVechi + 10
loBara.txtDiscountArt.Value = m.lnDiscountNou
loBara.txtDiscountArt.Valid()
DOEVENTS FORCE
DO asserteaza WITH 'discountul ajunge in tvanz', NVL(tvanz.discount, 0) = m.lnDiscountNou, TRANSFORM(NVL(tvanz.discount, 0))
DO asserteaza WITH 'total net recalculat', loForm.nTotalNetRon = ROUND(loForm.nTotalLiniiRon - m.lnDiscountNou, 2), TRANSFORM(loForm.nTotalNetRon)
*!* decizia 22: pe tipuri fara suma comparabila bara se ascunde, pagina ramane
loForm.nTipVanzare = 23
loForm.ActualizeazaBaraTotaluri()
DOEVENTS FORCE
DO asserteaza WITH 'bara ascunsa pe transfer (tip 23)', loBara.lblTotalLiniiArt.Visible = .F., TRANSFORM(loBara.lblTotalLiniiArt.Visible)
DO asserteaza WITH 'grid articole ramane vizibil pe transfer', loBara.grdArticoleFactura.Visible = .T., TRANSFORM(loBara.grdArticoleFactura.Visible)
loForm.nTipVanzare = 1
loForm.ActualizeazaBaraTotaluri()
DOEVENTS FORCE
DO asserteaza WITH 'bara revine vizibila pe factura normala', loBara.lblTotalLiniiArt.Visible = .T., TRANSFORM(loBara.lblTotalLiniiArt.Visible)
DO HarnessStep WITH 0, 'bara_totaluri', 25
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcUILog, 1)
loForm.Release()
IF Used('crsArticoleFactura')
Use In crsArticoleFactura
ENDIF
DO HarnessDone WITH 'done'
QUIT
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcUILog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcUILog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC

View File

@@ -0,0 +1,119 @@
* test_ui_culoare_contrast.prg - dovada vizuala pe formular vizibil: linia stearsa (sters=1)
* apare gri (RGB 150,150,150), o linie normala (sters=0) ramane neagra, pe acelasi grid
* (pgfArticole.PAGE3.grdArticoleFactura). Foloseste un document cu minim 3 linii, ca linia
* curenta a gridului (fundal albastru) sa nu coincida nici cu linia stearsa, nici cu linia
* de control - selectia nu trebuie sa acopere culoarea testata. Nu scrie in Oracle. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir
gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync5\'
gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_culoare_contrast_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcUILog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
PUBLIC gnPass, gnFail
gnPass = 0
gnFail = 0
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE
DO HarnessInit
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
LOCAL llCazA
llCazA = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_a')
IF !llCazA OR crscaz_a.nlin < 3
STRTOFILE('EROARE: cazul FACTURA_ARTICOLE nu are minim 3 linii (nlin=' + TRANSFORM(IIF(llCazA,crscaz_a.nlin,-1)) + ')' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
STRTOFILE('caz A: cod=' + TRANSFORM(crscaz_a.cod) + ' id_vanzare=' + TRANSFORM(crscaz_a.id_vanzare) + ' nlin=' + TRANSFORM(crscaz_a.nlin) + CHR(13) + CHR(10), gcUILog, 1)
LOCAL llOk, lnIdSet, loForm, loGrid, loBut
llOk = IncarcaCursoareModificareNota(crscaz_a.cod, crscaz_a.an, crscaz_a.luna, .F.)
IF !llOk OR !Used('tact') OR Reccount('tact') = 0
STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
IncarcaArticoleFactura(crscaz_a.id_vanzare, 'crsArticoleFactura')
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
loForm.pgfArticole.ActivePage = 3
DOEVENTS FORCE
loGrid = loForm.pgfArticole.Page3.grdArticoleFactura
loBut = loForm.pgfArticole.Page3.cmdStergeArticol
*!* marcheaza linia 2 ca stearsa
SELECT tvd
GO 2
loBut.Click()
DOEVENTS FORCE
DO asserteaza WITH 'linia 2: sters=1 dupa click', NVL(tvd.sters,0) = 1, TRANSFORM(NVL(tvd.sters,0))
*!* linia curenta a gridului ramane pe linia 3 (normala) - selectia (fundal albastru) nu trebuie
*!* sa acopere nici linia 2 (stearsa, de verificat gri) nici linia 1 (normala, de verificat neagra)
GO 3
loGrid.SetFocus()
DOEVENTS FORCE
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessStep WITH 0, 'pagina3 - linia 2 stearsa (gri), linia 1 normala (neagra)', 25
loForm.Release()
IF Used('crsArticoleFactura')
Use In crsArticoleFactura
ENDIF
DO HarnessDone WITH 'done'
QUIT
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcUILog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcUILog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC

View File

@@ -0,0 +1,137 @@
* test_ui_fix_editabil_subtotal.prg - verifica pe formular vizibil (nu headless) defectele raportate
* pe grid-ul grdArticoleFactura: coloanele cantitate/pret nu erau editabile (_grid.Init le forta
* ReadOnly cat timp lcamptextneeditabil ramanea .T.), valoarea pe linie ramanea defazata cu un pas la
* bifa "pret cu TVA" (in InteractiveChange, ControlSource nu e inca actualizat) si nu scadea
* discountul unitar. Coloana se numeste acum "Valoare" (campul tvd.valoare).
* Flux identic cu do_editare_factura. Document: cod=1139934/an=2021/luna=12 (id_vanzare=882, are si
* rulaje, altfel Show() ascunde tot pgfArticole). Nu scrie in Oracle. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir
gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync3\'
gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_fix_editabil_subtotal_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcUILog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
PUBLIC gnPass, gnFail
gnPass = 0
gnFail = 0
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE
DO HarnessInit
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
*!* test_init_env_auto incarca intai copia omodificari din ROACONT - o eliberam si o reincarcam pe cea de sub test
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
LOCAL llOk, lnIdSet, loForm, loGrid, loChk
LOCAL lnCant, lnPretNet, lnProcT, lnFlagVechi, lnFlagNou, lnValoareVeche, lnAsteptat, lnLaIncarcare
llOk = IncarcaCursoareModificareNota(1139934, 2021, 12, .F.)
IF !llOk OR !Used('tact') OR Reccount('tact') = 0
STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1139934' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
IncarcaArticoleFactura(882, 'crsArticoleFactura')
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
loForm.pgfArticole.ActivePage = 3
DOEVENTS FORCE
loGrid = loForm.pgfArticole.Page3.grdArticoleFactura
DO asserteaza WITH 'ColumnCount = 14', loGrid.ColumnCount = 14, TRANSFORM(loGrid.ColumnCount)
DO asserteaza WITH 'cantitate editabila', loGrid.cCantitateArt.ReadOnly = .F., TRANSFORM(loGrid.cCantitateArt.ReadOnly)
DO asserteaza WITH 'pret editabil', loGrid.cPretArt.ReadOnly = .F., TRANSFORM(loGrid.cPretArt.ReadOnly)
DO asserteaza WITH 'denumire ramane readonly', loGrid.cDenumireArt.ReadOnly = .T., TRANSFORM(loGrid.cDenumireArt.ReadOnly)
DO asserteaza WITH 'discount_unitar ramane readonly', loGrid.cDiscountUnitarArt.ReadOnly = .T., TRANSFORM(loGrid.cDiscountUnitarArt.ReadOnly)
DO asserteaza WITH 'valoare ramane readonly', loGrid.cValoareArt.ReadOnly = .T., TRANSFORM(loGrid.cValoareArt.ReadOnly)
DO asserteaza WITH 'antetul coloanei e Valoare', loGrid.cValoareArt.Header1.Caption == 'Valoare', loGrid.cValoareArt.Header1.Caption
SELECT tvd
GO TOP
lnCant = NVL(tvd.cantitate, 0)
lnPretNet = NVL(tvd.pret, 0) - NVL(tvd.discount_unitar, 0)
lnProcT = NVL(tvd.proc_tvav, 1)
lnFlagVechi = NVL(tvd.pret_cu_tva, 0)
lnValoareVeche = NVL(tvd.valoare, 0)
lnFlagNou = IIF(m.lnFlagVechi = 0, 1, 0)
lnLaIncarcare = ROUND(m.lnCant * IIF(m.lnFlagVechi = 0, m.lnPretNet * m.lnProcT, m.lnPretNet), m.gnPC)
lnAsteptat = ROUND(m.lnCant * IIF(m.lnFlagNou = 0, m.lnPretNet * m.lnProcT, m.lnPretNet), m.gnPC)
STRTOFILE('linia 1: cant=' + TRANSFORM(m.lnCant) + ' pret=' + TRANSFORM(NVL(tvd.pret,0)) + ;
' discount_unitar=' + TRANSFORM(NVL(tvd.discount_unitar,0)) + ' proc_tvav=' + TRANSFORM(m.lnProcT) + ;
' flag_vechi=' + TRANSFORM(m.lnFlagVechi) + ' valoare_la_incarcare=' + TRANSFORM(m.lnValoareVeche) + ;
' -> flag_nou=' + TRANSFORM(m.lnFlagNou) + ' valoare_asteptata=' + TRANSFORM(m.lnAsteptat) + CHR(13) + CHR(10), gcUILog, 1)
DO asserteaza WITH 'discountul scazut deja la incarcare', m.lnValoareVeche = m.lnLaIncarcare, TRANSFORM(m.lnValoareVeche) + ' vs ' + TRANSFORM(m.lnLaIncarcare)
*!* reproduce clickul pe bifa: valoarea se schimba in control, ControlSource inca nu
loChk = loGrid.cPretCuTvaArt._checkbox1
loChk.Value = m.lnFlagNou
loChk.InteractiveChange()
DOEVENTS FORCE
SELECT tvd
GO TOP
DO asserteaza WITH 'flagul ajunge in cursor', NVL(tvd.pret_cu_tva, 0) = m.lnFlagNou, TRANSFORM(NVL(tvd.pret_cu_tva, 0))
DO asserteaza WITH 'valoare recalculata cu flagul nou', NVL(tvd.valoare, 0) = m.lnAsteptat, TRANSFORM(NVL(tvd.valoare, 0))
DO asserteaza WITH 'linia marcata modificata', tvd.lmodificat = .T., TRANSFORM(tvd.lmodificat)
DO HarnessStep WITH 0, 'pagina3 articole - dupa bifa pret cu TVA', 25
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcUILog, 1)
loForm.Release()
IF Used('crsArticoleFactura')
Use In crsArticoleFactura
ENDIF
DO HarnessDone WITH 'done'
QUIT
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcUILog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcUILog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC

View File

@@ -0,0 +1,98 @@
* test_ui_grid_articole.prg - reproducere UI (formular real, nu headless) a grid-ului
* grdArticoleFactura raportat gol pe pagina 3 (Articole factura) la frm_modific2024.
* Flux real, identic cu do_editare_factura (ofacturare_comun.vc2:~3780-3796): IncarcaCursoareModificareNota
* -> rebuild tact -> update_jtva_coloane -> IncarcaArticoleFactura(id_vanzare,'crsArticoleFactura')
* -> Createobject(frm_modific2024)+Show() -> ActivePage=3. Captura de ecran via vfp_ui_harness.ps1
* (PrintWindow, off-screen, fara input real). Document: cod=1139934/an=2021/luna=12 (id_vanzare=882,
* verificat in test_page3_articole.prg - PageCount=3) - ales in loc de 1140885 pentru ca are si
* rulaje (trul/trul_obinv nevide), altfel Show() ascunde tot pgfArticole (deci si pagina 3),
* indiferent de tvd - "Ascund pageframe rulaje daca nu am rulaje" (omodificari.vc2:14254).
* Nu scrie in Oracle. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir
gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync\'
gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_grid_articole_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcUILog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE
DO HarnessInit
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
*!* test_init_env_auto face Set Classlib To omodificari Additive dupa Set Path pe ROACONT -
*!* se incarca intai copia ROACONT; o eliberam si reincarcam pe cea de sub test, cu cale completa.
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
LOCAL llOk, lnIdSet, loForm, lnReccountTvd, lcRecordSource, lnColumnCount
llOk = IncarcaCursoareModificareNota(1139934, 2021, 12, .F.)
IF !llOk OR !Used('tact') OR Reccount('tact') = 0
STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1139934' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
*!* replica exact do_editare_factura: articolele se incarca ACUM, inainte de Createobject
IncarcaArticoleFactura(882, 'crsArticoleFactura')
STRTOFILE('Reccount(crsArticoleFactura) inainte de Createobject = ' + TRANSFORM(Reccount('crsArticoleFactura')) + CHR(13) + CHR(10), gcUILog, 1)
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
*!* pagina 3 (Articole factura) apare doar daca lAreArticoleVanzari - navigheaza acolo din cod,
*!* fara click real (masina partajata)
*!* NU se mai cheama Refresh() manual aici - fixul din Show() (omodificari.vc2) trebuie sa fie suficient
loForm.pgfArticole.ActivePage = 3
DOEVENTS FORCE
lnReccountTvd = Reccount('tvd')
lcRecordSource = loForm.pgfArticole.Page3.grdArticoleFactura.RecordSource
lnColumnCount = loForm.pgfArticole.Page3.grdArticoleFactura.ColumnCount
STRTOFILE('PageCount = ' + TRANSFORM(loForm.pgfArticole.PageCount) + CHR(13) + CHR(10) + ;
'pgfArticole.Visible = ' + TRANSFORM(loForm.pgfArticole.Visible) + CHR(13) + CHR(10) + ;
'lAreArticoleVanzari = ' + TRANSFORM(loForm.lAreArticoleVanzari) + CHR(13) + CHR(10) + ;
'Reccount(tvd) = ' + TRANSFORM(lnReccountTvd) + CHR(13) + CHR(10) + ;
'RecordSource grid = [' + lcRecordSource + ']' + CHR(13) + CHR(10) + ;
'ColumnCount grid = ' + TRANSFORM(lnColumnCount) + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessStep WITH 0, 'pagina3 articole - formular vizibil dupa Show+ActivePage=3', 25
loForm.Release()
IF Used('crsArticoleFactura')
Use In crsArticoleFactura
ENDIF
DO HarnessDone WITH 'done'
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC

View File

@@ -0,0 +1,85 @@
* test_ui_pageframe_articole.prg - reproducere UI (formular real) a punctului A: pageframe-ul
* articole trebuie sa ramana vizibil cand documentul are DOAR articole, zero rulaje.
* Document: cod=1140885 (an/luna curente - vezi test_page3_articole.prg), id_vanzare=1047,
* trul si trul_obinv goale, tvd cu 2 randuri. Flux real: IncarcaCursoareModificareNota ->
* Createobject(frm_modific2024)+Show(), ca in do_editare_factura. Captura de ecran via
* vfp_ui_harness.ps1 (PrintWindow, off-screen, fara input real). Nu scrie in Oracle. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir
gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync\'
gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_pageframe_articole_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcUILog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE
DO HarnessInit
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
*!* test_init_env_auto face Set Classlib To omodificari Additive dupa Set Path pe ROACONT -
*!* se incarca intai copia ROACONT; o eliberam si reincarcam pe cea de sub test, cu cale completa.
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
LOCAL llOk, lnIdSet, loForm, lnReccountTvd, lnReccountTrul, lnReccountTrulObinv
llOk = IncarcaCursoareModificareNota(1140885, gnAn, gnLuna, .F.)
IF !llOk OR !Used('tact') OR Reccount('tact') = 0
STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1140885' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
lnReccountTvd = Reccount('tvd')
lnReccountTrul = Reccount('trul')
lnReccountTrulObinv = Reccount('trul_obinv')
*!* daca pageframe-ul e vizibil, navigheaza pe pagina 3 (Articole factura) - fara click real
IF loForm.pgfArticole.Visible
loForm.pgfArticole.ActivePage = 3
DOEVENTS FORCE
ENDIF
STRTOFILE('Reccount(trul) = ' + TRANSFORM(lnReccountTrul) + CHR(13) + CHR(10) + ;
'Reccount(trul_obinv) = ' + TRANSFORM(lnReccountTrulObinv) + CHR(13) + CHR(10) + ;
'Reccount(tvd) = ' + TRANSFORM(lnReccountTvd) + CHR(13) + CHR(10) + ;
'pgfArticole.Visible = ' + TRANSFORM(loForm.pgfArticole.Visible) + CHR(13) + CHR(10) + ;
'pgfArticole.PageCount = ' + TRANSFORM(loForm.pgfArticole.PageCount) + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessStep WITH 0, 'pageframe articole - formular vizibil dupa Show (zero rulaje, doar articole)', 25
loForm.Release()
DO HarnessDone WITH 'done'
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC

View File

@@ -0,0 +1,86 @@
* test_ui_pageframe_zero_rulaje.prg - defectul 2: pageframe-ul rulaje/articole colapsa complet
* (afiseaza_rulaje() -> pgfArticole.Visible = .F.) cand documentul are articole dar zero rulaje -
* conditia veche din Show() (omodificari.vc2) verifica doar trul/trul_obinv, nu si tvd. Document:
* cod=1140885/an=gnAn/luna=gnLuna (id_vanzare=1047) - verificat separat: Reccount(trul)=0,
* Reccount(trul_obinv)=0, Reccount(tvd)=2. Acelasi flux ca do_editare_factura (IncarcaArticoleFactura
* in cursor propriu, inainte de Createobject). Nu scrie in Oracle. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir
gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync2\'
gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_pageframe_zero_rulaje_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcUILog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE
DO HarnessInit
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
LOCAL llOk, lnIdSet, loForm
llOk = IncarcaCursoareModificareNota(1140885, gnAn, gnLuna, .F.)
IF !llOk OR !Used('tact') OR Reccount('tact') = 0
STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1140885' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
*!* replica do_editare_factura: articolele se incarca ACUM, inainte de Createobject (id_vanzare=1047)
IncarcaArticoleFactura(1047, 'crsArticoleFactura')
STRTOFILE('Reccount(crsArticoleFactura) inainte de Createobject = ' + TRANSFORM(Reccount('crsArticoleFactura')) + CHR(13) + CHR(10), gcUILog, 1)
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
loForm.pgfArticole.ActivePage = 3
DOEVENTS FORCE
STRTOFILE('PageCount = ' + TRANSFORM(loForm.pgfArticole.PageCount) + CHR(13) + CHR(10) + ;
'pgfArticole.Visible = ' + TRANSFORM(loForm.pgfArticole.Visible) + CHR(13) + CHR(10) + ;
'lAreArticoleVanzari = ' + TRANSFORM(loForm.lAreArticoleVanzari) + CHR(13) + CHR(10) + ;
'Reccount(trul) = ' + TRANSFORM(IIF(Used('trul'),Reccount('trul'),-1)) + CHR(13) + CHR(10) + ;
'Reccount(trul_obinv) = ' + TRANSFORM(IIF(Used('trul_obinv'),Reccount('trul_obinv'),-1)) + CHR(13) + CHR(10) + ;
'Reccount(tvd) = ' + TRANSFORM(Reccount('tvd')) + CHR(13) + CHR(10) + ;
'ColumnCount grid = ' + TRANSFORM(loForm.pgfArticole.Page3.grdArticoleFactura.ColumnCount) + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessStep WITH 0, 'pageframe zero rulaje - articole populate', 25
loForm.Release()
IF Used('crsArticoleFactura')
Use In crsArticoleFactura
ENDIF
DO HarnessDone WITH 'done'
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC

View File

@@ -0,0 +1,151 @@
* test_ui_sterge_linie.prg - verifica pe formular vizibil (nu headless) butonul nou
* pgfArticole.PAGE3.cmdStergeArticol: comuta tvd.sters intre 0 si 1 pe linia curenta,
* marcheaza lmodificat si grizeaza vizual randul (DynamicForeColor pe toate coloanele
* grid-ului) fara sa-l scoata din cursor - stergerea ramane logica, nu fizica.
* Document: cod=1139934/an=2021/luna=12 (id_vanzare=882, 2 linii, are si rulaje, altfel
* Show() ascunde tot pgfArticole). Nu scrie in Oracle. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir
gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync4\'
gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_sterge_linie_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcUILog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
PUBLIC gnPass, gnFail
gnPass = 0
gnFail = 0
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE
DO HarnessInit
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
*!* test_init_env_auto incarca intai copia omodificari din ROACONT - o eliberam si o reincarcam pe cea de sub test
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
LOCAL llOk, lnIdSet, loForm, loGrid, loBut
LOCAL lnStersInitialR1, lnStersInitialR2
llOk = IncarcaCursoareModificareNota(1139934, 2021, 12, .F.)
IF !llOk OR !Used('tact') OR Reccount('tact') = 0
STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1139934' + CHR(13) + CHR(10), gcUILog, 1)
DO HarnessDone WITH 'error'
QUIT
ENDIF
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
IncarcaArticoleFactura(882, 'crsArticoleFactura')
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
loForm.pgfArticole.ActivePage = 3
DOEVENTS FORCE
loGrid = loForm.pgfArticole.Page3.grdArticoleFactura
loBut = loForm.pgfArticole.Page3.cmdStergeArticol
DO asserteaza WITH 'butonul cmdStergeArticol exista', TYPE('loBut.Caption') = 'C', TYPE('loBut.Caption')
DO asserteaza WITH 'butonul e vizibil', loBut.Visible, TRANSFORM(loBut.Visible)
SELECT tvd
GO TOP
lnStersInitialR1 = NVL(tvd.sters, 0)
DO asserteaza WITH 'linia 1 incarcata cu sters=0', m.lnStersInitialR1 = 0, TRANSFORM(m.lnStersInitialR1)
SELECT tvd
SKIP
lnStersInitialR2 = NVL(tvd.sters, 0)
GO TOP
*!* primul click - marcheaza linia 1 ca stearsa (logic, ramane in cursor)
loBut.Click()
DOEVENTS FORCE
SELECT tvd
GO TOP
DO asserteaza WITH 'dupa click 1: sters=1 pe linia curenta', NVL(tvd.sters,0) = 1, TRANSFORM(NVL(tvd.sters,0))
DO asserteaza WITH 'dupa click 1: lmodificat=.T.', tvd.lmodificat = .T., TRANSFORM(tvd.lmodificat)
SELECT tvd
SKIP
DO asserteaza WITH 'linia 2 neatinsa de stergerea liniei 1', NVL(tvd.sters,0) = m.lnStersInitialR2, TRANSFORM(NVL(tvd.sters,0))
GO TOP
*!* al doilea click pe aceeasi linie - restaureaza (comutare, nu buton separat)
*!* asertia ruleaza INAINTE de orice HarnessStep - daca harness-ul nu detecteaza fereastra,
*!* procesul e omorat la primul READY si tot ce urmeaza dupa acel pas nu se mai executa
loBut.Click()
DOEVENTS FORCE
SELECT tvd
GO TOP
DO asserteaza WITH 'dupa click 2: sters=0 (restaurata)', NVL(tvd.sters,0) = 0, TRANSFORM(NVL(tvd.sters,0))
*!* al treilea click - re-marcheaza linia, doar ca sa fie vizibila grizarea in captura de mai jos
loBut.Click()
DOEVENTS FORCE
SELECT tvd
GO TOP
DO asserteaza WITH 'dupa click 3: sters=1 (re-marcata pentru captura)', NVL(tvd.sters,0) = 1, TRANSFORM(NVL(tvd.sters,0))
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcUILog, 1)
*!* muta randul curent al gridului pe linia 2, ca selectia (fundal albastru) sa nu acopere
*!* culoarea DynamicForeColor a liniei grizate (linia 1) in captura
SELECT tvd
SKIP
loGrid.SetFocus()
DOEVENTS FORCE
DO HarnessStep WITH 0, 'pagina3 articole - linia 1 grizata (sters=1)', 25
loForm.Release()
IF Used('crsArticoleFactura')
Use In crsArticoleFactura
ENDIF
DO HarnessDone WITH 'done'
QUIT
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcUILog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcUILog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC

View File

@@ -0,0 +1,365 @@
* test_verdict_act_rul.prg
* Verifica ActualizeazaVerdictActRul (omodificari.vc2, S4/#6 sub-blocul C partea 2): calculul
* Total ACT (sold net debit-credit pe cont, functie de tipul documentului), calculul Total RUL
* (SUM((cant+cante)*pretvtva) WHERE id_tip_rulaj=0, corectat cu liniile nestocate), alegerea
* contului pe grupa de tip (4111/461/418, respectiv 4111/411/461 pe rate/contract),
* ascunderea pe tipurile fara suma comparabila si tratamentul special tip=51 (verdict fortat
* "nu se aplica").
* Cifrele sunt recalculate INDEPENDENT (SCAN, nu SUM) pe acelasi document, ca sa valideze formula
* implementata, nu doar sa repete acelasi cod. Documentul e descoperit prin proprietate
* (descopera_caz_test.prg), nu ancorat pe cod. Nu scrie in Oracle - doar SELECT-uri si cursoare
* in memorie. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_verdict_act_rul_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE
*!* test_init_env_auto incarca clasa omodificari din working copy-ul ROACONT (alt SET PATH) -
*!* o eliberam si o reincarcam pe cea de sub test, cu cale completa
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
PUBLIC gnPass, gnFail
gnPass = 0
gnFail = 0
LOCAL llCazA
llCazA = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_a')
IF !llCazA
STRTOFILE('EROARE: cazul FACTURA_ARTICOLE nu a fost gasit' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
STRTOFILE('caz A: cod=' + TRANSFORM(crscaz_a.cod) + ' an=' + TRANSFORM(crscaz_a.an) + ' luna=' + TRANSFORM(crscaz_a.luna) + ;
' id_vanzare=' + TRANSFORM(crscaz_a.id_vanzare) + ' tip=' + TRANSFORM(crscaz_a.tip) + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL llOk, lnIdSet, loForm
LOCAL lnActManual, lnRulManual, lnCorectieManual, lnRulCuCorectieManual
llOk = IncarcaCursoareModificareNota(crscaz_a.cod, crscaz_a.an, crscaz_a.luna, .F.)
IF !llOk OR !Used('tact') OR Reccount('tact') = 0
STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe caz A' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite
Go Top In tact
lnIdSet = tact.id_set
IF !Used('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
Select tact
loForm = Createobject([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
DO asserteaza WITH 'formularul are articole (lAreArticoleVanzari)', loForm.lAreArticoleVanzari, TRANSFORM(loForm.lAreArticoleVanzari)
DO asserteaza WITH 'tip=1 (factura normala) - cont asteptat 4111, bara ACT/RUL vizibila', loForm.pgfArticole.PAGE3.lblTotalActArt.Visible, TRANSFORM(loForm.pgfArticole.PAGE3.lblTotalActArt.Visible)
*!* --- calcul independent (SCAN, nu SUM) al Total ACT pe contul 4111, ca sa valideze formula fara
*!* sa repete acelasi cod din ActualizeazaVerdictActRul ---
lnActManual = 0
SELECT tact
SCAN FOR Nvl(sters,0) = 0
IF Alltrim(Nvl(scd,'')) == '4111'
lnActManual = lnActManual + Nvl(suma,0)
ELSE
IF Alltrim(Nvl(scc,'')) == '4111' AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126')
lnActManual = lnActManual - Nvl(suma,0)
ENDIF
ENDIF
ENDSCAN
lnActManual = Round(lnActManual, 2)
DO asserteaza WITH 'Total ACT calculat de forma corespunde calculului independent (SCAN)', loForm.nTotalActRon == m.lnActManual, TRANSFORM(loForm.nTotalActRon) + ' vs manual ' + TRANSFORM(m.lnActManual)
*!* --- calcul independent al Total RUL (doar randurile cu id_tip_rulaj=0, decizia 36 - perechile
*!* id_tip_rulaj=3 sunt miscari virtuale de diferenta de pret, nu intra in suma), plus corectia
*!* liniilor nestocate ---
lnRulManual = 0
IF Used('trul')
SELECT trul
SCAN FOR Nvl(sters,0) = 0 AND Nvl(id_tip_rulaj,0) = 0
lnRulManual = lnRulManual + (Nvl(cant,0) + Nvl(cante,0)) * Nvl(pretvtva,0)
ENDSCAN
ENDIF
lnCorectieManual = 0
SELECT tvd
SCAN FOR Nvl(sters,0) <> 1 AND Nvl(in_stoc,1) = 0
lnCorectieManual = lnCorectieManual + Nvl(valoare,0)
ENDSCAN
lnRulCuCorectieManual = Round(m.lnRulManual + m.lnCorectieManual * Nvl(tvanz.curs,1) / Iif(Nvl(tvanz.multiplicator,1)=0,1,Nvl(tvanz.multiplicator,1)), 2)
DO asserteaza WITH 'Total RUL calculat de forma corespunde calculului independent (SCAN, formula + corectie nestocate)', loForm.nTotalRulRon == m.lnRulCuCorectieManual, TRANSFORM(loForm.nTotalRulRon) + ' vs manual ' + TRANSFORM(m.lnRulCuCorectieManual)
DO asserteaza WITH 'lRulAjustat reflecta exact daca exista linii nestocate (corectie <> 0)', loForm.lRulAjustat == (Round(m.lnCorectieManual,2) <> 0), 'lRulAjustat=' + TRANSFORM(loForm.lRulAjustat) + ' corectie=' + TRANSFORM(m.lnCorectieManual)
LOCAL lcCaptionRul, lcVerdictText
lcCaptionRul = loForm.pgfArticole.PAGE3.lblTotalRulArt.Caption
lcVerdictText = loForm.pgfArticole.PAGE3.lblVerdictArt.Caption
DO asserteaza WITH 'eticheta Total RUL marcheaza corect "(ajustat)" cand corectia s-a aplicat', ;
IIF(loForm.lRulAjustat, '(ajustat)' $ m.lcCaptionRul, NOT '(ajustat)' $ m.lcCaptionRul), m.lcCaptionRul
DO asserteaza WITH 'verdictul e informativ (contine "informativ", nu se prezinta ca eroare de sine statatoare)', ;
'informativ' $ Lower(m.lcVerdictText) AND NOT 'eroare:' $ Lower(m.lcVerdictText), m.lcVerdictText
IF Abs(loForm.nTotalActRon - loForm.nTotalRulRon) <= 0.02
DO asserteaza WITH 'verdict text = sincronizat, cand ACT si RUL coincid', 'sincronizat' $ Lower(m.lcVerdictText), m.lcVerdictText
ELSE
DO asserteaza WITH 'verdict text = divergent (informativ), cand ACT si RUL nu coincid', 'divergent' $ Lower(m.lcVerdictText), m.lcVerdictText
ENDIF
*!* --- documentul de test (cod=1140895): dupa decizia 36, perechile id_tip_rulaj=3 nu mai intra
*!* in Total RUL, deci ACT si RUL coincid exact la 1924.59 - verificare explicita a cifrei, nu
*!* doar a egalitatii celor doua totaluri (un bug care ar pune ambele pe zero ar trece testul de mai sus) ---
IF crscaz_a.cod = 1140895
DO asserteaza WITH 'documentul de test cod=1140895: Total ACT = 1924.59', loForm.nTotalActRon == 1924.59, TRANSFORM(loForm.nTotalActRon)
DO asserteaza WITH 'documentul de test cod=1140895: Total RUL = 1924.59 (decizia 36)', loForm.nTotalRulRon == 1924.59, TRANSFORM(loForm.nTotalRulRon)
DO asserteaza WITH 'documentul de test cod=1140895: verdict sincronizat', 'sincronizat' $ Lower(m.lcVerdictText), m.lcVerdictText
ENDIF
*!* --- tip=51 (ROAACNPRO): verdict fortat "nu se aplica", indiferent de cifre (decizia D din rec_suma_act.md) ---
loForm.nTipVanzare = 51
loForm.ActualizeazaBaraTotaluri()
DO asserteaza WITH 'tip=51: cifrele raman vizibile (informativ)', loForm.pgfArticole.PAGE3.lblTotalActArt.Visible, TRANSFORM(loForm.pgfArticole.PAGE3.lblTotalActArt.Visible)
DO asserteaza WITH 'tip=51: verdictul e fortat "nu se aplica", nu sincronizat/divergent', 'nu se aplica' $ Lower(loForm.pgfArticole.PAGE3.lblVerdictArt.Caption), loForm.pgfArticole.PAGE3.lblVerdictArt.Caption
*!* --- transfer intre subunitati (tip=23, decizia 22): bara ACT/RUL se ascunde odata cu restul barei ---
loForm.nTipVanzare = 23
loForm.ActualizeazaBaraTotaluri()
DO asserteaza WITH 'tip=23 (transfer): Total ACT ascuns', !loForm.pgfArticole.PAGE3.lblTotalActArt.Visible, TRANSFORM(loForm.pgfArticole.PAGE3.lblTotalActArt.Visible)
DO asserteaza WITH 'tip=23 (transfer): Total RUL ascuns', !loForm.pgfArticole.PAGE3.txtTotalRulArt.Visible, TRANSFORM(loForm.pgfArticole.PAGE3.txtTotalRulArt.Visible)
DO asserteaza WITH 'tip=23 (transfer): indicatorul de verdict ascuns', !loForm.pgfArticole.PAGE3.lblVerdictArt.Visible, TRANSFORM(loForm.pgfArticole.PAGE3.lblVerdictArt.Visible)
*!* --- custodie (tip=42, decizia 22): la fel, fara suma comparabila ---
loForm.nTipVanzare = 42
loForm.ActualizeazaBaraTotaluri()
DO asserteaza WITH 'tip=42 (custodie): Total ACT ascuns', !loForm.pgfArticole.PAGE3.lblTotalActArt.Visible, TRANSFORM(loForm.pgfArticole.PAGE3.lblTotalActArt.Visible)
*!* --- alegerea contului pe grupa de tip: avize catre clienti debitori (28,29) -> 461 ---
loForm.nTipVanzare = 28
loForm.ActualizeazaBaraTotaluri()
LOCAL lnAct461
lnAct461 = 0
SELECT tact
SCAN FOR Nvl(sters,0) = 0
IF Alltrim(Nvl(scd,'')) == '461'
lnAct461 = lnAct461 + Nvl(suma,0)
ELSE
IF Alltrim(Nvl(scc,'')) == '461' AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126')
lnAct461 = lnAct461 - Nvl(suma,0)
ENDIF
ENDIF
ENDSCAN
DO asserteaza WITH 'tip=28 (aviz client debitor): contul de referinta e 461', loForm.nTotalActRon == Round(m.lnAct461,2), TRANSFORM(loForm.nTotalActRon) + ' vs manual(461) ' + TRANSFORM(Round(m.lnAct461,2))
*!* --- restul avizelor (21,22,24,26) -> 418 ---
loForm.nTipVanzare = 21
loForm.ActualizeazaBaraTotaluri()
LOCAL lnAct418
lnAct418 = 0
SELECT tact
SCAN FOR Nvl(sters,0) = 0
IF Alltrim(Nvl(scd,'')) == '418'
lnAct418 = lnAct418 + Nvl(suma,0)
ELSE
IF Alltrim(Nvl(scc,'')) == '418' AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126')
lnAct418 = lnAct418 - Nvl(suma,0)
ENDIF
ENDIF
ENDSCAN
DO asserteaza WITH 'tip=21 (aviz obisnuit): contul de referinta e 418', loForm.nTotalActRon == Round(m.lnAct418,2), TRANSFORM(loForm.nTotalActRon) + ' vs manual(418) ' + TRANSFORM(Round(m.lnAct418,2))
*!* --- restaurare tip original si verificare corectie sintetica pe linii nestocate ---
loForm.nTipVanzare = crscaz_a.tip
loForm.ActualizeazaBaraTotaluri()
LOCAL lnRulInainte, lnRulDupa, lnValoareLinie, lnCursDoc, lnMultDoc
lnRulInainte = loForm.nTotalRulRon
SELECT tvd
GO TOP
lnValoareLinie = Nvl(valoare,0)
REPLACE in_stoc WITH 0
lnCursDoc = Nvl(tvanz.curs,1)
lnMultDoc = Iif(Nvl(tvanz.multiplicator,1)=0,1,Nvl(tvanz.multiplicator,1))
loForm.ActualizeazaBaraTotaluri()
lnRulDupa = loForm.nTotalRulRon
DO asserteaza WITH 'fortarea in_stoc=0 pe o linie activeaza corectia (lRulAjustat=.T.)', loForm.lRulAjustat, TRANSFORM(loForm.lRulAjustat)
DO asserteaza WITH 'corectia liniei nestocate creste Total RUL exact cu valoarea liniei convertita in RON', ;
Round(lnRulDupa - lnRulInainte, 2) == Round(m.lnValoareLinie * m.lnCursDoc / m.lnMultDoc, 2), ;
TRANSFORM(m.lnRulDupa) + ' - ' + TRANSFORM(m.lnRulInainte) + ' vs asteptat ' + TRANSFORM(Round(m.lnValoareLinie * m.lnCursDoc / m.lnMultDoc, 2))
*!* --- decizia 36: un rand id_tip_rulaj=3 nu intra in Total RUL, un rand id_tip_rulaj=0 intra ---
LOCAL lnRulRef, lnDeltaRulaj, lnRecnoRulTest, lnPretvtvaTest
lnRulRef = loForm.nTotalRulRon
IF Used('trul')
SELECT trul
LOCATE FOR Nvl(id_tip_rulaj,0) = 3 AND Nvl(sters,0) = 0
IF FOUND()
lnRecnoRulTest = Recno()
REPLACE cante WITH Nvl(cante,0) + 1000
loForm.ActualizeazaBaraTotaluri()
DO asserteaza WITH 'un rand id_tip_rulaj=3 nu modifica Total RUL (miscare virtuala, decizia 36)', loForm.nTotalRulRon == m.lnRulRef, TRANSFORM(loForm.nTotalRulRon) + ' vs referinta ' + TRANSFORM(m.lnRulRef)
SELECT trul
GO (m.lnRecnoRulTest)
REPLACE cante WITH Nvl(cante,0) - 1000
loForm.ActualizeazaBaraTotaluri()
ELSE
STRTOFILE('AVERTISMENT: nu s-a gasit rand trul cu id_tip_rulaj=3, testul de excludere sarit' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
SELECT trul
LOCATE FOR Nvl(id_tip_rulaj,0) = 0 AND Nvl(sters,0) = 0
IF FOUND()
lnRecnoRulTest = Recno()
lnPretvtvaTest = Nvl(trul.pretvtva,0)
lnRulRef = loForm.nTotalRulRon
lnDeltaRulaj = Iif(Nvl(trul.cant,0) <> 0, 1, 0)
REPLACE cant WITH Nvl(cant,0) + m.lnDeltaRulaj, cante WITH Nvl(cante,0) + (1 - m.lnDeltaRulaj)
loForm.ActualizeazaBaraTotaluri()
DO asserteaza WITH 'un rand id_tip_rulaj=0 modifica Total RUL cu exact pretvtva (decizia 36)', ;
Round(loForm.nTotalRulRon - m.lnRulRef, 2) == Round(m.lnPretvtvaTest, 2), TRANSFORM(loForm.nTotalRulRon) + ' vs referinta ' + TRANSFORM(m.lnRulRef) + ' + pretvtva ' + TRANSFORM(m.lnPretvtvaTest)
SELECT trul
GO (m.lnRecnoRulTest)
REPLACE cant WITH Nvl(cant,0) - m.lnDeltaRulaj, cante WITH Nvl(cante,0) - (1 - m.lnDeltaRulaj)
loForm.ActualizeazaBaraTotaluri()
ELSE
STRTOFILE('AVERTISMENT: nu s-a gasit rand trul cu id_tip_rulaj=0, testul de includere sarit' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDIF
*!* --- decizia 37: cont de referinta pe rate/contract (tip 2,6,52) accepta 4111/411/461, nu doar 4111 ---
SELECT tact
LOCATE FOR Alltrim(Nvl(scd,'')) == '4111' AND Nvl(sters,0) = 0
IF FOUND()
LOCAL lnRecnoContTest, lcScdOriginal, lnActMulti
lnRecnoContTest = Recno()
lcScdOriginal = scd
REPLACE scd WITH '411'
loForm.nTipVanzare = 2
loForm.ActualizeazaBaraTotaluri()
lnActMulti = 0
SELECT tact
SCAN FOR Nvl(sters,0) = 0
IF INLIST(Alltrim(Nvl(scd,'')), '4111', '411', '461')
lnActMulti = lnActMulti + Nvl(suma,0)
ELSE
IF INLIST(Alltrim(Nvl(scc,'')), '4111', '411', '461') AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126')
lnActMulti = lnActMulti - Nvl(suma,0)
ENDIF
ENDIF
ENDSCAN
DO asserteaza WITH 'tip=2 (rata/contract): contul 411 e acceptat alaturi de 4111/461 (decizia 37)', loForm.nTotalActRon == Round(m.lnActMulti,2), TRANSFORM(loForm.nTotalActRon) + ' vs manual ' + TRANSFORM(Round(m.lnActMulti,2))
SELECT tact
GO (m.lnRecnoContTest)
REPLACE scd WITH '461'
loForm.nTipVanzare = 6
loForm.ActualizeazaBaraTotaluri()
lnActMulti = 0
SELECT tact
SCAN FOR Nvl(sters,0) = 0
IF INLIST(Alltrim(Nvl(scd,'')), '4111', '411', '461')
lnActMulti = lnActMulti + Nvl(suma,0)
ELSE
IF INLIST(Alltrim(Nvl(scc,'')), '4111', '411', '461') AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126')
lnActMulti = lnActMulti - Nvl(suma,0)
ENDIF
ENDIF
ENDSCAN
DO asserteaza WITH 'tip=6 (rata/contract): contul 461 e acceptat alaturi de 4111/411 (decizia 37)', loForm.nTotalActRon == Round(m.lnActMulti,2), TRANSFORM(loForm.nTotalActRon) + ' vs manual ' + TRANSFORM(Round(m.lnActMulti,2))
*!* pe un tip fara rata, contul ramane strict 4111 - randul mutat pe 461 nu mai intra in suma
SELECT tact
GO (m.lnRecnoContTest)
loForm.nTipVanzare = 1
loForm.ActualizeazaBaraTotaluri()
lnActMulti = 0
SELECT tact
SCAN FOR Nvl(sters,0) = 0
IF Alltrim(Nvl(scd,'')) == '4111'
lnActMulti = lnActMulti + Nvl(suma,0)
ELSE
IF Alltrim(Nvl(scc,'')) == '4111' AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126')
lnActMulti = lnActMulti - Nvl(suma,0)
ENDIF
ENDIF
ENDSCAN
DO asserteaza WITH 'tip=1 (factura obisnuita): contul ramane strict 4111, randul mutat pe 461 nu mai intra in suma', loForm.nTotalActRon == Round(m.lnActMulti,2), TRANSFORM(loForm.nTotalActRon) + ' vs manual ' + TRANSFORM(Round(m.lnActMulti,2))
SELECT tact
GO (m.lnRecnoContTest)
REPLACE scd WITH m.lcScdOriginal
ELSE
STRTOFILE('AVERTISMENT: nu s-a gasit rand ACT cu scd=4111, testul decizia 37 sarit' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
loForm.Release()
IF Used('actactan')
Use In actactan
ENDIF
IF Used('tact')
Use In tact
ENDIF
IF Used('rul_temp')
Use In rul_temp
ENDIF
IF Used('trul')
Use In trul
ENDIF
IF Used('rul_temp_obinv')
Use In rul_temp_obinv
ENDIF
IF Used('trul_obinv')
Use In trul_obinv
ENDIF
IF Used('tvanz')
Use In tvanz
ENDIF
IF Used('tvd')
Use In tvd
ENDIF
QUIT
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC