sync SVN r18107

This commit is contained in:
2026-09-15 23:13:08 +03:00
parent af31776357
commit a2d309da4b
20 changed files with 5767 additions and 7 deletions

View File

@@ -175,6 +175,8 @@ DEFINE CLASS _cusodatabase AS _custom OF "_baza.vcx"
lcMesaj = "Inregistrarea a fost stearsa!"
AMESSAGE(lcMesaj,0+48,lctip)
Endif
Else
llSucces = .F.
Endif
Endif

View File

@@ -18687,14 +18687,14 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx"
*!* marius.mutu
*!* daca cantitatea ramasa dupa adaugarea articolului gestionabil este < 0, atunci pun 0 ca sa pot intra pe ramura facturare fara stoc
Lparameters tlImplicit, tlContract, tlRetur
Lparameters tlImplicit, tlContract, tlRetur, tlDoarAvertisment
* llImplicit = .T. => daca exista o singura linie in stoc, atunci nu mai apare formularul de completare a datelor
* tlContract = .T. => provine din gridul cu articole din contract
* tlRetur = .T. => se face retur la articolul selectat (trebuie selectat din rulaj in loc de stoc)
Private pnProcentDiscountMem
Local ofrmadarticol As "frm_articol_factura"
Local lcSelectActualizare, lcSql, llActualizat, llSucces, lnListaIdOld, lnRecno, lnSucces
Local lcMesajContVenit, lcSelectActualizare, lcSql, llActualizat, llSucces, lnListaIdOld, lnRecno, lnSucces
Local lnTotalCantitate, loCauta
*:Global gnButon, poArtLista
pnProcentDiscountMem = 0
@@ -18734,6 +18734,17 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx"
gnButon = 2
If Thisform.do_verifica_articol(poArticol, tlContract, lnCantitate)
lcMesajContVenit = verifica_cont_venit_linie(poArticol.id_articol, poArticol.Id_Pol)
If !Empty(lcMesajContVenit)
If Type('pcAcumulatorContVenit') = 'C'
pcAcumulatorContVenit = pcAcumulatorContVenit + Chr(13) + lcMesajContVenit
Else
AMESSAGEBOX(lcMesajContVenit, 0+48, "Atentie")
Endif
If !tlDoarAvertisment
Return
Endif
Endif
Do Case
Case (poArticol.gestionabil = 0 Or gnScadereStoc = 0 Or poDate.tip = 45) && 45 = ROARESTAURANT
* initializez frm_articol_factura, sa se initializeze toate calculele si daca nu arat formularul (adaugare toate articolele)
@@ -18953,6 +18964,16 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx"
Endif
Endif
Local lcMesajContVenit, lnIdPolLinie
lnIdPolLinie = Iif(Type('toArticol.Id_Pol')='N', toArticol.Id_Pol, Nvl(gnId_pol_pret_stoc,0))
If Type('toArticol.Id_Pol') <> 'N'
AddProperty(toArticol, 'Id_Pol', lnIdPolLinie)
Endif
lcMesajContVenit = verifica_cont_venit_linie(toArticol.id_articol, lnIdPolLinie)
If !Empty(lcMesajContVenit)
AMESSAGEBOX(lcMesajContVenit, 0+48, "Atentie")
Return .F.
Endif
If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47) And !Thisform.do_verifica_articol(toArticol, .F., tnCantitate)
save_grid_tag(Thisform.grd_factura)
Select crsfactura
@@ -19097,6 +19118,8 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx"
PROCEDURE do_adauga_tot
If Used('crsarticole') And Reccount('crsarticole')>0
Local lnNrInregistrare,lnRaspuns,lcArticol,llGestionabil
Private pcAcumulatorContVenit
pcAcumulatorContVenit = []
Select crsarticole
Scan
lnNrInregistrare = Recno()
@@ -19105,7 +19128,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx"
llGestionabil = (Type('crsArticole.gestionabil') = 'N' And Nvl(crsarticole.gestionabil, 0) = 1)
Do While lnRaspuns = 7
If (cantitate > 0 And m.llGestionabil) Or (!m.llGestionabil) && adaug si articolele cu cantitate negativa (ex: articolul de discount)
Thisform.do_adauga_articol(.T.)
Thisform.do_adauga_articol(.T., .F., .F., .T.)
Endif
Select crsarticole
Go lnNrInregistrare
@@ -19118,6 +19141,9 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx"
Select crsarticole
Go lnNrInregistrare
Endscan
If !Empty(pcAcumulatorContVenit)
AMESSAGEBOX("Articole fara cont de venit configurat:" + pcAcumulatorContVenit, 0+48, "Atentie")
Endif
Local lcJtvaLipsa, lnRecFactura, lnSelFactura
lcJtvaLipsa = []
lnSelFactura = Select()
@@ -22607,6 +22633,8 @@ DEFINE CLASS frm_optiuni_facturare AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="pgfrm_optiuni.Page1.Op_coeficient_k" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfrm_optiuni.Page1.op_aviz_bon_fiscal" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfrm_optiuni.Page1.op_factura_email" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfrm_optiuni.Page1.Clb_nota_stoc_debit" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfrm_optiuni.Page1.Clb_nota_stoc_credit" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfrm_optiuni.Page2.Ed_txt_subsol_fact" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfrm_optiuni.Page2.Ct_clb_fdoc_factura" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfrm_optiuni.Page2.op_printdenumire" UniqueID="" Timestamp="" />
@@ -22664,6 +22692,8 @@ DEFINE CLASS frm_optiuni_facturare AS _frmbase OF "_frm_base.vcx"
*p: cpolpretk
*p: cpolpretstoc
*p: cpolprettr
*p: csccnotastoc
*p: cscdnotastoc
*p: natasamentefact
*p: nidfdocaviz
*p: nidfdocavizretur
@@ -22697,6 +22727,8 @@ DEFINE CLASS frm_optiuni_facturare AS _frmbase OF "_frm_base.vcx"
cpolpretk =
cpolpretstoc =
cpolprettr =
csccnotastoc =
cscdnotastoc =
DoCreate = .T.
FontCharSet = 238
Height = 586
@@ -22815,6 +22847,38 @@ DEFINE CLASS frm_optiuni_facturare AS _frmbase OF "_frm_base.vcx"
Lb_simplu1.Name = "Lb_simplu1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
ADD OBJECT 'pgfrm_optiuni.Page1.Clb_nota_stoc_credit' AS clb_tx_simplu WITH ;
Height = 29, ;
Left = 9, ;
Name = "Clb_nota_stoc_credit", ;
TabIndex = 16, ;
Top = 469, ;
Width = 510, ;
Text_simplu1.Height = 23, ;
Text_simplu1.Left = 254, ;
Text_simplu1.Name = "Text_simplu1", ;
Text_simplu1.Top = 3, ;
Text_simplu1.Width = 90, ;
Lb_simplu1.Caption = "Nota implicita stoc - cont creditor", ;
Lb_simplu1.Name = "Lb_simplu1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
ADD OBJECT 'pgfrm_optiuni.Page1.Clb_nota_stoc_debit' AS clb_tx_simplu WITH ;
Height = 29, ;
Left = 9, ;
Name = "Clb_nota_stoc_debit", ;
TabIndex = 15, ;
Top = 440, ;
Width = 510, ;
Text_simplu1.Height = 23, ;
Text_simplu1.Left = 254, ;
Text_simplu1.Name = "Text_simplu1", ;
Text_simplu1.Top = 3, ;
Text_simplu1.Width = 90, ;
Lb_simplu1.Caption = "Nota implicita stoc - cont debitor", ;
Lb_simplu1.Name = "Lb_simplu1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
ADD OBJECT 'pgfrm_optiuni.Page1.Clb_zile_scadenta' AS clb_tx_simplu WITH ;
Height = 29, ;
Left = 9, ;
@@ -24113,6 +24177,7 @@ DEFINE CLASS frm_optiuni_facturare AS _frmbase OF "_frm_base.vcx"
Local lcTextConformFact5, lcTextConformFact6, lcTextFooterFact1, lcTextFooterFact2
Local lcTextFooterFact3, lcTextFooterFact4, lcTextFooterFact5, lnPrintDenumire, lnTextConformitate, lnId_fdoc_card
Local lcTextConformFact7, lcTextConformFact8, lnFacturaSold
Local lcScdNotaStoc, lcSccNotaStoc
*:Global gcTextConformFact7, gcTextConformFact8, gnFacturaSold, gnId_fdoc_card
*:Global gcTextConformFact1, gcTextConformFact2, gcTextConformFact3, gcTextConformFact4
*:Global gcTextConformFact5, gcTextConformFact6, gcTextFooterFact1, gcTextFooterFact2
@@ -24172,6 +24237,8 @@ DEFINE CLASS frm_optiuni_facturare AS _frmbase OF "_frm_base.vcx"
lnId_part_casa = Thisform.nidpartcasa
lnId_pol_pret_tr = Thisform.nidpolprettr
lnId_pol_pret_stoc = Thisform.nidpolpretstoc
lcScdNotaStoc = Alltrim(.page1.clb_nota_stoc_debit.text_simplu1.Value)
lcSccNotaStoc = Alltrim(.page1.clb_nota_stoc_credit.text_simplu1.Value)
*!* modificare v 2.0.58
lnAtasamenteFact = .page1.op_salvare_pdf._optiongrup1.Value
*!* modificare v 2.0.58 ^
@@ -24451,6 +24518,18 @@ DEFINE CLASS frm_optiuni_facturare AS _frmbase OF "_frm_base.vcx"
Endif
*!* modificare v 2.0.93 ^
If lcScdNotaStoc <> This.cScdNotaStoc Or lcSccNotaStoc <> This.cSccNotaStoc
Local loNotaStoc
loNotaStoc = Createobject('cus_pret_nomenclator')
If !loNotaStoc.salveaza_nota_politica(lnId_pol_pret_stoc, lcScdNotaStoc, lcSccNotaStoc)
Release loNotaStoc
Return .F.
Endif
Release loNotaStoc
This.cScdNotaStoc = lcScdNotaStoc
This.cSccNotaStoc = lcSccNotaStoc
Endif
Set Exact &lcSetare
If !Empty(lcOptiuni) And !Empty(lcValori)
@@ -24571,6 +24650,21 @@ DEFINE CLASS frm_optiuni_facturare AS _frmbase OF "_frm_base.vcx"
actualizeaza_politica_pret(23,@gnId_pol_pret_tr,@lcPolPretTr)
actualizeaza_politica_pret(1,@gnId_pol_pret_stoc,@lcPolPretStoc)
If Empty(Nvl(gnId_pol_pret_stoc,0))
Local loPolStoc, lnIdPolStoc
loPolStoc = Createobject('cus_pret_nomenclator')
lnIdPolStoc = loPolStoc.asigura_politica()
Release loPolStoc
If lnIdPolStoc > 0
actualizeaza_politica_pret(1,@gnId_pol_pret_stoc,@lcPolPretStoc)
Endif
Endif
Local loNotaStoc
loNotaStoc = Createobject('cus_pret_nomenclator')
loNotaStoc.incarca_nota_politica(Nvl(gnId_pol_pret_stoc,0))
This.cScdNotaStoc = loNotaStoc.cScd
This.cSccNotaStoc = loNotaStoc.cScc
Release loNotaStoc
*!* modificare v 2.0.58
Thisform.natasamentefact = 2-Nvl(citeste_optiune_firma([ATASAMENTEFACT]),0)
*!* modificare v 2.0.58 ^
@@ -24647,6 +24741,9 @@ DEFINE CLASS frm_optiuni_facturare AS _frmbase OF "_frm_base.vcx"
.op_factura_email._optiongrup1.Value = IIF(Nvl(m.gnFacturaEmail,0) = 0, 2, IIF(Nvl(m.gnFacturaEmail,0) = 1, 1, 3))
.ct_clb_pol_pret_stoc.clb_tx_cautare.teXT_SIMPLU1.Refresh()
.ct_clb_pol_pret_stoc.Enabled = Empty(Thisform.nidpolpretstoc)
.clb_nota_stoc_debit.text_simplu1.Value = This.cScdNotaStoc
.clb_nota_stoc_credit.text_simplu1.Value = This.cSccNotaStoc
*!* modificare v 2.0.58
.op_salvare_pdf._optiongrup1.Value = Thisform.natasamentefact
.op_salvare_pdf.Refresh()

View File

@@ -85,7 +85,7 @@ DEFINE CLASS cus_odata_catalog_articole AS _cusodatabase OF "_cus_odata_base.vcx
IIF(Isnull(pnId_part),[NULL],Alltrim(Str(pnId_part)))+[,] + ;
Alltrim(Str(pnTaxaReconditionare,18,4)) + [,] + ;
Alltrim(Str(pnListareCodBare)) + [,?@pnIdAMS,] + ;
alltrim(str(pnTip)) + [,0] + [, '] + m.pcCodNC8 + [',] + ALLTRIM(STR(NVL(m.pnGreutate, 0),12,4)) + [,] + ALLTRIM(STR(m.pnIdTaraOrigine)) + [, '] + m.pcCodCPV + [','] + m.pcCodUMISO + ['); end;]
alltrim(str(pnTip)) + [,0] + [, '] + m.pcCodNC8 + [',] + ALLTRIM(STR(NVL(m.pnGreutate, 0),12,4)) + [,] + IIF(ISNULL(m.pnIdTaraOrigine), [NULL], ALLTRIM(STR(m.pnIdTaraOrigine))) + [, '] + m.pcCodCPV + [','] + m.pcCodUMISO + ['); end;]
Case lcActiune = "UPDATE"
lcSql = [begin pack_preturi.modifica_articol(?gnAn,]+Alltrim(Str(pnId))+[, ']+;
pccodmat+ [', '] + pccodmatf + [', '] + pcconditii_pastrare + [','] + pcdenumire+[',] + ;
@@ -707,6 +707,14 @@ DEFINE CLASS frm_catalog_articole_nou AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="_pageframe1.Page2.ct_tara_origine" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page2.lblIntrastat" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page2.Clb_tx_simplu2" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Clb_tx_pret_ftva" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Clb_tx_pret_ctva" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Cb_tx_proc_tvav" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Cb_tx_venit" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Clb_tx_scd" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Clb_tx_scc" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Clb_tx_cont_dedus" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Lb_info_conturi" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Cus_odata_parteneri_articole_coduri" UniqueID="" Timestamp="" />
*<DefinedPropArrayMethod>
@@ -720,6 +728,7 @@ DEFINE CLASS frm_catalog_articole_nou AS _frmbase OF "_frm_base.vcx"
*p: nid
*p: ogeneratorcodbare
*p: ogeneratorcodmat
*p: opretnom
*p: orec
*</DefinedPropArrayMethod>
@@ -731,10 +740,12 @@ DEFINE CLASS frm_catalog_articole_nou AS _frmbase OF "_frm_base.vcx"
nid = 0
ogeneratorcodbare = .NULL.
ogeneratorcodmat = .NULL.
opretnom = .NULL.
Width = 610
_memberdata = <VFPData>
<memberdata name="ogeneratorcodmat" type="property" display="oGeneratorCodmat"/>
<memberdata name="ogeneratorcodbare" type="property" display="oGeneratorCodBare"/>
<memberdata name="opretnom" type="property" display="oPretNom"/>
</VFPData>
_shape1.Height = 29
_shape1.Left = 0
@@ -766,14 +777,16 @@ DEFINE CLASS frm_catalog_articole_nou AS _frmbase OF "_frm_base.vcx"
Height = 415, ;
Left = 1, ;
Name = "_pageframe1", ;
PageCount = 2, ;
PageCount = 3, ;
TabIndex = 1, ;
Top = 27, ;
Width = 610, ;
Page1.Caption = "Articol", ;
Page1.Name = "Page1", ;
Page2.Caption = "Alte informatii", ;
Page2.Name = "Page2"
Page2.Name = "Page2", ;
Page3.Caption = "Vanzare", ;
Page3.Name = "Page3"
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="pageframe" />
ADD OBJECT '_pageframe1.Page1._checkbox1' AS _checkbox WITH ;
@@ -1459,6 +1472,146 @@ DEFINE CLASS frm_catalog_articole_nou AS _frmbase OF "_frm_base.vcx"
Top = 8
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT '_pageframe1.Page3.Cb_tx_proc_tvav' AS cb_tx_simplu WITH ;
Height = 29, ;
Left = 9, ;
Name = "Cb_tx_proc_tvav", ;
TabIndex = 3, ;
Top = 82, ;
Width = 380, ;
ZOrderSet = 2, ;
_cbbase1.Height = 23, ;
_cbbase1.Left = 185, ;
_cbbase1.Name = "_cbbase1", ;
_cbbase1.Top = 3, ;
_cbbase1.Width = 163, ;
_lbbase1.Caption = "Cota TVA", ;
_lbbase1.Name = "_lbbase1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
ADD OBJECT '_pageframe1.Page3.Cb_tx_venit' AS cb_tx_simplu WITH ;
Height = 29, ;
Left = 9, ;
Name = "Cb_tx_venit", ;
TabIndex = 4, ;
Top = 118, ;
Width = 380, ;
ZOrderSet = 3, ;
_cbbase1.BoundColumn = 2, ;
_cbbase1.BoundTo = .T., ;
_cbbase1.ColumnCount = 2, ;
_cbbase1.ColumnLines = .F., ;
_cbbase1.ColumnWidths = "184,0", ;
_cbbase1.Height = 23, ;
_cbbase1.Left = 185, ;
_cbbase1.Name = "_cbbase1", ;
_cbbase1.Top = 3, ;
_cbbase1.Width = 184, ;
_lbbase1.Caption = "Tip venit", ;
_lbbase1.Name = "_lbbase1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
ADD OBJECT '_pageframe1.Page3.Clb_tx_cont_dedus' AS clb_tx_simplu WITH ;
Height = 29, ;
Left = 9, ;
Name = "Clb_tx_cont_dedus", ;
TabIndex = 7, ;
Top = 226, ;
Width = 380, ;
ZOrderSet = 6, ;
Text_simplu1.Height = 23, ;
Text_simplu1.Left = 185, ;
Text_simplu1.MaxLength = 12, ;
Text_simplu1.Name = "Text_simplu1", ;
Text_simplu1.ReadOnly = .T., ;
Text_simplu1.Top = 3, ;
Text_simplu1.Width = 113, ;
Lb_simplu1.Caption = "Cont venit articol", ;
Lb_simplu1.Name = "Lb_simplu1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
ADD OBJECT '_pageframe1.Page3.Clb_tx_pret_ctva' AS clb_tx_simplu WITH ;
Height = 29, ;
Left = 9, ;
Name = "Clb_tx_pret_ctva", ;
TabIndex = 2, ;
Top = 46, ;
Width = 380, ;
ZOrderSet = 1, ;
Text_simplu1.Format = "RK", ;
Text_simplu1.Height = 23, ;
Text_simplu1.InputMask = (GET_MASK(14,gnPC)), ;
Text_simplu1.Left = 185, ;
Text_simplu1.Name = "Text_simplu1", ;
Text_simplu1.Top = 3, ;
Text_simplu1.Width = 113, ;
Lb_simplu1.Caption = "Pret cu TVA", ;
Lb_simplu1.Name = "Lb_simplu1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
ADD OBJECT '_pageframe1.Page3.Clb_tx_pret_ftva' AS clb_tx_simplu WITH ;
Height = 29, ;
Left = 9, ;
Name = "Clb_tx_pret_ftva", ;
TabIndex = 1, ;
Top = 10, ;
Width = 380, ;
ZOrderSet = 0, ;
Text_simplu1.Format = "RK", ;
Text_simplu1.Height = 23, ;
Text_simplu1.InputMask = (GET_MASK(14,gnPC)), ;
Text_simplu1.Left = 185, ;
Text_simplu1.Name = "Text_simplu1", ;
Text_simplu1.Top = 3, ;
Text_simplu1.Width = 113, ;
Lb_simplu1.Caption = "Pret fara TVA", ;
Lb_simplu1.Name = "Lb_simplu1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
ADD OBJECT '_pageframe1.Page3.Clb_tx_scc' AS clb_tx_simplu WITH ;
Height = 29, ;
Left = 9, ;
Name = "Clb_tx_scc", ;
TabIndex = 6, ;
Top = 190, ;
Width = 380, ;
ZOrderSet = 5, ;
Text_simplu1.Height = 23, ;
Text_simplu1.Left = 185, ;
Text_simplu1.MaxLength = 12, ;
Text_simplu1.Name = "Text_simplu1", ;
Text_simplu1.Top = 3, ;
Text_simplu1.Width = 113, ;
Lb_simplu1.Caption = "Cont creditor", ;
Lb_simplu1.Name = "Lb_simplu1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
ADD OBJECT '_pageframe1.Page3.Clb_tx_scd' AS clb_tx_simplu WITH ;
Height = 29, ;
Left = 9, ;
Name = "Clb_tx_scd", ;
TabIndex = 5, ;
Top = 154, ;
Width = 380, ;
ZOrderSet = 4, ;
Text_simplu1.Height = 23, ;
Text_simplu1.Left = 185, ;
Text_simplu1.MaxLength = 12, ;
Text_simplu1.Name = "Text_simplu1", ;
Text_simplu1.Top = 3, ;
Text_simplu1.Width = 113, ;
Lb_simplu1.Caption = "Cont debitor", ;
Lb_simplu1.Name = "Lb_simplu1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
ADD OBJECT '_pageframe1.Page3.Lb_info_conturi' AS _label WITH ;
Caption = "Necompletate: debit 4111, credit contul de venit al articolului", ;
Left = 9, ;
Name = "Lb_info_conturi", ;
TabIndex = 8, ;
Top = 262
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'But_renunt1' AS but_renunt WITH ;
Left = 551, ;
Name = "But_renunt1", ;
@@ -1686,6 +1839,10 @@ DEFINE CLASS frm_catalog_articole_nou AS _frmbase OF "_frm_base.vcx"
Endscan
Set Deleted &lcDeleted
If m.llReturn And Vartype(Thisform.oPretNom) = "O"
llReturn = Thisform.oPretNom.salveaza(m.lnIdArticol)
Endif
Endif && cus_odata_catalog_articole
Thisform.do_inchide_tranzactie(Iif(m.llReturn, 1, 2))
@@ -1769,6 +1926,63 @@ DEFINE CLASS frm_catalog_articole_nou AS _frmbase OF "_frm_base.vcx"
lnRezultat2 = This.oGeneratorCodBare.creeaza_cursor_serii(15)
EndIf
*!* 07.09.2009 ^
If gcNumeProgram = [ROAFACTURARE]
This.oPretNom = Createobject("cus_pret_nomenclator")
This.oPretNom.incarca(Iif(Upper(Alltrim(m.tcActiune)) = [UPDATE], m.tnId, 0))
This._pageframe1.Page3.Clb_tx_pret_ftva.Text_simplu1.ControlSource = "Thisform.oPretNom.nPretFtva"
This._pageframe1.Page3.Clb_tx_pret_ctva.Text_simplu1.ControlSource = "Thisform.oPretNom.nPretCtva"
This._pageframe1.Page3.Clb_tx_scd.Text_simplu1.ControlSource = "Thisform.oPretNom.cScd"
This._pageframe1.Page3.Clb_tx_scc.Text_simplu1.ControlSource = "Thisform.oPretNom.cScc"
This._pageframe1.Page3.Clb_tx_cont_dedus.Text_simplu1.ControlSource = "Thisform.oPretNom.cContDedus"
If Used('crsvenchelt')
Use In crsvenchelt
Endif
goExecutor.oExecute([select id_venchelt, explicatie as venchelt from vnom_venchel where inactiv = 0 order by explicatie],[crsvenchelt])
This._pageframe1.Page3.Cb_tx_venit._cbbase1.RowSourceType = 6
This._pageframe1.Page3.Cb_tx_venit._cbbase1.RowSource = "crsvenchelt.venchelt,id_venchelt"
This._pageframe1.Page3.Cb_tx_venit._cbbase1.ControlSource = "Thisform.oPretNom.nIdVenchelt"
If Used('crs_cote_tva')
Use In crs_cote_tva
Endif
If Used('crs_cote_tva2')
Use In crs_cote_tva2
Endif
goExecutor.oExecute([select procent, proc_tva from ] + gcS + [.vcote_tva where an = ?gnAn and luna = ?gnLuna order by proc_tva desc],[crs_cote_tva2])
Create Cursor crs_cote_tva (procent C(100), proc_tva N(10,2) Null)
If Used('crs_cote_tva2')
Insert Into crs_cote_tva (procent, proc_tva) Select Alltrim(Str(procent,10,2)), proc_tva From crs_cote_tva2
Use In crs_cote_tva2
Endif
Select crs_cote_tva
Append Blank
Replace procent With [<ALES LA FACTURARE>]
This._pageframe1.Page3.Cb_tx_proc_tvav._cbbase1.RowSourceType = 2
This._pageframe1.Page3.Cb_tx_proc_tvav._cbbase1.RowSource = "crs_cote_tva"
If Isnull(This.oPretNom.nProcTvav)
Locate For Isnull(proc_tva)
Else
Locate For !Isnull(proc_tva) And proc_tva = This.oPretNom.nProcTvav
Endif
If !Found()
Go Bottom
Endif
This._pageframe1.Page3.Cb_tx_proc_tvav._cbbase1.ListIndex = Recno()
If This.oPretNom.lPreturiCuTva
This._pageframe1.Page3.Clb_tx_pret_ctva.Lb_simplu1.Caption = "Pret cu TVA (pret lista)"
This._pageframe1.Page3.Clb_tx_pret_ctva.Lb_simplu1.FontBold = .T.
This._pageframe1.Page3.Clb_tx_pret_ftva.Lb_simplu1.Caption = "Pret fara TVA"
This._pageframe1.Page3.Clb_tx_pret_ftva.Lb_simplu1.FontBold = .F.
Else
This._pageframe1.Page3.Clb_tx_pret_ftva.Lb_simplu1.Caption = "Pret fara TVA (pret lista)"
This._pageframe1.Page3.Clb_tx_pret_ftva.Lb_simplu1.FontBold = .T.
This._pageframe1.Page3.Clb_tx_pret_ctva.Lb_simplu1.Caption = "Pret cu TVA"
This._pageframe1.Page3.Clb_tx_pret_ctva.Lb_simplu1.FontBold = .F.
Endif
This._pageframe1.PageCount = 3
Else
This._pageframe1.PageCount = 2
Endif
ENDPROC
PROCEDURE Load
@@ -1927,6 +2141,30 @@ DEFINE CLASS frm_catalog_articole_nou AS _frmbase OF "_frm_base.vcx"
thisform.do_alege_partener()
ENDPROC
PROCEDURE _pageframe1.Page3.Cb_tx_proc_tvav._cbbase1.InteractiveChange
Select crs_cote_tva
Thisform.oPretNom.nProcTvav = crs_cote_tva.proc_tva
If Thisform.oPretNom.lPreturiCuTva
Thisform.oPretNom.nPretFtva = Thisform.oPretNom.recalculeaza_pret(Thisform.oPretNom.nPretCtva, .F.)
Thisform._pageframe1.Page3.Clb_tx_pret_ftva.Text_simplu1.Refresh()
Else
Thisform.oPretNom.nPretCtva = Thisform.oPretNom.recalculeaza_pret(Thisform.oPretNom.nPretFtva, .T.)
Thisform._pageframe1.Page3.Clb_tx_pret_ctva.Text_simplu1.Refresh()
Endif
ENDPROC
PROCEDURE _pageframe1.Page3.Clb_tx_pret_ctva.Text_simplu1.Valid
Thisform.oPretNom.nPretCtva = This.Value
Thisform.oPretNom.nPretFtva = Thisform.oPretNom.recalculeaza_pret(This.Value, .F.)
Thisform._pageframe1.Page3.Clb_tx_pret_ftva.Text_simplu1.Refresh()
ENDPROC
PROCEDURE _pageframe1.Page3.Clb_tx_pret_ftva.Text_simplu1.Valid
Thisform.oPretNom.nPretFtva = This.Value
Thisform.oPretNom.nPretCtva = Thisform.oPretNom.recalculeaza_pret(This.Value, .T.)
Thisform._pageframe1.Page3.Clb_tx_pret_ctva.Text_simplu1.Refresh()
ENDPROC
ENDDEFINE
DEFINE CLASS frm_config_codbare AS frm_termin_renunt OF "_frm_child.vcx"

View File

@@ -64,6 +64,17 @@
*!* prelucreaza_facturacrs + vpretctva/vdiscountctva in lista de insert (pretul si discountul
*!* unitar in valuta cu TVA inclus, care plecau 0 la Oracle la reemiterea documentelor in valuta)
*!* 14.09.2026
*!* agent
*!* + clasa cus_pret_nomenclator - politica de stoc pe pagina Vanzare din fisa articolului (plan #12b, S6b)
*!* + incarca_nota_politica/salveaza_nota_politica - nota implicita (cont debitor/creditor) a politicii
*!* de stoc, editabila din optiunile de facturare (plan #12b, S7b)
*!* 15.09.2026
*!* marius.mutu
*!* + verifica_cont_venit_linie - verificare prietenoasa a contului de venit rezolvat pentru o linie
*!* de factura, la adaugarea articolului
***************************************************************************************************************
**** Clase:
**** oDateFactura
@@ -76,6 +87,14 @@
**** scrieAtasamente
**** oDateGestiune
**** Reset
**** cus_pret_nomenclator
**** asigura_politica
**** incarca
**** valideaza
**** salveaza
**** recalculeaza_pret
**** incarca_nota_politica
**** salveaza_nota_politica
**** Functii:
**** actualizeaza_document
**** actualizeaza_partener_fact
@@ -819,6 +838,44 @@ Function deriva_cont_venit_fara_pol
Endfunc && deriva_cont_venit_fara_pol
*********************************************************************************************************
*********************************************************************************************************
* verificare prietenoasa D10 la adaugarea liniei; intoarce [] daca linia are cont de venit rezolvat, altfel mesajul de afisat
Function verifica_cont_venit_linie
Lparameters tnIdArticol, tnIdPol
Local lcSql, lnSucces, lcMesaj, lcIdPolStoc, lcIdPol, lcIdArt
lcMesaj = []
If Isnull(tnIdArticol) Or Isnull(tnIdPol)
Return lcMesaj
Endif
* fisa poate ajunge aici fara sa fi trecut prin optiunile facturarii - globalul nu exista inca
lcIdPolStoc = Iif(Type('gnId_pol_pret_stoc')='N',Alltrim(Str(gnId_pol_pret_stoc)),'0')
lcIdPol = Alltrim(Str(tnIdPol))
lcIdArt = Alltrim(Str(tnIdArticol))
* replica exacta a rezolvarii din pack_facturare.contabilizeaza_articol.cursor_articol: deducerea
* cont_venit_articol_stoc are prioritate doar pe politica de stoc si doar fara nota pe rand
lcSql = [select nom_articole.denumire, b.nume_lista_preturi, ] + ;
[nvl(case when a.id_pol = ] + lcIdPolStoc + [ and a.id_nota is null then pack_facturare.cont_venit_articol_stoc(] + lcIdArt + [) end, d.scc) as scc_rezolvat ] + ;
[from nom_articole ] + ;
[left join crm_politici_pret_art a on a.id_pol = ] + lcIdPol + [ and a.id_articol = nom_articole.id_articol ] + ;
[join crm_politici_preturi b on b.id_pol = ] + lcIdPol + [ ] + ;
[left join crm_note_vanzari c on c.id_nota = (case when ] + lcIdPol + [ = ] + lcIdPolStoc + [ then nvl(a.id_nota, b.id_nota) else b.id_nota end) ] + ;
[left join note_contabile d on d.id_set = c.id_set ] + ;
[where nom_articole.id_articol = ] + lcIdArt
If Used('crsverifcontvenit')
Use In crsverifcontvenit
Endif
lnSucces = goExecutor.oExecute(lcSql,[crsverifcontvenit])
If lnSucces >= 0 And Used('crsverifcontvenit') And Reccount('crsverifcontvenit') > 0 And Isnull(crsverifcontvenit.scc_rezolvat)
lcMesaj = [Articolul ] + Alltrim(Nvl(crsverifcontvenit.denumire,[])) + ;
[ nu are cont de venit configurat pe politica ] + Alltrim(Nvl(crsverifcontvenit.nume_lista_preturi,[])) + ;
[ - completati contul articolului sau nota contabila a politicii!]
Endif
If Used('crsverifcontvenit')
Use In crsverifcontvenit
Endif
Return lcMesaj
Endfunc && verifica_cont_venit_linie
*********************************************************************************************************
*********************************************************************************************************
*!* Function recalculeaza_pret_vanzare_lei_set
*!* Lparameters tcTabel,tnCurs
*!* Local llReturn
@@ -2304,3 +2361,249 @@ Function scrie_legatura_proforma
Endfunc && scrie_legatura_proforma
******************************* SFARSIT: scrie_legatura_proforma *****************************************
*********************************************************************************************************
*********************************************************************************************************
****************************************** INCEPUT: cus_pret_nomenclator ***************************************
Define Class cus_pret_nomenclator As Custom
nIdArticol = 0
nIdPolitica = 0
lIncarcat = .F.
lPreturiCuTva = .F.
nPretFtva = 0
nPretCtva = 0
nProcTvav = 1
nIdVenchelt = .NULL.
nIdNota = .NULL.
cScd = []
cScc = []
cContDedus = []
cEroare = []
* asigura politica de stoc (o creeaza daca lipseste); intoarce id politica, 0 la esec
Procedure asigura_politica
Local lcSql, lnSucces
Private pnIdUtil, pnIdPolitica
pnIdUtil = gnIdUtil
pnIdPolitica = 0
lcSql = [begin pack_preturi.asigura_politica_stoc(?pnIdUtil,?@pnIdPolitica); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
AMESSAGEBOX(goExecutor.oPrelucrareEroare(),16,"Eroare")
This.nIdPolitica = 0
Else
This.nIdPolitica = Nvl(pnIdPolitica,0)
Endif
Release pnIdUtil, pnIdPolitica
Return This.nIdPolitica
Endproc && asigura_politica
* citeste randul politicii de stoc pentru articol, contul dedus si conturile notei asociate
Procedure incarca
Lparameters tnIdArticol
Local lcSql, lnSucces
This.nIdArticol = tnIdArticol
This.lIncarcat = .F.
This.nPretFtva = 0
This.nPretCtva = 0
This.nProcTvav = (GetProcTvaStandard()+100)/100
This.lPreturiCuTva = .F.
This.nIdVenchelt = .NULL.
This.nIdNota = .NULL.
This.cScd = []
This.cScc = []
This.cContDedus = []
If This.asigura_politica() <= 0
Return .F.
Endif
lcSql = [select nvl(preturi_cu_tva,0) as preturi_cu_tva from crm_politici_preturi where id_pol = ] + Alltrim(Str(This.nIdPolitica))
If Used('crspreturi')
Use In crspreturi
Endif
lnSucces = goExecutor.oExecute(lcSql,[crspreturi])
If lnSucces >= 0 And Reccount('crspreturi') > 0
This.lPreturiCuTva = (crspreturi.preturi_cu_tva = 1)
Endif
If Used('crspreturi')
Use In crspreturi
Endif
lcSql = [select pretftva, pretctva, proc_tvav, id_venchelt, id_nota from crm_politici_pret_art ] + ;
[where id_pol = ] + Alltrim(Str(This.nIdPolitica)) + [ and id_articol = ] + Alltrim(Str(tnIdArticol))
If Used('crspolart')
Use In crspolart
Endif
lnSucces = goExecutor.oExecute(lcSql,[crspolart])
If lnSucces < 0
AMESSAGEBOX(goExecutor.oPrelucrareEroare(),16,"Eroare")
Return .F.
Endif
If Reccount('crspolart') > 0
This.nPretFtva = Nvl(crspolart.pretftva,0)
This.nPretCtva = Nvl(crspolart.pretctva,0)
This.nProcTvav = crspolart.proc_tvav
If !Isnull(crspolart.id_venchelt)
This.nIdVenchelt = crspolart.id_venchelt
Endif
If !Isnull(crspolart.id_nota)
This.nIdNota = crspolart.id_nota
Endif
Endif
If Used('crspolart')
Use In crspolart
Endif
If !Isnull(This.nIdNota)
lcSql = [select n.scd, n.scc from crm_note_vanzari v, note_contabile n ] + ;
[where v.id_nota = ] + Alltrim(Str(This.nIdNota)) + [ and n.id_set = v.id_set]
If Used('crsnotapol')
Use In crsnotapol
Endif
lnSucces = goExecutor.oExecute(lcSql,[crsnotapol])
If lnSucces >= 0 And Reccount('crsnotapol') > 0
This.cScd = Alltrim(Nvl(crsnotapol.scd,[]))
This.cScc = Alltrim(Nvl(crsnotapol.scc,[]))
Endif
If Used('crsnotapol')
Use In crsnotapol
Endif
Endif
lcSql = [select pack_facturare.cont_venit_articol_stoc(] + Alltrim(Str(tnIdArticol)) + [) as cont_dedus from dual]
If Used('crscontded')
Use In crscontded
Endif
lnSucces = goExecutor.oExecute(lcSql,[crscontded])
If lnSucces >= 0 And Reccount('crscontded') > 0
This.cContDedus = Alltrim(Nvl(crscontded.cont_dedus,[]))
Endif
If Used('crscontded')
Use In crscontded
Endif
This.lIncarcat = .T.
Return .T.
Endproc && incarca
* valideaza conturile si pretul curente; mesaj + .F. la refuz
Procedure valideaza
This.cEroare = []
If (!Empty(This.cScd) And Empty(This.cScc)) Or (Empty(This.cScd) And !Empty(This.cScc))
This.cEroare = [Trebuie completate ambele conturi (debit si credit) sau niciunul.]
Else
If This.nPretFtva < 0 Or This.nPretCtva < 0
This.cEroare = [Pretul nu poate fi negativ.]
Endif
Endif
If !Empty(This.cEroare)
AMESSAGEBOX(This.cEroare,0+48,"Atentie")
Return .F.
Endif
Return .T.
Endproc && valideaza
* scrie pretul si, daca sunt conturi, nota de vanzare aferenta; fara tranzactie proprie
Procedure salveaza
Lparameters tnIdArticol
Local lcSql, lnSucces
Private pnIdArticol, pnPretFtva, pnPretCtva, pnProcTvav, pnIdVenchelt, pnIdNota, pnScrieNota
If !This.valideaza()
Return .F.
Endif
If !Empty(This.cScd) And !Empty(This.cScc)
Private pcScd, pcScc, pnIdUtil
pcScd = This.cScd
pcScc = This.cScc
pnIdUtil = gnIdUtil
pnIdNota = 0
lcSql = [begin pack_preturi.gaseste_sau_creeaza_nota_vanzare(?pcScd,?pcScc,?pnIdUtil,?@pnIdNota); end;]
lnSucces = goExecutor.oExecute(lcSql)
Release pcScd, pcScc, pnIdUtil
If lnSucces < 0
AMESSAGEBOX(goExecutor.oPrelucrareEroare(),16,"Eroare")
Release pnIdArticol, pnPretFtva, pnPretCtva, pnProcTvav, pnIdVenchelt, pnIdNota, pnScrieNota
Return .F.
Endif
This.nIdNota = Nvl(pnIdNota,0)
Else
This.nIdNota = .NULL.
Endif
pnIdArticol = tnIdArticol
pnPretFtva = This.nPretFtva
pnPretCtva = This.nPretCtva
pnProcTvav = This.nProcTvav
pnIdVenchelt = This.nIdVenchelt
pnIdNota = This.nIdNota
pnScrieNota = Iif(This.lIncarcat, 1, 0)
lcSql = [begin pack_preturi.salveaza_pret_nomenclator(?pnIdArticol,?pnPretFtva,?pnPretCtva,?pnProcTvav,?pnIdVenchelt,?pnIdNota,?pnScrieNota); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
AMESSAGEBOX(goExecutor.oPrelucrareEroare(),16,"Eroare")
Endif
Release pnIdArticol, pnPretFtva, pnPretCtva, pnProcTvav, pnIdVenchelt, pnIdNota, pnScrieNota
Return (lnSucces >= 0)
Endproc && salveaza
* recalculeaza pretul opus (cu/fara TVA) dupa proc_tvav curent
Procedure recalculeaza_pret
Lparameters tnPret, tlSpreCuTva
Local lnProcTvav
lnProcTvav = Iif(Isnull(This.nProcTvav), (GetProcTvaStandard()+100)/100, This.nProcTvav)
If tlSpreCuTva
Return Round(tnPret * lnProcTvav, gnPc)
Endif
Return Round(tnPret / lnProcTvav, gnPc)
Endproc && recalculeaza_pret
* citeste scd/scc din nota curenta a politicii date (goala daca politica nu are nota)
Procedure incarca_nota_politica
Lparameters tnIdPol
Local lcSql, lnSucces
This.cScd = []
This.cScc = []
lcSql = [select n.scd, n.scc from crm_politici_preturi p, crm_note_vanzari v, note_contabile n ] + ;
[where p.id_pol = ] + Alltrim(Str(tnIdPol)) + [ and v.id_nota = p.id_nota and n.id_set = v.id_set]
If Used('crsnotapolstoc')
Use In crsnotapolstoc
Endif
lnSucces = goExecutor.oExecute(lcSql,[crsnotapolstoc])
If lnSucces >= 0 And Reccount('crsnotapolstoc') > 0
This.cScd = Alltrim(Nvl(crsnotapolstoc.scd,[]))
This.cScc = Alltrim(Nvl(crsnotapolstoc.scc,[]))
Endif
If Used('crsnotapolstoc')
Use In crsnotapolstoc
Endif
Return !Empty(This.cScd) And !Empty(This.cScc)
Endproc && incarca_nota_politica
* valideaza (ambele conturi sau niciunul) si scrie nota implicita a politicii date
Procedure salveaza_nota_politica
Lparameters tnIdPol, tcScd, tcScc
Local lcSql, lnSucces
If (!Empty(tcScd) And Empty(tcScc)) Or (Empty(tcScd) And !Empty(tcScc))
This.cEroare = [Trebuie completate ambele conturi (debit si credit) sau niciunul.]
AMESSAGEBOX(This.cEroare,0+48,"Atentie")
Return .F.
Endif
If Empty(tcScd) And Empty(tcScc)
Return .T.
Endif
Private pcScd, pcScc, pnIdUtil, pnIdNota, pnIdPol
pcScd = tcScd
pcScc = tcScc
pnIdUtil = gnIdUtil
pnIdNota = 0
lcSql = [begin pack_preturi.gaseste_sau_creeaza_nota_vanzare(?pcScd,?pcScc,?pnIdUtil,?@pnIdNota); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
AMESSAGEBOX(goExecutor.oPrelucrareEroare(),16,"Eroare")
Release pcScd, pcScc, pnIdUtil, pnIdNota, pnIdPol
Return .F.
Endif
pnIdPol = tnIdPol
lcSql = [begin pack_preturi.seteaza_nota_politica_stoc(?pnIdPol,?pnIdNota); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
AMESSAGEBOX(goExecutor.oPrelucrareEroare(),16,"Eroare")
Endif
Release pcScd, pcScc, pnIdUtil, pnIdNota, pnIdPol
Return (lnSucces >= 0)
Endproc && salveaza_nota_politica
Enddefine
****************************************** SFARSIT: cus_pret_nomenclator ****************************************
*********************************************************************************************************

View File

@@ -0,0 +1,626 @@
* probe_12b_s4b_matrice.prg
* Plan #12b, S4b - proba A (matrice, zero date) + "mutatie de control" pe pachetul de DINAINTE
* de S4b. Starea curenta a schemei (MARIUSM_AUTO) la data rularii: S4a aplicat (functia
* pack_facturare.cont_venit_articol_stoc exista), dar cursor_articol din contabilizeaza_articol
* NU citeste inca A.ID_NOTA, nu deduce SCC din cont si nu are garda FACT-033 - SCD/SCC/ASCD/ASCC
* vin azi INTOTDEAUNA din nota politicii (B.ID_NOTA), indiferent de politica sau de articol.
*
* Apeleaza direct pack_facturare.contabilizeaza_articol(v_row) cu un rand
* VANZARI_DETALII_TEMP%ROWTYPE construit in PL/SQL (fara sa treaca prin RPC-ul de adaugare
* linie/UI), citeste rezultatul din ACT_TEMP (GTT ON COMMIT DELETE ROWS) in aceeasi tranzactie
* manuala (Transactions=2). Fiecare caz care muta date (ID_NOTA pe rand sau pe politica, CONT pe
* articol) isi restaureaza mutatia INAUNTRUL propriului bloc PL/SQL (pe calea de succes SI pe
* exceptie, ca sa nu contamineze cazurile urmatoare cand acest script va fi rerulat dupa ce S4b
* va introduce chiar erorile FACT-033 asteptate) - ROLLBACK-ul final e doar plasa de siguranta.
*
* Asteptarile (valorile "S4b" din sectiunea 3 a planului) sunt calculate independent de codul
* testat: din baseline_12b.md sectiunea 6 (notele 5 si 6, statice) si din interogari separate
* (nota politicii reale, pack_facturare.GetAnaliticByGrupUtilizatori) - nu din cursor_articol.
*
* Rulare: powershell -ExecutionPolicy Bypass -File ruleaza_suita.ps1 -Nume probe_12b_s4b_matrice
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_12b_s4b_matrice.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
PUBLIC gcLog, gcCaz, gnPass, gnFail, gnTransOriginal, gcErrMsg
gcErrMsg = ""
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_12b_s4b_matrice.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gcCaz = ""
gnPass = 0
gnFail = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
gnIdUtil = 8
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle)
gnTransOriginal = SQLGETPROP(gnHandle, "Transactions")
SQLSETPROP(gnHandle, "Transactions", 2)
DO AfLog WITH "Transactions manual, original=" + TRANSFORM(gnTransOriginal)
*----------------------------------------------------------------------------------------
* precondition: nid_politica_stoc = 41 dupa initializeaza_facturare(8) - altfel ramurile
* "politica reala" ar trece tautologic (nimic nu ar mai fi cu adevarat "politica de stoc")
gcCaz = "[precondition] "
LOCAL lnOk, lcSql
* pack_facturare are propriile variabile de antet de document (nnumar_act, cserie_act, datele,
* nid_moneda_nationala, nperechec, nid_fdoc, nid_factc, nid_part, nid_partc, nid_set - toate
* NOT NULL in ACT_TEMP sau folosite in DECODE-uri care ajung acolo) - neinitializate de
* initializeaza_facturare (care seteaza doar politica de stoc) si nici de test_init_env_auto_*.
* Fara ele contabilizeaza_articol pica pe ORA-01400 (NRACT/PERECHEC/ID_SET) inainte sa ajunga la
* SCD/SCC - descoperit prin proba directa pe sqlplus, nu presupus.
lcSql = [begin pack_facturare.initializeaza_facturare(8); ] + ;
[if nvl(pack_facturare.nid_politica_stoc,0) <> 41 then raise_application_error(-20900,'nid_politica_stoc='||to_char(pack_facturare.nid_politica_stoc)); end if; ] + ;
[pack_facturare.nnumar_act := 999999; pack_facturare.cserie_act := 'TST'; ] + ;
[pack_facturare.ddata_ireg := sysdate; pack_facturare.ddata_act := sysdate; pack_facturare.ddata_scadenta := sysdate; ] + ;
[pack_facturare.nid_moneda_nationala := 3; pack_facturare.nperechec := 0; pack_facturare.nid_fdoc := 0; ] + ;
[pack_facturare.nid_factc := 0; pack_facturare.nid_part := 0; pack_facturare.nid_partc := 0; pack_facturare.nid_set := 25000; ] + ;
[pack_facturare.nid_sectie_stoc := nvl(pack_facturare.nid_sectie_stoc,1); end;]
lnOk = SQLEXEC(gnHandle, lcSql)
DO Verdict WITH lnOk > 0, "initializeaza_facturare(8) + antet document proba + precondition nid_politica_stoc=41"
IF lnOk <= 0
DO AfLog WITH "BLOCAT: precondition esuata, opresc"
DO Final
ENDIF
*----------------------------------------------------------------------------------------
* descoperire (read-only): articolul singurei politici 32/33, politica reala a articolului 1
* (D5), nota acelei politici reale, si analiticele de grup (GetAnaliticByGrupUtilizatori) pentru
* conturile folosite mai jos - toate independente de cursor_articol
gcCaz = "[descoperire] "
LOCAL lnArtPol32, lnArtPol33, lnPolReala1, lnNotaRealaOrig
lnArtPol32 = 0
lnArtPol33 = 0
lnPolReala1 = 0
lnNotaRealaOrig = 0
lnOk = SQLEXEC(gnHandle, "select id_articol from crm_politici_pret_art where id_pol = 32 and rownum = 1", "crsp32")
IF lnOk > 0 AND USED('crsp32') AND RECCOUNT('crsp32') = 1
lnArtPol32 = crsp32.id_articol
ENDIF
IF USED('crsp32')
USE IN crsp32
ENDIF
DO AfLog WITH "articol politica 32 (HOTEL TAXE) = " + TRANSFORM(lnArtPol32)
lnOk = SQLEXEC(gnHandle, "select id_articol from crm_politici_pret_art where id_pol = 33 and rownum = 1", "crsp33")
IF lnOk > 0 AND USED('crsp33') AND RECCOUNT('crsp33') = 1
lnArtPol33 = crsp33.id_articol
ENDIF
IF USED('crsp33')
USE IN crsp33
ENDIF
DO AfLog WITH "articol politica 33 (HOTEL CAZARE) = " + TRANSFORM(lnArtPol33)
lnOk = SQLEXEC(gnHandle, "select id_pol from crm_politici_pret_art where id_articol = 1 and id_pol <> 41 and rownum = 1", "crspr1")
IF lnOk > 0 AND USED('crspr1') AND RECCOUNT('crspr1') = 1
lnPolReala1 = crspr1.id_pol
ENDIF
IF USED('crspr1')
USE IN crspr1
ENDIF
DO AfLog WITH "politica reala a articolului 1 (D5) = " + TRANSFORM(lnPolReala1)
IF lnArtPol32 = 0 OR lnArtPol33 = 0 OR lnPolReala1 = 0
DO AfLog WITH "BLOCAT: descoperire incompleta (art32=" + TRANSFORM(lnArtPol32) + " art33=" + TRANSFORM(lnArtPol33) + " polreala1=" + TRANSFORM(lnPolReala1) + ")"
DO Final
ENDIF
LOCAL lcScdReal, lcAscdReal, lcSccReal, lcAsccReal
lcScdReal = ""
lcAscdReal = ""
lcSccReal = ""
lcAsccReal = ""
lcSql = "select b.id_nota, nvl(d.scd,'<NULL>') scd, nvl(d.ascd,'<NULL>') ascd, nvl(d.scc,'<NULL>') scc, nvl(d.ascc,'<NULL>') ascc" + ;
" from crm_politici_preturi b join crm_note_vanzari c on b.id_nota = c.id_nota join note_contabile d on c.id_set = d.id_set" + ;
" where b.id_pol = " + TRANSFORM(lnPolReala1)
lnOk = SQLEXEC(gnHandle, lcSql, "crsnr")
IF lnOk > 0 AND USED('crsnr') AND RECCOUNT('crsnr') = 1
lnNotaRealaOrig = crsnr.id_nota
lcScdReal = ALLTRIM(crsnr.scd)
lcAscdReal = ALLTRIM(crsnr.ascd)
lcSccReal = ALLTRIM(crsnr.scc)
lcAsccReal = ALLTRIM(crsnr.ascc)
ELSE
DO AfLog WITH "BLOCAT: nu am gasit nota politicii reale " + TRANSFORM(lnPolReala1)
DO Final
ENDIF
IF USED('crsnr')
USE IN crsnr
ENDIF
DO AfLog WITH "nota politicii reale " + TRANSFORM(lnPolReala1) + " = id_nota " + TRANSFORM(lnNotaRealaOrig) + " SCD=" + lcScdReal + " ASCD=" + lcAscdReal + " SCC=" + lcSccReal + " ASCC=" + lcAsccReal
LOCAL lcAsc4111, lcAsc461, lcAsc7583, lcAsc707, lcAsc7015, lcAsc418, lcAscScdReal, lcAscSccReal
lcSql = "select nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'4111'),'<NULL>') a1, nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'461'),'<NULL>') a2," + ;
" nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'7583'),'<NULL>') a3, nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'707'),'<NULL>') a4," + ;
" nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'7015'),'<NULL>') a5, nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'418'),'<NULL>') a6," + ;
" nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'" + lcScdReal + "'),'<NULL>') a7, nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'" + lcSccReal + "'),'<NULL>') a8" + ;
" from dual"
lnOk = SQLEXEC(gnHandle, lcSql, "crsga")
IF lnOk > 0 AND USED('crsga') AND RECCOUNT('crsga') = 1
lcAsc4111 = ALLTRIM(crsga.a1)
lcAsc461 = ALLTRIM(crsga.a2)
lcAsc7583 = ALLTRIM(crsga.a3)
lcAsc707 = ALLTRIM(crsga.a4)
lcAsc7015 = ALLTRIM(crsga.a5)
lcAsc418 = ALLTRIM(crsga.a6)
lcAscScdReal = ALLTRIM(crsga.a7)
lcAscSccReal = ALLTRIM(crsga.a8)
ELSE
DO AfLog WITH "BLOCAT: nu am putut citi analiticele de grup"
DO Final
ENDIF
IF USED('crsga')
USE IN crsga
ENDIF
* fallback NVL ca in cod: daca nota nu are ASCD/ASCC propriu, cel efectiv e cel din grup
IF lcAscdReal == "<NULL>"
lcAscdReal = lcAscScdReal
ENDIF
IF lcAsccReal == "<NULL>"
lcAsccReal = lcAscSccReal
ENDIF
DO AfLog WITH "GetAnaliticByGrupUtilizatori(8,.): 4111=" + lcAsc4111 + " 461=" + lcAsc461 + " 7583=" + lcAsc7583 + " 707=" + lcAsc707 + " 7015=" + lcAsc7015 + " 418=" + lcAsc418
DO AfLog WITH "ASCD/ASCC efective (dupa fallback NVL) ale politicii reale " + TRANSFORM(lnPolReala1) + ": ASCD=" + lcAscdReal + " ASCC=" + lcAsccReal
* nota 6 (PRODUCTIE, politica 41) si nota 5 (VANZARE MARFA) - statice, din baseline_12b.md sect. 6
LOCAL lcN6Scd, lcN6Ascd, lcN6Scc, lcN6Ascc, lcN5Scd, lcN5Ascd, lcN5Scc, lcN5Ascc
lcN6Scd = "4111"
lcN6Ascd = lcAsc4111 && nota 6 are ASCD gol -> fallback grup
lcN6Scc = "7015"
lcN6Ascc = lcAsc7015 && nota 6 are ASCC gol -> fallback grup
lcN5Scd = "4111"
lcN5Ascd = "11"
lcN5Scc = "707"
lcN5Ascc = "11"
*----------------------------------------------------------------------------------------
* CAZ 1: nota pe rand (A.ID_NOTA) 461=7583, creata in tranzactie pe un articol fara nota proprie
* Tinta S4b (D10 regula 1): SCD/SCC/ASCD/ASCC din nota RANDULUI = 461/7583/asc461/asc7583
gcCaz = "[caz1-nota-pe-rand-461-7583] "
lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; v_id_nota crm_note_vanzari.id_nota%TYPE; v_id_set crm_note_vanzari.id_set%TYPE; ] + ;
[BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901000; ] + ;
[INSERT INTO crm_note_vanzari (denumire, id_util, id_sectie, dataora) VALUES ('PROBA S4B CAZ1', 8, 1, SYSDATE) RETURNING id_nota, id_set INTO v_id_nota, v_id_set; ] + ;
[INSERT INTO note_contabile (explicatie, scd, scc, ordine, cu_tva, ptva, id_set, in_valuta, id_jtva_coloana) VALUES ('PROBA S4B CAZ1', '461', '7583', 1, 1, 21, v_id_set, 0, 35); ] + ;
[UPDATE crm_politici_pret_art SET id_nota = v_id_nota WHERE id_pol = 41 AND id_articol = 4294507216; ] + ;
[v_row.id_pol := 41; v_row.id_articol := 4294507216; v_row.cont_venit := NULL; ] + ;
[v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ;
[v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ;
[v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ1'; v_row.proc_tvav := 1.19; ] + ;
[BEGIN v_res := pack_facturare.contabilizeaza_articol(v_row); ] + ;
[EXCEPTION WHEN OTHERS THEN UPDATE crm_politici_pret_art SET id_nota = NULL WHERE id_pol = 41 AND id_articol = 4294507216; RAISE; END; ] + ;
[UPDATE crm_politici_pret_art SET id_nota = NULL WHERE id_pol = 41 AND id_articol = 4294507216; END;]
lnOk = SQLEXEC(gnHandle, lcSql)
DO Verdict WITH lnOk > 0, "apelul a trecut fara eroare (azi nicio garda pe nota randului)"
IF lnOk > 0
DO LeaActTemp WITH -900999
IF USED('crsact') AND RECCOUNT('crsact') = 1
DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " ASCD=" + ALLTRIM(crsact.ascd) + " SCC=" + ALLTRIM(crsact.scc) + " ASCC=" + ALLTRIM(crsact.ascc)
DO AfLog WITH "asteptat S4b: SCD=461 ASCD=" + lcAsc461 + " SCC=7583 ASCC=" + lcAsc7583
DO Verdict WITH ALLTRIM(crsact.scd) == "461" AND ALLTRIM(crsact.scc) == "7583", "SCD/SCC = nota randului (461/7583) - tinta S4b regula 1"
ELSE
DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)"
ENDIF
ENDIF
IF USED('crsact')
USE IN crsact
ENDIF
*----------------------------------------------------------------------------------------
* CAZ 2: articol CONT=371 (CORESP->707) pe politica 41, cu nota 5 (ASCC=11) fortata temporar ca
* nota implicita a politicii 41. Tinta S4b (D10 regula 2): SCC=707 (dedus), ASCC din grup - NU 11
gcCaz = "[caz2-cont371-nota5-ascc-grup] "
lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; v_orig NUMBER; ] + ;
[BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901100; ] + ;
[SELECT id_nota INTO v_orig FROM crm_politici_preturi WHERE id_pol = 41; ] + ;
[UPDATE crm_politici_preturi SET id_nota = 5 WHERE id_pol = 41; ] + ;
[v_row.id_pol := 41; v_row.id_articol := 2910202427; v_row.cont_venit := NULL; ] + ;
[v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ;
[v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ;
[v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ2'; v_row.proc_tvav := 1.19; ] + ;
[BEGIN v_res := pack_facturare.contabilizeaza_articol(v_row); ] + ;
[EXCEPTION WHEN OTHERS THEN UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = 41; RAISE; END; ] + ;
[UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = 41; END;]
lnOk = SQLEXEC(gnHandle, lcSql)
DO Verdict WITH lnOk > 0, "apelul a trecut fara eroare"
IF lnOk > 0
DO LeaActTemp WITH -901099
IF USED('crsact') AND RECCOUNT('crsact') = 1
DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " ASCD=" + ALLTRIM(crsact.ascd) + " SCC=" + ALLTRIM(crsact.scc) + " ASCC=" + ALLTRIM(crsact.ascc)
DO AfLog WITH "asteptat S4b: SCD=" + lcN5Scd + " ASCD=" + lcN5Ascd + " SCC=707 ASCC(grup)=" + lcAsc707 + " [azi foloseste ASCC-ul notei=11, nu grupul]"
DO Verdict WITH ALLTRIM(crsact.scc) == "707" AND ALLTRIM(crsact.ascc) == lcAsc707, "SCC dedus (707) SI ASCC din grup (nu 11 din nota) - tinta S4b regula 2"
ELSE
DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)"
ENDIF
ENDIF
IF USED('crsact')
USE IN crsact
ENDIF
*----------------------------------------------------------------------------------------
* CAZ 3: articol scratch (4294507213, DISCOUNT) cu CONT temporar '707' (incepe cu 7 -> dedus =
* el insusi), pe politica 41 cu nota implicita neatinsa (nota 6). Tinta S4b: SCC=707 (dedus),
* nu 7015 (nota politicii, cum e azi)
gcCaz = "[caz3-cont707-dedus] "
lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; v_orig_cont nom_articole.cont%TYPE; ] + ;
[BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901200; ] + ;
[SELECT cont INTO v_orig_cont FROM nom_articole WHERE id_articol = 4294507213; ] + ;
[UPDATE nom_articole SET cont = '707' WHERE id_articol = 4294507213; ] + ;
[v_row.id_pol := 41; v_row.id_articol := 4294507213; v_row.cont_venit := NULL; ] + ;
[v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ;
[v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ;
[v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ3'; v_row.proc_tvav := 1.19; ] + ;
[BEGIN v_res := pack_facturare.contabilizeaza_articol(v_row); ] + ;
[EXCEPTION WHEN OTHERS THEN UPDATE nom_articole SET cont = v_orig_cont WHERE id_articol = 4294507213; RAISE; END; ] + ;
[UPDATE nom_articole SET cont = v_orig_cont WHERE id_articol = 4294507213; END;]
lnOk = SQLEXEC(gnHandle, lcSql)
DO Verdict WITH lnOk > 0, "apelul a trecut fara eroare"
IF lnOk > 0
DO LeaActTemp WITH -901199
IF USED('crsact') AND RECCOUNT('crsact') = 1
DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " ASCD=" + ALLTRIM(crsact.ascd) + " SCC=" + ALLTRIM(crsact.scc) + " ASCC=" + ALLTRIM(crsact.ascc)
DO AfLog WITH "asteptat S4b: SCD=" + lcN6Scd + " ASCD=" + lcN6Ascd + " SCC=707 ASCC(grup)=" + lcAsc707
DO Verdict WITH ALLTRIM(crsact.scc) == "707", "SCC = cont dedus (707), nu nota politicii (7015) - tinta S4b regula 2"
ELSE
DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)"
ENDIF
ENDIF
IF USED('crsact')
USE IN crsact
ENDIF
*----------------------------------------------------------------------------------------
* CAZ 4: articol fara cont (CONT NULL), pe politica 41, fara nicio mutatie. Tinta S4b (regula 3,
* fallback) = nota politicii = azi (4111/7015) - neschimbat de S4b
gcCaz = "[caz4-faracont-notapolitica] "
lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; ] + ;
[BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901300; ] + ;
[v_row.id_pol := 41; v_row.id_articol := 4294507216; v_row.cont_venit := NULL; ] + ;
[v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ;
[v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ;
[v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ4'; v_row.proc_tvav := 1.19; ] + ;
[v_res := pack_facturare.contabilizeaza_articol(v_row); END;]
lnOk = SQLEXEC(gnHandle, lcSql)
DO Verdict WITH lnOk > 0, "apelul a trecut fara eroare"
IF lnOk > 0
DO LeaActTemp WITH -901299
IF USED('crsact') AND RECCOUNT('crsact') = 1
DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " ASCD=" + ALLTRIM(crsact.ascd) + " SCC=" + ALLTRIM(crsact.scc) + " ASCC=" + ALLTRIM(crsact.ascc)
DO AfLog WITH "asteptat S4b: SCD=" + lcN6Scd + " ASCD=" + lcN6Ascd + " SCC=" + lcN6Scc + " ASCC=" + lcN6Ascc
DO Verdict WITH ALLTRIM(crsact.scd) == lcN6Scd AND ALLTRIM(crsact.scc) == lcN6Scc, "SCD/SCC = nota politicii (4111/7015) - neschimbat de S4b"
ELSE
DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)"
ENDIF
ENDIF
IF USED('crsact')
USE IN crsact
ENDIF
*----------------------------------------------------------------------------------------
* CAZ 5: politica de stoc cu ID_NOTA (al politicii) NULL temporar + articol fara cont. Tinta S4b:
* FACT-033 (SCC final NULL -> refuz). Azi: nicio garda, linia se scrie cu SCD/SCC NULL (gaura V2)
gcCaz = "[caz5-politicastoc-faranota-faracont] "
lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; v_orig NUMBER; ] + ;
[BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901400; ] + ;
[SELECT id_nota INTO v_orig FROM crm_politici_preturi WHERE id_pol = 41; ] + ;
[UPDATE crm_politici_preturi SET id_nota = NULL WHERE id_pol = 41; ] + ;
[v_row.id_pol := 41; v_row.id_articol := 4294507216; v_row.cont_venit := NULL; ] + ;
[v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ;
[v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ;
[v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ5'; v_row.proc_tvav := 1.19; ] + ;
[BEGIN v_res := pack_facturare.contabilizeaza_articol(v_row); ] + ;
[EXCEPTION WHEN OTHERS THEN UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = 41; RAISE; END; ] + ;
[UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = 41; END;]
lnOk = SQLEXEC(gnHandle, lcSql)
IF lnOk <= 0
DO LogErr
DO Verdict WITH .T., "S4b implementat: garda a refuzat linia fara cont de venit (asteptarea planului)"
DO VerifMesajFact033 WITH 4294507216, 41
ELSE
DO LeaActTemp WITH -901399
IF USED('crsact') AND RECCOUNT('crsact') = 1
DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " SCC=" + ALLTRIM(crsact.scc) + " (asteptat S4b: eroare FACT-033, nicio linie)"
DO Verdict WITH .F., "FACT-033 absenta - linia s-a scris cu SCD/SCC NULL (gaura V2, S4b trebuie sa o astupe)"
ELSE
DO Verdict WITH .F., "nicio linie si nicio eroare (neasteptat)"
ENDIF
ENDIF
IF USED('crsact')
USE IN crsact
ENDIF
*----------------------------------------------------------------------------------------
* CAZ 6: nota politicii cu AL DOILEA rand adaugat in NOTE_CONTABILE (acelasi ID_SET). Tinta S4b:
* FACT-033 (garda pe nota cu mai mult de un rand). Azi: WHILE cursor_articol%FOUND dubleaza
* venitul - 2 randuri in ACT_TEMP, fara nicio eroare
gcCaz = "[caz6-nota-dublu-rand] "
lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; v_orig NUMBER; v_id_nota crm_note_vanzari.id_nota%TYPE; v_id_set crm_note_vanzari.id_set%TYPE; ] + ;
[BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901500; ] + ;
[SELECT id_nota INTO v_orig FROM crm_politici_preturi WHERE id_pol = 41; ] + ;
[INSERT INTO crm_note_vanzari (denumire, id_util, id_sectie, dataora) VALUES ('PROBA S4B CAZ6', 8, 1, SYSDATE) RETURNING id_nota, id_set INTO v_id_nota, v_id_set; ] + ;
[INSERT INTO note_contabile (explicatie, scd, scc, ordine, cu_tva, ptva, id_set, in_valuta, id_jtva_coloana) VALUES ('PROBA S4B CAZ6 rand1', '461', '7583', 1, 1, 21, v_id_set, 0, 35); ] + ;
[INSERT INTO note_contabile (explicatie, scd, scc, ordine, cu_tva, ptva, id_set, in_valuta, id_jtva_coloana) VALUES ('PROBA S4B CAZ6 rand2', '462', '7584', 2, 1, 21, v_id_set, 0, 35); ] + ;
[UPDATE crm_politici_preturi SET id_nota = v_id_nota WHERE id_pol = 41; ] + ;
[v_row.id_pol := 41; v_row.id_articol := 4294507216; v_row.cont_venit := NULL; ] + ;
[v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ;
[v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ;
[v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ6'; v_row.proc_tvav := 1.19; ] + ;
[BEGIN v_res := pack_facturare.contabilizeaza_articol(v_row); ] + ;
[EXCEPTION WHEN OTHERS THEN UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = 41; RAISE; END; ] + ;
[UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = 41; END;]
lnOk = SQLEXEC(gnHandle, lcSql)
IF lnOk <= 0
DO LogErr
DO Verdict WITH .T., "S4b implementat: garda a refuzat nota cu mai mult de un rand (asteptarea planului)"
DO VerifMesajFact033 WITH 4294507216, 41
ELSE
LOCAL lnCnt
lnCnt = 0
IF USED('crscnt')
USE IN crscnt
ENDIF
lnOk = SQLEXEC(gnHandle, "select count(*) cnt from act_temp where id_act between -901499 and -901498", "crscnt")
IF lnOk > 0 AND USED('crscnt')
lnCnt = crscnt.cnt
ENDIF
IF USED('crscnt')
USE IN crscnt
ENDIF
DO AfLog WITH "obtinut azi: " + TRANSFORM(lnCnt) + " randuri in ACT_TEMP (asteptat S4b: 0, eroare FACT-033)"
IF lnCnt = 2
DO LeaActTemp WITH -901499
IF USED('crsact') AND RECCOUNT('crsact') = 1
DO AfLog WITH " rand1: SCD=" + ALLTRIM(crsact.scd) + " SCC=" + ALLTRIM(crsact.scc)
ENDIF
IF USED('crsact')
USE IN crsact
ENDIF
DO LeaActTemp WITH -901498
IF USED('crsact') AND RECCOUNT('crsact') = 1
DO AfLog WITH " rand2: SCD=" + ALLTRIM(crsact.scd) + " SCC=" + ALLTRIM(crsact.scc)
ENDIF
IF USED('crsact')
USE IN crsact
ENDIF
ENDIF
DO Verdict WITH .F., "FACT-033 absenta - venitul se dubleaza tacut (" + TRANSFORM(lnCnt) + " randuri), S4b trebuie sa refuze"
ENDIF
*----------------------------------------------------------------------------------------
* CAZ 7: acelasi articol D5 (id=1, CONT=371) pe politica REALA (nu de stoc), fara nicio mutatie.
* Tinta S4b: nota politicii reale, neschimbata - regulile D9/D10 nu ating politicile reale
gcCaz = "[caz7-articol1-politica-reala] "
lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; ] + ;
[BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901600; ] + ;
[v_row.id_pol := ] + TRANSFORM(lnPolReala1) + [; v_row.id_articol := 1; v_row.cont_venit := NULL; ] + ;
[v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ;
[v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ;
[v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ7'; v_row.proc_tvav := 1.19; ] + ;
[v_res := pack_facturare.contabilizeaza_articol(v_row); END;]
lnOk = SQLEXEC(gnHandle, lcSql)
DO Verdict WITH lnOk > 0, "apelul a trecut fara eroare"
IF lnOk > 0
DO LeaActTemp WITH -901599
IF USED('crsact') AND RECCOUNT('crsact') = 1
DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " ASCD=" + ALLTRIM(crsact.ascd) + " SCC=" + ALLTRIM(crsact.scc) + " ASCC=" + ALLTRIM(crsact.ascc)
DO AfLog WITH "asteptat (azi si dupa S4b, neschimbat): SCD=" + lcScdReal + " ASCD=" + lcAscdReal + " SCC=" + lcSccReal + " ASCC=" + lcAsccReal
DO Verdict WITH ALLTRIM(crsact.scd) == lcScdReal AND ALLTRIM(crsact.scc) == lcSccReal, "SCD/SCC = nota politicii reale, neschimbat de S4b"
ELSE
DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)"
ENDIF
ENDIF
IF USED('crsact')
USE IN crsact
ENDIF
*----------------------------------------------------------------------------------------
* CAZ 8: politica 32 (HOTEL TAXE), fara nota deloc. Tinta S4b: FACT-033. Azi: SCD/SCC NULL, fara eroare
gcCaz = "[caz8-politica32-faranota] "
lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; ] + ;
[BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901700; ] + ;
[v_row.id_pol := 32; v_row.id_articol := ] + TRANSFORM(lnArtPol32) + [; v_row.cont_venit := NULL; ] + ;
[v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ;
[v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ;
[v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ8'; v_row.proc_tvav := 1.19; ] + ;
[v_res := pack_facturare.contabilizeaza_articol(v_row); END;]
lnOk = SQLEXEC(gnHandle, lcSql)
IF lnOk <= 0
DO LogErr
DO Verdict WITH .T., "S4b implementat: garda a refuzat politica 32 fara nota (asteptarea planului)"
DO VerifMesajFact033 WITH lnArtPol32, 32
ELSE
DO LeaActTemp WITH -901699
IF USED('crsact') AND RECCOUNT('crsact') = 1
DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " SCC=" + ALLTRIM(crsact.scc) + " (asteptat S4b: eroare FACT-033)"
ENDIF
DO Verdict WITH .F., "FACT-033 absenta - politica reala fara nota trece tacut azi"
ENDIF
IF USED('crsact')
USE IN crsact
ENDIF
*----------------------------------------------------------------------------------------
* CAZ 9: politica 33 (HOTEL CAZARE), fara nota deloc. Tinta S4b: FACT-033. Azi: idem caz 8
gcCaz = "[caz9-politica33-faranota] "
lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; ] + ;
[BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901800; ] + ;
[v_row.id_pol := 33; v_row.id_articol := ] + TRANSFORM(lnArtPol33) + [; v_row.cont_venit := NULL; ] + ;
[v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ;
[v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ;
[v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ9'; v_row.proc_tvav := 1.19; ] + ;
[v_res := pack_facturare.contabilizeaza_articol(v_row); END;]
lnOk = SQLEXEC(gnHandle, lcSql)
IF lnOk <= 0
DO LogErr
DO Verdict WITH .T., "S4b implementat: garda a refuzat politica 33 fara nota (asteptarea planului)"
DO VerifMesajFact033 WITH lnArtPol33, 33
ELSE
DO LeaActTemp WITH -901799
IF USED('crsact') AND RECCOUNT('crsact') = 1
DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " SCC=" + ALLTRIM(crsact.scc) + " (asteptat S4b: eroare FACT-033)"
ENDIF
DO Verdict WITH .F., "FACT-033 absenta - politica reala fara nota trece tacut azi"
ENDIF
IF USED('crsact')
USE IN crsact
ENDIF
*----------------------------------------------------------------------------------------
* CAZ 10: politica reala D5 (a articolului 1) cu ID_NOTA pus pe NULL temporar. Tinta S4b:
* FACT-033 (garda "pe orice politica", nu doar de stoc). Azi: SCD/SCC NULL, fara eroare
gcCaz = "[caz10-politicareala-notanull] "
lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; v_orig NUMBER; ] + ;
[BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901900; ] + ;
[SELECT id_nota INTO v_orig FROM crm_politici_preturi WHERE id_pol = ] + TRANSFORM(lnPolReala1) + [; ] + ;
[UPDATE crm_politici_preturi SET id_nota = NULL WHERE id_pol = ] + TRANSFORM(lnPolReala1) + [; ] + ;
[v_row.id_pol := ] + TRANSFORM(lnPolReala1) + [; v_row.id_articol := 1; v_row.cont_venit := NULL; ] + ;
[v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ;
[v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ;
[v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ10'; v_row.proc_tvav := 1.19; ] + ;
[BEGIN v_res := pack_facturare.contabilizeaza_articol(v_row); ] + ;
[EXCEPTION WHEN OTHERS THEN UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = ] + TRANSFORM(lnPolReala1) + [; RAISE; END; ] + ;
[UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = ] + TRANSFORM(lnPolReala1) + [; END;]
lnOk = SQLEXEC(gnHandle, lcSql)
IF lnOk <= 0
DO LogErr
DO Verdict WITH .T., "S4b implementat: garda a refuzat politica reala fara nota (asteptarea planului)"
DO VerifMesajFact033 WITH 1, lnPolReala1
ELSE
DO LeaActTemp WITH -901899
IF USED('crsact') AND RECCOUNT('crsact') = 1
DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " SCC=" + ALLTRIM(crsact.scc) + " (asteptat S4b: eroare FACT-033)"
ENDIF
DO Verdict WITH .F., "FACT-033 absenta - garda azi nu exista pe nicio politica"
ENDIF
IF USED('crsact')
USE IN crsact
ENDIF
* verificare restaurare politica reala (defensiv, inainte de ROLLBACK-ul final)
lnOk = SQLEXEC(gnHandle, "select id_nota from crm_politici_preturi where id_pol = " + TRANSFORM(lnPolReala1), "crschk")
IF lnOk > 0 AND USED('crschk') AND RECCOUNT('crschk') = 1
DO Verdict WITH crschk.id_nota == lnNotaRealaOrig, "restaurare in tranzactie: politica reala " + TRANSFORM(lnPolReala1) + " are din nou id_nota=" + TRANSFORM(lnNotaRealaOrig)
ENDIF
IF USED('crschk')
USE IN crschk
ENDIF
*----------------------------------------------------------------------------------------
* CAZ 11 (aviz, ntip=22): articol CONT=371 (CORESP->707) pe politica 41, nota implicita restaurata
* (nota 6). SCD e fortat 418 pe avize INDIFERENT de S4b (cod neschimbat); SCC: azi=nota (7015),
* tinta S4b=dedus (707)
gcCaz = "[caz11-aviz-scd418-sccdedus] "
lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; ] + ;
[BEGIN pack_facturare.ntip := 22; pack_facturare.nid_act := -902000; ] + ;
[v_row.id_pol := 41; v_row.id_articol := 2910202427; v_row.cont_venit := NULL; ] + ;
[v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ;
[v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ;
[v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ11'; v_row.proc_tvav := 1.19; ] + ;
[v_res := pack_facturare.contabilizeaza_articol(v_row); END;]
lnOk = SQLEXEC(gnHandle, lcSql)
DO Verdict WITH lnOk > 0, "apelul a trecut fara eroare"
IF lnOk > 0
DO LeaActTemp WITH -901999
IF USED('crsact') AND RECCOUNT('crsact') = 1
DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " ASCD=" + ALLTRIM(crsact.ascd) + " SCC=" + ALLTRIM(crsact.scc) + " ASCC=" + ALLTRIM(crsact.ascc)
DO AfLog WITH "asteptat S4b: SCD=418 ASCD=" + lcAsc418 + " SCC=707 ASCC(grup)=" + lcAsc707
DO Verdict WITH ALLTRIM(crsact.scd) == "418", "SCD=418 pe aviz - neschimbat de S4b (cod deja existent)"
DO Verdict WITH ALLTRIM(crsact.scc) == "707", "SCC = cont dedus (707), nu nota politicii (7015) - tinta S4b regula 2, valabila si pe aviz"
ELSE
DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)"
ENDIF
ENDIF
IF USED('crsact')
USE IN crsact
ENDIF
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE LogErr
LOCAL laErr[1]
AERROR(laErr)
gcErrMsg = TRANSFORM(laErr[2])
DO AfLog WITH " eroare reala: " + TRANSFORM(laErr[1]) + " / " + gcErrMsg
ENDPROC
PROCEDURE VerifMesajFact033
* verifica ca mesajul FACT-033 (gcErrMsg, populat de LogErr) numeste articolul si politica -
* denumirile vin din tabele, in afara pachetului testat
LPARAMETERS tnIdArticol, tnIdPol
LOCAL lcDenArt, lcDenPol
lcDenArt = ""
lcDenPol = ""
IF USED('crsver')
USE IN crsver
ENDIF
IF SQLEXEC(gnHandle, "select denumire from nom_articole where id_articol = " + TRANSFORM(tnIdArticol), "crsver") > 0 AND USED('crsver')
lcDenArt = ALLTRIM(crsver.denumire)
ENDIF
IF USED('crsver')
USE IN crsver
ENDIF
IF SQLEXEC(gnHandle, "select nume_lista_preturi from crm_politici_preturi where id_pol = " + TRANSFORM(tnIdPol), "crsver") > 0 AND USED('crsver')
lcDenPol = ALLTRIM(crsver.nume_lista_preturi)
ENDIF
IF USED('crsver')
USE IN crsver
ENDIF
DO Verdict WITH !EMPTY(lcDenArt) AND !EMPTY(lcDenPol) AND lcDenArt $ gcErrMsg AND lcDenPol $ gcErrMsg, ;
"mesajul FACT-033 numeste articolul (" + lcDenArt + ") si politica (" + lcDenPol + "): " + gcErrMsg
ENDPROC
PROCEDURE LeaActTemp
LPARAMETERS tnIdAct
LOCAL lnRet
IF USED('crsact')
USE IN crsact
ENDIF
lnRet = SQLEXEC(gnHandle, "select nvl(scd,'<NULL>') scd, nvl(ascd,'<NULL>') ascd, nvl(scc,'<NULL>') scc, nvl(ascc,'<NULL>') ascc from act_temp where id_act = " + TRANSFORM(tnIdAct), "crsact")
RETURN lnRet
ENDPROC
PROCEDURE Verdict
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
LOCAL lnOk
gcCaz = "[final] "
lnOk = SQLEXEC(gnHandle, "ROLLBACK")
DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk)
IF TYPE('gnTransOriginal') = 'N'
SQLSETPROP(gnHandle, "Transactions", gnTransOriginal)
ENDIF
DO AfLog WITH "TOTAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,763 @@
* probe_12b_s4b_proba_b_dupa.prg
* Plan 12b, S4b partea 3 - Proba B "DUPA": copie a probe_12b_s4b_proba_b_inainte.prg (mecanica
* nemodificata), aceeasi emitere reala (tip_incasare=1, "Fara incasare", forma veche) - client
* RAJA (id_part=463), plaja utilizatorului 8. Se ruleaza PE PACHETUL NOU (wip12_07, D10 aplicat),
* ca sa produca documentul comparat cu cel "inainte" (id_vanzare=1883) prin
* lib_comparatie_documente.CompAct.
*
* Criteriul 1 de "gata" al S3b, PROBA REALA (nu structurala): emite documente REALE in Oracle
* (MARIUSM_AUTO@ROA_CENTRAL, aprobat explicit de Marius) prin fluxul de emitere efectiv, pe
* fiecare din cele patru tipuri de incasare (1=Fara incasare, 2=Chitanta, 3=Bon fiscal, 4=POS/Card),
* o data pe formularul vechi (frm_facturare_articole) si o data pe cel unificat
* (frm_facturare_articole2), si compara randurile persistate in VANZARI dupa commit.
*
* Sursa documentului e cursor_preturi (lista de preturi, client RAJA id_part=463) cu tnTip=22 -
* singura combinatie confirmata prin proba read-only (probe_emitere_reala.prg) ca intoarce articole
* in acest mediu; tnTip=5 (FACTURA direct) da Reccount=0. Numerotarea/serie a documentului ramane
* cea naturala pentru tnTip=22 (AVIZ, nIdTipDoc=6, plaja globala) - neatinsa, nu conteaza pentru
* criteriul de paritate a INCASARII, care e independent de seria documentului.
*
* Mecanica bazata pe COMUN\utile\Teste\editare_factura\creeaza_documente_s8.prg (mediu Oracle real
* + clase de productie, dovedit ca emite documente reale pentru tnTip=22): dialogul modal de antet
* e inlocuit cu setare directa poDate (ca acolo), iar "Do Form verificare" (ofacturare.vc2:14404 /
* :20126) e ocolit cu acelasi stub versionat COMUN\utile\Teste\achizitie_import\stub_verificare\
* (SET PATH cu el primul).
*
* Diferenta fata de creeaza_documente_s8.prg: al doilea modal (frm_alte_date, doar pe calea veche)
* NU e doar "confirmat" - un driver pe Timer ii seteaza opt_incasat.Value la tipul cerut INAINTE
* sa-i cheme do_termin(), exact tehnica validata structural in test_s3b_paritate_emitere.prg (setarea
* de .Value declanseaza opt_incasat.ProgrammaticChange -> actualizeaza_tipincasare(), cod real).
* Pe calea noua nu exista al doilea modal (opt_incasat e inline pe formular): se seteaza direct pe
* goFrm inainte de goFrm.do_termin().
*
* De ce NU se compara nr_incasare/NR_INCASAT intre vechi si nou (asa cum a facut suita structurala):
* acolo numerele erau dezalocate dupa fiecare tip, deci acelasi numar fizic se realoca in faza 2.
* Aici documentele raman scrise (nu se dezaloca nimic dupa un commit reusit), deci vechi si nou aloca
* NUMERE DIFERITE, consecutive, din aceeasi plaja - egalitatea lor ar fi o eroare, nu o dovada.
* Paritatea reala verificata e (a) consistenta interna - VANZARI.NR_INCASAT persistat == poDate.nr_incasare
* capturat chiar inainte de scriere, pe fiecare document in parte, si (b) egalitatea intre vechi/nou a
* CODULUI de tip (VANZARI.TIP_INCASAT) si a SUMEI (VANZARI.SUMA_INCASAT) - marimi care nu depind de
* alocarea secventiala si trebuie sa fie identice daca cele doua cai proceseaza acelasi lcListaIncasare.
*
* CONSUMA DATE REALE: fiecare pereche (tip, forma) scrie un document nou in VANZARI (client 463),
* iar tipurile 2/3/4 aloca si un numar real de chitanta/bon fiscal/pos (serii 16/3/26). Niciun
* rollback, nicio stergere - documentele raman in schema, de inspectat de Marius.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_12b_s4b_proba_b_dupa.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_12b_s4b_proba_b_dupa.log
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_12b_s4b_proba_b_dupa.log"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLog)
gnPass = 0
gnFail = 0
ON ERROR DO S3bErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
LOCAL lcAppPathLocal, lcSql
lcAppPathLocal = "D:\ROA\ROAFACTURARE\"
*-- stub_verificare PRIMUL (SET PATH plain, nu ADDITIVE): test_init_env_auto_roafacturare.prg
*-- face el insusi SET PATH TO ... ADDITIVE mai jos, care ADAUGA dupa (nu inaintea) intrarilor
*-- deja existente - asta pastreaza stub_verificare cu prioritate fata de COMUN\FERESTRE, ca
*-- "Do Form verificare" (ofacturare.vc2:14404 / :20126) sa rezolve la stub, nu la formularul real
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare"
*-- mediul REAL, identic cu cel folosit de test_s3b_paritate_emitere.prg (deja dovedit ca
*-- instantiaza fara agatare frm_facturare_articole2 - orice reconstructie manuala a acestui
*-- mediu s-a dovedit incompleta si a agatat headless in interiorul Init-ului formularului nou,
*-- la constructia coloanei Gestiune din grd_factura (vezi raport)
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO S3bLog WITH 'EROARE: conectare Oracle esuata'
DO S3bFinal
ENDIF
DO S3bLog WITH 'test_init_env_auto_roafacturare OK, gnHandle=' + TRANSFORM(gnHandle)
*-- fara asta, un lacat Oracle blocheaza rularea la infinit, invizibil in log
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
*-- clase suplimentare, necesare pentru grd_factura (coloane cu combo pe cursor SQL)
SET PATH TO (lcAppPathLocal + "COMUN\utile\gridextras") ADDITIVE
SET CLASSLIB TO gridextras.vcx ADDITIVE
SET CLASSLIB TO _cb_base.vcx ADDITIVE
DO S3bLog WITH 'SET CLASSLIB suplimentar OK'
*-- mock amessagebox: la nume duplicat castiga fisierul de proceduri deschis cel mai recent
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
DO S3bLog WITH 'mock_amessagebox OK'
*-- CdocGasesteIdVanzare: dovada de scriere pe jonctiunea serie_act + nract
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
*-- initializare REALA a optiunilor de program (tehnica din test_s3b_paritate_emitere.prg) -
*-- creeaza dinamic globalele gnXxx/glXxx/gcXxx din tabela OPTIUNI; suprascrise imediat dupa
*-- cu valorile care bypaseaza dialogurile per-linie in mediul headless
IF !actualizeaza_optiuni_program()
DO S3bLog WITH 'EROARE: actualizeaza_optiuni_program()'
DO S3bFinal
ENDIF
gnScadereStoc = 0
gnModTotFact = 0
gnFactSeturi = 0
gnListareAvizBonFiscal = 0
gnid_part_casa = 0
*-- 167: singura sucursala cu plaje pentru chitanta/bon fiscal/pos in acest mediu (16/3/26);
*-- verificat READ-ONLY (probe_emitere_reala.prg) ca nu schimba Reccount(cursor_preturi)
gnIdSucursala = 167
lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]
goExecutor.oExecuta(lcSql)
DO S3bLog WITH 'actualizeaza_optiuni_program OK, gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala)
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ''
gnMockUltimTip = 0
*----- driver: conduce frm_alte_date (singurul modal ramas, doar pe calea veche) -----
PUBLIC goDriverAD, glDlgTratatAD, gnTipIncasareCerut, gnNrIncasareCapturat, gcClaseVazute
glDlgTratatAD = .F.
gnTipIncasareCerut = 1
gnNrIncasareCapturat = 0
gcClaseVazute = ';'
goDriverAD = CREATEOBJECT('driverAlteDateAD')
_SCREEN.AddObject('tmrDrvAD', 'Timer')
_SCREEN.tmrDrvAD.Interval = 200
BINDEVENT(_SCREEN.tmrDrvAD, 'Timer', goDriverAD, 'Executa')
_SCREEN.tmrDrvAD.Enabled = .T.
*-- _SCREEN ramane invizibil (default -A -T), ca in test_s3b_paritate_emitere.prg - un GETFILE()
*-- nativ (dialog "Open") aparut la o SET SCREEN VISIBLE = .T. a agatat rularea (vezi raport)
_SCREEN.Caption = 'S3b - emitere reala (paritate incasare vechi/nou)'
DO S3bLog WITH 'driver+timer pregatiti'
*-- pre-proba plajelor 3/16/26 - plasa de siguranta, evita blocaj invizibil daca lipsesc
DO S3bLog WITH 'pre-proba plaje: tip3=' + TRANSFORM(RanduriSerii(3)) + ' tip16=' + TRANSFORM(RanduriSerii(16)) + ;
' tip26=' + TRANSFORM(RanduriSerii(26))
*-- stare INAINTE: ultimul NR_INCASAT emis pe fiecare tip de incasare, in TOATA schema
DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE INAINTE (MAX(NR_INCASAT) pe tip_incasat, toata schema) ====='
DO LogStareMaxIncasat
CREATE CURSOR crsRezultate (tip_incasare N(1), forma C(10), id_vanzare N(10), cod N(10), ;
serie_act C(10), id_fact N(10), nr_incasare_asteptat N(10), nr_incasat N(10), ;
tip_incasat N(10), suma_incasat N(18,2), serie_incasat C(10), total_cu_tva N(18,2))
LOCAL laNumeTip[4]
laNumeTip[1] = 'Fara incasare'
laNumeTip[2] = 'Chitanta'
laNumeTip[3] = 'Bon fiscal'
laNumeTip[4] = 'POS Card'
*-- FORMA NOUA: BLOCATA in aceasta sesiune (vezi docs\raport_s3b_emitere_reala.md) -
*-- frm_facturare_articole2 agata la CREATEOBJECT (Init -> grd_factura.cGestiune.cCboGestiune
*-- -> _cb_base.vc2 combosql.Init:589 -> RefreshData(0):826 -> SelectData():832 -> un dialog
*-- nativ "Open" real, needeterminat cauzal, indiferent de mediu/tip/vizibilitate _SCREEN).
*-- Ramane .F. neconditionat aici; DACA se rezolva blocajul, se schimba in .T. pentru ambele.
PUBLIC glIncercaFormaNoua
glIncercaFormaNoua = .F.
LOCAL lnTip, lnIdVz, lnIdVzDupa
lnIdVzDupa = 0
FOR lnTip = 1 TO 1
DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA VECHE (tnTip=22) ====='
lnIdVz = CreeazaDocumentIncasare(lnTip, .F.)
DO InregistreazaRezultat WITH lnTip, 'vechi', lnIdVz
IF lnIdVz > 0
DO LogLiniiDocument WITH lnIdVz
lnIdVzDupa = lnIdVz
ENDIF
IF glIncercaFormaNoua
DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA NOUA (tnTip=3) ====='
lnIdVz = CreeazaDocumentIncasare(lnTip, .T.)
DO InregistreazaRezultat WITH lnTip, 'nou', lnIdVz
ELSE
DO S3bLog WITH ' forma noua SARITA (blocata, vezi raport)'
ENDIF
ENDFOR
DO S3bLog WITH CHR(13)+CHR(10) + '===== COMPARATIE VECHI / NOU, PE TIP ====='
DO ComparaRezultate
*-- 12b S4b partea 3: CompAct intre documentul "inainte" (1883, SSS/100135, pachetul vechi)
*-- si documentul "dupa" tocmai emis (pachetul nou, wip12_07) - aceeasi emitere, acelasi client.
DO S3bLog WITH CHR(13)+CHR(10) + '===== CompAct: SSS/100135 (inainte) vs documentul nou (dupa) ====='
IF lnIdVzDupa > 0
LOCAL lcSerieDupa, lnNractDupa, lnQAct
lnQAct = goExecutor.oExecute([select serie_act, numar_act from vanzari where id_vanzare=] + ;
TRANSFORM(lnIdVzDupa), 'crsVzDupa')
IF lnQAct > 0 AND RECCOUNT('crsVzDupa') = 1
lcSerieDupa = ALLTRIM(crsVzDupa.serie_act)
lnNractDupa = crsVzDupa.numar_act
USE IN crsVzDupa
DO S3bLog WITH ' document dupa: serie_act=' + lcSerieDupa + ' numar_act=' + TRANSFORM(lnNractDupa) + ;
' id_vanzare=' + TRANSFORM(lnIdVzDupa)
=CompAct('SSS', 100135, lcSerieDupa, lnNractDupa, '12b S4b proba B inainte/dupa')
ELSE
DO S3bLog WITH ' EROARE: nu s-a putut citi serie_act/numar_act pentru id_vanzare=' + TRANSFORM(lnIdVzDupa)
ENDIF
ELSE
DO S3bLog WITH ' EROARE: documentul dupa nu s-a scris (id_vanzare<=0), CompAct sarit'
ENDIF
DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE DUPA (MAX(NR_INCASAT) pe tip_incasat, toata schema) ====='
DO LogStareMaxIncasat
_SCREEN.tmrDrvAD.Enabled = .F.
DO S3bFinal
CATCH TO loExc
DO S3bLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S3bFinal
ENDTRY
QUIT
*==================================================================================
PROCEDURE S3bLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S3bErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO S3bLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S3bFinal
DO S3bLog WITH CHR(13)+CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail)
DO S3bLog WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S3bLog WITH 'PASS: ' + tcMsg
ELSE
gnFail = gnFail + 1
DO S3bLog WITH 'FAIL: ' + tcMsg
ENDIF
ENDPROC
*-- cate randuri de plaja intoarce verifica_cursor_serii pentru un tip de document, fara sa aloce
FUNCTION RanduriSerii
LPARAMETERS tnIdTipDoc
LOCAL lnOk, lnRanduri, lcSql
LOCAL ARRAY laErr[1]
PRIVATE pnIdTipDoc, pnRezultat
pnIdTipDoc = tnIdTipDoc
pnRezultat = 0
lnRanduri = -1
lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}"
lnOk = SQLEXEC(gnHandle, lcSql, "crsprobapl")
IF lnOk > 0
lnRanduri = RECCOUNT("crsprobapl")
USE IN (SELECT("crsprobapl"))
ELSE
AERROR(laErr)
DO S3bLog WITH 'pre-proba plaje tip ' + TRANSFORM(tnIdTipDoc) + ' ESEC: ' + TRANSFORM(laErr[2])
ENDIF
RETURN lnRanduri
ENDFUNC
*-- 12b S4b: liniile VANZARI_DETALII (id_pol) + randurile ACT (SCD/SCC) ale documentului, ca
*-- instantaneu "inainte" pentru CompAct (partea 3) - client/document fixe, notate in stare.
PROCEDURE LogLiniiDocument
LPARAMETERS tnIdVz
LOCAL lnQ
lnQ = goExecutor.oExecute([select id_articol, id_pol, cont from vanzari_detalii where sters=0 and id_vanzare=] + ;
TRANSFORM(tnIdVz) + [ order by id_articol], 'crsLiniiVz')
IF lnQ > 0
SELECT crsLiniiVz
SCAN
DO S3bLog WITH ' [proba B linie] id_articol=' + TRANSFORM(id_articol) + ' id_pol=' + TRANSFORM(NVL(id_pol,-1)) + ' cont=' + TRANSFORM(NVL(cont,''))
ENDSCAN
USE IN crsLiniiVz
ENDIF
lnQ = goExecutor.oExecute([select scd, scc, ascd, ascc, id_venchelt from act a ] + ;
[join vanzari v on v.serie_act=a.serie_act and v.numar_act=a.nract ] + ;
[where a.sters=0 and v.id_vanzare=] + TRANSFORM(tnIdVz) + [ order by scd, scc], 'crsActVz')
IF lnQ > 0
SELECT crsActVz
SCAN
DO S3bLog WITH ' [proba B ACT] SCD=' + TRANSFORM(NVL(scd,'')) + ' SCC=' + TRANSFORM(NVL(scc,'')) + ;
' ASCD=' + TRANSFORM(NVL(ascd,'')) + ' ASCC=' + TRANSFORM(NVL(ascc,'')) + ' ID_VENCHELT=' + TRANSFORM(NVL(id_venchelt,-1))
ENDSCAN
USE IN crsActVz
ENDIF
ENDPROC
PROCEDURE LogStareMaxIncasat
LOCAL lnQ
lnQ = goExecutor.oExecute([select tip_incasat, max(nr_incasat) as maxnr, count(*) as nr ] + ;
[from vanzari where tip_incasat is not null group by tip_incasat order by tip_incasat], 'crsMaxInc')
IF lnQ > 0
SELECT crsMaxInc
SCAN
DO S3bLog WITH ' tip_incasat=' + TRANSFORM(tip_incasat) + ' max(nr_incasat)=' + TRANSFORM(maxnr) + ' nr_documente=' + TRANSFORM(nr)
ENDSCAN
USE IN crsMaxInc
ELSE
DO S3bLog WITH ' EROARE citire stare incasat: ' + goExecutor.oPrelucrareEroare()
ENDIF
ENDPROC
*-- citeste randul VANZARI scris pentru id_vanzare si-l adauga in crsRezultate
PROCEDURE InregistreazaRezultat
LPARAMETERS tnTip, tcForma, tnIdVz
DO Assert WITH tnIdVz > 0, '[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] documentul exista in VANZARI (jonctiune serie_act+nract), e=' + TRANSFORM(tnIdVz)
IF tnIdVz <= 0
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': documentul NU s-a scris (id_vanzare=0), fara rand in VANZARI'
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, 0)
RETURN
ENDIF
LOCAL lnQ
lnQ = goExecutor.oExecute([select id_vanzare, cod, serie_act, nvl(id_fact,0) as id_fact, ] + ;
[nvl(nr_incasat,0) as nr_incasat, nvl(tip_incasat,0) as tip_incasat, nvl(suma_incasat,0) as suma_incasat, ] + ;
[nvl(serie_incasat,'') as serie_incasat, total_cu_tva from vanzari where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVz1')
IF lnQ <= 0 OR RECCOUNT('crsVz1') <> 1
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': EROARE citire VANZARI id_vanzare=' + TRANSFORM(tnIdVz)
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, tnIdVz)
RETURN
ENDIF
SELECT crsVz1
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare, cod, serie_act, id_fact, ;
nr_incasare_asteptat, nr_incasat, tip_incasat, suma_incasat, serie_incasat, total_cu_tva) ;
VALUES (tnTip, tcForma, tnIdVz, crsVz1.cod, NVL(crsVz1.serie_act,''), crsVz1.id_fact, ;
gnNrIncasareCapturat, crsVz1.nr_incasat, crsVz1.tip_incasat, crsVz1.suma_incasat, NVL(crsVz1.serie_incasat,''), crsVz1.total_cu_tva)
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': id_vanzare=' + TRANSFORM(tnIdVz) + ' cod=' + TRANSFORM(crsVz1.cod) + ;
' serie_act=' + TRANSFORM(crsVz1.serie_act) + ' id_fact=' + TRANSFORM(crsVz1.id_fact) + ;
' nr_incasat=' + TRANSFORM(crsVz1.nr_incasat) + ' (asteptat ' + TRANSFORM(gnNrIncasareCapturat) + ') tip_incasat=' + TRANSFORM(crsVz1.tip_incasat) + ;
' suma_incasat=' + TRANSFORM(crsVz1.suma_incasat) + ' serie_incasat=[' + TRANSFORM(crsVz1.serie_incasat) + ']' + ;
' total_cu_tva=' + TRANSFORM(crsVz1.total_cu_tva)
USE IN crsVz1
DO Assert WITH crsRezultate.nr_incasat = gnNrIncasareCapturat, ;
'[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI.NR_INCASAT persistat (' + TRANSFORM(crsRezultate.nr_incasat) + ;
') == poDate.nr_incasare capturat inainte de scriere (' + TRANSFORM(gnNrIncasareCapturat) + ')'
ENDPROC
PROCEDURE ComparaRezultate
LOCAL lnTip, lnRVechi, lnRNou
IF !glIncercaFormaNoua
DO S3bLog WITH ' forma noua sarita in aceasta rulare - fara comparatie vechi/nou, doar valorile persistate pe forma veche'
RETURN
ENDIF
FOR lnTip = 1 TO 4
SELECT crsRezultate
LOCATE FOR tip_incasare = lnTip AND forma == 'vechi'
IF !FOUND()
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand vechi gasit in crsRezultate'
LOOP
ENDIF
lnRVechi = RECNO()
LOCATE FOR tip_incasare = lnTip AND forma == 'nou'
IF !FOUND()
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand nou gasit in crsRezultate'
LOOP
ENDIF
lnRNou = RECNO()
LOCAL lnIdVechi, lnIdNou, lnTipIncVechi, lnTipIncNou, lnSumaVechi, lnSumaNou, lcSerieVechi, lcSerieNou
GO lnRVechi IN crsRezultate
lnIdVechi = crsRezultate.id_vanzare
lnTipIncVechi = crsRezultate.tip_incasat
lnSumaVechi = crsRezultate.suma_incasat
lcSerieVechi = crsRezultate.serie_incasat
GO lnRNou IN crsRezultate
lnIdNou = crsRezultate.id_vanzare
lnTipIncNou = crsRezultate.tip_incasat
lnSumaNou = crsRezultate.suma_incasat
lcSerieNou = crsRezultate.serie_incasat
IF lnIdVechi <= 0 OR lnIdNou <= 0
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] ambele documente s-au scris (vechi id_vanzare=' + ;
TRANSFORM(lnIdVechi) + ' nou id_vanzare=' + TRANSFORM(lnIdNou) + ')'
LOOP
ENDIF
DO Assert WITH lnTipIncVechi = lnTipIncNou, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.TIP_INCASAT identic (vechi=' + ;
TRANSFORM(lnTipIncVechi) + ' nou=' + TRANSFORM(lnTipIncNou) + ')'
DO Assert WITH ABS(lnSumaVechi - lnSumaNou) < 0.005, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SUMA_INCASAT identica (vechi=' + ;
TRANSFORM(lnSumaVechi) + ' nou=' + TRANSFORM(lnSumaNou) + ')'
DO Assert WITH ALLTRIM(lcSerieVechi) == ALLTRIM(lcSerieNou), '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SERIE_INCASAT identica (vechi=[' + ;
ALLTRIM(lcSerieVechi) + '] nou=[' + ALLTRIM(lcSerieNou) + '])'
ENDFOR
ENDPROC
*==================================================================================
* CreeazaDocumentIncasare: emite un document REAL prin fluxul de productie (tnTip=22, cursor_preturi,
* client RAJA id_part=463), aplicand tipul de incasare cerut pe formularul indicat. Intoarce
* poDate.nid_vanzare (>0 succes) sau 0 (esec, detaliat in log). gnNrIncasareCapturat e umplut cu
* poDate.nr_incasare chiar inainte de do_termin() - marimea persistata se verifica fata de asta.
FUNCTION CreeazaDocumentIncasare
LPARAMETERS tnTipIncasare, tlFormNou
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest
LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat, tnTip, tnIdClient, tnIdDelegat
LOCAL lcSerieAlocata, lnNractAlocat
lnIdVanzareRezultat = 0
lcSerieAlocata = ''
lnNractAlocat = 0
gnNrIncasareCapturat = 0
*-- FORMA VECHE: tnTip=22 (AVIZ din lista de preturi) - calea PROVENITA, curata, fara efecte
*-- secundare (nu intra pe ramura "comanda" din do_scrie_factura). opt_incasat traieste pe
*-- frm_alte_date (clasa separata), deci nu are restrictia Between(poDate.tip,1,4).
*-- FORMA NOUA: are nevoie de tnTip Between(1,4) ca opt_incasat sa existe inline pe formular
*-- (ofacturare.vc2:21066) - singurele din acel interval cu date reale in cursor_preturi sunt
*-- 3/4 (probe_emitere_reala.prg), dar tnTip=3 declanseaza un MESSAGEBOX_FORM real necunoscut
*-- mock-ului ("Doriti sa se inchida comanda?") si formularul nou insusi agata la CREATEOBJECT
*-- pe coloana Gestiune a grd_factura (vezi raport) - BLOCAT, nerezolvat in aceasta sesiune.
*-- 12b S4b proba B: incercari tnTip=1 (client 332) si tnTip=2 (client 463) - Reccount=0 in acest
*-- mediu (poDate.id_gestiune_init implicit NULL); revenire la tnTip=22/client 463, singura
*-- combinatie confirmata ca intoarce articole headless (probe_emitere_reala.prg) - a dat
*-- documentul real id_vanzare=1883, aproape integral pe politica de stoc (41), nu politica reala
*-- 34 tintita initial - limitare consemnata in stare, nu blocanta (proba A caz7 acopera regresia
*-- pe politica reala 34 direct in PL/SQL)
tnTip = IIF(tlFormNou, 3, 22)
tnIdClient = 463
tnIdDelegat = 256
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
IF !tlFormNou
poDate.nIdTipDoc = 6 && AVIZ - plaja globala, dovedit (id_vanzare 1061/1062/1063)
ENDIF
gnIdUtil = 8
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.id_client = tnIdClient
poDate.id_delegat = tnIdDelegat
poDate.zi_curs = {^2026-08-10}
IF poDate.rezultat_serii = 3
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
ENDIF
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
gnIdUtil = -3
lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, [])))
lnNractAlocat = poDate.nract
DO S3bLog WITH ' poDate.nract=' + TRANSFORM(poDate.nract) + ' serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + ']'
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ;
[?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}]
lcCursor = [crsarticole]
lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor)
IF lnSucces < 0
DO S3bLog WITH ' EROARE cursor articole: ' + goExecutor.oPrelucrareEroare()
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO S3bCurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
IF RECCOUNT(lcCursor) = 0
DO S3bLog WITH ' Nu exista articole (Reccount=0) - abandon document'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO S3bCurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
DO S3bLog WITH ' crsarticole Reccount=' + TRANSFORM(RECCOUNT(lcCursor))
*-- Lista de preturi a articolului e in EURO (tip_valuta=1), iar do_scrie_articole
*-- trimite pe ramura aceea vpretftva, derivat din pret_val - fortand doar pret,
*-- documentul iesea cu VANZARI_DETALII.PRET=0. Se forteaza perechea, coerent cu cursul.
SELECT (lcCursor)
REPLACE ALL cantitate WITH 1, ;
pret_val WITH IIF(tip_valuta = 1, 100, 0), ;
pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100)
=TABLEUPDATE(.T., .T., lcCursor)
GO TOP
creeaza_facturacrs([crsfactura])
IF poDate.in_valuta = 1
SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM (lcCursor) WITH (Buffering = .T.) WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri
SELECT crscursuri
poDate.Curs = Curs
poDate.multiplicator = multiplicator
ELSE
citeste_cursuri_zi(poDate.zi_curs)
IF RECCOUNT('crscursuri') = 0
USE IN crscursuri
ENDIF
ENDIF
IF TYPE(lcCursor + '.nume_lista_preturi') <> 'U'
CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100))
SELECT crspolitici
INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '<TOATE>')
INSERT INTO crspolitici(id_pol, nume_lista_preturi) ;
SELECT DISTINCT id_pol, nume_lista_preturi FROM (lcCursor) ORDER BY nume_lista_preturi
ENDIF
*-- formularul, modeless (apel direct de metode) - vechi sau unificat, dupa tlFormNou
PUBLIC goFrmS3b
IF tlFormNou
goFrmS3b = CREATEOBJECT('frm_facturare_articole2')
ELSE
goFrmS3b = CREATEOBJECT('frm_facturare_articole')
ENDIF
DO S3bLog WITH ' CREATEOBJECT OK, VARTYPE=' + VARTYPE(goFrmS3b)
goFrmS3b.WindowType = 0
DO S3bLog WITH ' WindowType=0 OK'
goFrmS3b.Show()
DO S3bLog WITH ' Show() OK'
DOEVENTS FORCE
DO S3bLog WITH ' formular afisat modeless (' + IIF(tlFormNou, 'NOU frm_facturare_articole2', 'VECHI frm_facturare_articole') + ')'
goFrmS3b.do_adauga_tot()
DOEVENTS FORCE
DO S3bLog WITH ' do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura'))
goFrmS3b.do_calculeaza_totaluri()
DOEVENTS FORCE
*-- CONT_VENIT asteptat, derivat exact ca in do_scrie_articole (ofacturare.vc2:14279), citit
*-- direct din randul crsfactura pe care do_scrie_articole il va scana
LOCAL lcExpContVenit, lnExpIdPol, lnExpIdArticol, lcExpCont, loExecutorReal
SELECT crsfactura
GO TOP
lnExpIdPol = crsfactura.id_pol
lnExpIdArticol = crsfactura.id_articol
lcExpCont = crsfactura.Cont
lcExpContVenit = IIF(EMPTY(NVL(lnExpIdPol, 0)), deriva_cont_venit_fara_pol(lnExpIdArticol, lcExpCont), '<NULL>')
*-- spion pe goExecutor (tehnica SpyS13, probe_s13_toomanycolumns.prg): captureaza SQL-ul real
*-- trimis de do_scrie_articole, fara sa-i schimbe comportamentul (DODEFAULT pe PCOUNT)
loExecutorReal = goExecutor
goExecutor = CREATEOBJECT('SpyContVenit')
goExecutor.nHandle = gnHandle
LOCAL lnScris
IF tlFormNou
*-- opt_incasat e inline pe formular - fara al doilea modal
goFrmS3b.seteaza_mod_incasare(tnTipIncasare)
gnNrIncasareCapturat = poDate.nr_incasare
DO S3bLog WITH ' opt_incasat.Value=' + TRANSFORM(tnTipIncasare) + ' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ;
' incasat=' + TRANSFORM(poDate.incasat) + ' incasatCARD=' + TRANSFORM(poDate.incasatCARD)
lnScris = goFrmS3b.do_termin()
ELSE
*-- calea veche: al doilea modal (frm_alte_date) e condus de goDriverAD/tmrDrvAD
glDlgTratatAD = .F.
gnTipIncasareCerut = tnTipIncasare
lnScris = goFrmS3b.do_termin()
LOCAL lnWait
lnWait = 0
DO WHILE !glDlgTratatAD AND lnWait < 10
DOEVENTS FORCE
lnWait = lnWait + 1
ENDDO
ENDIF
DO S3bLog WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0))
*-- restaureaza goExecutor real si verifica CONT_VENIT trimis de do_scrie_articole
LOCAL lcActualContVenit, lcEticheta
lcEticheta = '[' + IIF(tlFormNou,'nou','vechi') + ' tip=' + TRANSFORM(tnTipIncasare) + ']'
DO Assert WITH goExecutor.cLastArtCall # '', ;
lcEticheta + ' do_scrie_articole a trimis adauga_articol_factura (spion pe goExecutor)'
IF goExecutor.cLastArtCall # ''
lcActualContVenit = ExtrageContVenit(goExecutor.cLastArtCall)
DO Assert WITH lcActualContVenit == lcExpContVenit, ;
lcEticheta + ' CONT_VENIT trimis de do_scrie_articole = [' + lcExpContVenit + '], obtinut [' + lcActualContVenit + ']'
ENDIF
goExecutor = loExecutorReal
*-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare
*-- ramane santinela la esec: singura dovada e randul din VANZARI, pe serie_act + nract.
lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat)
IF lnIdVanzareRezultat < 0
lnIdVanzareRezultat = 0
ENDIF
DO S3bLog WITH ' verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ;
' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat)
IF TYPE('goFrmS3b') = 'O' AND !ISNULL(goFrmS3b)
goFrmS3b.Release()
ENDIF
goFrmS3b = NULL
IF USED('crspolitici')
USE IN crspolitici
ENDIF
IF USED('crscursuri')
USE IN crscursuri
ENDIF
IF USED('crsfactura')
USE IN crsfactura
ENDIF
IF USED('crsarticole')
USE IN crsarticole
ENDIF
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN lnIdVanzareRezultat
ENDFUNC
PROCEDURE S3bCurataJtva
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
ENDPROC
*-- extrage parametrul 29 (CONT_VENIT) dintr-un apel capturat pack_facturare.adauga_articol_factura(...);
*-- pozitia 28 e mereu literalul NULL, deci pos29 e tot ce urmeaza dupa ultima virgula dinaintea "); end;"
FUNCTION ExtrageContVenit
LPARAMETERS tcSql
LOCAL lnEnd, lcParams, lnComma, lcPos29
lnEnd = AT('); end;', tcSql)
IF lnEnd = 0
RETURN '<NEPARSABIL>'
ENDIF
lcParams = LEFT(tcSql, lnEnd - 1)
lnComma = RAT(',', lcParams)
IF lnComma = 0
RETURN '<NEPARSABIL>'
ENDIF
lcPos29 = SUBSTR(lcParams, lnComma + 1)
IF UPPER(lcPos29) == 'NULL'
RETURN '<NULL>'
ENDIF
RETURN STRTRAN(lcPos29, "'", '')
ENDFUNC
*==================================================================================
*-- SpyContVenit: subclasa a lui oexecutor (tehnica SpyS13 din probe_s13_toomanycolumns.prg) -
*-- logheaza in cLastArtCall statementul adauga_articol_factura, apoi executa normal prin
*-- DODEFAULT pe PCOUNT (fara sa schimbe comportamentul real)
DEFINE CLASS SpyContVenit AS oexecutor
cLastArtCall = ''
PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect)
LOCAL lnPc, lcS, lnRet
lnPc = PCOUNT()
lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '')
IF 'adauga_articol_factura(' $ lcS
THIS.cLastArtCall = lcS
ENDIF
TRY
DO CASE
CASE lnPc <= 1
lnRet = DODEFAULT(m.tcSql)
CASE lnPc = 2
lnRet = DODEFAULT(m.tcSql, m.tcCursor)
CASE lnPc = 3
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress)
CASE lnPc = 4
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress)
CASE lnPc = 5
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle)
CASE lnPc = 6
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError)
CASE lnPc = 7
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError)
OTHERWISE
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect)
ENDCASE
CATCH TO loExSpy
lnRet = -1
THIS.cEroare = 'SpyContVenit: ' + TRANSFORM(loExSpy.Message)
ENDTRY
RETURN lnRet
ENDPROC
ENDDEFINE
*==================================================================================
*-- driverAlteDateAD: cauta FRM_ALTE_DATE prin _SCREEN.Forms si ii seteaza opt_incasat.Value la
* gnTipIncasareCerut INAINTE de a-i chema .do_termin() - acelasi mecanism ca driverAlteDate8 din
* creeaza_documente_s8.prg, cu un singur adaos (selectia tipului de incasare).
DEFINE CLASS driverAlteDateAD AS Custom
PROCEDURE Executa
LOCAL lnI, loForm, llGasit, loMsgForm
llGasit = .F.
loMsgForm = NULL
FOR lnI = 1 TO _SCREEN.FormCount
LOCAL lcClasa
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF lcClasa == 'FRM_ALTE_DATE'
loForm = _SCREEN.Forms(lnI)
llGasit = .T.
ENDIF
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S3bLog WITH ' [diag timer] forma noua vazuta: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
*-- confirmare reala neacoperita de mock_amessagebox (forma modala messagebox_form) -
*-- apasa automat cmdYes/cmdOk, ca in productie la raspuns implicit "Da"
IF !ISNULL(loMsgForm)
TRY
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S3bLog WITH ' [diag timer] messagebox_form: CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ENDIF
IF glDlgTratatAD OR !llGasit
RETURN
ENDIF
LOCAL loAC
loAC = loForm.ActiveControl
TRY
loForm.opt_incasat.Value = gnTipIncasareCerut
gnNrIncasareCapturat = poDate.nr_incasare
DO S3bLog WITH ' driverAlteDateAD: opt_incasat.Value=' + TRANSFORM(gnTipIncasareCerut) + ;
' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ' incasat=' + TRANSFORM(poDate.incasat) + ;
' incasatCARD=' + TRANSFORM(poDate.incasatCARD)
loForm.do_termin()
glDlgTratatAD = .T.
CATCH TO loExcDrv
DO S3bLog WITH ' driverAlteDateAD: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ;
' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo)
glDlgTratatAD = .T.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,740 @@
* probe_12b_s4b_proba_b_inainte.prg
* Plan 12b, S4b partea 2 - Proba B "INAINTE": copie a test_s3b_emitere_reala.prg (mecanica
* nemodificata, deja dovedita), restransa la o singura emitere reala (tip_incasare=1, "Fara
* incasare", forma veche) - client RAJA (id_part=463), plaja utilizatorului 8. Se ruleaza PE
* PACHETUL DE DINAINTE de D10 (S4a), ca sa capteze un instantaneu real al SCD/SCC pe politica
* reala inainte de schimbare; "dupa" (aceeasi client, mecanism) il face partea 3, cu CompAct.
*
* Criteriul 1 de "gata" al S3b, PROBA REALA (nu structurala): emite documente REALE in Oracle
* (MARIUSM_AUTO@ROA_CENTRAL, aprobat explicit de Marius) prin fluxul de emitere efectiv, pe
* fiecare din cele patru tipuri de incasare (1=Fara incasare, 2=Chitanta, 3=Bon fiscal, 4=POS/Card),
* o data pe formularul vechi (frm_facturare_articole) si o data pe cel unificat
* (frm_facturare_articole2), si compara randurile persistate in VANZARI dupa commit.
*
* Sursa documentului e cursor_preturi (lista de preturi, client RAJA id_part=463) cu tnTip=22 -
* singura combinatie confirmata prin proba read-only (probe_emitere_reala.prg) ca intoarce articole
* in acest mediu; tnTip=5 (FACTURA direct) da Reccount=0. Numerotarea/serie a documentului ramane
* cea naturala pentru tnTip=22 (AVIZ, nIdTipDoc=6, plaja globala) - neatinsa, nu conteaza pentru
* criteriul de paritate a INCASARII, care e independent de seria documentului.
*
* Mecanica bazata pe COMUN\utile\Teste\editare_factura\creeaza_documente_s8.prg (mediu Oracle real
* + clase de productie, dovedit ca emite documente reale pentru tnTip=22): dialogul modal de antet
* e inlocuit cu setare directa poDate (ca acolo), iar "Do Form verificare" (ofacturare.vc2:14404 /
* :20126) e ocolit cu acelasi stub versionat COMUN\utile\Teste\achizitie_import\stub_verificare\
* (SET PATH cu el primul).
*
* Diferenta fata de creeaza_documente_s8.prg: al doilea modal (frm_alte_date, doar pe calea veche)
* NU e doar "confirmat" - un driver pe Timer ii seteaza opt_incasat.Value la tipul cerut INAINTE
* sa-i cheme do_termin(), exact tehnica validata structural in test_s3b_paritate_emitere.prg (setarea
* de .Value declanseaza opt_incasat.ProgrammaticChange -> actualizeaza_tipincasare(), cod real).
* Pe calea noua nu exista al doilea modal (opt_incasat e inline pe formular): se seteaza direct pe
* goFrm inainte de goFrm.do_termin().
*
* De ce NU se compara nr_incasare/NR_INCASAT intre vechi si nou (asa cum a facut suita structurala):
* acolo numerele erau dezalocate dupa fiecare tip, deci acelasi numar fizic se realoca in faza 2.
* Aici documentele raman scrise (nu se dezaloca nimic dupa un commit reusit), deci vechi si nou aloca
* NUMERE DIFERITE, consecutive, din aceeasi plaja - egalitatea lor ar fi o eroare, nu o dovada.
* Paritatea reala verificata e (a) consistenta interna - VANZARI.NR_INCASAT persistat == poDate.nr_incasare
* capturat chiar inainte de scriere, pe fiecare document in parte, si (b) egalitatea intre vechi/nou a
* CODULUI de tip (VANZARI.TIP_INCASAT) si a SUMEI (VANZARI.SUMA_INCASAT) - marimi care nu depind de
* alocarea secventiala si trebuie sa fie identice daca cele doua cai proceseaza acelasi lcListaIncasare.
*
* CONSUMA DATE REALE: fiecare pereche (tip, forma) scrie un document nou in VANZARI (client 463),
* iar tipurile 2/3/4 aloca si un numar real de chitanta/bon fiscal/pos (serii 16/3/26). Niciun
* rollback, nicio stergere - documentele raman in schema, de inspectat de Marius.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_emitere_reala.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_emitere_reala.log
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_12b_s4b_proba_b_inainte.log"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLog)
gnPass = 0
gnFail = 0
ON ERROR DO S3bErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
LOCAL lcAppPathLocal, lcSql
lcAppPathLocal = "D:\ROA\ROAFACTURARE\"
*-- stub_verificare PRIMUL (SET PATH plain, nu ADDITIVE): test_init_env_auto_roafacturare.prg
*-- face el insusi SET PATH TO ... ADDITIVE mai jos, care ADAUGA dupa (nu inaintea) intrarilor
*-- deja existente - asta pastreaza stub_verificare cu prioritate fata de COMUN\FERESTRE, ca
*-- "Do Form verificare" (ofacturare.vc2:14404 / :20126) sa rezolve la stub, nu la formularul real
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare"
*-- mediul REAL, identic cu cel folosit de test_s3b_paritate_emitere.prg (deja dovedit ca
*-- instantiaza fara agatare frm_facturare_articole2 - orice reconstructie manuala a acestui
*-- mediu s-a dovedit incompleta si a agatat headless in interiorul Init-ului formularului nou,
*-- la constructia coloanei Gestiune din grd_factura (vezi raport)
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO S3bLog WITH 'EROARE: conectare Oracle esuata'
DO S3bFinal
ENDIF
DO S3bLog WITH 'test_init_env_auto_roafacturare OK, gnHandle=' + TRANSFORM(gnHandle)
*-- fara asta, un lacat Oracle blocheaza rularea la infinit, invizibil in log
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
*-- clase suplimentare, necesare pentru grd_factura (coloane cu combo pe cursor SQL)
SET PATH TO (lcAppPathLocal + "COMUN\utile\gridextras") ADDITIVE
SET CLASSLIB TO gridextras.vcx ADDITIVE
SET CLASSLIB TO _cb_base.vcx ADDITIVE
DO S3bLog WITH 'SET CLASSLIB suplimentar OK'
*-- mock amessagebox: la nume duplicat castiga fisierul de proceduri deschis cel mai recent
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
DO S3bLog WITH 'mock_amessagebox OK'
*-- CdocGasesteIdVanzare: dovada de scriere pe jonctiunea serie_act + nract
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
*-- initializare REALA a optiunilor de program (tehnica din test_s3b_paritate_emitere.prg) -
*-- creeaza dinamic globalele gnXxx/glXxx/gcXxx din tabela OPTIUNI; suprascrise imediat dupa
*-- cu valorile care bypaseaza dialogurile per-linie in mediul headless
IF !actualizeaza_optiuni_program()
DO S3bLog WITH 'EROARE: actualizeaza_optiuni_program()'
DO S3bFinal
ENDIF
gnScadereStoc = 0
gnModTotFact = 0
gnFactSeturi = 0
gnListareAvizBonFiscal = 0
gnid_part_casa = 0
*-- 167: singura sucursala cu plaje pentru chitanta/bon fiscal/pos in acest mediu (16/3/26);
*-- verificat READ-ONLY (probe_emitere_reala.prg) ca nu schimba Reccount(cursor_preturi)
gnIdSucursala = 167
lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]
goExecutor.oExecuta(lcSql)
DO S3bLog WITH 'actualizeaza_optiuni_program OK, gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala)
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ''
gnMockUltimTip = 0
*----- driver: conduce frm_alte_date (singurul modal ramas, doar pe calea veche) -----
PUBLIC goDriverAD, glDlgTratatAD, gnTipIncasareCerut, gnNrIncasareCapturat, gcClaseVazute
glDlgTratatAD = .F.
gnTipIncasareCerut = 1
gnNrIncasareCapturat = 0
gcClaseVazute = ';'
goDriverAD = CREATEOBJECT('driverAlteDateAD')
_SCREEN.AddObject('tmrDrvAD', 'Timer')
_SCREEN.tmrDrvAD.Interval = 200
BINDEVENT(_SCREEN.tmrDrvAD, 'Timer', goDriverAD, 'Executa')
_SCREEN.tmrDrvAD.Enabled = .T.
*-- _SCREEN ramane invizibil (default -A -T), ca in test_s3b_paritate_emitere.prg - un GETFILE()
*-- nativ (dialog "Open") aparut la o SET SCREEN VISIBLE = .T. a agatat rularea (vezi raport)
_SCREEN.Caption = 'S3b - emitere reala (paritate incasare vechi/nou)'
DO S3bLog WITH 'driver+timer pregatiti'
*-- pre-proba plajelor 3/16/26 - plasa de siguranta, evita blocaj invizibil daca lipsesc
DO S3bLog WITH 'pre-proba plaje: tip3=' + TRANSFORM(RanduriSerii(3)) + ' tip16=' + TRANSFORM(RanduriSerii(16)) + ;
' tip26=' + TRANSFORM(RanduriSerii(26))
*-- stare INAINTE: ultimul NR_INCASAT emis pe fiecare tip de incasare, in TOATA schema
DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE INAINTE (MAX(NR_INCASAT) pe tip_incasat, toata schema) ====='
DO LogStareMaxIncasat
CREATE CURSOR crsRezultate (tip_incasare N(1), forma C(10), id_vanzare N(10), cod N(10), ;
serie_act C(10), id_fact N(10), nr_incasare_asteptat N(10), nr_incasat N(10), ;
tip_incasat N(10), suma_incasat N(18,2), serie_incasat C(10), total_cu_tva N(18,2))
LOCAL laNumeTip[4]
laNumeTip[1] = 'Fara incasare'
laNumeTip[2] = 'Chitanta'
laNumeTip[3] = 'Bon fiscal'
laNumeTip[4] = 'POS Card'
*-- FORMA NOUA: BLOCATA in aceasta sesiune (vezi docs\raport_s3b_emitere_reala.md) -
*-- frm_facturare_articole2 agata la CREATEOBJECT (Init -> grd_factura.cGestiune.cCboGestiune
*-- -> _cb_base.vc2 combosql.Init:589 -> RefreshData(0):826 -> SelectData():832 -> un dialog
*-- nativ "Open" real, needeterminat cauzal, indiferent de mediu/tip/vizibilitate _SCREEN).
*-- Ramane .F. neconditionat aici; DACA se rezolva blocajul, se schimba in .T. pentru ambele.
PUBLIC glIncercaFormaNoua
glIncercaFormaNoua = .F.
LOCAL lnTip, lnIdVz
FOR lnTip = 1 TO 1
DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA VECHE (tnTip=22) ====='
lnIdVz = CreeazaDocumentIncasare(lnTip, .F.)
DO InregistreazaRezultat WITH lnTip, 'vechi', lnIdVz
IF lnIdVz > 0
DO LogLiniiDocument WITH lnIdVz
ENDIF
IF glIncercaFormaNoua
DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA NOUA (tnTip=3) ====='
lnIdVz = CreeazaDocumentIncasare(lnTip, .T.)
DO InregistreazaRezultat WITH lnTip, 'nou', lnIdVz
ELSE
DO S3bLog WITH ' forma noua SARITA (blocata, vezi raport)'
ENDIF
ENDFOR
DO S3bLog WITH CHR(13)+CHR(10) + '===== COMPARATIE VECHI / NOU, PE TIP ====='
DO ComparaRezultate
DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE DUPA (MAX(NR_INCASAT) pe tip_incasat, toata schema) ====='
DO LogStareMaxIncasat
_SCREEN.tmrDrvAD.Enabled = .F.
DO S3bFinal
CATCH TO loExc
DO S3bLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S3bFinal
ENDTRY
QUIT
*==================================================================================
PROCEDURE S3bLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S3bErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO S3bLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S3bFinal
DO S3bLog WITH CHR(13)+CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail)
DO S3bLog WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S3bLog WITH 'PASS: ' + tcMsg
ELSE
gnFail = gnFail + 1
DO S3bLog WITH 'FAIL: ' + tcMsg
ENDIF
ENDPROC
*-- cate randuri de plaja intoarce verifica_cursor_serii pentru un tip de document, fara sa aloce
FUNCTION RanduriSerii
LPARAMETERS tnIdTipDoc
LOCAL lnOk, lnRanduri, lcSql
LOCAL ARRAY laErr[1]
PRIVATE pnIdTipDoc, pnRezultat
pnIdTipDoc = tnIdTipDoc
pnRezultat = 0
lnRanduri = -1
lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}"
lnOk = SQLEXEC(gnHandle, lcSql, "crsprobapl")
IF lnOk > 0
lnRanduri = RECCOUNT("crsprobapl")
USE IN (SELECT("crsprobapl"))
ELSE
AERROR(laErr)
DO S3bLog WITH 'pre-proba plaje tip ' + TRANSFORM(tnIdTipDoc) + ' ESEC: ' + TRANSFORM(laErr[2])
ENDIF
RETURN lnRanduri
ENDFUNC
*-- 12b S4b: liniile VANZARI_DETALII (id_pol) + randurile ACT (SCD/SCC) ale documentului, ca
*-- instantaneu "inainte" pentru CompAct (partea 3) - client/document fixe, notate in stare.
PROCEDURE LogLiniiDocument
LPARAMETERS tnIdVz
LOCAL lnQ
lnQ = goExecutor.oExecute([select id_articol, id_pol, cont from vanzari_detalii where sters=0 and id_vanzare=] + ;
TRANSFORM(tnIdVz) + [ order by id_articol], 'crsLiniiVz')
IF lnQ > 0
SELECT crsLiniiVz
SCAN
DO S3bLog WITH ' [proba B linie] id_articol=' + TRANSFORM(id_articol) + ' id_pol=' + TRANSFORM(NVL(id_pol,-1)) + ' cont=' + TRANSFORM(NVL(cont,''))
ENDSCAN
USE IN crsLiniiVz
ENDIF
lnQ = goExecutor.oExecute([select scd, scc, ascd, ascc, id_venchelt from act a ] + ;
[join vanzari v on v.serie_act=a.serie_act and v.numar_act=a.nract ] + ;
[where a.sters=0 and v.id_vanzare=] + TRANSFORM(tnIdVz) + [ order by scd, scc], 'crsActVz')
IF lnQ > 0
SELECT crsActVz
SCAN
DO S3bLog WITH ' [proba B ACT] SCD=' + TRANSFORM(NVL(scd,'')) + ' SCC=' + TRANSFORM(NVL(scc,'')) + ;
' ASCD=' + TRANSFORM(NVL(ascd,'')) + ' ASCC=' + TRANSFORM(NVL(ascc,'')) + ' ID_VENCHELT=' + TRANSFORM(NVL(id_venchelt,-1))
ENDSCAN
USE IN crsActVz
ENDIF
ENDPROC
PROCEDURE LogStareMaxIncasat
LOCAL lnQ
lnQ = goExecutor.oExecute([select tip_incasat, max(nr_incasat) as maxnr, count(*) as nr ] + ;
[from vanzari where tip_incasat is not null group by tip_incasat order by tip_incasat], 'crsMaxInc')
IF lnQ > 0
SELECT crsMaxInc
SCAN
DO S3bLog WITH ' tip_incasat=' + TRANSFORM(tip_incasat) + ' max(nr_incasat)=' + TRANSFORM(maxnr) + ' nr_documente=' + TRANSFORM(nr)
ENDSCAN
USE IN crsMaxInc
ELSE
DO S3bLog WITH ' EROARE citire stare incasat: ' + goExecutor.oPrelucrareEroare()
ENDIF
ENDPROC
*-- citeste randul VANZARI scris pentru id_vanzare si-l adauga in crsRezultate
PROCEDURE InregistreazaRezultat
LPARAMETERS tnTip, tcForma, tnIdVz
DO Assert WITH tnIdVz > 0, '[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] documentul exista in VANZARI (jonctiune serie_act+nract), e=' + TRANSFORM(tnIdVz)
IF tnIdVz <= 0
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': documentul NU s-a scris (id_vanzare=0), fara rand in VANZARI'
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, 0)
RETURN
ENDIF
LOCAL lnQ
lnQ = goExecutor.oExecute([select id_vanzare, cod, serie_act, nvl(id_fact,0) as id_fact, ] + ;
[nvl(nr_incasat,0) as nr_incasat, nvl(tip_incasat,0) as tip_incasat, nvl(suma_incasat,0) as suma_incasat, ] + ;
[nvl(serie_incasat,'') as serie_incasat, total_cu_tva from vanzari where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVz1')
IF lnQ <= 0 OR RECCOUNT('crsVz1') <> 1
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': EROARE citire VANZARI id_vanzare=' + TRANSFORM(tnIdVz)
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, tnIdVz)
RETURN
ENDIF
SELECT crsVz1
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare, cod, serie_act, id_fact, ;
nr_incasare_asteptat, nr_incasat, tip_incasat, suma_incasat, serie_incasat, total_cu_tva) ;
VALUES (tnTip, tcForma, tnIdVz, crsVz1.cod, NVL(crsVz1.serie_act,''), crsVz1.id_fact, ;
gnNrIncasareCapturat, crsVz1.nr_incasat, crsVz1.tip_incasat, crsVz1.suma_incasat, NVL(crsVz1.serie_incasat,''), crsVz1.total_cu_tva)
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': id_vanzare=' + TRANSFORM(tnIdVz) + ' cod=' + TRANSFORM(crsVz1.cod) + ;
' serie_act=' + TRANSFORM(crsVz1.serie_act) + ' id_fact=' + TRANSFORM(crsVz1.id_fact) + ;
' nr_incasat=' + TRANSFORM(crsVz1.nr_incasat) + ' (asteptat ' + TRANSFORM(gnNrIncasareCapturat) + ') tip_incasat=' + TRANSFORM(crsVz1.tip_incasat) + ;
' suma_incasat=' + TRANSFORM(crsVz1.suma_incasat) + ' serie_incasat=[' + TRANSFORM(crsVz1.serie_incasat) + ']' + ;
' total_cu_tva=' + TRANSFORM(crsVz1.total_cu_tva)
USE IN crsVz1
DO Assert WITH crsRezultate.nr_incasat = gnNrIncasareCapturat, ;
'[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI.NR_INCASAT persistat (' + TRANSFORM(crsRezultate.nr_incasat) + ;
') == poDate.nr_incasare capturat inainte de scriere (' + TRANSFORM(gnNrIncasareCapturat) + ')'
ENDPROC
PROCEDURE ComparaRezultate
LOCAL lnTip, lnRVechi, lnRNou
IF !glIncercaFormaNoua
DO S3bLog WITH ' forma noua sarita in aceasta rulare - fara comparatie vechi/nou, doar valorile persistate pe forma veche'
RETURN
ENDIF
FOR lnTip = 1 TO 4
SELECT crsRezultate
LOCATE FOR tip_incasare = lnTip AND forma == 'vechi'
IF !FOUND()
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand vechi gasit in crsRezultate'
LOOP
ENDIF
lnRVechi = RECNO()
LOCATE FOR tip_incasare = lnTip AND forma == 'nou'
IF !FOUND()
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand nou gasit in crsRezultate'
LOOP
ENDIF
lnRNou = RECNO()
LOCAL lnIdVechi, lnIdNou, lnTipIncVechi, lnTipIncNou, lnSumaVechi, lnSumaNou, lcSerieVechi, lcSerieNou
GO lnRVechi IN crsRezultate
lnIdVechi = crsRezultate.id_vanzare
lnTipIncVechi = crsRezultate.tip_incasat
lnSumaVechi = crsRezultate.suma_incasat
lcSerieVechi = crsRezultate.serie_incasat
GO lnRNou IN crsRezultate
lnIdNou = crsRezultate.id_vanzare
lnTipIncNou = crsRezultate.tip_incasat
lnSumaNou = crsRezultate.suma_incasat
lcSerieNou = crsRezultate.serie_incasat
IF lnIdVechi <= 0 OR lnIdNou <= 0
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] ambele documente s-au scris (vechi id_vanzare=' + ;
TRANSFORM(lnIdVechi) + ' nou id_vanzare=' + TRANSFORM(lnIdNou) + ')'
LOOP
ENDIF
DO Assert WITH lnTipIncVechi = lnTipIncNou, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.TIP_INCASAT identic (vechi=' + ;
TRANSFORM(lnTipIncVechi) + ' nou=' + TRANSFORM(lnTipIncNou) + ')'
DO Assert WITH ABS(lnSumaVechi - lnSumaNou) < 0.005, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SUMA_INCASAT identica (vechi=' + ;
TRANSFORM(lnSumaVechi) + ' nou=' + TRANSFORM(lnSumaNou) + ')'
DO Assert WITH ALLTRIM(lcSerieVechi) == ALLTRIM(lcSerieNou), '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SERIE_INCASAT identica (vechi=[' + ;
ALLTRIM(lcSerieVechi) + '] nou=[' + ALLTRIM(lcSerieNou) + '])'
ENDFOR
ENDPROC
*==================================================================================
* CreeazaDocumentIncasare: emite un document REAL prin fluxul de productie (tnTip=22, cursor_preturi,
* client RAJA id_part=463), aplicand tipul de incasare cerut pe formularul indicat. Intoarce
* poDate.nid_vanzare (>0 succes) sau 0 (esec, detaliat in log). gnNrIncasareCapturat e umplut cu
* poDate.nr_incasare chiar inainte de do_termin() - marimea persistata se verifica fata de asta.
FUNCTION CreeazaDocumentIncasare
LPARAMETERS tnTipIncasare, tlFormNou
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest
LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat, tnTip, tnIdClient, tnIdDelegat
LOCAL lcSerieAlocata, lnNractAlocat
lnIdVanzareRezultat = 0
lcSerieAlocata = ''
lnNractAlocat = 0
gnNrIncasareCapturat = 0
*-- FORMA VECHE: tnTip=22 (AVIZ din lista de preturi) - calea PROVENITA, curata, fara efecte
*-- secundare (nu intra pe ramura "comanda" din do_scrie_factura). opt_incasat traieste pe
*-- frm_alte_date (clasa separata), deci nu are restrictia Between(poDate.tip,1,4).
*-- FORMA NOUA: are nevoie de tnTip Between(1,4) ca opt_incasat sa existe inline pe formular
*-- (ofacturare.vc2:21066) - singurele din acel interval cu date reale in cursor_preturi sunt
*-- 3/4 (probe_emitere_reala.prg), dar tnTip=3 declanseaza un MESSAGEBOX_FORM real necunoscut
*-- mock-ului ("Doriti sa se inchida comanda?") si formularul nou insusi agata la CREATEOBJECT
*-- pe coloana Gestiune a grd_factura (vezi raport) - BLOCAT, nerezolvat in aceasta sesiune.
*-- 12b S4b proba B: incercari tnTip=1 (client 332) si tnTip=2 (client 463) - Reccount=0 in acest
*-- mediu (poDate.id_gestiune_init implicit NULL); revenire la tnTip=22/client 463, singura
*-- combinatie confirmata ca intoarce articole headless (probe_emitere_reala.prg) - a dat
*-- documentul real id_vanzare=1883, aproape integral pe politica de stoc (41), nu politica reala
*-- 34 tintita initial - limitare consemnata in stare, nu blocanta (proba A caz7 acopera regresia
*-- pe politica reala 34 direct in PL/SQL)
tnTip = IIF(tlFormNou, 3, 22)
tnIdClient = 463
tnIdDelegat = 256
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
IF !tlFormNou
poDate.nIdTipDoc = 6 && AVIZ - plaja globala, dovedit (id_vanzare 1061/1062/1063)
ENDIF
gnIdUtil = 8
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.id_client = tnIdClient
poDate.id_delegat = tnIdDelegat
poDate.zi_curs = {^2026-08-10}
IF poDate.rezultat_serii = 3
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
ENDIF
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
gnIdUtil = -3
lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, [])))
lnNractAlocat = poDate.nract
DO S3bLog WITH ' poDate.nract=' + TRANSFORM(poDate.nract) + ' serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + ']'
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ;
[?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}]
lcCursor = [crsarticole]
lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor)
IF lnSucces < 0
DO S3bLog WITH ' EROARE cursor articole: ' + goExecutor.oPrelucrareEroare()
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO S3bCurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
IF RECCOUNT(lcCursor) = 0
DO S3bLog WITH ' Nu exista articole (Reccount=0) - abandon document'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO S3bCurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
DO S3bLog WITH ' crsarticole Reccount=' + TRANSFORM(RECCOUNT(lcCursor))
*-- Lista de preturi a articolului e in EURO (tip_valuta=1), iar do_scrie_articole
*-- trimite pe ramura aceea vpretftva, derivat din pret_val - fortand doar pret,
*-- documentul iesea cu VANZARI_DETALII.PRET=0. Se forteaza perechea, coerent cu cursul.
SELECT (lcCursor)
REPLACE ALL cantitate WITH 1, ;
pret_val WITH IIF(tip_valuta = 1, 100, 0), ;
pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100)
=TABLEUPDATE(.T., .T., lcCursor)
GO TOP
creeaza_facturacrs([crsfactura])
IF poDate.in_valuta = 1
SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM (lcCursor) WITH (Buffering = .T.) WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri
SELECT crscursuri
poDate.Curs = Curs
poDate.multiplicator = multiplicator
ELSE
citeste_cursuri_zi(poDate.zi_curs)
IF RECCOUNT('crscursuri') = 0
USE IN crscursuri
ENDIF
ENDIF
IF TYPE(lcCursor + '.nume_lista_preturi') <> 'U'
CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100))
SELECT crspolitici
INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '<TOATE>')
INSERT INTO crspolitici(id_pol, nume_lista_preturi) ;
SELECT DISTINCT id_pol, nume_lista_preturi FROM (lcCursor) ORDER BY nume_lista_preturi
ENDIF
*-- formularul, modeless (apel direct de metode) - vechi sau unificat, dupa tlFormNou
PUBLIC goFrmS3b
IF tlFormNou
goFrmS3b = CREATEOBJECT('frm_facturare_articole2')
ELSE
goFrmS3b = CREATEOBJECT('frm_facturare_articole')
ENDIF
DO S3bLog WITH ' CREATEOBJECT OK, VARTYPE=' + VARTYPE(goFrmS3b)
goFrmS3b.WindowType = 0
DO S3bLog WITH ' WindowType=0 OK'
goFrmS3b.Show()
DO S3bLog WITH ' Show() OK'
DOEVENTS FORCE
DO S3bLog WITH ' formular afisat modeless (' + IIF(tlFormNou, 'NOU frm_facturare_articole2', 'VECHI frm_facturare_articole') + ')'
goFrmS3b.do_adauga_tot()
DOEVENTS FORCE
DO S3bLog WITH ' do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura'))
goFrmS3b.do_calculeaza_totaluri()
DOEVENTS FORCE
*-- CONT_VENIT asteptat, derivat exact ca in do_scrie_articole (ofacturare.vc2:14279), citit
*-- direct din randul crsfactura pe care do_scrie_articole il va scana
LOCAL lcExpContVenit, lnExpIdPol, lnExpIdArticol, lcExpCont, loExecutorReal
SELECT crsfactura
GO TOP
lnExpIdPol = crsfactura.id_pol
lnExpIdArticol = crsfactura.id_articol
lcExpCont = crsfactura.Cont
lcExpContVenit = IIF(EMPTY(NVL(lnExpIdPol, 0)), deriva_cont_venit_fara_pol(lnExpIdArticol, lcExpCont), '<NULL>')
*-- spion pe goExecutor (tehnica SpyS13, probe_s13_toomanycolumns.prg): captureaza SQL-ul real
*-- trimis de do_scrie_articole, fara sa-i schimbe comportamentul (DODEFAULT pe PCOUNT)
loExecutorReal = goExecutor
goExecutor = CREATEOBJECT('SpyContVenit')
goExecutor.nHandle = gnHandle
LOCAL lnScris
IF tlFormNou
*-- opt_incasat e inline pe formular - fara al doilea modal
goFrmS3b.seteaza_mod_incasare(tnTipIncasare)
gnNrIncasareCapturat = poDate.nr_incasare
DO S3bLog WITH ' opt_incasat.Value=' + TRANSFORM(tnTipIncasare) + ' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ;
' incasat=' + TRANSFORM(poDate.incasat) + ' incasatCARD=' + TRANSFORM(poDate.incasatCARD)
lnScris = goFrmS3b.do_termin()
ELSE
*-- calea veche: al doilea modal (frm_alte_date) e condus de goDriverAD/tmrDrvAD
glDlgTratatAD = .F.
gnTipIncasareCerut = tnTipIncasare
lnScris = goFrmS3b.do_termin()
LOCAL lnWait
lnWait = 0
DO WHILE !glDlgTratatAD AND lnWait < 10
DOEVENTS FORCE
lnWait = lnWait + 1
ENDDO
ENDIF
DO S3bLog WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0))
*-- restaureaza goExecutor real si verifica CONT_VENIT trimis de do_scrie_articole
LOCAL lcActualContVenit, lcEticheta
lcEticheta = '[' + IIF(tlFormNou,'nou','vechi') + ' tip=' + TRANSFORM(tnTipIncasare) + ']'
DO Assert WITH goExecutor.cLastArtCall # '', ;
lcEticheta + ' do_scrie_articole a trimis adauga_articol_factura (spion pe goExecutor)'
IF goExecutor.cLastArtCall # ''
lcActualContVenit = ExtrageContVenit(goExecutor.cLastArtCall)
DO Assert WITH lcActualContVenit == lcExpContVenit, ;
lcEticheta + ' CONT_VENIT trimis de do_scrie_articole = [' + lcExpContVenit + '], obtinut [' + lcActualContVenit + ']'
ENDIF
goExecutor = loExecutorReal
*-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare
*-- ramane santinela la esec: singura dovada e randul din VANZARI, pe serie_act + nract.
lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat)
IF lnIdVanzareRezultat < 0
lnIdVanzareRezultat = 0
ENDIF
DO S3bLog WITH ' verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ;
' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat)
IF TYPE('goFrmS3b') = 'O' AND !ISNULL(goFrmS3b)
goFrmS3b.Release()
ENDIF
goFrmS3b = NULL
IF USED('crspolitici')
USE IN crspolitici
ENDIF
IF USED('crscursuri')
USE IN crscursuri
ENDIF
IF USED('crsfactura')
USE IN crsfactura
ENDIF
IF USED('crsarticole')
USE IN crsarticole
ENDIF
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN lnIdVanzareRezultat
ENDFUNC
PROCEDURE S3bCurataJtva
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
ENDPROC
*-- extrage parametrul 29 (CONT_VENIT) dintr-un apel capturat pack_facturare.adauga_articol_factura(...);
*-- pozitia 28 e mereu literalul NULL, deci pos29 e tot ce urmeaza dupa ultima virgula dinaintea "); end;"
FUNCTION ExtrageContVenit
LPARAMETERS tcSql
LOCAL lnEnd, lcParams, lnComma, lcPos29
lnEnd = AT('); end;', tcSql)
IF lnEnd = 0
RETURN '<NEPARSABIL>'
ENDIF
lcParams = LEFT(tcSql, lnEnd - 1)
lnComma = RAT(',', lcParams)
IF lnComma = 0
RETURN '<NEPARSABIL>'
ENDIF
lcPos29 = SUBSTR(lcParams, lnComma + 1)
IF UPPER(lcPos29) == 'NULL'
RETURN '<NULL>'
ENDIF
RETURN STRTRAN(lcPos29, "'", '')
ENDFUNC
*==================================================================================
*-- SpyContVenit: subclasa a lui oexecutor (tehnica SpyS13 din probe_s13_toomanycolumns.prg) -
*-- logheaza in cLastArtCall statementul adauga_articol_factura, apoi executa normal prin
*-- DODEFAULT pe PCOUNT (fara sa schimbe comportamentul real)
DEFINE CLASS SpyContVenit AS oexecutor
cLastArtCall = ''
PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect)
LOCAL lnPc, lcS, lnRet
lnPc = PCOUNT()
lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '')
IF 'adauga_articol_factura(' $ lcS
THIS.cLastArtCall = lcS
ENDIF
TRY
DO CASE
CASE lnPc <= 1
lnRet = DODEFAULT(m.tcSql)
CASE lnPc = 2
lnRet = DODEFAULT(m.tcSql, m.tcCursor)
CASE lnPc = 3
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress)
CASE lnPc = 4
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress)
CASE lnPc = 5
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle)
CASE lnPc = 6
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError)
CASE lnPc = 7
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError)
OTHERWISE
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect)
ENDCASE
CATCH TO loExSpy
lnRet = -1
THIS.cEroare = 'SpyContVenit: ' + TRANSFORM(loExSpy.Message)
ENDTRY
RETURN lnRet
ENDPROC
ENDDEFINE
*==================================================================================
*-- driverAlteDateAD: cauta FRM_ALTE_DATE prin _SCREEN.Forms si ii seteaza opt_incasat.Value la
* gnTipIncasareCerut INAINTE de a-i chema .do_termin() - acelasi mecanism ca driverAlteDate8 din
* creeaza_documente_s8.prg, cu un singur adaos (selectia tipului de incasare).
DEFINE CLASS driverAlteDateAD AS Custom
PROCEDURE Executa
LOCAL lnI, loForm, llGasit, loMsgForm
llGasit = .F.
loMsgForm = NULL
FOR lnI = 1 TO _SCREEN.FormCount
LOCAL lcClasa
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF lcClasa == 'FRM_ALTE_DATE'
loForm = _SCREEN.Forms(lnI)
llGasit = .T.
ENDIF
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S3bLog WITH ' [diag timer] forma noua vazuta: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
*-- confirmare reala neacoperita de mock_amessagebox (forma modala messagebox_form) -
*-- apasa automat cmdYes/cmdOk, ca in productie la raspuns implicit "Da"
IF !ISNULL(loMsgForm)
TRY
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S3bLog WITH ' [diag timer] messagebox_form: CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ENDIF
IF glDlgTratatAD OR !llGasit
RETURN
ENDIF
LOCAL loAC
loAC = loForm.ActiveControl
TRY
loForm.opt_incasat.Value = gnTipIncasareCerut
gnNrIncasareCapturat = poDate.nr_incasare
DO S3bLog WITH ' driverAlteDateAD: opt_incasat.Value=' + TRANSFORM(gnTipIncasareCerut) + ;
' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ' incasat=' + TRANSFORM(poDate.incasat) + ;
' incasatCARD=' + TRANSFORM(poDate.incasatCARD)
loForm.do_termin()
glDlgTratatAD = .T.
CATCH TO loExcDrv
DO S3bLog WITH ' driverAlteDateAD: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ;
' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo)
glDlgTratatAD = .T.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,406 @@
* probe_12b_s6b_clasa_pret_nomenclator.prg
* Plan #12b, S6b - proba headless pe clasa cus_pret_nomenclator (COMUN\programe\ofacturare_comun.prg:2319),
* definita direct in .prg (Set Procedure To ofacturare_comun.prg, deja Additive in mediul de test),
* nu in .vcx - CREATEOBJECT direct, fara SET CLASSLIB.
*
* Articol de proba: 2528841557 (ARIPA FATA AUDI A4), are deja rand pe politica 41 (tiparul S5/S5b).
* Conturi 461/7583 (tiparul S5b caz2 si S4b caz1/caz6): validate in PLCONT, fara nota preexistenta.
*
* Cazuri (numerotate ca in docs\stare_plan_12b.md / plan_12b, sectiunea S6b):
* (1) asigura_politica -> 41; incarca -> salveaza (12.34/1.21, conturi goale) -> instanta noua
* incarca -> aceleasi valori; citire si prin cursor_preturi (tiparul S5).
* (2) doar cont debit fara credit -> valideaza .F., spion: zero apeluri RPC.
* (3) esec fortat pe al doilea RPC (salveaza_pret_nomenclator) dupa ce primul (gaseste_sau_creeaza_
* nota_vanzare, real, 461/7583) a creat nota -> salveaza .F.; SAVEPOINT/ROLLBACK TO local (nu
* tot lantul), apoi SELECT confirma ca nici nota noua, nici randul nu au ramas modificate.
* (4) rand cu ID_NOTA existent (pus direct prin SQL, in tranzactie), instanta noua fara incarca,
* salveaza -> ID_NOTA neschimbat (pnScrieNota=0 cand lIncarcat=.F.).
* (5) conturi 461/7583 salvate prin clasa (real, fara spion) -> pack_facturare.contabilizeaza_articol
* pe un rand de factura pentru acelasi articol/politica -> ACT_TEMP.SCD=461/SCC=7583 (tiparul S4b-A).
* (6) recalculeaza_pret: 100 fara TVA la proc_tvav=1.21 -> 121 si invers: 121 -> 100, rotunjire la
* zecimalele reale (gnPc=2, verificat egal cu pack_sesiune.nzecimale_pretv - baseline_12b.sql:114).
*
* Spion pe goExecutor (subclasa, DODEFAULT pe PCOUNT) - tiparul din probe_12b_s7a_optiuni_readonly.prg /
* editare_factura\probe_s13_toomanycolumns.prg: nu opreste executia decat pentru cazul (3), unde
* filtreaza explicit SQL-ul care contine 'salveaza_pret_nomenclator' si intoarce -1 fara sa-l trimita.
*
* Rulare: powershell -ExecutionPolicy Bypass -File ruleaza_suita.ps1 -Nume probe_12b_s6b_clasa_pret_nomenclator
* Log: D:\ROA\ROAFACTURARE\docs\loguri_12b\s6b_clasa.log (cerut de sarcina, nu out\)
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
PUBLIC gcLog, gcCaz, gnPass, gnFail, gnTransOriginal, gcErrMsg, gnIdArtProba, gnAn, gnLuna
gcErrMsg = ""
gcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\s6b_clasa.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b")
MD "D:\ROA\ROAFACTURARE\docs\loguri_12b"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gcCaz = ""
gnPass = 0
gnFail = 0
gnIdArtProba = 2528841557
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
gnIdUtil = 8
* gnPc lipseste din test_init_env_auto_roafacturare - il seteaza aplicatia real la nivelul sesiunii,
* tiparul din alte probe ale suitei (gnPc = 2, ex. test_s4c_discount_grid.prg)
PUBLIC gnPc
gnPc = 2
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) + " gnPc=" + TRANSFORM(gnPc)
IF TYPE('cus_pret_nomenclator') <> 'C' AND !("CUS_PRET_NOMENCLATOR" $ UPPER(SET('PROCEDURE')))
* verificare informativa - CREATEOBJECT esueaza oricum mai jos daca clasa nu e vizibila
DO AfLog WITH "info: SET(PROCEDURE) nu confirma explicit ofacturare_comun.prg (verificare slaba, se bazeaza pe CREATEOBJECT)"
ENDIF
gnTransOriginal = SQLGETPROP(gnHandle, "Transactions")
SQLSETPROP(gnHandle, "Transactions", 2)
DO AfLog WITH "Transactions manual, original=" + TRANSFORM(gnTransOriginal)
*----------------------------------------------------------------------------------------
* precondition: articolul de proba e chiar pe politica 41, si pack_facturare are politica de
* stoc + antetul de document initializate (cerut de contabilizeaza_articol la cazul 5, tiparul
* precondition din probe_12b_s4b_matrice.prg)
gcCaz = "[precondition] "
LOCAL lnOk, lcSql
lnOk = SQLEXEC(gnHandle, "select count(*) cnt from crm_politici_pret_art where id_pol = 41 and id_articol = " + TRANSFORM(gnIdArtProba), "crspre")
DO Verdict WITH lnOk > 0 AND USED('crspre') AND crspre.cnt = 1, "articolul " + TRANSFORM(gnIdArtProba) + " e pe politica 41 (cnt=" + TRANSFORM(IIF(USED('crspre'),crspre.cnt,-1)) + ")"
IF USED('crspre')
USE IN crspre
ENDIF
gnAn = YEAR(DATETIME())
gnLuna = MONTH(DATETIME())
lcSql = [begin pack_facturare.initializeaza_facturare(8); ] + ;
[if nvl(pack_facturare.nid_politica_stoc,0) <> 41 then raise_application_error(-20900,'nid_politica_stoc='||to_char(pack_facturare.nid_politica_stoc)); end if; ] + ;
[pack_facturare.nnumar_act := 999998; pack_facturare.cserie_act := 'TST'; ] + ;
[pack_facturare.ddata_ireg := sysdate; pack_facturare.ddata_act := sysdate; pack_facturare.ddata_scadenta := sysdate; ] + ;
[pack_facturare.nid_moneda_nationala := 3; pack_facturare.nperechec := 0; pack_facturare.nid_fdoc := 0; ] + ;
[pack_facturare.nid_factc := 0; pack_facturare.nid_part := 0; pack_facturare.nid_partc := 0; pack_facturare.nid_set := 26000; ] + ;
[pack_facturare.nid_sectie_stoc := nvl(pack_facturare.nid_sectie_stoc,1); pack_facturare.ntip := 1; end;]
lnOk = SQLEXEC(gnHandle, lcSql)
DO Verdict WITH lnOk > 0, "initializeaza_facturare(8) + antet document proba + precondition nid_politica_stoc=41"
IF lnOk <= 0
DO AfLog WITH "BLOCAT: precondition esuata, opresc"
DO Final
ENDIF
*==========================================================================================
* CAZ (1): asigura_politica -> incarca -> salveaza (conturi goale) -> instanta noua incarca
*==========================================================================================
gcCaz = "[1-incarca-salveaza-reincarca] "
LOCAL loP1, loP1b
loP1 = CREATEOBJECT('cus_pret_nomenclator')
LOCAL lnPol1
lnPol1 = loP1.asigura_politica()
DO Verdict WITH lnPol1 = 41, "asigura_politica() = 41 (obtinut " + TRANSFORM(lnPol1) + ")"
DO Verdict WITH loP1.incarca(gnIdArtProba), "incarca(" + TRANSFORM(gnIdArtProba) + ") = .T."
DO AfLog WITH " inainte de salveaza: pretftva=" + TRANSFORM(loP1.nPretFtva) + " pretctva=" + TRANSFORM(loP1.nPretCtva) + " proc_tvav=" + TRANSFORM(loP1.nProcTvav) + " id_nota=" + TRANSFORM(NVL(loP1.nIdNota,-999))
loP1.nPretFtva = 12.34
loP1.nProcTvav = 1.21
loP1.nPretCtva = loP1.recalculeaza_pret(loP1.nPretFtva, .T.)
loP1.cScd = []
loP1.cScc = []
DO Verdict WITH loP1.salveaza(gnIdArtProba), "salveaza() = .T. (pretftva=12.34 pretctva=" + TRANSFORM(loP1.nPretCtva) + " proc_tvav=1.21, conturi goale)"
loP1b = CREATEOBJECT('cus_pret_nomenclator')
DO Verdict WITH loP1b.incarca(gnIdArtProba), "instanta noua: incarca(" + TRANSFORM(gnIdArtProba) + ") = .T."
DO Verdict WITH loP1b.nPretFtva == 12.34, "reincarcat pretftva=12.34 (obtinut " + TRANSFORM(loP1b.nPretFtva) + ")"
DO Verdict WITH loP1b.nPretCtva == loP1.nPretCtva, "reincarcat pretctva=" + TRANSFORM(loP1.nPretCtva) + " (obtinut " + TRANSFORM(loP1b.nPretCtva) + ")"
DO Verdict WITH loP1b.nProcTvav == 1.21, "reincarcat proc_tvav=1.21 (obtinut " + TRANSFORM(loP1b.nProcTvav) + ")"
DO Verdict WITH ISNULL(loP1b.nIdNota), "reincarcat id_nota=NULL (conturi goale la salvare, incarcat=.T. -> scrie_nota=1)"
* citire si prin cursor_preturi (tiparul S5): articol vizibil prin STOC temporar (gestiune 1, cants=10)
gcCaz = "[1b-cursor_preturi] "
LOCAL lnIdStoc
lnOk = SQLEXEC(gnHandle, "select nvl(max(id_stoc),0)+1 idn from stoc", "crsids")
lnIdStoc = IIF(lnOk > 0 AND USED('crsids'), crsids.idn, 0)
IF USED('crsids')
USE IN crsids
ENDIF
lcSql = "insert into stoc (id_stoc, an, luna, id_articol, pret, pretv, tva, tvav, cants, cant, cante, cont, pretd, id_gestiune, proc_tvav, id_sucursala) values (" + ;
TRANSFORM(lnIdStoc) + "," + TRANSFORM(gnAn) + "," + TRANSFORM(gnLuna) + "," + TRANSFORM(gnIdArtProba) + ",0,0,0,0,10,0,0,'371',0,1,1.21,167)"
lnOk = SQLEXEC(gnHandle, lcSql)
DO Verdict WITH lnOk > 0, "INSERT STOC temporar pentru vizibilitate in cursor_preturi (id_stoc=" + TRANSFORM(lnIdStoc) + ")"
PRIVATE pnIdArtCursor, pnGasitCursor, pnPretCursor, pnProcCursor
pnIdArtCursor = gnIdArtProba
pnGasitCursor = 0
pnPretCursor = 0
pnProcCursor = 0
* ?@ ca tinta de asignare directa (nu doar ca parametru de apel) e confirmat in COMUN\clase\ocomenzi.vc2:1916
* ([begin ?@pcMesajVerificareCom:=pack_comenzi.verifica_acces_comanda(...); end;]) - dar doar ca instructiune
* de top-level, o singura data; asignarile de mai jos se fac dupa LOOP, in variabile PL/SQL simple pe
* parcursul buclei, ca sa nu riscam un bind ?@ neconfirmat imbricat in IF/LOOP (View Parameter modal)
lcSql = [declare v_cursor pack_facturare.cursor_facturare; v_id_c number; v_id_articol number; v_lot varchar2(50); v_serie varchar2(50); ] + ;
[v_id_pol number; v_id_valuta number; v_nume_lista varchar2(200); v_discount number; v_discount_val number; ] + ;
[v_codmat varchar2(50); v_codbare varchar2(50); v_denumire varchar2(200); v_um varchar2(50); v_gestionabil number; ] + ;
[v_cantitate number; v_proc_tvav number; v_preturi_cu_tva number; v_curs number; v_multiplicator number; ] + ;
[v_pret number; v_pret_val number; v_tip_valuta number; v_nume_val varchar2(50); v_modificabil number; ] + ;
[v_gasit number := 0; v_pret_out number := 0; v_proc_out number := 0; ] + ;
[begin pack_facturare.cursor_preturi(trunc(sysdate),1,3,null,] + TRANSFORM(gnLuna) + [,] + TRANSFORM(gnAn) + [,8,167,v_cursor); ] + ;
[loop fetch v_cursor into v_id_c, v_id_articol, v_lot, v_serie, v_id_pol, v_id_valuta, v_nume_lista, v_discount, v_discount_val, ] + ;
[v_codmat, v_codbare, v_denumire, v_um, v_gestionabil, v_cantitate, v_proc_tvav, v_preturi_cu_tva, v_curs, v_multiplicator, ] + ;
[v_pret, v_pret_val, v_tip_valuta, v_nume_val, v_modificabil; ] + ;
[exit when v_cursor%notfound; if v_id_articol = ] + TRANSFORM(gnIdArtProba) + [ then v_gasit := 1; v_pret_out := v_pret; v_proc_out := v_proc_tvav; exit; end if; end loop; ] + ;
[close v_cursor; ?@pnGasitCursor := v_gasit; ?@pnPretCursor := v_pret_out; ?@pnProcCursor := v_proc_out; end;]
lnOk = goExecutor.oExecute(lcSql)
DO Verdict WITH lnOk >= 0, "bloc cursor_preturi executat fara eroare"
DO AfLog WITH " cursor_preturi: gasit=" + TRANSFORM(pnGasitCursor) + " pret=" + TRANSFORM(pnPretCursor) + " proc_tvav=" + TRANSFORM(pnProcCursor)
DO Verdict WITH pnGasitCursor = 1, "articolul apare in cursor_preturi (STOC temporar vizibil)"
DO Verdict WITH ROUND(pnPretCursor,2) == 12.34, "cursor_preturi.pret = 12.34 (obtinut " + TRANSFORM(pnPretCursor) + ")"
DO Verdict WITH ROUND(pnProcCursor,2) == 1.21, "cursor_preturi.proc_tvav = 1.21 (obtinut " + TRANSFORM(pnProcCursor) + ")"
lnOk = SQLEXEC(gnHandle, "delete from stoc where id_stoc = " + TRANSFORM(lnIdStoc))
DO Verdict WITH lnOk >= 0, "curatare STOC temporar"
*==========================================================================================
* CAZ (2): doar cont debit fara credit -> valideaza .F., zero apeluri RPC
*==========================================================================================
gcCaz = "[2-doar-debit-zero-rpc] "
LOCAL loP2, loRealTmp, loSpy2
loP2 = CREATEOBJECT('cus_pret_nomenclator')
loP2.nPretFtva = 10
loP2.nPretCtva = 12.1
loP2.nProcTvav = 1.21
loP2.cScd = '461'
loP2.cScc = []
DO Verdict WITH !loP2.valideaza(), "valideaza() = .F. (doar debit, fara credit)"
loRealTmp = goExecutor
loSpy2 = CREATEOBJECT('SpyS6b')
goExecutor = loSpy2
LOCAL llRezSalv2
llRezSalv2 = loP2.salveaza(gnIdArtProba)
goExecutor = loRealTmp
DO Verdict WITH !llRezSalv2, "salveaza() = .F. (refuz pe validare)"
DO Verdict WITH loSpy2.nApeluri = 0, "zero apeluri RPC prin executor (" + TRANSFORM(loSpy2.nApeluri) + " obtinut)"
*==========================================================================================
* CAZ (3): esec fortat pe al doilea RPC (salveaza_pret_nomenclator), dupa ce primul (nota
* 461/7583) chiar s-a executat - SAVEPOINT local, ROLLBACK TO, apoi SELECT de confirmare
*==========================================================================================
gcCaz = "[3-esec-al-doilea-rpc] "
lnOk = SQLEXEC(gnHandle, "SAVEPOINT SP_CAZ3")
DO Verdict WITH lnOk > 0, "SAVEPOINT SP_CAZ3"
LOCAL lnMaxNotaInainte, lnIdNotaRandInainte
lnOk = SQLEXEC(gnHandle, "select nvl(max(id_nota),0) mx from crm_note_vanzari", "crsmx1")
lnMaxNotaInainte = IIF(lnOk > 0 AND USED('crsmx1'), crsmx1.mx, -1)
IF USED('crsmx1')
USE IN crsmx1
ENDIF
lnOk = SQLEXEC(gnHandle, "select id_nota from crm_politici_pret_art where id_pol = 41 and id_articol = " + TRANSFORM(gnIdArtProba), "crsid1")
lnIdNotaRandInainte = IIF(lnOk > 0 AND USED('crsid1'), NVL(crsid1.id_nota,-999), -999)
IF USED('crsid1')
USE IN crsid1
ENDIF
DO AfLog WITH " inainte: max(id_nota)=" + TRANSFORM(lnMaxNotaInainte) + " id_nota rand=" + TRANSFORM(lnIdNotaRandInainte)
LOCAL loP3, loSpy3
loP3 = CREATEOBJECT('cus_pret_nomenclator')
DO Verdict WITH loP3.incarca(gnIdArtProba), "incarca() pentru caz3"
loP3.nPretFtva = 20
loP3.nProcTvav = 1.21
loP3.nPretCtva = loP3.recalculeaza_pret(loP3.nPretFtva, .T.)
loP3.cScd = '461'
loP3.cScc = '7583'
loRealTmp = goExecutor
loSpy3 = CREATEOBJECT('SpyS6b')
loSpy3.lForteazaEsecSalveaza = .T.
goExecutor = loSpy3
LOCAL llRezSalv3
llRezSalv3 = loP3.salveaza(gnIdArtProba)
goExecutor = loRealTmp
DO Verdict WITH !llRezSalv3, "salveaza() = .F. (RPC2 fortat sa esueze)"
DO Verdict WITH loSpy3.nApeluri = 2, "2 apeluri RPC (nota + salveaza_pret_nomenclator interceptat) - " + TRANSFORM(loSpy3.nApeluri)
lnOk = SQLEXEC(gnHandle, "ROLLBACK TO SP_CAZ3")
DO Verdict WITH lnOk > 0, "ROLLBACK TO SP_CAZ3"
LOCAL lnMaxNotaDupa, lnIdNotaRandDupa
lnOk = SQLEXEC(gnHandle, "select nvl(max(id_nota),0) mx from crm_note_vanzari", "crsmx2")
lnMaxNotaDupa = IIF(lnOk > 0 AND USED('crsmx2'), crsmx2.mx, -1)
IF USED('crsmx2')
USE IN crsmx2
ENDIF
lnOk = SQLEXEC(gnHandle, "select id_nota from crm_politici_pret_art where id_pol = 41 and id_articol = " + TRANSFORM(gnIdArtProba), "crsid2")
lnIdNotaRandDupa = IIF(lnOk > 0 AND USED('crsid2'), NVL(crsid2.id_nota,-999), -999)
IF USED('crsid2')
USE IN crsid2
ENDIF
DO AfLog WITH " dupa ROLLBACK: max(id_nota)=" + TRANSFORM(lnMaxNotaDupa) + " id_nota rand=" + TRANSFORM(lnIdNotaRandDupa)
DO Verdict WITH lnMaxNotaDupa = lnMaxNotaInainte, "dupa ROLLBACK nicio nota noua (max(id_nota) neschimbat)"
DO Verdict WITH lnIdNotaRandDupa = lnIdNotaRandInainte, "dupa ROLLBACK randul politicii nu a fost modificat (id_nota=" + TRANSFORM(lnIdNotaRandDupa) + ")"
*==========================================================================================
* CAZ (4): rand cu ID_NOTA existent (SQL direct), instanta noua fara incarca -> ID_NOTA neschimbat
*==========================================================================================
gcCaz = "[4-fara-incarca-idnota-neschimbat] "
LOCAL lnNotaFixata
lnNotaFixata = 6
lnOk = SQLEXEC(gnHandle, "update crm_politici_pret_art set id_nota = " + TRANSFORM(lnNotaFixata) + " where id_pol = 41 and id_articol = " + TRANSFORM(gnIdArtProba))
DO Verdict WITH lnOk > 0, "UPDATE id_nota=" + TRANSFORM(lnNotaFixata) + " direct pe rand (precondition caz 4)"
LOCAL loP4
loP4 = CREATEOBJECT('cus_pret_nomenclator')
DO Verdict WITH !loP4.lIncarcat, "instanta noua: lIncarcat=.F. (fara incarca)"
loP4.nPretFtva = 30
loP4.nProcTvav = 1.21
loP4.nPretCtva = loP4.recalculeaza_pret(loP4.nPretFtva, .T.)
DO Verdict WITH loP4.salveaza(gnIdArtProba), "salveaza() fara incarca = .T."
lnOk = SQLEXEC(gnHandle, "select id_nota from crm_politici_pret_art where id_pol = 41 and id_articol = " + TRANSFORM(gnIdArtProba), "crsid4")
DO Verdict WITH lnOk > 0 AND USED('crsid4') AND NVL(crsid4.id_nota,-999) = lnNotaFixata, "id_nota neschimbat dupa salveaza() fara incarca (" + TRANSFORM(IIF(USED('crsid4'),NVL(crsid4.id_nota,-999),-999)) + ", asteptat " + TRANSFORM(lnNotaFixata) + ")"
IF USED('crsid4')
USE IN crsid4
ENDIF
*==========================================================================================
* CAZ (5): conturi 461/7583 salvate prin clasa (real) -> contabilizeaza_articol -> ACT_TEMP
*==========================================================================================
gcCaz = "[5-conturi-461-7583-contabilizare] "
LOCAL loP5
loP5 = CREATEOBJECT('cus_pret_nomenclator')
DO Verdict WITH loP5.incarca(gnIdArtProba), "incarca() pentru caz5"
loP5.nPretFtva = 40
loP5.nProcTvav = 1.21
loP5.nPretCtva = loP5.recalculeaza_pret(loP5.nPretFtva, .T.)
loP5.cScd = '461'
loP5.cScc = '7583'
DO Verdict WITH loP5.salveaza(gnIdArtProba), "salveaza() real cu conturi 461/7583 = .T."
DO Verdict WITH !ISNULL(loP5.nIdNota) AND loP5.nIdNota > 0, "id_nota atribuit dupa salveaza (" + TRANSFORM(NVL(loP5.nIdNota,-1)) + ")"
lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; ] + ;
[BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -906000; ] + ;
[v_row.id_pol := 41; v_row.id_articol := ] + TRANSFORM(gnIdArtProba) + [; v_row.cont_venit := NULL; ] + ;
[v_row.cantitate := 1; v_row.pret := 40; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ;
[v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ;
[v_row.in_stoc := 0; v_row.explicatia := 'PROBA S6B CAZ5'; v_row.proc_tvav := 1.21; ] + ;
[v_res := pack_facturare.contabilizeaza_articol(v_row); END;]
lnOk = SQLEXEC(gnHandle, lcSql)
DO Verdict WITH lnOk > 0, "contabilizeaza_articol fara eroare"
IF lnOk > 0
* ACT_TEMP.ID_ACT = nid_act + 1, nu nid_act (tiparul confirmat pe toate cele 11 cazuri din
* probe_12b_s4b_matrice.prg, ex. nid_act=-901000 -> LeaActTemp WITH -900999)
lnOk = SQLEXEC(gnHandle, "select nvl(scd,'<NULL>') scd, nvl(scc,'<NULL>') scc from act_temp where id_act = -905999", "crsact5")
IF lnOk > 0 AND USED('crsact5') AND RECCOUNT('crsact5') = 1
DO AfLog WITH " ACT_TEMP: SCD=" + ALLTRIM(crsact5.scd) + " SCC=" + ALLTRIM(crsact5.scc)
DO Verdict WITH ALLTRIM(crsact5.scd) == "461" AND ALLTRIM(crsact5.scc) == "7583", "ACT_TEMP.SCD/SCC = 461/7583 (nota scrisa prin clasa)"
ELSE
DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)"
ENDIF
ENDIF
IF USED('crsact5')
USE IN crsact5
ENDIF
*==========================================================================================
* CAZ (6): recalculeaza_pret, rotunjire pe gnPc (verificat egal cu pack_sesiune.nzecimale_pretv)
*==========================================================================================
gcCaz = "[6-recalculeaza_pret] "
* pack_sesiune.nzecimale_pretv e variabila de pachet PL/SQL, neselectabila direct din SQL
* (ORA-06553 PLS-221, confirmat in docs\baseline_12b.md:6-9) - SQLEXEC-ul de mai jos esua tacut
* (lnOk<=0), de-aia asertul vechi trecea gnPc fata de fallback-ul -1, nu fata de o valoare reala.
* recalculeaza_pret (ofacturare_comun.prg:2485/2487) foloseste Round(tnPret*nProcTvav, gnPc) -
* gnPc e sursa reala de rotunjire, nu pachetul Oracle; verificat prin cod (vfp_symbols -Grep).
DO Verdict WITH gnPc = 2, "gnPc = 2 (precizie sume lei, sursa reala din recalculeaza_pret - ofacturare_comun.prg:2485)"
LOCAL loP6
loP6 = CREATEOBJECT('cus_pret_nomenclator')
loP6.nProcTvav = 1.21
DO Verdict WITH loP6.recalculeaza_pret(100, .T.) == 121, "recalculeaza_pret(100,.T.) = 121 (obtinut " + TRANSFORM(loP6.recalculeaza_pret(100,.T.)) + ")"
DO Verdict WITH loP6.recalculeaza_pret(121, .F.) == 100, "recalculeaza_pret(121,.F.) = 100 (obtinut " + TRANSFORM(loP6.recalculeaza_pret(121,.F.)) + ")"
DO Final
*==================================================================================================
* Spion pe goExecutor - subclasa DODEFAULT pe PCOUNT (nu opreste executia), tiparul din
* probe_12b_s7a_optiuni_readonly.prg. lForteazaEsecSalveaza=.T. intoarce -1 fara sa mai trimita
* SQL-ul cand acesta contine 'salveaza_pret_nomenclator' (cazul 3) - restul trece prin DODEFAULT.
*==================================================================================================
DEFINE CLASS SpyS6b AS oexecutor
nApeluri = 0
cToateSql = ''
lForteazaEsecSalveaza = .F.
PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect)
LOCAL lnRet, lnPc, lcS
THIS.nApeluri = THIS.nApeluri + 1
lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '<NU E SIR>')
THIS.cToateSql = THIS.cToateSql + lcS + CHR(13) + CHR(10)
STRTOFILE(' SpyS6b #' + TRANSFORM(THIS.nApeluri) + ' SQL=[' + lcS + ']' + CHR(13) + CHR(10), gcLog, 1)
IF THIS.lForteazaEsecSalveaza AND 'SALVEAZA_PRET_NOMENCLATOR' $ UPPER(lcS)
STRTOFILE(' SpyS6b: ESEC FORTAT (nu trimit SQL-ul de mai sus)' + CHR(13) + CHR(10), gcLog, 1)
RETURN -1
ENDIF
lnPc = PCOUNT()
DO CASE
CASE lnPc <= 1
lnRet = DODEFAULT(m.tcSql)
CASE lnPc = 2
lnRet = DODEFAULT(m.tcSql, m.tcCursor)
CASE lnPc = 3
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress)
CASE lnPc = 4
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress)
CASE lnPc = 5
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle)
CASE lnPc = 6
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError)
CASE lnPc = 7
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError)
OTHERWISE
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect)
ENDCASE
RETURN lnRet
ENDPROC
ENDDEFINE
PROCEDURE Verdict
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
LOCAL lnOk
gcCaz = "[final] "
lnOk = SQLEXEC(gnHandle, "ROLLBACK")
DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk)
IF TYPE('gnTransOriginal') = 'N'
SQLSETPROP(gnHandle, "Transactions", gnTransOriginal)
ENDIF
DO AfLog WITH "TOTAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,785 @@
* probe_12b_s6c_fisa_pagina_vanzare.prg
* Plan #12b, S6c - proba headless pe frm_catalog_articole_nou (COMUN\clase\onom_articole.vc2:662),
* Page3 "Vanzare" (docs\plan_12b_nomenclator_politica_stoc.md, sectiunea S6c).
*
* Partea 1 (fara scriere in Oracle, fara salvare), doua cazuri, in DOUA procese vfp9 separate -
* Init() executa neconditionat (indiferent de gcNumeProgram) generatorul de coduri automate
* (creeaza_cursor_serii); a doua instantiere a formularului in ACELASI proces se autobloca (nu
* apuca sa arunce nicio eroare prinsa de TRY, nici dupa ROLLBACK intre cele doua CREATEOBJECT -
* incercat si infirmat), deci fiecare caz porneste propriul vfp9, cu propriul gnHandle:
* (0a) implicit, fara parametru - CREATEOBJECT sub gcNumeProgram=ROAFACTURARE - trece (errno=0);
* PageCount=3; Thisform.oPretNom instantiat (Vartype='O'); valorile incarcate in oPretNom
* comparate cu un SELECT direct, independent de goExecutor, pe crm_politici_pret_art;
* TabIndex pe cele 7 controale din Page3; recalculeaza_pret (ftva<->ctva) apelat prin
* Thisform.oPretNom, cu proc_tvav real incarcat.
* (0b) cu parametrul ROACONT - acelasi CREATEOBJECT sub gcNumeProgram=ROACONT - trece (errno=0);
* PageCount=2; Thisform.oPretNom NU e instantiat (Vartype<>'O').
*
* Partea 2 (scrie in Oracle, tot in tranzactie/ROLLBACK), patru cazuri, fiecare in procesul lui
* propriu (acelasi motiv ca la partea 1 - o singura instantiere a formularului per proces).
* Salvarea headless NU trece prin inainte_de_do_termin() (onom_articole.vc2:1777) - confirmat cu
* un script de diagnostic: This.ActiveControl.BaseClass (linia 1782, primul rand al metodei)
* arunca ERROR 1924 "ACTIVECONTROL is not an object" pe un formular niciodata Show(), deci fara
* focus real de fereastra (masina partajata - nu se face Show()). In loc, proba apeleaza direct,
* in aceeasi ordine ca in productie, metodele reale de salvare pe care inainte_de_do_termin le
* orchestreaza (onom_articole.vc2:1799-1840): Thisform.do_deschide_tranzactie(),
* Thisform.cus_odata_catalog_articole.salvare(Thisform.orec, Thisform.NID) (cu lSilent=.T., ca sa
* sara peste dialogul modal de confirmare - _cus_odata_base.vc2:126-130), apoi
* Thisform.oPretNom.salveaza(idArticol) (COMUN\programe\ofacturare_comun.prg:2487).
* Diferenta fata de fluxul real: pe cazurile de succes (CAZ1/CAZ2) proba NU cheama
* Thisform.do_inchide_tranzactie(1) - acela face un SQLCOMMIT() real, ireversibil, pe schema de
* test; verificarea se face prin SELECT in aceeasi tranzactie manuala, apoi un ROLLBACK direct
* (nu wrapper-ul de productie). Pe CAZ3 (esec fortat), do_inchide_tranzactie(2) chiar se cheama -
* acela face SQLROLLBACK(), sigur de rulat real, exact cum cere sarcina.
* (CAZ1) articol NOU (INSERT), pret/TVA/conturi (461/7583) setate pe Page3 (Thisform.oPretNom) ->
* dupa salvare, randul din crm_politici_pret_art exista in Oracle (in tranzactie) cu
* valorile puse de proba, id_nota alocat; apoi ROLLBACK direct, zero date ramase.
* (CAZ2) articolul de proba (2528841557, UPDATE) cu pret/TVA/conturi noi pe Page3 -> randul din
* crm_politici_pret_art actualizat in Oracle (in tranzactie); apoi ROLLBACK direct.
* (CAZ3) articol NOU (INSERT) - articolul se salveaza real, apoi salvarea randului de pret e
* fortata sa esueze cu un spion pe goExecutor (subclasa oexecutor, filtreaza SQL-ul care
* contine 'salveaza_pret_nomenclator', fara modificare de productie - tiparul SpyS6b din
* probe_12b_s6b_clasa_pret_nomenclator.prg) -> Thisform.do_inchide_tranzactie(2) (ROLLBACK
* real) -> articolul nou nu mai exista.
* (CAZ4) regresie garda NULL (onom_articole.vc2:88, S6c-4) - articol NOU (INSERT) cu
* id_tara_origine fortat NULL -> cus_odata_catalog_articole.salvare() trebuie sa construiasca
* un SQL real (nu This.csql NULL) si sa scrie efectiv in Oracle; verificat direct dupa
* codmat (id_tara_origine ramas NULL), apoi ROLLBACK direct. Inainte de reparatie, csql
* devenea NULL si salvare() intorcea .T. fara nicio scriere (defect de productie #1).
* (CAZ5) regresie S6c-5 (_cus_odata_base.vc2:150-181) - subclasa LOCALA proba
* (cus_odata_vid_s6c5 AS cus_odata_catalog_articole, make_sql suprascris gol, fara nicio
* modificare de productie) forteaza This.csql gol -> salvare() trebuie sa intoarca .F.
* (inainte de reparatie intorcea .T. fara sa trimita niciun SQL - defect de productie #2).
* Nu scrie in Oracle (verificat prin spion pe goExecutor, 0 apeluri).
* Manual, ramane datorie deschisa (nu se automatizeaza): aspectul paginii si fluxul real
* "articol nou -> factura"; fisa deschisa din NIR si din importul e-Factura.
*
* Articol de proba: 2528841557, pe politica 41 (tiparul S5/S5b/S6b).
*
* Rulare (0a): powershell -ExecutionPolicy Bypass -File ruleaza_suita.ps1 -Nume probe_12b_s6c_fisa_pagina_vanzare
* Rulare (0b): "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" -A -T probe_12b_s6c_fisa_pagina_vanzare.prg ROACONT
* Rulare (CAZ1/CAZ2/CAZ3/CAZ4/CAZ5): "...\vfp9.exe" -A -T probe_12b_s6c_fisa_pagina_vanzare.prg CAZ1 (idem CAZ2, CAZ3, CAZ4, CAZ5)
* Log: D:\ROA\ROAFACTURARE\docs\loguri_12b\s6c_fisa.log (cerut de sarcina, nu out\; fiecare
* proces face APPEND peste rularile anterioare)
PARAMETERS tcModo
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
LOCAL lcCazSel
lcCazSel = UPPER(ALLTRIM(IIF(VARTYPE(tcModo) = "C", tcModo, "")))
LOCAL llCazB
llCazB = (lcCazSel == "ROACONT")
PUBLIC gcLog, gcCaz, gnPass, gnFail
gcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\s6c_fisa.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b")
MD "D:\ROA\ROAFACTURARE\docs\loguri_12b"
ENDIF
DO CASE
CASE llCazB
STRTOFILE("--- caz (0b), proces separat, START " + TTOC(DATETIME()) + " ---" + CHR(13) + CHR(10), gcLog, 1)
CASE INLIST(lcCazSel, "CAZ1", "CAZ2", "CAZ3", "CAZ4", "CAZ5")
STRTOFILE("--- partea 2, caz (" + lcCazSel + "), proces separat, START " + TTOC(DATETIME()) + " ---" + CHR(13) + CHR(10), gcLog, 1)
OTHERWISE
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
ENDCASE
gcCaz = ""
gnPass = 0
gnFail = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
gnIdUtil = 8
PUBLIC gnPc
gnPc = 2
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) + " gnPc=" + TRANSFORM(gnPc)
* incarcare explicita din calea COMPLETA (tiparul S7a) - ofacturare.vcx inainte de onom_articole.vcx,
* la fel ca la instalarea reala (roafacturare.prg incarca tot COMUN\CLASE la pornire)
SET PATH TO (gcAppPath + "COMUN\CLASE") ADDITIVE
SET CLASSLIB TO (gcAppPath + "COMUN\CLASE\ofacturare.vcx") ADDITIVE
SET CLASSLIB TO (gcAppPath + "COMUN\CLASE\onom_articole.vcx") ADDITIVE
DO AfLog WITH "SET CLASSLIB ofacturare + onom_articole OK (cale completa)"
* precondition-urile pe care le face onomenclatoare.prg (nom_articole_modifica/nou) inainte sa
* deschida fisa - fara ele Init() pica pe alias lipsa (crs_grupe_art / vnom_um_iso), independent
* de continutul paginii Vanzare
update_um()
update_um_iso()
update_grupe_art()
update_subgrupe_art()
DO AfLog WITH "preconditii onomenclatoare (update_um/update_um_iso/update_grupe_art/update_subgrupe_art) OK"
LOCAL lnIdArtProba, lnOk, loRec
lnIdArtProba = 2528841557
gcCaz = "[precondition] "
lnOk = SQLEXEC(gnHandle, "select count(*) cnt from crm_politici_pret_art where id_pol = 41 and id_articol = " + TRANSFORM(lnIdArtProba), "crspre")
DO Verdict WITH lnOk > 0 AND USED('crspre') AND crspre.cnt = 1, "articolul " + TRANSFORM(lnIdArtProba) + " e pe politica 41 (mod UPDATE)"
IF USED('crspre')
USE IN crspre
ENDIF
lnOk = goExecutor.oExecuta('select * from vnom_articole where id_articol = ' + TRANSFORM(lnIdArtProba), 'vnom_articole_nou')
DO Verdict WITH lnOk # .F. AND USED('vnom_articole_nou') AND RECCOUNT('vnom_articole_nou') = 1, "SELECT vnom_articole pentru articolul de proba"
SELECT vnom_articole_nou
SCATTER NAME loRec MEMO
loRec.conditii_pastrare = NVL(loRec.conditii_pastrare,'')
USE IN vnom_articole_nou
PUBLIC gcNumeProgram
DO CASE
CASE !llCazB AND !INLIST(lcCazSel, "CAZ1", "CAZ2", "CAZ3", "CAZ4", "CAZ5")
*==========================================================================================
* CAZ (0a): CREATEOBJECT sub gcNumeProgram = ROAFACTURARE - trece, plus verificarile din plan
* care nu scriu in Oracle: PageCount, instantierea oPretNom, valorile incarcate, TabIndex,
* recalculeaza_pret
*==========================================================================================
* SELECT direct pe crm_politici_pret_art, PRIN SQLEXEC (fara goExecutor, deci independent de
* incarca()) - referinta pentru compararea valorilor incarcate in Thisform.oPretNom
LOCAL lnPretFtvaDirect, lnPretCtvaDirect, lnProcTvavDirect, lnIdVenchDirect, lnIdNotaDirect, llVenchNullDirect, llNotaNullDirect, llProcNullDirect
gcCaz = "[precondition] "
lnOk = SQLEXEC(gnHandle, "select pretftva, pretctva, proc_tvav, id_venchelt, id_nota from crm_politici_pret_art where id_pol = 41 and id_articol = " + TRANSFORM(lnIdArtProba), "crsdirect")
DO Verdict WITH lnOk > 0 AND USED('crsdirect') AND RECCOUNT('crsdirect') = 1, "SELECT direct (SQLEXEC) pe crm_politici_pret_art, referinta pentru caz (0a)"
lnPretFtvaDirect = NVL(crsdirect.pretftva,0)
lnPretCtvaDirect = NVL(crsdirect.pretctva,0)
llProcNullDirect = ISNULL(crsdirect.proc_tvav)
lnProcTvavDirect = NVL(crsdirect.proc_tvav,-1)
llVenchNullDirect = ISNULL(crsdirect.id_venchelt)
lnIdVenchDirect = NVL(crsdirect.id_venchelt,-1)
llNotaNullDirect = ISNULL(crsdirect.id_nota)
lnIdNotaDirect = NVL(crsdirect.id_nota,-1)
IF USED('crsdirect')
USE IN crsdirect
ENDIF
DO AfLog WITH " referinta directa: pretftva=" + TRANSFORM(lnPretFtvaDirect) + " pretctva=" + TRANSFORM(lnPretCtvaDirect) + " proc_tvav=" + IIF(llProcNullDirect,"NULL",TRANSFORM(lnProcTvavDirect)) + " id_venchelt=" + IIF(llVenchNullDirect,"NULL",TRANSFORM(lnIdVenchDirect)) + " id_nota=" + IIF(llNotaNullDirect,"NULL",TRANSFORM(lnIdNotaDirect))
gcCaz = "[0a-createobject-ROAFACTURARE] "
gcNumeProgram = 'ROAFACTURARE'
PRIVATE poRec, pnIdAMS
poRec = loRec
pnIdAMS = lnIdArtProba
LOCAL loForm1, llCrapat1, lcErrMsg1, lnErrNo1
llCrapat1 = .F.
lcErrMsg1 = ''
lnErrNo1 = 0
TRY
loForm1 = CREATEOBJECT('frm_catalog_articole_nou', loRec, lnIdArtProba, 'UPDATE')
CATCH TO loExc1
llCrapat1 = .T.
lnErrNo1 = loExc1.ErrorNo
lcErrMsg1 = loExc1.Message
ENDTRY
DO AfLog WITH " rezultat: llCrapat=" + TRANSFORM(llCrapat1) + " errno=" + TRANSFORM(lnErrNo1) + " mesaj=[" + lcErrMsg1 + "]"
DO Verdict WITH !llCrapat1 AND lnErrNo1 = 0, "CREATEOBJECT trece sub gcNumeProgram=ROAFACTURARE (errno=0)"
IF !llCrapat1
DO Verdict WITH loForm1._pageframe1.PageCount = 3, "PageCount = 3 (Page3 Vanzare vizibila, obtinut " + TRANSFORM(loForm1._pageframe1.PageCount) + ")"
DO Verdict WITH VARTYPE(loForm1.oPretNom) = "O", "Thisform.oPretNom instantiat (Vartype=" + VARTYPE(loForm1.oPretNom) + ")"
IF VARTYPE(loForm1.oPretNom) = "O"
gcCaz = "[0a-valori-opretnom] "
DO Verdict WITH loForm1.oPretNom.nPretFtva == lnPretFtvaDirect, "oPretNom.nPretFtva = " + TRANSFORM(lnPretFtvaDirect) + " (obtinut " + TRANSFORM(loForm1.oPretNom.nPretFtva) + ")"
DO Verdict WITH loForm1.oPretNom.nPretCtva == lnPretCtvaDirect, "oPretNom.nPretCtva = " + TRANSFORM(lnPretCtvaDirect) + " (obtinut " + TRANSFORM(loForm1.oPretNom.nPretCtva) + ")"
DO Verdict WITH IIF(llProcNullDirect, ISNULL(loForm1.oPretNom.nProcTvav), loForm1.oPretNom.nProcTvav == lnProcTvavDirect), "oPretNom.nProcTvav = " + IIF(llProcNullDirect,"NULL",TRANSFORM(lnProcTvavDirect)) + " (obtinut " + IIF(ISNULL(loForm1.oPretNom.nProcTvav),"NULL",TRANSFORM(loForm1.oPretNom.nProcTvav)) + ")"
DO Verdict WITH IIF(llVenchNullDirect, ISNULL(loForm1.oPretNom.nIdVenchelt), loForm1.oPretNom.nIdVenchelt == lnIdVenchDirect), "oPretNom.nIdVenchelt = " + IIF(llVenchNullDirect,"NULL",TRANSFORM(lnIdVenchDirect)) + " (obtinut " + IIF(ISNULL(loForm1.oPretNom.nIdVenchelt),"NULL",TRANSFORM(loForm1.oPretNom.nIdVenchelt)) + ")"
DO Verdict WITH IIF(llNotaNullDirect, ISNULL(loForm1.oPretNom.nIdNota), loForm1.oPretNom.nIdNota == lnIdNotaDirect), "oPretNom.nIdNota = " + IIF(llNotaNullDirect,"NULL",TRANSFORM(lnIdNotaDirect)) + " (obtinut " + IIF(ISNULL(loForm1.oPretNom.nIdNota),"NULL",TRANSFORM(loForm1.oPretNom.nIdNota)) + ")"
gcCaz = "[0a-tabindex-page3] "
DO Verdict WITH loForm1._pageframe1.Page3.Clb_tx_pret_ftva.TabIndex = 1, "TabIndex Clb_tx_pret_ftva = 1"
DO Verdict WITH loForm1._pageframe1.Page3.Clb_tx_pret_ctva.TabIndex = 2, "TabIndex Clb_tx_pret_ctva = 2"
DO Verdict WITH loForm1._pageframe1.Page3.Cb_tx_proc_tvav.TabIndex = 3, "TabIndex Cb_tx_proc_tvav = 3"
DO Verdict WITH loForm1._pageframe1.Page3.Cb_tx_venit.TabIndex = 4, "TabIndex Cb_tx_venit = 4"
DO Verdict WITH loForm1._pageframe1.Page3.Clb_tx_scd.TabIndex = 5, "TabIndex Clb_tx_scd = 5"
DO Verdict WITH loForm1._pageframe1.Page3.Clb_tx_scc.TabIndex = 6, "TabIndex Clb_tx_scc = 6"
DO Verdict WITH loForm1._pageframe1.Page3.Clb_tx_cont_dedus.TabIndex = 7, "TabIndex Clb_tx_cont_dedus = 7"
gcCaz = "[0a-recalculeaza-pret] "
LOCAL lnFtvaTest, lnCtvaCalc, lnFtvaInapoi, lnCoefEfectiv
lnFtvaTest = 100
lnCoefEfectiv = IIF(ISNULL(loForm1.oPretNom.nProcTvav), (GetProcTvaStandard()+100)/100, loForm1.oPretNom.nProcTvav)
lnCtvaCalc = loForm1.oPretNom.recalculeaza_pret(lnFtvaTest, .T.)
lnFtvaInapoi = loForm1.oPretNom.recalculeaza_pret(lnCtvaCalc, .F.)
DO AfLog WITH " recalculeaza_pret: proc_tvav efectiv=" + TRANSFORM(lnCoefEfectiv) + " 100->" + TRANSFORM(lnCtvaCalc) + "->" + TRANSFORM(lnFtvaInapoi)
DO Verdict WITH lnCtvaCalc == ROUND(lnFtvaTest * lnCoefEfectiv, gnPc), "recalculeaza_pret(100,.T.) = 100 * proc_tvav efectiv rotunjit (obtinut " + TRANSFORM(lnCtvaCalc) + ")"
DO Verdict WITH lnFtvaInapoi == lnFtvaTest, "recalculeaza_pret(recalculeaza_pret(100,.T.),.F.) = 100 (reciproc, obtinut " + TRANSFORM(lnFtvaInapoi) + ")"
ENDIF
RELEASE loForm1
ENDIF
DO AfLog WITH " caz (0b) ruleaza intr-un proces vfp9 separat (vezi antetul fisierului) - reentranta"
DO AfLog WITH " CREATEOBJECT('frm_catalog_articole_nou') in acelasi proces se autoblocheaza."
CASE llCazB
*==========================================================================================
* CAZ (0b): CREATEOBJECT sub gcNumeProgram = ROACONT (proces separat de (0a)) - trece
* (errno=0), Page3 invizibila (PageCount=2) si oPretNom NEinstantiat, dovada ca defectul
* original (ERROR 1736) nu revine si ca ramura gcNumeProgram din Init izoleaza corect
* celelalte produse
*==========================================================================================
gcCaz = "[0b-createobject-ROACONT] "
gcNumeProgram = 'ROACONT'
PRIVATE poRec, pnIdAMS
poRec = loRec
pnIdAMS = lnIdArtProba
LOCAL loForm2, llCrapat2, lcErrMsg2, lnErrNo2
llCrapat2 = .F.
lcErrMsg2 = ''
lnErrNo2 = 0
TRY
loForm2 = CREATEOBJECT('frm_catalog_articole_nou', loRec, lnIdArtProba, 'UPDATE')
CATCH TO loExc2
llCrapat2 = .T.
lnErrNo2 = loExc2.ErrorNo
lcErrMsg2 = loExc2.Message
ENDTRY
DO AfLog WITH " rezultat: llCrapat=" + TRANSFORM(llCrapat2) + " errno=" + TRANSFORM(lnErrNo2) + " mesaj=[" + lcErrMsg2 + "]"
DO Verdict WITH !llCrapat2 AND lnErrNo2 = 0, "CREATEOBJECT trece sub gcNumeProgram=ROACONT (errno=0)"
IF !llCrapat2
DO Verdict WITH loForm2._pageframe1.PageCount = 2, "PageCount = 2 (Page3 Vanzare invizibila, obtinut " + TRANSFORM(loForm2._pageframe1.PageCount) + ")"
DO Verdict WITH VARTYPE(loForm2.oPretNom) <> "O", "Thisform.oPretNom NEinstantiat sub ROACONT (Vartype=" + VARTYPE(loForm2.oPretNom) + ")"
RELEASE loForm2
ENDIF
DO AfLog WITH ""
DO AfLog WITH " Partea 2 (INSERT/UPDATE la salvare, cu scriere in Oracle) - cazurile CAZ1/CAZ2/CAZ3"
DO AfLog WITH " ale acestui fisier, fiecare in procesul lui propriu (vezi antetul fisierului)."
*=================================================================================================
* CAZ (1): articol NOU (INSERT) - pret/TVA/conturi setate pe Page3 (Thisform.oPretNom), salvat prin
* metodele reale de salvare (nu inainte_de_do_termin, vezi antetul); dupa salvare, verificat direct
* din Oracle, in aceeasi tranzactie manuala, apoi ROLLBACK direct (nu do_inchide_tranzactie(1) -
* ala ar comite real)
*=================================================================================================
CASE lcCazSel == "CAZ1"
gcCaz = "[1-articol-nou-page3-vanzare] "
gcNumeProgram = 'ROAFACTURARE'
LOCAL lcCodMat1
lcCodMat1 = "PS6C2B1" + SYS(2015)
loRec.codmat = lcCodMat1
loRec.codmatf = lcCodMat1
loRec.denumire = "PROBA S6C2B ARTICOL NOU CAZ1"
loRec.codbare = ""
* articolul de proba (2528841557) are id_tara_origine NULL - make_sql (onom_articole.vc2:88,
* ramura INSERT) NU garzeste NULL-ul (spre deosebire de ramura UPDATE, linia 100), deci
* This.csql devine NULL (propagare NULL in concatenare) si salvare() raporteaza .T. fara sa
* trimita vreun SQL - defect de productie, NEREPARAT; proba isi alege un id_tara_origine
* valid (dintr-un articol real) ca sa poata testa ce i s-a cerut (pret/TVA/ID_NOTA pe Page3)
LOCAL lnOkTara1, lnTaraOrigine1
lnTaraOrigine1 = 0
lnOkTara1 = SQLEXEC(gnHandle, "select id_tara_origine from vnom_articole where id_tara_origine is not null and rownum = 1", "crstara1")
IF lnOkTara1 > 0 AND USED('crstara1') AND RECCOUNT('crstara1') = 1
lnTaraOrigine1 = crstara1.id_tara_origine
ENDIF
IF USED('crstara1')
USE IN crstara1
ENDIF
IF lnTaraOrigine1 > 0
loRec.id_tara_origine = lnTaraOrigine1
ENDIF
PRIVATE poRec, pnIdAMS
poRec = loRec
pnIdAMS = 0
LOCAL loForm1, llCrapat1, lcErrMsg1, lnErrNo1
llCrapat1 = .F.
lcErrMsg1 = ''
lnErrNo1 = 0
TRY
loForm1 = CREATEOBJECT('frm_catalog_articole_nou', loRec, 0, 'INSERT')
CATCH TO loExc1
llCrapat1 = .T.
lnErrNo1 = loExc1.ErrorNo
lcErrMsg1 = loExc1.Message
ENDTRY
DO AfLog WITH " rezultat CREATEOBJECT: llCrapat=" + TRANSFORM(llCrapat1) + " errno=" + TRANSFORM(lnErrNo1) + " mesaj=[" + lcErrMsg1 + "]"
DO Verdict WITH !llCrapat1 AND VARTYPE(loForm1) = "O", "CREATEOBJECT('frm_catalog_articole_nou',...,'INSERT') trece (errno=0)"
IF !llCrapat1
DO Verdict WITH VARTYPE(loForm1.oPretNom) = "O", "oPretNom instantiat pe formularul de INSERT"
IF VARTYPE(loForm1.oPretNom) = "O"
LOCAL lnPretFtvaNou, lnProcTvavNou, lnPretCtvaNou
lnPretFtvaNou = 55.55
lnProcTvavNou = 1.19
lnPretCtvaNou = loForm1.oPretNom.recalculeaza_pret(lnPretFtvaNou, .T.)
loForm1.oPretNom.nPretFtva = lnPretFtvaNou
loForm1.oPretNom.nProcTvav = lnProcTvavNou
loForm1.oPretNom.nPretCtva = lnPretCtvaNou
loForm1.oPretNom.cScd = '461'
loForm1.oPretNom.cScc = '7583'
loForm1.cus_odata_catalog_articole.lSilent = .T.
DO Verdict WITH loForm1.do_deschide_tranzactie(), "do_deschide_tranzactie() = .T."
DO AfLog WITH " diagnostic: lSilent=" + TRANSFORM(loForm1.cus_odata_catalog_articole.lSilent) + " cactiune=[" + loForm1.cus_odata_catalog_articole.cactiune + "] validare()=" + TRANSFORM(loForm1.cus_odata_catalog_articole.validare()) + " TYPE(orec)=" + TYPE('loForm1.orec') + " TYPE(NID)=" + TYPE('loForm1.NID')
* spion NEUTRU (nu forteaza esec) doar ca sa vada proba exact ce SQL a trimis (sau nu)
* cus_odata_catalog_articole.salvare() prin goExecutor - diagnostic, nu modifica fluxul
LOCAL loRealExec1, loSpy1
loRealExec1 = goExecutor
loSpy1 = CREATEOBJECT('SpyS6c2b')
goExecutor = loSpy1
LOCAL llSalvatArticol1
llSalvatArticol1 = loForm1.cus_odata_catalog_articole.salvare(loForm1.orec, loForm1.NID)
goExecutor = loRealExec1
DO AfLog WITH " diagnostic: dupa salvare() lsalvareconfirmata=" + TRANSFORM(loForm1.cus_odata_catalog_articole.lsalvareconfirmata) + " VARTYPE(csql)=" + VARTYPE(loForm1.cus_odata_catalog_articole.csql) + " csql=[" + TRANSFORM(loForm1.cus_odata_catalog_articole.csql) + "]"
DO AfLog WITH " diagnostic: SpyS6c2b apeluri=" + TRANSFORM(loSpy1.nApeluri)
DO Verdict WITH llSalvatArticol1, "cus_odata_catalog_articole.salvare() INSERT = .T. (codmat=" + lcCodMat1 + ")"
* pnIdAMS (OUT bind ?@pnIdAMS din make_sql) a ramas 0 dupa un INSERT confirmat reusit -
* id-ul real se ia din Oracle, dupa codmat (unic, generat mai sus), nu din pnIdAMS
DO AfLog WITH " info: pnIdAMS dupa INSERT=" + TRANSFORM(NVL(pnIdAMS,-1)) + " (neconcludent, vezi cautarea dupa codmat mai jos)"
LOCAL lnIdArtNou1, lnOkIdNou1
lnIdArtNou1 = 0
lnOkIdNou1 = SQLEXEC(gnHandle, "select id_articol from vnom_articole where codmat = '" + lcCodMat1 + "'", "crsidnou1")
IF lnOkIdNou1 > 0 AND USED('crsidnou1') AND RECCOUNT('crsidnou1') = 1
lnIdArtNou1 = crsidnou1.id_articol
ENDIF
IF USED('crsidnou1')
USE IN crsidnou1
ENDIF
DO AfLog WITH " id articol nou (cautat dupa codmat)=" + TRANSFORM(lnIdArtNou1)
DO Verdict WITH lnIdArtNou1 > 0, "articolul nou gasit dupa codmat, id_articol > 0 (obtinut " + TRANSFORM(lnIdArtNou1) + ")"
LOCAL llSalvatPret1
llSalvatPret1 = .F.
IF lnIdArtNou1 > 0
llSalvatPret1 = loForm1.oPretNom.salveaza(lnIdArtNou1)
ENDIF
DO Verdict WITH llSalvatPret1, "oPretNom.salveaza() = .T. (articol nou)"
LOCAL lnOkAnyPol1
lnOkAnyPol1 = SQLEXEC(gnHandle, "select id_pol, pretftva, pretctva, proc_tvav, id_nota from crm_politici_pret_art where id_articol = " + TRANSFORM(lnIdArtNou1), "crsanypol1")
DO AfLog WITH " diagnostic: randuri crm_politici_pret_art (orice id_pol) pentru articolul nou=" + TRANSFORM(IIF(lnOkAnyPol1>0 AND USED('crsanypol1'),RECCOUNT('crsanypol1'),-1)) + " nIdPolitica(oPretNom)=" + TRANSFORM(loForm1.oPretNom.nIdPolitica)
IF USED('crsanypol1')
SELECT crsanypol1
SCAN
DO AfLog WITH " id_pol=" + TRANSFORM(crsanypol1.id_pol) + " pretftva=" + TRANSFORM(crsanypol1.pretftva) + " id_nota=" + TRANSFORM(NVL(crsanypol1.id_nota,-1))
ENDSCAN
USE IN crsanypol1
ENDIF
LOCAL lnOkSel1
lnOkSel1 = SQLEXEC(gnHandle, "select pretftva, pretctva, proc_tvav, id_nota from crm_politici_pret_art where id_pol = 41 and id_articol = " + TRANSFORM(lnIdArtNou1), "crscaz1")
DO Verdict WITH lnOkSel1 > 0 AND USED('crscaz1') AND RECCOUNT('crscaz1') = 1, "randul politicii de pret exista in Oracle pentru articolul nou (in tranzactie)"
IF USED('crscaz1') AND RECCOUNT('crscaz1') = 1
DO Verdict WITH ROUND(crscaz1.pretftva,2) == lnPretFtvaNou, "Oracle pretftva=" + TRANSFORM(lnPretFtvaNou) + " (obtinut " + TRANSFORM(crscaz1.pretftva) + ")"
DO Verdict WITH ROUND(crscaz1.pretctva,2) == lnPretCtvaNou, "Oracle pretctva=" + TRANSFORM(lnPretCtvaNou) + " (obtinut " + TRANSFORM(crscaz1.pretctva) + ")"
DO Verdict WITH ROUND(crscaz1.proc_tvav,2) == lnProcTvavNou, "Oracle proc_tvav=" + TRANSFORM(lnProcTvavNou) + " (obtinut " + TRANSFORM(crscaz1.proc_tvav) + ")"
DO Verdict WITH !ISNULL(crscaz1.id_nota) AND crscaz1.id_nota > 0, "Oracle id_nota atribuit (" + TRANSFORM(NVL(crscaz1.id_nota,-1)) + ")"
ENDIF
IF USED('crscaz1')
USE IN crscaz1
ENDIF
LOCAL lnOkArt1
lnOkArt1 = SQLEXEC(gnHandle, "select count(*) cnt from vnom_articole where id_articol = " + TRANSFORM(lnIdArtNou1), "crsart1")
DO Verdict WITH lnOkArt1 > 0 AND USED('crsart1') AND crsart1.cnt = 1, "articolul nou exista in vnom_articole (in tranzactie)"
IF USED('crsart1')
USE IN crsart1
ENDIF
* fara Thisform.do_inchide_tranzactie(1) - ar face SQLCOMMIT() real; ROLLBACK direct
* dupa verificare, ca sa nu ramana date (cerinta explicita a sarcinii)
LOCAL lnOkRb1
lnOkRb1 = SQLEXEC(gnHandle, "ROLLBACK")
DO Verdict WITH lnOkRb1 > 0, "ROLLBACK direct dupa verificare (nu do_inchide_tranzactie(1))"
SQLSETPROP(gnHandle, "Transactions", 1)
ENDIF
RELEASE loForm1
ENDIF
*=================================================================================================
* CAZ (2): articolul de proba (existent, UPDATE) - pret/TVA/conturi noi pe Page3 -> randul din
* crm_politici_pret_art actualizat in Oracle (in tranzactie), apoi ROLLBACK direct
*=================================================================================================
CASE lcCazSel == "CAZ2"
gcCaz = "[2-articol-existent-page3-modificat] "
gcNumeProgram = 'ROAFACTURARE'
PRIVATE poRec, pnIdAMS
poRec = loRec
pnIdAMS = lnIdArtProba
LOCAL loForm2, llCrapat2, lcErrMsg2, lnErrNo2
llCrapat2 = .F.
lcErrMsg2 = ''
lnErrNo2 = 0
TRY
loForm2 = CREATEOBJECT('frm_catalog_articole_nou', loRec, lnIdArtProba, 'UPDATE')
CATCH TO loExc2b
llCrapat2 = .T.
lnErrNo2 = loExc2b.ErrorNo
lcErrMsg2 = loExc2b.Message
ENDTRY
DO AfLog WITH " rezultat CREATEOBJECT: llCrapat=" + TRANSFORM(llCrapat2) + " errno=" + TRANSFORM(lnErrNo2) + " mesaj=[" + lcErrMsg2 + "]"
DO Verdict WITH !llCrapat2 AND VARTYPE(loForm2) = "O", "CREATEOBJECT('frm_catalog_articole_nou',...,'UPDATE') trece (errno=0)"
IF !llCrapat2
DO Verdict WITH VARTYPE(loForm2.oPretNom) = "O", "oPretNom instantiat pe formularul de UPDATE"
IF VARTYPE(loForm2.oPretNom) = "O"
LOCAL lnPretFtvaMod, lnProcTvavMod, lnPretCtvaMod
lnPretFtvaMod = 77.70
lnProcTvavMod = 1.09
lnPretCtvaMod = loForm2.oPretNom.recalculeaza_pret(lnPretFtvaMod, .T.)
loForm2.oPretNom.nPretFtva = lnPretFtvaMod
loForm2.oPretNom.nProcTvav = lnProcTvavMod
loForm2.oPretNom.nPretCtva = lnPretCtvaMod
loForm2.oPretNom.cScd = '461'
loForm2.oPretNom.cScc = '7583'
loForm2.cus_odata_catalog_articole.lSilent = .T.
DO Verdict WITH loForm2.do_deschide_tranzactie(), "do_deschide_tranzactie() = .T."
LOCAL llSalvatArticol2
llSalvatArticol2 = loForm2.cus_odata_catalog_articole.salvare(loForm2.orec, loForm2.NID)
DO Verdict WITH llSalvatArticol2, "cus_odata_catalog_articole.salvare() UPDATE = .T."
DO AfLog WITH " diagnostic: inainte de salveaza() nIdPolitica=" + TRANSFORM(loForm2.oPretNom.nIdPolitica) + " nPretFtva=" + TRANSFORM(loForm2.oPretNom.nPretFtva) + " nProcTvav=" + TRANSFORM(loForm2.oPretNom.nProcTvav) + " lIncarcat=" + TRANSFORM(loForm2.oPretNom.lIncarcat)
LOCAL loRealExec2, loSpy2
loRealExec2 = goExecutor
loSpy2 = CREATEOBJECT('SpyS6c2b')
goExecutor = loSpy2
LOCAL llSalvatPret2
llSalvatPret2 = loForm2.oPretNom.salveaza(lnIdArtProba)
goExecutor = loRealExec2
DO AfLog WITH " diagnostic: dupa salveaza() nPretFtva=" + TRANSFORM(loForm2.oPretNom.nPretFtva) + " nIdNota=" + TRANSFORM(NVL(loForm2.oPretNom.nIdNota,-1))
DO Verdict WITH llSalvatPret2, "oPretNom.salveaza() = .T. (articol existent " + TRANSFORM(lnIdArtProba) + ")"
LOCAL lnOkSel2
lnOkSel2 = SQLEXEC(gnHandle, "select pretftva, pretctva, proc_tvav, id_nota from crm_politici_pret_art where id_pol = 41 and id_articol = " + TRANSFORM(lnIdArtProba), "crscaz2")
DO Verdict WITH lnOkSel2 > 0 AND USED('crscaz2') AND RECCOUNT('crscaz2') = 1, "randul politicii de pret exista in Oracle pentru articolul modificat (in tranzactie)"
IF USED('crscaz2') AND RECCOUNT('crscaz2') = 1
DO Verdict WITH ROUND(crscaz2.pretftva,2) == lnPretFtvaMod, "Oracle pretftva=" + TRANSFORM(lnPretFtvaMod) + " (obtinut " + TRANSFORM(crscaz2.pretftva) + ")"
DO Verdict WITH ROUND(crscaz2.pretctva,2) == lnPretCtvaMod, "Oracle pretctva=" + TRANSFORM(lnPretCtvaMod) + " (obtinut " + TRANSFORM(crscaz2.pretctva) + ")"
DO Verdict WITH ROUND(crscaz2.proc_tvav,2) == lnProcTvavMod, "Oracle proc_tvav=" + TRANSFORM(lnProcTvavMod) + " (obtinut " + TRANSFORM(crscaz2.proc_tvav) + ")"
DO Verdict WITH !ISNULL(crscaz2.id_nota) AND crscaz2.id_nota > 0, "Oracle id_nota atribuit (" + TRANSFORM(NVL(crscaz2.id_nota,-1)) + ")"
ENDIF
IF USED('crscaz2')
USE IN crscaz2
ENDIF
LOCAL lnOkRb2
lnOkRb2 = SQLEXEC(gnHandle, "ROLLBACK")
DO Verdict WITH lnOkRb2 > 0, "ROLLBACK direct dupa verificare (articolul existent ramane cu valorile originale)"
SQLSETPROP(gnHandle, "Transactions", 1)
ENDIF
RELEASE loForm2
ENDIF
*=================================================================================================
* CAZ (3): articol NOU (INSERT) - articolul se salveaza real, apoi salvarea randului de pret e
* fortata sa esueze cu un spion pe goExecutor (subclasa oexecutor, tiparul SpyS6b din
* probe_12b_s6b_clasa_pret_nomenclator.prg, fara nicio modificare de productie) -> flux real:
* Thisform.do_inchide_tranzactie(2) - ROLLBACK real - articolul nou nu mai exista
*=================================================================================================
CASE lcCazSel == "CAZ3"
gcCaz = "[3-esec-salvare-pret-articol-nou] "
gcNumeProgram = 'ROAFACTURARE'
LOCAL lcCodMat3
lcCodMat3 = "PS6C2B3" + SYS(2015)
loRec.codmat = lcCodMat3
loRec.codmatf = lcCodMat3
loRec.denumire = "PROBA S6C2B ARTICOL NOU CAZ3 ESEC"
loRec.codbare = ""
* vezi nota din CAZ1 - id_tara_origine NULL blocheaza INSERT-ul (defect de productie, NEREPARAT)
LOCAL lnOkTara3, lnTaraOrigine3
lnTaraOrigine3 = 0
lnOkTara3 = SQLEXEC(gnHandle, "select id_tara_origine from vnom_articole where id_tara_origine is not null and rownum = 1", "crstara3")
IF lnOkTara3 > 0 AND USED('crstara3') AND RECCOUNT('crstara3') = 1
lnTaraOrigine3 = crstara3.id_tara_origine
ENDIF
IF USED('crstara3')
USE IN crstara3
ENDIF
IF lnTaraOrigine3 > 0
loRec.id_tara_origine = lnTaraOrigine3
ENDIF
PRIVATE poRec, pnIdAMS
poRec = loRec
pnIdAMS = 0
LOCAL loForm3, llCrapat3, lcErrMsg3, lnErrNo3
llCrapat3 = .F.
lcErrMsg3 = ''
lnErrNo3 = 0
TRY
loForm3 = CREATEOBJECT('frm_catalog_articole_nou', loRec, 0, 'INSERT')
CATCH TO loExc3
llCrapat3 = .T.
lnErrNo3 = loExc3.ErrorNo
lcErrMsg3 = loExc3.Message
ENDTRY
DO AfLog WITH " rezultat CREATEOBJECT: llCrapat=" + TRANSFORM(llCrapat3) + " errno=" + TRANSFORM(lnErrNo3) + " mesaj=[" + lcErrMsg3 + "]"
DO Verdict WITH !llCrapat3 AND VARTYPE(loForm3) = "O", "CREATEOBJECT('frm_catalog_articole_nou',...,'INSERT') trece (errno=0, caz3)"
IF !llCrapat3 AND VARTYPE(loForm3.oPretNom) = "O"
loForm3.oPretNom.nPretFtva = 33.33
loForm3.oPretNom.nProcTvav = 1.19
loForm3.oPretNom.nPretCtva = loForm3.oPretNom.recalculeaza_pret(33.33, .T.)
* conturi goale - fortarea esecului tinteste doar salveaza_pret_nomenclator, nu nota
loForm3.oPretNom.cScd = ''
loForm3.oPretNom.cScc = ''
loForm3.cus_odata_catalog_articole.lSilent = .T.
DO Verdict WITH loForm3.do_deschide_tranzactie(), "do_deschide_tranzactie() = .T. (caz3)"
LOCAL llSalvatArticol3
llSalvatArticol3 = loForm3.cus_odata_catalog_articole.salvare(loForm3.orec, loForm3.NID)
DO Verdict WITH llSalvatArticol3, "cus_odata_catalog_articole.salvare() INSERT = .T. (articolul e creat inainte de esecul pe pret)"
* id-ul se cauta dupa codmat (unic), nu din pnIdAMS - vezi nota din CAZ1
LOCAL lnIdArtNou3, lnOkIdNou3
lnIdArtNou3 = 0
lnOkIdNou3 = SQLEXEC(gnHandle, "select id_articol from vnom_articole where codmat = '" + lcCodMat3 + "'", "crsidnou3")
IF lnOkIdNou3 > 0 AND USED('crsidnou3') AND RECCOUNT('crsidnou3') = 1
lnIdArtNou3 = crsidnou3.id_articol
ENDIF
IF USED('crsidnou3')
USE IN crsidnou3
ENDIF
DO AfLog WITH " id articol nou caz3 (cautat dupa codmat)=" + TRANSFORM(lnIdArtNou3)
DO Verdict WITH lnIdArtNou3 > 0, "articolul nou gasit dupa codmat, id_articol > 0 (caz3, obtinut " + TRANSFORM(lnIdArtNou3) + ")"
LOCAL loRealExec3, loSpy3
loRealExec3 = goExecutor
loSpy3 = CREATEOBJECT('SpyS6c2b')
loSpy3.lForteazaEsecSalveaza = .T.
goExecutor = loSpy3
LOCAL llSalvatPret3
llSalvatPret3 = .F.
IF lnIdArtNou3 > 0
llSalvatPret3 = loForm3.oPretNom.salveaza(lnIdArtNou3)
ENDIF
goExecutor = loRealExec3
DO Verdict WITH !llSalvatPret3, "oPretNom.salveaza() = .F. (salveaza_pret_nomenclator interceptat/fortat sa esueze)"
* flux real: llReturn=.F. -> Thisform.do_inchide_tranzactie(2) - SQLROLLBACK() real, sigur
LOCAL llInchis3
llInchis3 = loForm3.do_inchide_tranzactie(IIF(llSalvatPret3, 1, 2))
DO Verdict WITH llInchis3, "do_inchide_tranzactie(2) = .T. (ROLLBACK real, tnTip=2)"
IF lnIdArtNou3 > 0
LOCAL lnOkArt3
lnOkArt3 = SQLEXEC(gnHandle, "select count(*) cnt from vnom_articole where id_articol = " + TRANSFORM(lnIdArtNou3), "crsart3")
DO Verdict WITH lnOkArt3 > 0 AND USED('crsart3') AND crsart3.cnt = 0, "articolul nou NU exista dupa do_inchide_tranzactie(2) (cnt=" + TRANSFORM(IIF(USED('crsart3'),crsart3.cnt,-1)) + ")"
IF USED('crsart3')
USE IN crsart3
ENDIF
ENDIF
RELEASE loForm3
ENDIF
*=================================================================================================
* CAZ (4): regresie garda NULL (S6c-4, onom_articole.vc2:88) - articol NOU (INSERT) cu
* id_tara_origine fortat NULL -> cus_odata_catalog_articole.salvare() trebuie sa construiasca SQL
* real (nu This.csql NULL) si sa scrie efectiv in Oracle - verificat direct dupa codmat, apoi
* ROLLBACK direct
*=================================================================================================
CASE lcCazSel == "CAZ4"
gcCaz = "[4-articol-nou-tara-origine-null] "
gcNumeProgram = 'ROAFACTURARE'
LOCAL lcCodMat4
lcCodMat4 = "PS6C4" + SYS(2015)
loRec.codmat = lcCodMat4
loRec.codmatf = lcCodMat4
loRec.denumire = "PROBA S6C4 ARTICOL NOU TARA ORIGINE NULL"
loRec.codbare = ""
loRec.id_tara_origine = .NULL.
PRIVATE poRec, pnIdAMS
poRec = loRec
pnIdAMS = 0
LOCAL loForm4, llCrapat4, lcErrMsg4, lnErrNo4
llCrapat4 = .F.
lcErrMsg4 = ''
lnErrNo4 = 0
TRY
loForm4 = CREATEOBJECT('frm_catalog_articole_nou', loRec, 0, 'INSERT')
CATCH TO loExc4
llCrapat4 = .T.
lnErrNo4 = loExc4.ErrorNo
lcErrMsg4 = loExc4.Message
ENDTRY
DO AfLog WITH " rezultat CREATEOBJECT: llCrapat=" + TRANSFORM(llCrapat4) + " errno=" + TRANSFORM(lnErrNo4) + " mesaj=[" + lcErrMsg4 + "]"
DO Verdict WITH !llCrapat4 AND VARTYPE(loForm4) = "O", "CREATEOBJECT('frm_catalog_articole_nou',...,'INSERT') trece (errno=0, caz4)"
IF !llCrapat4
loForm4.cus_odata_catalog_articole.lSilent = .T.
DO Verdict WITH loForm4.do_deschide_tranzactie(), "do_deschide_tranzactie() = .T. (caz4)"
LOCAL llSalvatArticol4
llSalvatArticol4 = loForm4.cus_odata_catalog_articole.salvare(loForm4.orec, loForm4.NID)
DO AfLog WITH " diagnostic: VARTYPE(csql)=" + VARTYPE(loForm4.cus_odata_catalog_articole.csql) + " csql=[" + TRANSFORM(loForm4.cus_odata_catalog_articole.csql) + "]"
DO Verdict WITH llSalvatArticol4, "cus_odata_catalog_articole.salvare() INSERT = .T. (id_tara_origine NULL, codmat=" + lcCodMat4 + ")"
DO Verdict WITH VARTYPE(loForm4.cus_odata_catalog_articole.csql) = "C" AND !EMPTY(loForm4.cus_odata_catalog_articole.csql), "This.csql construit (nu NULL) cu id_tara_origine NULL"
LOCAL lnIdArtNou4, lnOkIdNou4
lnIdArtNou4 = 0
lnOkIdNou4 = SQLEXEC(gnHandle, "select id_articol, id_tara_origine from vnom_articole where codmat = '" + lcCodMat4 + "'", "crsidnou4")
DO Verdict WITH lnOkIdNou4 > 0 AND USED('crsidnou4') AND RECCOUNT('crsidnou4') = 1, "articolul nou exista in Oracle dupa codmat (in tranzactie, caz4)"
IF USED('crsidnou4') AND RECCOUNT('crsidnou4') = 1
lnIdArtNou4 = crsidnou4.id_articol
DO Verdict WITH ISNULL(crsidnou4.id_tara_origine), "id_tara_origine ramas NULL in Oracle (caz4)"
ENDIF
IF USED('crsidnou4')
USE IN crsidnou4
ENDIF
DO AfLog WITH " id articol nou caz4 (cautat dupa codmat)=" + TRANSFORM(lnIdArtNou4)
DO Verdict WITH lnIdArtNou4 > 0, "articolul nou gasit dupa codmat, id_articol > 0 (caz4, obtinut " + TRANSFORM(lnIdArtNou4) + ")"
LOCAL lnOkRb4
lnOkRb4 = SQLEXEC(gnHandle, "ROLLBACK")
DO Verdict WITH lnOkRb4 > 0, "ROLLBACK direct dupa verificare (caz4, nu do_inchide_tranzactie(1))"
SQLSETPROP(gnHandle, "Transactions", 1)
RELEASE loForm4
ENDIF
*=================================================================================================
* CAZ (5): regresie S6c-5 (_cus_odata_base.vc2:150-181) - subclasa LOCALA proba
* (cus_odata_vid_s6c5, definita mai jos in acest fisier, fara nicio modificare de productie)
* suprascrie make_sql lasand This.csql gol -> llConditie devine .F. in salvare() -> trebuie sa
* intoarca .F. (inainte de reparatie intorcea .T. fara sa trimita niciun SQL). Nu instantiaza
* formularul, nu atinge Oracle - doar apeleaza direct salvare() pe obiectul de proba, cu spion pe
* goExecutor ca sa confirme 0 apeluri.
*=================================================================================================
CASE lcCazSel == "CAZ5"
gcCaz = "[5-sql-gol-salvare-fals] "
gcNumeProgram = 'ROAFACTURARE'
LOCAL loObj5, llRet5, loRealExec5, loSpy5
loObj5 = CREATEOBJECT('cus_odata_vid_s6c5')
loObj5.lSilent = .T.
loObj5.cactiune = 'INSERT'
loRealExec5 = goExecutor
loSpy5 = CREATEOBJECT('SpyS6c2b')
goExecutor = loSpy5
llRet5 = loObj5.salvare(loRec, 0)
goExecutor = loRealExec5
DO AfLog WITH " diagnostic: VARTYPE(csql)=" + VARTYPE(loObj5.csql) + " csql=[" + TRANSFORM(loObj5.csql) + "] SpyS6c2b apeluri=" + TRANSFORM(loSpy5.nApeluri)
DO Verdict WITH !llRet5, "salvare() = .F. cand make_sql lasa csql gol (S6c-5, regresie)"
DO Verdict WITH EMPTY(loObj5.csql), "csql a ramas gol (make_sql suprascris nu construieste SQL)"
DO Verdict WITH loSpy5.nApeluri = 0, "goExecutor.oExecute NU a fost apelat (nimic trimis la Oracle)"
RELEASE loObj5
ENDCASE
DO Final
*==================================================================================================
* Spion pe goExecutor - subclasa DODEFAULT pe PCOUNT (nu opreste executia), tiparul SpyS6b din
* probe_12b_s6b_clasa_pret_nomenclator.prg. lForteazaEsecSalveaza=.T. intoarce -1 fara sa mai
* trimita SQL-ul cand acesta contine 'salveaza_pret_nomenclator' (caz CAZ3) - restul trece prin
* DODEFAULT.
*==================================================================================================
DEFINE CLASS SpyS6c2b AS oexecutor
nApeluri = 0
cToateSql = ''
lForteazaEsecSalveaza = .F.
PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect)
LOCAL lnRet, lnPc, lcS
THIS.nApeluri = THIS.nApeluri + 1
lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '<NU E SIR>')
THIS.cToateSql = THIS.cToateSql + lcS + CHR(13) + CHR(10)
STRTOFILE(' SpyS6c2b #' + TRANSFORM(THIS.nApeluri) + ' SQL=[' + lcS + ']' + CHR(13) + CHR(10), gcLog, 1)
IF THIS.lForteazaEsecSalveaza AND 'SALVEAZA_PRET_NOMENCLATOR' $ UPPER(lcS)
STRTOFILE(' SpyS6c2b: ESEC FORTAT (nu trimit SQL-ul de mai sus)' + CHR(13) + CHR(10), gcLog, 1)
RETURN -1
ENDIF
lnPc = PCOUNT()
DO CASE
CASE lnPc <= 1
lnRet = DODEFAULT(m.tcSql)
CASE lnPc = 2
lnRet = DODEFAULT(m.tcSql, m.tcCursor)
CASE lnPc = 3
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress)
CASE lnPc = 4
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress)
CASE lnPc = 5
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle)
CASE lnPc = 6
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError)
CASE lnPc = 7
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError)
OTHERWISE
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect)
ENDCASE
RETURN lnRet
ENDPROC
ENDDEFINE
*==================================================================================================
* Subclasa LOCALA de proba (CAZ5, S6c-5) - fara nicio modificare de productie. make_sql suprascris
* gol, This.csql ramane la valoarea implicita din clasa de baza (sir gol), ca sa forteze ramura
* llConditie = .F. in _cus_odata_base.vc2 salvare().
*==================================================================================================
DEFINE CLASS cus_odata_vid_s6c5 AS cus_odata_catalog_articole
PROCEDURE make_sql
LPARAMETERS toRec, tnId
ENDPROC
ENDDEFINE
PROCEDURE Verdict
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
LOCAL lnOk
gcCaz = "[final] "
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
lnOk = SQLEXEC(gnHandle, "ROLLBACK")
DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk) + " (plasa de siguranta - fiecare caz isi face deja propriul ROLLBACK/verificare inainte de asta)"
ENDIF
DO AfLog WITH "PARTIAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,187 @@
* probe_12b_s7a_optiuni_readonly.prg
* Plan #12b, S7a - proba headless pe frm_optiuni_facturare (COMUN\clase\ofacturare.vc2:24650):
* .ct_clb_pol_pret_stoc.Enabled = Empty(Thisform.nidpolpretstoc) in Init.
*
* nidpolpretstoc vine din pack_facturare.citeste_setari_pol_pret(1, gnIdUtil, ...) (apelata din
* actualizeaza_politica_pret, ofacturare.vc2:24573). Sursa PL/SQL (ALL_SOURCE, verificata inainte
* de proba, nu presupusa) pentru V_TIP=1 NU filtreaza dupa V_ID_UTIL - citeste direct
* OPTIUNI.VARVALUE (VARNAME='ID_POL_PRET_STOC') si verifica doar ca politica exista si nu e STERS
* in CRM_POLITICI_PRETURI. Filtrul pe utilizator (CRM_VPOLPRETCURUTIL) exista doar pe ramurile
* V_TIP IN (23,30,41) si V_TIP IN (48,49) - S3 a scos exact acest filtru de pe ramura V_TIP=1
* ("Locul #3 (citire din OPTIUNI + CRM_POLITICI_PRETURI, fara view-ul pe utilizator)"). Cum S3 e
* deja aplicat REAL pe schema (stare_plan_12b.md), id_util=4 (fara drept azi la politica 41 prin
* CRM_VPOLPRETCURUTIL, baseline_12b.md sectiunea 11) primeste ACUM acelasi id_pol=41 ca id_util=8
* pe aceasta ramura - nota "fara drept inainte de S3" din plan descrie starea DINAINTE de aplicarea
* reala a S3, nu starea curenta a schemei.
*
* Spion pe goExecutor (subclasa, DODEFAULT pe PCOUNT) - tiparul din
* editare_factura\probe_s13_toomanycolumns.prg: nu opreste executia, doar logheaza fiecare SQL.
*
* Rulare: powershell -ExecutionPolicy Bypass -File ruleaza_suita.ps1 -Nume probe_12b_s7a_optiuni_readonly
* Log: D:\ROA\ROAFACTURARE\docs\loguri_12b\s7a_optiuni_readonly.log (cerut de sarcina, nu out\)
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
PUBLIC gcLog, gcCaz, gnPass, gnFail
gcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\s7a_optiuni_readonly.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b")
MD "D:\ROA\ROAFACTURARE\docs\loguri_12b"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gcCaz = ""
gnPass = 0
gnFail = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle)
* incarcare explicita a clasei din calea COMPLETA (nu relativa via SET PATH), ca sa fim siguri
* care ofacturare.vcx s-a incarcat de fapt
RELEASE CLASSLIB ofacturare
SET CLASSLIB TO (gcAppPath + "COMUN\CLASE\ofacturare.vcx") ADDITIVE
DO AfLog WITH "SET CLASSLIB la " + gcAppPath + "COMUN\CLASE\ofacturare.vcx"
gnTransOriginal = SQLGETPROP(gnHandle, "Transactions")
SQLSETPROP(gnHandle, "Transactions", 2)
DO AfLog WITH "Transactions manual, original=" + TRANSFORM(gnTransOriginal)
LOCAL loForm1, loForm2, loForm3, loForm4, loReal, loSpy
*----------------------------------------------------------------------------------------
gcCaz = "[1: optiune setata, id_util=8] "
gnIdUtil = 8
loForm1 = CREATEOBJECT('frm_optiuni_facturare', 1)
DO Verdict WITH LOWER(JUSTFNAME(loForm1.ClassLibrary)) == 'ofacturare.vcx', ;
"ClassLibrary incarcat = ofacturare.vcx (cale completa) - " + TRANSFORM(loForm1.ClassLibrary)
DO Verdict WITH loForm1.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .F., ;
"Enabled=.F. dupa Init (nidpolpretstoc=" + TRANSFORM(loForm1.nidpolpretstoc) + ")"
loForm1.Refresh()
DO Verdict WITH loForm1.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .F., "Enabled=.F. dupa Refresh()"
*----------------------------------------------------------------------------------------
gcCaz = "[2: optiune setata, id_util=4 fara drept CRM_VPOLPRETCURUTIL] "
gnIdUtil = 4
loForm2 = CREATEOBJECT('frm_optiuni_facturare', 1)
DO Verdict WITH loForm2.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .F., ;
"Enabled=.F. dupa Init (nidpolpretstoc=" + TRANSFORM(loForm2.nidpolpretstoc) + ") - fara filtru pe utilizator pe ramura V_TIP=1, cf. sursei citite"
loForm2.Refresh()
DO Verdict WITH loForm2.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .F., "Enabled=.F. dupa Refresh()"
*----------------------------------------------------------------------------------------
gcCaz = "[3: optiune GOALA] "
gnIdUtil = 8
LOCAL lnOk
lnOk = SQLEXEC(gnHandle, "UPDATE OPTIUNI SET VARVALUE = NULL WHERE PROGRAM = 'ROAFACTURARE' AND VARNAME = 'ID_POL_PRET_STOC'")
DO Verdict WITH lnOk > 0, "UPDATE OPTIUNI ID_POL_PRET_STOC=NULL (in tranzactie, ROLLBACK la final) - lnOk=" + TRANSFORM(lnOk)
loForm3 = CREATEOBJECT('frm_optiuni_facturare', 1)
DO Verdict WITH loForm3.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .T., ;
"Enabled=.T. cu optiunea goala (nidpolpretstoc=" + TRANSFORM(NVL(loForm3.nidpolpretstoc, -999)) + ")"
*----------------------------------------------------------------------------------------
* revin la optiunea reala (41) pentru cazul 4 - salvare fara schimbare trebuie sa compare fata
* de valoarea reala din OPTIUNI, nu fata de NULL-ul de mai sus
lnOk = SQLEXEC(gnHandle, "UPDATE OPTIUNI SET VARVALUE = '41' WHERE PROGRAM = 'ROAFACTURARE' AND VARNAME = 'ID_POL_PRET_STOC'")
DO Verdict WITH lnOk > 0, "restaurare OPTIUNI ID_POL_PRET_STOC=41 (tot in tranzactie) - lnOk=" + TRANSFORM(lnOk)
gcCaz = "[4: salvare fara schimbare de camp, spion oexecutor] "
loForm4 = CREATEOBJECT('frm_optiuni_facturare', 1)
loReal = goExecutor
loSpy = CREATEOBJECT('SpyS7a')
loSpy.nHandle = gnHandle
goExecutor = loSpy
loForm4.inainte_de_do_termin()
goExecutor = loReal
DO Verdict WITH !('modificare_politica_stoc' $ UPPER(loSpy.cToateSql)) AND !('MODIFICARE_POLITICA_STOC' $ loSpy.cToateSql), ;
"niciun SQL trimis prin executor nu contine modificare_politica_stoc (" + TRANSFORM(loSpy.nApeluri) + " apel(uri))"
*----------------------------------------------------------------------------------------
gcCaz = "[mutatie de control, instanta separata] "
LOCAL loFormCtrl
gnIdUtil = 8
loFormCtrl = CREATEOBJECT('frm_optiuni_facturare', 1)
loFormCtrl.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .T.
DO Verdict WITH loFormCtrl.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .T., ;
"dupa fortare manuala Enabled=.T. pe o instanta separata - un assert naiv 'Enabled=.F.' de la cazul 1 ar fi picat aici, deci asertul e sensibil la linia din Init"
DO Final
*==================================================================================================
* Spion pe goExecutor - subclasa DODEFAULT pe PCOUNT (nu opreste executia), tiparul din
* editare_factura\probe_s13_toomanycolumns.prg. Acumuleaza toate SQL-urile intr-un singur sir,
* pentru un singur test de substring la final.
*==================================================================================================
DEFINE CLASS SpyS7a AS oexecutor
nApeluri = 0
cToateSql = ''
PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect)
LOCAL lnRet, lnPc, lcS
THIS.nApeluri = THIS.nApeluri + 1
lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '<NU E SIR>')
THIS.cToateSql = THIS.cToateSql + lcS + CHR(13) + CHR(10)
STRTOFILE(' SpyS7a #' + TRANSFORM(THIS.nApeluri) + ' SQL=[' + lcS + ']' + CHR(13) + CHR(10), gcLog, 1)
lnPc = PCOUNT()
DO CASE
CASE lnPc <= 1
lnRet = DODEFAULT(m.tcSql)
CASE lnPc = 2
lnRet = DODEFAULT(m.tcSql, m.tcCursor)
CASE lnPc = 3
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress)
CASE lnPc = 4
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress)
CASE lnPc = 5
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle)
CASE lnPc = 6
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError)
CASE lnPc = 7
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError)
OTHERWISE
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect)
ENDCASE
RETURN lnRet
ENDPROC
ENDDEFINE
PROCEDURE Verdict
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
LOCAL lnOk
gcCaz = "[final] "
lnOk = SQLEXEC(gnHandle, "ROLLBACK")
DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk)
IF TYPE('gnTransOriginal') = 'N'
SQLSETPROP(gnHandle, "Transactions", gnTransOriginal)
ENDIF
DO AfLog WITH "TOTAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,181 @@
* probe_12b_s7b_politica_nota.prg
* Plan #12b, S7b - proba headless pe clasa cus_pret_nomenclator (COMUN\programe\ofacturare_comun.prg:2323),
* metodele adaugate in S7b: incarca_nota_politica / salveaza_nota_politica (nota implicita a politicii
* de stoc, folosita in optiunile facturarii, ofacturare.vc2). Clasa e definita direct in .prg
* (Set Procedure To ofacturare_comun.prg, deja Additive in mediul de test) - CREATEOBJECT direct.
*
* Cazuri:
* (1) asigura_politica() apelata de doua ori, ca din ROACONTRACTE (acelasi pachet PL/SQL,
* D14 = pack_preturi.asigura_politica_stoc) dupa ce optiunea e golita -> o singura politica
* noua (numarate randurile CRM_POLITICI_PRETURI inainte/dupa fiecare apel, nu doar id-ul).
* (2) salveaza_nota_politica(id_pol_nou, '461', '7583') -> ID_NOTA citit DIRECT din
* CRM_POLITICI_PRETURI (nu din proprietatile instantei), plus SCD/SCC ale notei citite prin
* JOIN CRM_NOTE_VANZARI/NOTE_CONTABILE, comparate cu valorile asteptate 461/7583.
* (3) incarca_nota_politica(acelasi id_pol) pe o instanta noua -> cScd/cScc = 461/7583, identic
* cu ce s-a scris la (2).
* Politica noua de la (1) e folosita si la (2)/(3), ca sa nu atinga politica 41 de productie -
* dispare oricum la ROLLBACK.
*
* Spion pe goExecutor: nu e nevoie - toate verificarile citesc direct din Oracle (SQLEXEC), nu
* numara apeluri RPC.
*
* Rulare: powershell -ExecutionPolicy Bypass -File ruleaza_suita.ps1 -Nume probe_12b_s7b_politica_nota
* Log: D:\ROA\ROAFACTURARE\docs\loguri_12b\s7b_proba.log (cerut de sarcina, nu out\)
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
PUBLIC gcLog, gcCaz, gnPass, gnFail, gnTransOriginal
gcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\s7b_proba.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b")
MD "D:\ROA\ROAFACTURARE\docs\loguri_12b"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gcCaz = ""
gnPass = 0
gnFail = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
gnIdUtil = 8
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle)
gnTransOriginal = SQLGETPROP(gnHandle, "Transactions")
SQLSETPROP(gnHandle, "Transactions", 2)
DO AfLog WITH "Transactions manual, original=" + TRANSFORM(gnTransOriginal)
LOCAL lnOk, lnCntInit, lnCntDupa1, lnCntDupa2, lcOptInit, loA, loB, lnPolA, lnPolB
*==========================================================================================
* CAZ (1): asigura_politica_stoc apelata de doua ori (ca din ROACONTRACTE) -> o singura politica
*==========================================================================================
gcCaz = "[1-asigura_politica_stoc-x2] "
* precondition: sesiunea reala initializeaza pack_facturare.nid_moneda_nationala inaintea D14
* (initializeaza_facturare) - tiparul confirmat in docs\proba_s6a_asigura_politica_stoc.sql
lnOk = SQLEXEC(gnHandle, "begin pack_facturare.nid_moneda_nationala := pack_def.GetIdMonedaNationala(); end;")
DO Verdict WITH lnOk > 0, "precondition pack_facturare.nid_moneda_nationala initializat"
lnOk = SQLEXEC(gnHandle, "select count(*) cnt from crm_politici_preturi", "crscnt0")
lnCntInit = IIF(lnOk > 0 AND USED('crscnt0'), crscnt0.cnt, -1)
IF USED('crscnt0')
USE IN crscnt0
ENDIF
lnOk = SQLEXEC(gnHandle, "select varvalue from optiuni where program='ROAFACTURARE' and varname='ID_POL_PRET_STOC'", "crsopt0")
lcOptInit = IIF(lnOk > 0 AND USED('crsopt0') AND !ISNULL(crsopt0.varvalue), ALLTRIM(crsopt0.varvalue), "")
IF USED('crsopt0')
USE IN crsopt0
ENDIF
DO AfLog WITH " OPTIUNE initiala ID_POL_PRET_STOC=[" + lcOptInit + "], politici initial=" + TRANSFORM(lnCntInit)
lnOk = SQLEXEC(gnHandle, "UPDATE OPTIUNI SET VARVALUE = NULL WHERE PROGRAM = 'ROAFACTURARE' AND VARNAME = 'ID_POL_PRET_STOC'")
DO Verdict WITH lnOk > 0, "UPDATE OPTIUNI ID_POL_PRET_STOC=NULL (tranzactie, ROLLBACK la final) - lnOk=" + TRANSFORM(lnOk)
loA = CREATEOBJECT('cus_pret_nomenclator')
lnPolA = loA.asigura_politica()
DO Verdict WITH lnPolA > 0, "primul apel asigura_politica() > 0 (obtinut " + TRANSFORM(lnPolA) + ")"
lnOk = SQLEXEC(gnHandle, "select count(*) cnt from crm_politici_preturi", "crscnt1")
lnCntDupa1 = IIF(lnOk > 0 AND USED('crscnt1'), crscnt1.cnt, -1)
IF USED('crscnt1')
USE IN crscnt1
ENDIF
DO Verdict WITH lnCntDupa1 = lnCntInit + 1, "dupa primul apel: politici " + TRANSFORM(lnCntInit) + " -> " + TRANSFORM(lnCntDupa1) + " (+1 asteptat)"
loB = CREATEOBJECT('cus_pret_nomenclator')
lnPolB = loB.asigura_politica()
lnOk = SQLEXEC(gnHandle, "select count(*) cnt from crm_politici_preturi", "crscnt2")
lnCntDupa2 = IIF(lnOk > 0 AND USED('crscnt2'), crscnt2.cnt, -1)
IF USED('crscnt2')
USE IN crscnt2
ENDIF
DO Verdict WITH lnPolB = lnPolA, "al doilea apel (ca din ROACONTRACTE) intoarce acelasi id=" + TRANSFORM(lnPolA) + " (obtinut " + TRANSFORM(lnPolB) + ")"
DO Verdict WITH lnCntDupa2 = lnCntDupa1, "al doilea apel NU creeaza politica noua (politici " + TRANSFORM(lnCntDupa1) + " -> " + TRANSFORM(lnCntDupa2) + ")"
IF !EMPTY(lcOptInit)
lnOk = SQLEXEC(gnHandle, "UPDATE OPTIUNI SET VARVALUE = '" + lcOptInit + "' WHERE PROGRAM = 'ROAFACTURARE' AND VARNAME = 'ID_POL_PRET_STOC'")
DO Verdict WITH lnOk > 0, "restaurare OPTIUNI ID_POL_PRET_STOC=" + lcOptInit + " (tot in tranzactie) - lnOk=" + TRANSFORM(lnOk)
ENDIF
*==========================================================================================
* CAZ (2): salveaza_nota_politica scrie ID_NOTA in CRM_POLITICI_PRETURI (citit din Oracle)
*==========================================================================================
gcCaz = "[2-salveaza_nota_politica] "
LOCAL loC, llRes2, lnIdNotaCitit
loC = CREATEOBJECT('cus_pret_nomenclator')
llRes2 = loC.salveaza_nota_politica(lnPolA, '461', '7583')
DO Verdict WITH llRes2, "salveaza_nota_politica(" + TRANSFORM(lnPolA) + ",461,7583) = .T."
lnOk = SQLEXEC(gnHandle, "select id_nota from crm_politici_preturi where id_pol = " + TRANSFORM(lnPolA), "crsverif2")
lnIdNotaCitit = IIF(lnOk > 0 AND USED('crsverif2') AND RECCOUNT('crsverif2') = 1, NVL(crsverif2.id_nota,-999), -999)
IF USED('crsverif2')
USE IN crsverif2
ENDIF
DO Verdict WITH lnIdNotaCitit > 0, "ID_NOTA citit direct din CRM_POLITICI_PRETURI (nu din instanta) > 0 - obtinut " + TRANSFORM(lnIdNotaCitit)
lnOk = SQLEXEC(gnHandle, "select n.scd, n.scc from crm_note_vanzari v, note_contabile n where v.id_nota = " + TRANSFORM(lnIdNotaCitit) + " and n.id_set = v.id_set", "crsnota2")
DO Verdict WITH lnOk > 0 AND USED('crsnota2') AND RECCOUNT('crsnota2') = 1 AND ALLTRIM(crsnota2.scd) == "461" AND ALLTRIM(crsnota2.scc) == "7583", ;
"nota din Oracle are scd/scc = 461/7583 (asteptat independent, nu cursorul clasei) - obtinut " + ;
IIF(USED('crsnota2') AND RECCOUNT('crsnota2') = 1, ALLTRIM(NVL(crsnota2.scd,'?')) + '/' + ALLTRIM(NVL(crsnota2.scc,'?')), '<lipsa>')
IF USED('crsnota2')
USE IN crsnota2
ENDIF
*==========================================================================================
* CAZ (3): incarca_nota_politica citeste inapoi identic (instanta noua)
*==========================================================================================
gcCaz = "[3-incarca_nota_politica] "
LOCAL loD, llRes3
loD = CREATEOBJECT('cus_pret_nomenclator')
llRes3 = loD.incarca_nota_politica(lnPolA)
DO Verdict WITH llRes3, "incarca_nota_politica(" + TRANSFORM(lnPolA) + ") = .T."
DO Verdict WITH ALLTRIM(loD.cScd) == "461", "incarca_nota_politica: cScd=461 (obtinut [" + ALLTRIM(loD.cScd) + "])"
DO Verdict WITH ALLTRIM(loD.cScc) == "7583", "incarca_nota_politica: cScc=7583 (obtinut [" + ALLTRIM(loD.cScc) + "])"
DO Final
*==================================================================================================
PROCEDURE Verdict
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
LOCAL lnOk
gcCaz = "[final] "
lnOk = SQLEXEC(gnHandle, "ROLLBACK")
DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk)
IF TYPE('gnTransOriginal') = 'N'
SQLSETPROP(gnHandle, "Transactions", gnTransOriginal)
ENDIF
DO AfLog WITH "TOTAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,401 @@
* probe_12b_s8_cai_1_3.prg
* Plan 12b, S8-4b: proba headless a caii 1 (do_adauga_articol) si caii 3 (do_adauga_tot) din
* frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) pentru verificarea prietenoasa D10 a
* contului de venit (S8-3). Calea 2 (do_adauga_articol_cautat) e alt fisier.
*
* Instantiere formular headless (tipar dovedit, COMUN\utile\Teste\facturare_unificat\test_s3_4b_incarca_articole.prg,
* 95 PASS): SET PATH/CLASSLIB gridextras + _cb_base ADDITIVE inainte de Createobject, crsfactura
* deschis (structura goala + camp gestiune) inainte de Createobject (grd_factura.Column e legat la
* crsFactura.denumire), o singura instanta refolosita pe cele 3 cazuri.
*
* crsarticole: structura REALA descoperita cu AFIELDS pe pack_facturare.cursor_preturi(tnTip=1)
* (24 campuri), nu cursorul sintetic din mock_cursor_articole.prg (are pretftva/pretctva direct,
* incompatibil cu do_initializeaza_articol care cere Pret/pret_val si le deriva singur).
*
* Politica de stoc (ID_NOTA NULL, tranzactie, ROLLBACK la final) + cele doua articole (cont dedus /
* fara cont dedus) alese din baza vie prin acelasi tipar ca probe_12b_s8_verifica_linie.prg (caz3/caz4).
* Articolele sunt marcate gestionabil=0 in crsarticole (nu reflecta starea reala din nomenclator) ca
* sa ocoleasca do_alege_stoc (ramura de stoc, neatinsa de S8-3) - do_verifica_articol si Do Case-ul
* de ramificare din do_adauga_articol trec amandoua pe gestionabil=0, indiferent de gnScadereStoc.
*
* Spion amessagebox propriu (contor + text), incarcat PRIMUL (SET PROCEDURE TO (acest fisier), &lcProcExistent).
*
* Cazuri:
* (1) calea 1, articol FARA cont dedus -> do_adauga_articol(.T.) nu adauga (Reccount(crsfactura)
* neschimbat), spion: 1 mesaj continand denumirea articolului. PASS.
* (2) calea 1, articol CU cont dedus -> linia se adauga (Reccount+1), 0 mesaje. PASS.
* (3) calea 3, do_adauga_tot() pe crsarticole cu ambele articole (problema + OK) -> AMBELE linii
* adaugate (Reccount+2), spion: EXACT 1 mesaj, continand denumirea articolului problema, nu si
* pe a celui OK. PASS.
*
* S8-4d: blocajul (2)/(3) era lipsa cursorului 'saft_taxtable' - Createobject("frm_articol_factura",...)
* (ofacturare.vc2:18751) executa in Init (:2678, gl406) un Requery() pe un combo RowSourceType=3 legat
* de 'saft_taxtable'; cu SET TABLEPROMPT OFF eroarea reala era "File 'saft_taxtable.dbf' does not exist."
* Fix: update_saft_taxtable() (COMUN\programe\updateserver.prg), acelasi apel facut de aplicatie in
* factureaza() (COMUN\programe\ofacturare.prg) imediat dupa update_jtva_coloane(), inainte de
* Createobject('frm_facturare_articole2'). glIncearcaCazSucces implicit .T.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_12b_s8_cai_1_3.prg"
* Log: D:\ROA\ROAFACTURARE\docs\loguri_12b\s8_cai_1_3.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
SET TABLEPROMPT OFF
CLOSE DATABASES
PUBLIC gcLog, gcCaz, gnPass, gnFail, gnTransOriginal
PUBLIC gcSpionMesaje, gnSpionCount
gcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\s8_cai_1_3.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b")
MD "D:\ROA\ROAFACTURARE\docs\loguri_12b"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog, 1)
gcCaz = ""
gnPass = 0
gnFail = 0
gcSpionMesaje = ""
gnSpionCount = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
*-- spion amessagebox: se incarca PRIMUL (inaintea aplicatiei), ca sa castige la nume duplicat
LOCAL lcProcExistent, lcCmdProc
lcProcExistent = SET("PROCEDURE")
lcCmdProc = [SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_12b_s8_cai_1_3.prg"]
IF !EMPTY(lcProcExistent)
lcCmdProc = lcCmdProc + ", " + lcProcExistent
ENDIF
&lcCmdProc
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
gnIdUtil = 8
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle)
gnTransOriginal = SQLGETPROP(gnHandle, "Transactions")
SQLSETPROP(gnHandle, "Transactions", 2)
DO AfLog WITH "Transactions manual, original=" + TRANSFORM(gnTransOriginal)
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
DO AfLog WITH "actualizeaza_optiuni_program OK, gnScadereStoc=" + TRANSFORM(NVL(gnScadereStoc, -1))
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
DO AfLog WITH "SET CLASSLIB suplimentar OK"
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
DO AfLog WITH "update_saft_taxtable OK, Reccount=" + TRANSFORM(IIF(USED('saft_taxtable'), RECCOUNT('saft_taxtable'), -1))
*==========================================================================================
* alegere date: politica de stoc curenta + articol OK (cont dedus) + articol problema (fara cont)
*==========================================================================================
LOCAL lnOk, lnIdPolStoc, lnIdArtOk, lnIdArtProblema, lcDenOk, lcDenProblema
LOCAL llGasitOk, llGasitProblema
gcCaz = "[setup] "
lnOk = SQLEXEC(gnHandle, "select varvalue from optiuni where program='ROAFACTURARE' and varname='ID_POL_PRET_STOC'", "crsopt")
lnIdPolStoc = IIF(lnOk > 0 AND USED('crsopt') AND !ISNULL(crsopt.varvalue), VAL(ALLTRIM(crsopt.varvalue)), 0)
IF USED('crsopt')
USE IN crsopt
ENDIF
DO Verdict WITH lnIdPolStoc > 0, "politica de stoc citita din OPTIUNI, id_pol=" + TRANSFORM(lnIdPolStoc)
IF lnIdPolStoc <= 0
DO Final
ENDIF
PUBLIC gnId_pol_pret_stoc
gnId_pol_pret_stoc = lnIdPolStoc
* articol OK: rand al politicii de stoc, ID_NOTA propriu NULL, cont_venit_articol_stoc rezolvat
lnOk = SQLEXEC(gnHandle, ;
"select a.id_articol from crm_politici_pret_art a " + ;
"where a.id_pol = " + TRANSFORM(lnIdPolStoc) + " and a.id_nota is null " + ;
"and pack_facturare.cont_venit_articol_stoc(a.id_articol) is not null and rownum = 1", "crsok")
llGasitOk = lnOk > 0 AND USED('crsok') AND RECCOUNT('crsok') = 1
lnIdArtOk = IIF(llGasitOk, crsok.id_articol, 0)
IF USED('crsok')
USE IN crsok
ENDIF
DO AfLog WITH "articol OK ales: id_articol=" + TRANSFORM(lnIdArtOk)
* articol problema: alt rand al politicii de stoc, ID_NOTA propriu NULL, fara cont dedus
lnOk = SQLEXEC(gnHandle, ;
"select a.id_articol from crm_politici_pret_art a " + ;
"where a.id_pol = " + TRANSFORM(lnIdPolStoc) + " and a.id_nota is null " + ;
"and a.id_articol <> " + TRANSFORM(lnIdArtOk) + " " + ;
"and pack_facturare.cont_venit_articol_stoc(a.id_articol) is null and rownum = 1", "crsprob")
llGasitProblema = lnOk > 0 AND USED('crsprob') AND RECCOUNT('crsprob') = 1
lnIdArtProblema = IIF(llGasitProblema, crsprob.id_articol, 0)
IF USED('crsprob')
USE IN crsprob
ENDIF
DO AfLog WITH "articol PROBLEMA ales: id_articol=" + TRANSFORM(lnIdArtProblema)
IF !llGasitOk OR !llGasitProblema
DO AfLog WITH "FAIL: date insuficiente in baza vie (articol OK sau PROBLEMA negasit), opresc proba"
gnFail = gnFail + 1
DO Final
ENDIF
lnOk = SQLEXEC(gnHandle, "select denumire from nom_articole where id_articol = " + TRANSFORM(lnIdArtOk), "crsden1")
lcDenOk = IIF(lnOk > 0 AND USED('crsden1') AND RECCOUNT('crsden1') = 1, ALLTRIM(NVL(crsden1.denumire, [])), [<necunoscut>])
IF USED('crsden1')
USE IN crsden1
ENDIF
lnOk = SQLEXEC(gnHandle, "select denumire from nom_articole where id_articol = " + TRANSFORM(lnIdArtProblema), "crsden2")
lcDenProblema = IIF(lnOk > 0 AND USED('crsden2') AND RECCOUNT('crsden2') = 1, ALLTRIM(NVL(crsden2.denumire, [])), [<necunoscut>])
IF USED('crsden2')
USE IN crsden2
ENDIF
DO AfLog WITH "denumiri: OK=[" + lcDenOk + "] PROBLEMA=[" + lcDenProblema + "]"
* politica de stoc cu ID_NOTA NULL (tranzactie, ROLLBACK la final) - fortez ramura "fara cont dedus"
gcCaz = "[setup] "
lnOk = SQLEXEC(gnHandle, "UPDATE crm_politici_preturi SET id_nota = NULL WHERE id_pol = " + TRANSFORM(lnIdPolStoc))
DO Verdict WITH lnOk > 0, "UPDATE politica de stoc ID_NOTA=NULL (tranzactie, ROLLBACK la final) - lnOk=" + TRANSFORM(lnOk)
*==========================================================================================
* mediu formular: poDate, jtva_coloane, crsfactura gol, Createobject
*==========================================================================================
PRIVATE poDate, poGeneratorNumere
LOCAL lnIdSet
lnIdSet = 25000 + 30 - 1 + NVL(gnScadereStoc, 0) * 10
poDate = CREATEOBJECT("oDateFactura", lnIdSet, 30)
poDate.dataireg = DATE(gnAn, gnLuna, 10)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_client = 1
poDate.nIdTipDoc = 6
poGeneratorNumere = NULL
DO AfLog WITH "poDate OK, tip=" + TRANSFORM(poDate.tip) + " in_valuta=" + TRANSFORM(poDate.in_valuta) + " tva_incasare=" + TRANSFORM(NVL(poDate.tva_incasare, -1))
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF NVL(poDate.tva_incasare, 0) = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
DO AfLog WITH "jtva_coloane Reccount=" + TRANSFORM(RECCOUNT('jtva_coloane'))
DO PregatesteFacturaGoala
LOCAL loForm
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Verdict WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
DO Final
ENDIF
* fara Show()/WindowType - formularul ramane necreat vizual, ca in test_s3_4b_incarca_articole.prg
DO AfLog WITH "formular creat, nu afisat (fara Show())"
*==========================================================================================
* CAZ (1): calea 1, articol fara cont dedus -> refuz
*==========================================================================================
gcCaz = "[1-calea1-refuz] "
DO PregatesteArticoleUnRand WITH lnIdArtProblema, lcDenProblema, lnIdPolStoc
LOCAL lnReccountInainte
lnReccountInainte = RECCOUNT('crsfactura')
gnSpionCount = 0
gcSpionMesaje = ""
loForm.do_adauga_articol(.T.)
DO Verdict WITH RECCOUNT('crsfactura') == lnReccountInainte, ;
"Reccount(crsfactura) neschimbat (" + TRANSFORM(RECCOUNT('crsfactura')) + ", era " + TRANSFORM(lnReccountInainte) + ")"
DO Verdict WITH gnSpionCount == 1, "spion: 1 mesaj (obtinut " + TRANSFORM(gnSpionCount) + ")"
DO Verdict WITH lcDenProblema $ gcSpionMesaje, "mesajul contine denumirea articolului [" + lcDenProblema + "] - mesaj: [" + gcSpionMesaje + "]"
*==========================================================================================
* CAZ (2): calea 1, articol cu cont dedus -> linia se adauga
*==========================================================================================
IF TYPE('glIncearcaCazSucces') = 'U'
PUBLIC glIncearcaCazSucces
glIncearcaCazSucces = .T.
ENDIF
gcCaz = "[2-calea1-cont-dedus] "
IF !glIncearcaCazSucces
DO AfLog WITH "BLOCAT: " + gcCaz + "sarit (glIncearcaCazSucces=.F.) - ramura de succes a lui do_adauga_articol atarna headless, vezi antetul fisierului"
ELSE
DO PregatesteArticoleUnRand WITH lnIdArtOk, lcDenOk, lnIdPolStoc
lnReccountInainte = RECCOUNT('crsfactura')
gnSpionCount = 0
gcSpionMesaje = ""
loForm.do_adauga_articol(.T.)
DO Verdict WITH RECCOUNT('crsfactura') == lnReccountInainte + 1, ;
"Reccount(crsfactura) creste cu 1 (" + TRANSFORM(RECCOUNT('crsfactura')) + ", era " + TRANSFORM(lnReccountInainte) + ")"
DO Verdict WITH gnSpionCount == 0, "spion: 0 mesaje (obtinut " + TRANSFORM(gnSpionCount) + ") - " + gcSpionMesaje
ENDIF
*==========================================================================================
* CAZ (3): calea 3, do_adauga_tot() pe ambele articole -> ambele linii, UN singur mesaj
* (scaneaza crsarticole si cheama do_adauga_articol pe fiecare rand)
*==========================================================================================
gcCaz = "[3-calea3-adauga-tot] "
IF !glIncearcaCazSucces
DO AfLog WITH "BLOCAT: " + gcCaz + "sarit (glIncearcaCazSucces=.F.) - aceeasi ramura de succes ca (2)"
ELSE
DO PregatesteFacturaGoala
loForm.grd_factura.RecordSource = ''
loForm.grd_factura.RecordSource = 'crsfactura'
DO PregatesteArticoleDoiaRanduri WITH lnIdArtProblema, lcDenProblema, lnIdArtOk, lcDenOk, lnIdPolStoc
lnReccountInainte = RECCOUNT('crsfactura')
gnSpionCount = 0
gcSpionMesaje = ""
loForm.do_adauga_tot()
DO Verdict WITH RECCOUNT('crsfactura') == lnReccountInainte + 2, ;
"Reccount(crsfactura) creste cu 2, ambele linii adaugate (" + TRANSFORM(RECCOUNT('crsfactura')) + ", era " + TRANSFORM(lnReccountInainte) + ")"
DO Verdict WITH gnSpionCount == 1, "spion: EXACT 1 mesaj (obtinut " + TRANSFORM(gnSpionCount) + ") - " + gcSpionMesaje
DO Verdict WITH lcDenProblema $ gcSpionMesaje, "mesajul contine denumirea articolului problema [" + lcDenProblema + "]"
DO Verdict WITH !(lcDenOk $ gcSpionMesaje), "mesajul NU contine denumirea articolului OK [" + lcDenOk + "]"
ENDIF
IF VARTYPE(loForm) = 'O' AND !ISNULL(loForm)
loForm.Release()
ENDIF
loForm = NULL
DO Final
*==================================================================================================
*-- spion amessagebox - contor + texte, incarcat PRIMUL (vezi SET PROCEDURE la inceput)
FUNCTION amessagebox
LPARAMETERS tcMessage, tnDialogBoxType, tcTitle, tcFont, tnTimeOut, tnTimeoutValue
gnSpionCount = gnSpionCount + 1
gcSpionMesaje = gcSpionMesaje + "[" + TRANSFORM(tcMessage) + "]" + CHR(13) + CHR(10)
DO AfLog WITH " [spion amessagebox] " + TRANSFORM(tcMessage)
RETURN 6
ENDFUNC
*-- crsfactura gol, cu campul 'gestiune' suplimentar cerut de grd_factura.cGestiune (ca in
*-- test_s3_4b_incarca_articole.prg) - obligatoriu inainte de Createobject (legare ControlSource)
PROCEDURE PregatesteFacturaGoala
IF USED('crsfactura')
USE IN crsfactura
ENDIF
creeaza_facturacrs([crsfactura])
SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE
USE IN crsfactura
SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE
USE IN crsfact_tmp
ENDPROC
*-- crsarticole cu structura REALA (24 campuri, AFIELDS pe cursor_preturi tnTip=1), UN singur rand,
*-- gestionabil=0 (ocoleste do_alege_stoc, neatins de S8-3)
PROCEDURE PregatesteArticoleUnRand
LPARAMETERS tnIdArticol, tcDenumire, tnIdPol
IF USED('crsarticole')
USE IN crsarticole
ENDIF
DO CreeazaStructuraArticole
INSERT INTO crsarticole (id_c, id_articol, lot, serie, id_pol, id_valuta, nume_lista_preturi, ;
discount_unitar, discount_unitar_val, codmat, codbare, denumire, um, gestionabil, ;
cantitate, proc_tvav, preturi_cu_tva, curs, multiplicator, pret, pret_val, tip_valuta, ;
nume_val, modificabil) ;
VALUES (1, tnIdArticol, [], [], tnIdPol, 1, [S8-4b], 0, 0, [S8-4b], [], tcDenumire, [BUC], 0, ;
1, 1.19, 0, 0, 1, 100, 0, 0, [RON], 1)
GO TOP IN crsarticole
ENDPROC
*-- crsarticole cu DOUA randuri (problema + OK), pentru do_adauga_tot
PROCEDURE PregatesteArticoleDoiaRanduri
LPARAMETERS tnIdArtProblema, tcDenProblema, tnIdArtOk, tcDenOk, tnIdPol
IF USED('crsarticole')
USE IN crsarticole
ENDIF
DO CreeazaStructuraArticole
INSERT INTO crsarticole (id_c, id_articol, lot, serie, id_pol, id_valuta, nume_lista_preturi, ;
discount_unitar, discount_unitar_val, codmat, codbare, denumire, um, gestionabil, ;
cantitate, proc_tvav, preturi_cu_tva, curs, multiplicator, pret, pret_val, tip_valuta, ;
nume_val, modificabil) ;
VALUES (1, tnIdArtProblema, [], [], tnIdPol, 1, [S8-4b], 0, 0, [S8-4b], [], tcDenProblema, [BUC], 0, ;
1, 1.19, 0, 0, 1, 100, 0, 0, [RON], 1)
INSERT INTO crsarticole (id_c, id_articol, lot, serie, id_pol, id_valuta, nume_lista_preturi, ;
discount_unitar, discount_unitar_val, codmat, codbare, denumire, um, gestionabil, ;
cantitate, proc_tvav, preturi_cu_tva, curs, multiplicator, pret, pret_val, tip_valuta, ;
nume_val, modificabil) ;
VALUES (2, tnIdArtOk, [], [], tnIdPol, 1, [S8-4b], 0, 0, [S8-4b], [], tcDenOk, [BUC], 0, ;
1, 1.19, 0, 0, 1, 100, 0, 0, [RON], 1)
GO TOP IN crsarticole
ENDPROC
PROCEDURE CreeazaStructuraArticole
CREATE CURSOR crsarticole (id_c N(8,0), id_articol N(20,0), lot C(20), serie C(20), id_pol N(7,0), ;
id_valuta N(7,0), nume_lista_preturi C(100), discount_unitar N(8,2), discount_unitar_val N(8,2), ;
codmat C(50), codbare C(50), denumire C(100), um C(20), gestionabil N(3,0), cantitate N(8,2), ;
proc_tvav N(12,4), preturi_cu_tva N(3,0), curs N(14,4), multiplicator N(12,0), pret N(8,2), ;
pret_val N(8,2), tip_valuta N(3,0), nume_val C(20), modificabil N(3,0))
ENDPROC
PROCEDURE Verdict
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
LOCAL lnI, laStack
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
DO AfLog WITH " MESSAGE(1)=" + TRANSFORM(MESSAGE(1))
DO AfLog WITH " SYS(16)=" + TRANSFORM(SYS(16))
IF ASTACKINFO(laStack) > 0
LOCAL lnJ, lcRand
FOR lnI = 1 TO ALEN(laStack, 1)
lcRand = " STACK[" + TRANSFORM(lnI) + "]"
FOR lnJ = 1 TO ALEN(laStack, 2)
lcRand = lcRand + " c" + TRANSFORM(lnJ) + "=" + TRANSFORM(laStack(lnI, lnJ))
ENDFOR
DO AfLog WITH lcRand
ENDFOR
ENDIF
gnFail = gnFail + 1
ENDPROC
PROCEDURE Final
LOCAL lnOk
gcCaz = "[final] "
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
lnOk = SQLEXEC(gnHandle, "ROLLBACK")
DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk)
IF TYPE('gnTransOriginal') = 'N'
SQLSETPROP(gnHandle, "Transactions", gnTransOriginal)
ENDIF
ENDIF
DO AfLog WITH "TOTAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,382 @@
* probe_12b_s8_calea_2.prg
* Plan 12b, S8-4a: proba headless a caii 2 (do_adauga_articol_cautat) din frm_facturare_articole2
* (COMUN\clase\ofacturare.vc2) pentru verificarea prietenoasa D10 a contului de venit (S8-3/S8-4a).
*
* PAS 0 (dovada): pe aceasta cale, obiectul toArticol vine dintr-un Scatter Name pe crsCodmat/
* crsDenumire. Analiza statica din raportul S8-3 a citat proprietatile design-time csourcesql/
* csourcewhere de pe combosql_cautare (:17528/:17564, doar 7 coloane, fara id_pol) - dar acelea NU
* sunt folosite la rulare: refreshdata/selectdata (ofacturare.vc2:463-529) ignora total csourcesql
* si cheama This.cursor_preturi_call() (:446-461), adica {call pack_facturare.cursor_preturi(...)}
* (sau cursor_gestiune pentru tip=41) - acelasi mecanism ca la crsarticole (calea 1). Structura reala
* a cursorului (creeaza_cursor_gol :426-444, reordoneaza :498-512) INCLUDE id_pol. Asadar in cazul
* normal Type('toArticol.Id_Pol')='N' e adevarat, iar linia scrisa in crsfactura (Gather la
* ofacturare.vc2:19018) primeste chiar politica reala rezolvata de cursor_preturi pentru articolul
* respectiv - nu politica de stoc.
*
* Fix S8-4a (ofacturare.vc2:18968-18972): confirmat empiric (probe separat, Gather Name cu
* proprietate lipsa NU arunca eroare si LASA campul destinatie neschimbat, adica linia ar fi ramas
* cu Id_Pol vechi/implicit daca toArticol nu are proprietatea) ca fallback-ul gnId_pol_pret_stoc
* calculat pentru verificare (lnIdPolLinie) nu ajungea niciodata in linia scrisa cand proprietatea
* lipsea din toArticol - AddProperty(toArticol,'Id_Pol',lnIdPolLinie) inchide acest gol; e no-op
* cand Type('toArticol.Id_Pol')='N' (cazul normal, politica reala).
*
* Cazuri (fara mock goExecutor, politica de stoc cu ID_NOTA NULL in tranzactie, ROLLBACK la final):
* (a) toArticol FARA proprietatea Id_Pol, articol fara cont dedus -> do_adauga_articol_cautat = .F.,
* Reccount(crsfactura) neschimbat, spion amessagebox: mesaj continand denumirea articolului.
* (b) toArticol FARA proprietatea Id_Pol, articol CU cont dedus -> linia se adauga (Reccount+1),
* spion 0 apeluri, iar crsfactura.Id_Pol al liniei noi == gnId_pol_pret_stoc (fallback aplicat).
* (c) toArticol CU Id_Pol = o politica reala (<> politica de stoc, cu nota proprie valida) -> linia
* se adauga, crsfactura.Id_Pol al liniei noi == acea politica reala (Type='N', fix no-op,
* politica ramane cea reala, nu cea de stoc).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_12b_s8_calea_2.prg"
* Log: D:\ROA\ROAFACTURARE\docs\loguri_12b\s8_calea_2.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gcCaz, gnPass, gnFail, gnTransOriginal
PUBLIC gcSpionMesaje, gnSpionCount
gcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\s8_calea_2.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b")
MD "D:\ROA\ROAFACTURARE\docs\loguri_12b"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gcCaz = ""
gnPass = 0
gnFail = 0
gcSpionMesaje = ""
gnSpionCount = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
*-- spion amessagebox: se incarca PRIMUL (inaintea aplicatiei), ca sa castige la nume duplicat
LOCAL lcProcExistent, lcCmdProc
lcProcExistent = SET("PROCEDURE")
lcCmdProc = [SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_12b_s8_calea_2.prg"]
IF !EMPTY(lcProcExistent)
lcCmdProc = lcCmdProc + ", " + lcProcExistent
ENDIF
&lcCmdProc
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
gnIdUtil = 8
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle)
gnTransOriginal = SQLGETPROP(gnHandle, "Transactions")
SQLSETPROP(gnHandle, "Transactions", 2)
DO AfLog WITH "Transactions manual, original=" + TRANSFORM(gnTransOriginal)
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
DO AfLog WITH "actualizeaza_optiuni_program OK, gnScadereStoc=" + TRANSFORM(NVL(gnScadereStoc, -1))
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
DO AfLog WITH "SET CLASSLIB suplimentar OK"
update_jtva_coloane([JV], [jtva_coloane_temp])
*==========================================================================================
* alegere date: politica de stoc curenta + articol OK (cont dedus) + articol problema (fara cont)
* + o politica reala cu nota proprie valida (caz c) - acelasi tipar ca probe_12b_s8_cai_1_3.prg /
* probe_12b_s8_verifica_linie.prg
*==========================================================================================
LOCAL lnOk, lnIdPolStoc, lnIdArtOk, lnIdArtProblema, lcDenOk, lcDenProblema, lnIdPolReal, lnIdArtReal
LOCAL llGasitOk, llGasitProblema, llGasitPolReal, llGasitArtReal
gcCaz = "[setup] "
lnOk = SQLEXEC(gnHandle, "select varvalue from optiuni where program='ROAFACTURARE' and varname='ID_POL_PRET_STOC'", "crsopt")
lnIdPolStoc = IIF(lnOk > 0 AND USED('crsopt') AND !ISNULL(crsopt.varvalue), VAL(ALLTRIM(crsopt.varvalue)), 0)
IF USED('crsopt')
USE IN crsopt
ENDIF
DO Verdict WITH lnIdPolStoc > 0, "politica de stoc citita din OPTIUNI, id_pol=" + TRANSFORM(lnIdPolStoc)
IF lnIdPolStoc <= 0
DO Final
ENDIF
PUBLIC gnId_pol_pret_stoc
gnId_pol_pret_stoc = lnIdPolStoc
* articol OK: rand al politicii de stoc, ID_NOTA propriu NULL, cont_venit_articol_stoc rezolvat
lnOk = SQLEXEC(gnHandle, ;
"select a.id_articol from crm_politici_pret_art a " + ;
"where a.id_pol = " + TRANSFORM(lnIdPolStoc) + " and a.id_nota is null " + ;
"and pack_facturare.cont_venit_articol_stoc(a.id_articol) is not null and rownum = 1", "crsok")
llGasitOk = lnOk > 0 AND USED('crsok') AND RECCOUNT('crsok') = 1
lnIdArtOk = IIF(llGasitOk, crsok.id_articol, 0)
IF USED('crsok')
USE IN crsok
ENDIF
DO AfLog WITH "articol OK ales: id_articol=" + TRANSFORM(lnIdArtOk)
* articol problema: alt rand al politicii de stoc, ID_NOTA propriu NULL, fara cont dedus
lnOk = SQLEXEC(gnHandle, ;
"select a.id_articol from crm_politici_pret_art a " + ;
"where a.id_pol = " + TRANSFORM(lnIdPolStoc) + " and a.id_nota is null " + ;
"and a.id_articol <> " + TRANSFORM(lnIdArtOk) + " " + ;
"and pack_facturare.cont_venit_articol_stoc(a.id_articol) is null and rownum = 1", "crsprob")
llGasitProblema = lnOk > 0 AND USED('crsprob') AND RECCOUNT('crsprob') = 1
lnIdArtProblema = IIF(llGasitProblema, crsprob.id_articol, 0)
IF USED('crsprob')
USE IN crsprob
ENDIF
DO AfLog WITH "articol PROBLEMA ales: id_articol=" + TRANSFORM(lnIdArtProblema)
* caz (c): o politica reala (<> politica de stoc) cu nota proprie valida (scc nenul) + un articol activ
lnOk = SQLEXEC(gnHandle, ;
"select p.id_pol from crm_politici_preturi p " + ;
"join crm_note_vanzari v on v.id_nota = p.id_nota " + ;
"join note_contabile n on n.id_set = v.id_set and n.scc is not null " + ;
"where p.id_pol <> " + TRANSFORM(lnIdPolStoc) + " and rownum = 1", "crspolreal")
llGasitPolReal = lnOk > 0 AND USED('crspolreal') AND RECCOUNT('crspolreal') = 1
lnIdPolReal = IIF(llGasitPolReal, crspolreal.id_pol, 0)
IF USED('crspolreal')
USE IN crspolreal
ENDIF
lnOk = SQLEXEC(gnHandle, "select id_articol from nom_articole where sters = 0 and rownum = 1", "crsartreal")
llGasitArtReal = lnOk > 0 AND USED('crsartreal') AND RECCOUNT('crsartreal') = 1
lnIdArtReal = IIF(llGasitArtReal, crsartreal.id_articol, 0)
IF USED('crsartreal')
USE IN crsartreal
ENDIF
DO AfLog WITH "CAZ(c) ales: id_pol_real=" + TRANSFORM(lnIdPolReal) + " id_articol=" + TRANSFORM(lnIdArtReal)
IF !llGasitOk OR !llGasitProblema OR !llGasitPolReal OR !llGasitArtReal
DO AfLog WITH "FAIL: date insuficiente in baza vie, opresc proba"
gnFail = gnFail + 1
DO Final
ENDIF
lnOk = SQLEXEC(gnHandle, "select denumire from nom_articole where id_articol = " + TRANSFORM(lnIdArtOk), "crsden1")
lcDenOk = IIF(lnOk > 0 AND USED('crsden1') AND RECCOUNT('crsden1') = 1, ALLTRIM(NVL(crsden1.denumire, [])), [<necunoscut>])
IF USED('crsden1')
USE IN crsden1
ENDIF
lnOk = SQLEXEC(gnHandle, "select denumire from nom_articole where id_articol = " + TRANSFORM(lnIdArtProblema), "crsden2")
lcDenProblema = IIF(lnOk > 0 AND USED('crsden2') AND RECCOUNT('crsden2') = 1, ALLTRIM(NVL(crsden2.denumire, [])), [<necunoscut>])
IF USED('crsden2')
USE IN crsden2
ENDIF
DO AfLog WITH "denumiri: OK=[" + lcDenOk + "] PROBLEMA=[" + lcDenProblema + "]"
* politica de stoc cu ID_NOTA NULL (tranzactie, ROLLBACK la final) - fortez ramura "fara cont dedus"
gcCaz = "[setup] "
lnOk = SQLEXEC(gnHandle, "UPDATE crm_politici_preturi SET id_nota = NULL WHERE id_pol = " + TRANSFORM(lnIdPolStoc))
DO Verdict WITH lnOk > 0, "UPDATE politica de stoc ID_NOTA=NULL (tranzactie, ROLLBACK la final) - lnOk=" + TRANSFORM(lnOk)
*==========================================================================================
* mediu formular: poDate, jtva_coloane, crsfactura gol, Createobject
*==========================================================================================
PRIVATE poDate, poGeneratorNumere
LOCAL lnIdSet
lnIdSet = 25000 + 30 - 1 + NVL(gnScadereStoc, 0) * 10
poDate = CREATEOBJECT("oDateFactura", lnIdSet, 30)
poDate.dataireg = DATE(gnAn, gnLuna, 10)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_client = 1
poDate.nIdTipDoc = 6
poGeneratorNumere = NULL
DO AfLog WITH "poDate OK, tip=" + TRANSFORM(poDate.tip) + " id_pol=" + TRANSFORM(NVL(poDate.id_pol,-1)) + " in_valuta=" + TRANSFORM(poDate.in_valuta)
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF NVL(poDate.tva_incasare, 0) = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
DO AfLog WITH "jtva_coloane Reccount=" + TRANSFORM(RECCOUNT('jtva_coloane'))
DO PregatesteFacturaGoala
LOCAL loForm
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Verdict WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
DO Final
ENDIF
DO AfLog WITH "formular creat, nu afisat (fara Show())"
*==========================================================================================
* CAZ (a): toArticol fara Id_Pol, articol fara cont dedus -> refuz
*==========================================================================================
gcCaz = "[a-calea2-refuz] "
LOCAL loArticol, lnReccountInainte
loArticol = PregatesteToArticol(lnIdArtProblema, lcDenProblema, .F., 0)
lnReccountInainte = RECCOUNT('crsfactura')
gnSpionCount = 0
gcSpionMesaje = ""
LOCAL llRezA
llRezA = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO Verdict WITH llRezA = .F., "do_adauga_articol_cautat = .F. (obtinut " + TRANSFORM(llRezA) + ")"
DO Verdict WITH RECCOUNT('crsfactura') == lnReccountInainte, ;
"Reccount(crsfactura) neschimbat (" + TRANSFORM(RECCOUNT('crsfactura')) + ", era " + TRANSFORM(lnReccountInainte) + ")"
DO Verdict WITH gnSpionCount >= 1, "spion: cel putin 1 mesaj (obtinut " + TRANSFORM(gnSpionCount) + ")"
DO Verdict WITH lcDenProblema $ gcSpionMesaje, "mesajul contine denumirea articolului [" + lcDenProblema + "] - mesaj: [" + gcSpionMesaje + "]"
*==========================================================================================
* CAZ (b): toArticol fara Id_Pol, articol CU cont dedus -> linia se adauga cu Id_Pol = politica de stoc
*==========================================================================================
gcCaz = "[b-calea2-cont-dedus] "
loArticol = PregatesteToArticol(lnIdArtOk, lcDenOk, .F., 0)
DO Verdict WITH TYPE('loArticol.Id_Pol') = 'U', "toArticol FARA proprietatea Id_Pol (Type=" + TYPE('loArticol.Id_Pol') + ")"
SELECT crsfactura
APPEND BLANK
lnReccountInainte = RECCOUNT('crsfactura')
gnSpionCount = 0
gcSpionMesaje = ""
LOCAL llRezB
llRezB = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO Verdict WITH llRezB = .T., "do_adauga_articol_cautat = .T. (obtinut " + TRANSFORM(llRezB) + ")"
DO Verdict WITH gnSpionCount == 0, "spion: 0 mesaje (obtinut " + TRANSFORM(gnSpionCount) + ") - " + gcSpionMesaje
DO Verdict WITH VARTYPE(crsfactura.Id_Pol) = 'N' AND crsfactura.Id_Pol == gnId_pol_pret_stoc, ;
"linia noua primeste Id_Pol = politica de stoc (" + TRANSFORM(gnId_pol_pret_stoc) + ", obtinut " + TRANSFORM(NVL(crsfactura.Id_Pol,-999)) + ")"
*==========================================================================================
* CAZ (c): toArticol CU Id_Pol = politica reala (<> politica de stoc) -> linia pastreaza politica reala
*==========================================================================================
gcCaz = "[c-calea2-politica-reala] "
loArticol = PregatesteToArticol(lnIdArtReal, "articol-real", .T., lnIdPolReal)
DO Verdict WITH TYPE('loArticol.Id_Pol') = 'N' AND loArticol.Id_Pol == lnIdPolReal, ;
"toArticol.Id_Pol = politica reala aleasa (" + TRANSFORM(lnIdPolReal) + ", obtinut " + TRANSFORM(NVL(loArticol.Id_Pol,-999)) + ")"
SELECT crsfactura
APPEND BLANK
gnSpionCount = 0
gcSpionMesaje = ""
LOCAL llRezC
llRezC = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO Verdict WITH llRezC = .T., "do_adauga_articol_cautat = .T. (obtinut " + TRANSFORM(llRezC) + ")"
DO Verdict WITH gnSpionCount == 0, "spion: 0 mesaje (obtinut " + TRANSFORM(gnSpionCount) + ") - " + gcSpionMesaje
DO Verdict WITH VARTYPE(crsfactura.Id_Pol) = 'N' AND crsfactura.Id_Pol == lnIdPolReal, ;
"linia noua pastreaza Id_Pol = politica reala (" + TRANSFORM(lnIdPolReal) + ", obtinut " + TRANSFORM(NVL(crsfactura.Id_Pol,-999)) + "), nu politica de stoc"
IF VARTYPE(loForm) = 'O' AND !ISNULL(loForm)
loForm.Release()
ENDIF
loForm = NULL
DO Final
*==================================================================================================
*-- spion amessagebox - contor + texte, incarcat PRIMUL (vezi SET PROCEDURE la inceput)
FUNCTION amessagebox
LPARAMETERS tcMessage, tnDialogBoxType, tcTitle, tcFont, tnTimeOut, tnTimeoutValue
gnSpionCount = gnSpionCount + 1
gcSpionMesaje = gcSpionMesaje + "[" + TRANSFORM(tcMessage) + "]" + CHR(13) + CHR(10)
DO AfLog WITH " [spion amessagebox] " + TRANSFORM(tcMessage)
RETURN 6
ENDFUNC
*-- crsfactura gol, cu campul 'gestiune' suplimentar cerut de grd_factura.cGestiune (ca in
*-- probe_12b_s8_cai_1_3.prg) - obligatoriu inainte de Createobject (legare ControlSource)
PROCEDURE PregatesteFacturaGoala
IF USED('crsfactura')
USE IN crsfactura
ENDIF
creeaza_facturacrs([crsfactura])
SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE
USE IN crsfactura
SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE
USE IN crsfact_tmp
ENDPROC
*-- toArticol: obiect echivalent unui Scatter Name pe crsCodmat/crsDenumire (structura reala,
*-- creeaza_cursor_gol/reordoneaza din ofacturare.vc2, 20 coloane), fara/cu id_pol dupa caz
FUNCTION PregatesteToArticol
LPARAMETERS tnIdArticol, tcDenumire, tlCuIdPol, tnIdPol
LOCAL lcCursor, loObj
IF USED('crstoart')
USE IN crstoart
ENDIF
IF m.tlCuIdPol
CREATE CURSOR crstoart (codmat C(100), denumire C(100), um C(10), pret N(20,4), ;
nume_val C(20), nume_lista_preturi C(100), proc_tvav N(20,4), codbare C(50), id_articol N(20), ;
id_pol N(20), gestionabil N(1), preturi_cu_tva N(1), tip_valuta N(1), curs N(20,4), ;
multiplicator N(10), id_valuta N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
cantitate N(20,4), pret_val N(20,4))
INSERT INTO crstoart (codmat, denumire, um, pret, nume_val, nume_lista_preturi, proc_tvav, codbare, ;
id_articol, id_pol, gestionabil, preturi_cu_tva, tip_valuta, curs, multiplicator, id_valuta, ;
discount_unitar, discount_unitar_val, cantitate, pret_val) ;
VALUES ([S8-4A], tcDenumire, [BUC], 100, [RON], [S8-4a], 1.19, [], tnIdArticol, ;
tnIdPol, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0)
ELSE
CREATE CURSOR crstoart (codmat C(100), denumire C(100), um C(10), pret N(20,4), ;
nume_val C(20), nume_lista_preturi C(100), proc_tvav N(20,4), codbare C(50), id_articol N(20), ;
gestionabil N(1), preturi_cu_tva N(1), tip_valuta N(1), curs N(20,4), ;
multiplicator N(10), id_valuta N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
cantitate N(20,4), pret_val N(20,4))
INSERT INTO crstoart (codmat, denumire, um, pret, nume_val, nume_lista_preturi, proc_tvav, codbare, ;
id_articol, gestionabil, preturi_cu_tva, tip_valuta, curs, multiplicator, id_valuta, ;
discount_unitar, discount_unitar_val, cantitate, pret_val) ;
VALUES ([S8-4A], tcDenumire, [BUC], 100, [RON], [S8-4a], 1.19, [], tnIdArticol, ;
0, 0, 0, 1, 1, 1, 0, 0, 1, 0)
ENDIF
SELECT crstoart
GO TOP
SCATTER NAME loObj MEMO
RETURN loObj
ENDFUNC
PROCEDURE Verdict
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
gnFail = gnFail + 1
ENDPROC
PROCEDURE Final
LOCAL lnOk
gcCaz = "[final] "
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
lnOk = SQLEXEC(gnHandle, "ROLLBACK")
DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk)
IF TYPE('gnTransOriginal') = 'N'
SQLSETPROP(gnHandle, "Transactions", gnTransOriginal)
ENDIF
ENDIF
DO AfLog WITH "TOTAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,213 @@
* probe_12b_s8_verifica_linie.prg
* Proba headless pentru ofacturare_comun.prg / verifica_cont_venit_linie (langa deriva_cont_venit_fara_pol).
* Fara mock pe goExecutor - toate verificarile trec prin Oracle real (MARIUSM_AUTO), in tranzactie
* manuala, ROLLBACK la final.
*
* Datele (articole, politici, note) se aleg din baza vie la rulare, nu sunt fixe - scrise in log.
* Cazuri:
* (1) politica reala (id_pol <> politica de stoc), cu nota proprie valida -> []
* (2) politica de stoc, rand cu ID_NOTA propriu pe articol, valid -> []
* (3) politica de stoc, rand fara ID_NOTA propriu, dar cont_venit_articol_stoc(articol) rezolvat -> []
* (4) politica de stoc cu ID_NOTA NULL (fortat in tranzactie), rand fara ID_NOTA propriu, fara cont
* dedus -> mesaj nevid, continand denumirea articolului
*
* Rulare: powershell -File ruleaza_suita.ps1 -Nume probe_12b_s8_verifica_linie (sau vfp9.exe -A -T direct)
* Log: D:\ROA\ROAFACTURARE\docs\loguri_12b\s8_verifica_linie.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
PUBLIC gcLog, gcCaz, gnPass, gnFail, gnTransOriginal
gcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\s8_verifica_linie.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b")
MD "D:\ROA\ROAFACTURARE\docs\loguri_12b"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gcCaz = ""
gnPass = 0
gnFail = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
gnIdUtil = 8
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle)
gnTransOriginal = SQLGETPROP(gnHandle, "Transactions")
SQLSETPROP(gnHandle, "Transactions", 2)
DO AfLog WITH "Transactions manual, original=" + TRANSFORM(gnTransOriginal)
LOCAL lnOk, lnIdPolStoc, lnIdArtCaz1, lnIdPolCaz1, lnIdArtCaz2, lnIdPolArtCaz2, lnIdNotaCaz2, ;
lnIdArtCaz3, lnIdArtCaz4, lcMesaj, lcDenumireCaz4, ;
llGasitCaz1, llGasitArtCaz1, llGasitCaz2, llGasitNotaCaz2, llGasitCaz3, llGasitCaz4
*==========================================================================================
* alegere date: politica de stoc curenta
*==========================================================================================
gcCaz = "[setup] "
lnOk = SQLEXEC(gnHandle, "select varvalue from optiuni where program='ROAFACTURARE' and varname='ID_POL_PRET_STOC'", "crsopt")
lnIdPolStoc = IIF(lnOk > 0 AND USED('crsopt') AND !ISNULL(crsopt.varvalue), VAL(ALLTRIM(crsopt.varvalue)), 0)
IF USED('crsopt')
USE IN crsopt
ENDIF
DO Verdict WITH lnIdPolStoc > 0, "politica de stoc citita din OPTIUNI, id_pol=" + TRANSFORM(lnIdPolStoc)
IF lnIdPolStoc <= 0
DO Final
ENDIF
PUBLIC gnId_pol_pret_stoc
gnId_pol_pret_stoc = lnIdPolStoc
* caz (1): o politica reala cu nota proprie valida (scc nenul) - orice articol activ merge, ramura
* reala nu foloseste randul din crm_politici_pret_art
lnOk = SQLEXEC(gnHandle, ;
"select p.id_pol from crm_politici_preturi p " + ;
"join crm_note_vanzari v on v.id_nota = p.id_nota " + ;
"join note_contabile n on n.id_set = v.id_set and n.scc is not null " + ;
"where p.id_pol <> " + TRANSFORM(lnIdPolStoc) + " and rownum = 1", "crs1")
llGasitCaz1 = lnOk > 0 AND USED('crs1') AND RECCOUNT('crs1') = 1
lnIdPolCaz1 = IIF(llGasitCaz1, crs1.id_pol, 0)
IF USED('crs1')
USE IN crs1
ENDIF
lnOk = SQLEXEC(gnHandle, "select id_articol from nom_articole where sters = 0 and rownum = 1", "crsart1")
llGasitArtCaz1 = lnOk > 0 AND USED('crsart1') AND RECCOUNT('crsart1') = 1
lnIdArtCaz1 = IIF(llGasitArtCaz1, crsart1.id_articol, 0)
IF USED('crsart1')
USE IN crsart1
ENDIF
DO AfLog WITH "CAZ1 ales: id_pol=" + TRANSFORM(lnIdPolCaz1) + " id_articol=" + TRANSFORM(lnIdArtCaz1)
* caz (2): rand existent al politicii de stoc, cu ID_NOTA propriu setat (in tranzactie) la o nota valida
lnOk = SQLEXEC(gnHandle, ;
"select id_pol_art, id_articol from crm_politici_pret_art where id_pol = " + TRANSFORM(lnIdPolStoc) + " and rownum = 1", "crs2")
llGasitCaz2 = lnOk > 0 AND USED('crs2') AND RECCOUNT('crs2') = 1
lnIdPolArtCaz2 = IIF(llGasitCaz2, crs2.id_pol_art, 0)
lnIdArtCaz2 = IIF(llGasitCaz2, crs2.id_articol, 0)
IF USED('crs2')
USE IN crs2
ENDIF
lnOk = SQLEXEC(gnHandle, ;
"select v.id_nota from crm_note_vanzari v, note_contabile n " + ;
"where n.id_set = v.id_set and n.scc is not null and rownum = 1", "crs2b")
llGasitNotaCaz2 = lnOk > 0 AND USED('crs2b') AND RECCOUNT('crs2b') = 1
lnIdNotaCaz2 = IIF(llGasitNotaCaz2, crs2b.id_nota, 0)
IF USED('crs2b')
USE IN crs2b
ENDIF
DO AfLog WITH "CAZ2 ales: id_pol_art=" + TRANSFORM(lnIdPolArtCaz2) + " id_articol=" + TRANSFORM(lnIdArtCaz2) + " id_nota_fortata=" + TRANSFORM(lnIdNotaCaz2)
* caz (3): alt rand al politicii de stoc, ID_NOTA propriu NULL, cu cont_venit_articol_stoc rezolvat
lnOk = SQLEXEC(gnHandle, ;
"select a.id_articol from crm_politici_pret_art a " + ;
"where a.id_pol = " + TRANSFORM(lnIdPolStoc) + " and a.id_nota is null " + ;
"and a.id_articol <> " + TRANSFORM(lnIdArtCaz2) + " " + ;
"and pack_facturare.cont_venit_articol_stoc(a.id_articol) is not null and rownum = 1", "crs3")
llGasitCaz3 = lnOk > 0 AND USED('crs3') AND RECCOUNT('crs3') = 1
lnIdArtCaz3 = IIF(llGasitCaz3, crs3.id_articol, 0)
IF USED('crs3')
USE IN crs3
ENDIF
DO AfLog WITH "CAZ3 ales: id_articol=" + TRANSFORM(lnIdArtCaz3)
* caz (4): alt rand al politicii de stoc, ID_NOTA propriu NULL, fara cont dedus
lnOk = SQLEXEC(gnHandle, ;
"select a.id_articol from crm_politici_pret_art a " + ;
"where a.id_pol = " + TRANSFORM(lnIdPolStoc) + " and a.id_nota is null " + ;
"and a.id_articol not in (" + TRANSFORM(lnIdArtCaz2) + "," + TRANSFORM(lnIdArtCaz3) + ") " + ;
"and pack_facturare.cont_venit_articol_stoc(a.id_articol) is null and rownum = 1", "crs4")
llGasitCaz4 = lnOk > 0 AND USED('crs4') AND RECCOUNT('crs4') = 1
lnIdArtCaz4 = IIF(llGasitCaz4, crs4.id_articol, 0)
IF USED('crs4')
USE IN crs4
ENDIF
DO AfLog WITH "CAZ4 ales: id_articol=" + TRANSFORM(lnIdArtCaz4)
IF !llGasitCaz1 OR !llGasitArtCaz1 OR !llGasitCaz2 OR !llGasitNotaCaz2 OR !llGasitCaz3 OR !llGasitCaz4
DO AfLog WITH "FAIL: date insuficiente in baza vie pentru cele 4 cazuri, opresc proba"
gnFail = gnFail + 1
DO Final
ENDIF
*==========================================================================================
* CAZ (1): politica reala -> []
*==========================================================================================
gcCaz = "[1-politica-reala] "
lcMesaj = verifica_cont_venit_linie(lnIdArtCaz1, lnIdPolCaz1)
DO Verdict WITH EMPTY(lcMesaj), "verifica_cont_venit_linie(" + TRANSFORM(lnIdArtCaz1) + "," + TRANSFORM(lnIdPolCaz1) + ") = [] (obtinut [" + lcMesaj + "])"
*==========================================================================================
* CAZ (2): politica de stoc, ID_NOTA pe rand -> []
*==========================================================================================
gcCaz = "[2-nota-pe-rand] "
lnOk = SQLEXEC(gnHandle, "UPDATE crm_politici_pret_art SET id_nota = " + TRANSFORM(lnIdNotaCaz2) + " WHERE id_pol_art = " + TRANSFORM(lnIdPolArtCaz2))
DO Verdict WITH lnOk > 0, "UPDATE id_nota pe rand (tranzactie, ROLLBACK la final) - lnOk=" + TRANSFORM(lnOk)
lcMesaj = verifica_cont_venit_linie(lnIdArtCaz2, lnIdPolStoc)
DO Verdict WITH EMPTY(lcMesaj), "verifica_cont_venit_linie(" + TRANSFORM(lnIdArtCaz2) + "," + TRANSFORM(lnIdPolStoc) + ") = [] (obtinut [" + lcMesaj + "])"
*==========================================================================================
* CAZ (3): politica de stoc, fara nota pe rand, cont dedus -> []
*==========================================================================================
gcCaz = "[3-cont-dedus] "
lcMesaj = verifica_cont_venit_linie(lnIdArtCaz3, lnIdPolStoc)
DO Verdict WITH EMPTY(lcMesaj), "verifica_cont_venit_linie(" + TRANSFORM(lnIdArtCaz3) + "," + TRANSFORM(lnIdPolStoc) + ") = [] (obtinut [" + lcMesaj + "])"
*==========================================================================================
* CAZ (4): politica de stoc cu ID_NOTA NULL, fara nota rand, fara cont dedus -> mesaj nevid
*==========================================================================================
gcCaz = "[4-fara-cont] "
lnOk = SQLEXEC(gnHandle, "UPDATE crm_politici_preturi SET id_nota = NULL WHERE id_pol = " + TRANSFORM(lnIdPolStoc))
DO Verdict WITH lnOk > 0, "UPDATE politica de stoc ID_NOTA=NULL (tranzactie, ROLLBACK la final) - lnOk=" + TRANSFORM(lnOk)
lcMesaj = verifica_cont_venit_linie(lnIdArtCaz4, lnIdPolStoc)
DO Verdict WITH !EMPTY(lcMesaj), "verifica_cont_venit_linie(" + TRANSFORM(lnIdArtCaz4) + "," + TRANSFORM(lnIdPolStoc) + ") <> [] (obtinut [" + lcMesaj + "])"
lnOk = SQLEXEC(gnHandle, "select denumire from nom_articole where id_articol = " + TRANSFORM(lnIdArtCaz4), "crsden4")
lcDenumireCaz4 = IIF(lnOk > 0 AND USED('crsden4') AND RECCOUNT('crsden4') = 1, ALLTRIM(NVL(crsden4.denumire,[])), [<necunoscut>])
IF USED('crsden4')
USE IN crsden4
ENDIF
DO Verdict WITH !EMPTY(lcDenumireCaz4) AND lcDenumireCaz4 $ lcMesaj, ;
"mesajul contine denumirea articolului ales [" + lcDenumireCaz4 + "] - mesaj: [" + lcMesaj + "]"
DO Final
*==================================================================================================
PROCEDURE Verdict
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
LOCAL lnOk
gcCaz = "[final] "
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
lnOk = SQLEXEC(gnHandle, "ROLLBACK")
DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk)
IF TYPE('gnTransOriginal') = 'N'
SQLSETPROP(gnHandle, "Transactions", gnTransOriginal)
ENDIF
ENDIF
DO AfLog WITH "TOTAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,258 @@
* probe_vanzare_ui_cota_tva.prg
* Proba headless pe pagina "Vanzare" din fisa articolului (COMUN\clase\onom_articole.vc2, clasa
* frm_catalog_articole_nou) si pe clasa cus_pret_nomenclator (COMUN\programe\ofacturare_comun.prg):
* combo-ul de cota TVA din tabela pe luni, pastrarea PROC_TVAV NULL ("ales la facturare"), cota
* standard pe articol nou, recalculul pretului derivat si etichetele paginii.
*
* Fara dialoguri: formularul nu se arata niciodata (CREATEOBJECT fara Show()), iar AMESSAGEBOX e
* inlocuit de mock-ul incarcat de test_init_env_auto_roafacturare.prg sub -A -T.
* Fara scriere permanenta in Oracle: singura scriere (cazul NOMEN) se face in tranzactie manuala,
* inchisa cu ROLLBACK.
* Cazurile ruleaza in procese vfp9 separate - a doua instantiere a formularului in acelasi proces
* se autoblocheaza (tiparul probe_12b_s6c_fisa_pagina_vanzare.prg).
*
* Articol de proba: 2528841557, pe politica 41 (PRETURI_CU_TVA = 0, PROC_TVAV = NULL).
* Cotele lunii (comun.vcote_tva): 21/1.21, 19/1.19, 11/1.11, 0/1, apoi randul "<ALES LA FACTURARE>".
*
* Rulare (form): powershell -ExecutionPolicy Bypass -File ruleaza_suita.ps1 -Nume probe_vanzare_ui_cota_tva
* Rulare (nomen): "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" -A -T probe_vanzare_ui_cota_tva.prg NOMEN
* Log: D:\ROA\ROAFACTURARE\docs\loguri_12b\vanzare_ui_cota_tva.log (fiecare proces face APPEND)
PARAMETERS tcModo
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
LOCAL lcMod
lcMod = UPPER(ALLTRIM(IIF(VARTYPE(tcModo) = "C", tcModo, "")))
IF EMPTY(lcMod)
lcMod = "FORM"
ENDIF
PUBLIC gcLog, gcCaz, gnPass, gnFail
gcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\vanzare_ui_cota_tva.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b")
MD "D:\ROA\ROAFACTURARE\docs\loguri_12b"
ENDIF
STRTOFILE("--- caz (" + lcMod + ") START " + TTOC(DATETIME()) + " ---" + CHR(13) + CHR(10), gcLog, 1)
gcCaz = ""
gnPass = 0
gnFail = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
PUBLIC gnPc
gnPc = 2
gnIdUtil = 8
gcNumeProgram = [ROAFACTURARE]
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) + " gnPc=" + TRANSFORM(gnPc) + " gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnPc=" + TRANSFORM(gnPc)
LOCAL lnIdArtProba, lnProcStd, lnCoefStd
lnIdArtProba = 2528841557
lnProcStd = GetProcTvaStandard()
lnCoefStd = ROUND((lnProcStd + 100)/100, 4)
DO AfLog WITH "cota standard " + TRANSFORM(gnLuna) + "/" + TRANSFORM(gnAn) + ": procent=" + TRANSFORM(lnProcStd) + " coeficient=" + TRANSFORM(lnCoefStd)
DO CASE
*=================================================================================================
* Cazul FORM: pagina "Vanzare" - combo cota TVA din vcote_tva, etichete, recalcul
*=================================================================================================
CASE lcMod == "FORM"
* incarcare explicita din calea COMPLETA (tiparul S7a): ofacturare.vcx inainte de
* onom_articole.vcx, ca la instalarea reala
SET PATH TO (gcAppPath + "COMUN\CLASE") ADDITIVE
SET CLASSLIB TO (gcAppPath + "COMUN\CLASE\ofacturare.vcx") ADDITIVE
SET CLASSLIB TO (gcAppPath + "COMUN\CLASE\onom_articole.vcx") ADDITIVE
* precondition-urile pe care le face onomenclatoare.prg inainte sa deschida fisa
update_um()
update_um_iso()
update_grupe_art()
update_subgrupe_art()
gcCaz = "[form-precondition] "
LOCAL lnOk, loRec
lnOk = goExecutor.oExecuta('select * from vnom_articole where id_articol = ' + TRANSFORM(lnIdArtProba), 'vnom_articole_nou')
DO Verdict WITH lnOk # .F. AND USED('vnom_articole_nou') AND RECCOUNT('vnom_articole_nou') = 1, "SELECT vnom_articole pentru articolul de proba"
SELECT vnom_articole_nou
SCATTER NAME loRec MEMO
loRec.conditii_pastrare = NVL(loRec.conditii_pastrare,'')
USE IN vnom_articole_nou
lnOk = SQLEXEC(gnHandle, "select a.proc_tvav, nvl(p.preturi_cu_tva,0) ptva from crm_politici_pret_art a, crm_politici_preturi p where a.id_pol = p.id_pol and a.id_pol = 41 and a.id_articol = " + TRANSFORM(lnIdArtProba), "crsref")
DO Verdict WITH lnOk > 0 AND USED('crsref') AND RECCOUNT('crsref') = 1, "referinta directa proc_tvav / preturi_cu_tva pentru politica 41"
LOCAL llRefProcNull, lnRefPreturiCuTva
llRefProcNull = .F.
lnRefPreturiCuTva = -1
IF USED('crsref') AND RECCOUNT('crsref') = 1
llRefProcNull = ISNULL(crsref.proc_tvav)
lnRefPreturiCuTva = crsref.ptva
ENDIF
IF USED('crsref')
USE IN crsref
ENDIF
DO AfLog WITH " referinta: proc_tvav=" + IIF(llRefProcNull,"NULL",TRANSFORM(lnCoefStd)) + " preturi_cu_tva=" + TRANSFORM(lnRefPreturiCuTva)
DO Verdict WITH llRefProcNull, "preconditie: articolul de proba are PROC_TVAV NULL (cazul 'ales la facturare')"
DO Verdict WITH lnRefPreturiCuTva = 0, "preconditie: politica 41 are PRETURI_CU_TVA = 0 (referinta e pretul fara TVA)"
gcCaz = "[form-createobject] "
PRIVATE poRec, pnIdAMS
poRec = loRec
pnIdAMS = lnIdArtProba
LOCAL loForm, llCrapat, lcErrMsg, lnErrNo
llCrapat = .F.
lcErrMsg = ''
lnErrNo = 0
TRY
loForm = CREATEOBJECT('frm_catalog_articole_nou', loRec, lnIdArtProba, 'UPDATE')
CATCH TO loExc
llCrapat = .T.
lnErrNo = loExc.ErrorNo
lcErrMsg = loExc.Message
DO AfLog WITH " diagnostic exceptie: Procedure=[" + TRANSFORM(loExc.Procedure) + "] LineNo=" + TRANSFORM(loExc.LineNo) + " LineContents=[" + TRANSFORM(loExc.LineContents) + "] Details=[" + TRANSFORM(loExc.Details) + "]"
ENDTRY
DO AfLog WITH " rezultat CREATEOBJECT: llCrapat=" + TRANSFORM(llCrapat) + " errno=" + TRANSFORM(lnErrNo) + " mesaj=[" + lcErrMsg + "]"
DO Verdict WITH !llCrapat AND lnErrNo = 0, "CREATEOBJECT frm_catalog_articole_nou (UPDATE) trece (errno=0)"
IF !llCrapat
LOCAL loCb, lnI, lcLista
gcCaz = "[form-combo-cota] "
DO Verdict WITH loForm._pageframe1.PageCount = 3, "PageCount = 3 (Page3 Vanzare vizibila)"
DO Verdict WITH PEMSTATUS(loForm._pageframe1.Page3,"Cb_tx_proc_tvav",5), "controlul Cb_tx_proc_tvav exista pe Page3"
DO Verdict WITH PEMSTATUS(loForm._pageframe1.Page3,"Clb_tx_proc_tvav",5) = .F., "vechiul Clb_tx_proc_tvav (textbox) nu mai exista"
loCb = loForm._pageframe1.Page3.Cb_tx_proc_tvav._cbbase1
DO Verdict WITH UPPER(ALLTRIM(loCb.BaseClass)) = "COMBOBOX", "Cb_tx_proc_tvav._cbbase1 e ComboBox (obtinut " + ALLTRIM(loCb.BaseClass) + ")"
DO Verdict WITH loCb.RowSourceType = 2, "RowSourceType = 2 alias (obtinut " + TRANSFORM(loCb.RowSourceType) + ")"
DO Verdict WITH UPPER(ALLTRIM(loCb.RowSource)) = "CRS_COTE_TVA", "RowSource = crs_cote_tva (obtinut [" + loCb.RowSource + "])"
DO Verdict WITH USED('crs_cote_tva'), "cursorul crs_cote_tva e deschis"
DO Verdict WITH loCb.ListCount = 5, "ListCount = 5 (4 cote ale lunii + randul 'ales la facturare') (obtinut " + TRANSFORM(loCb.ListCount) + ")"
lcLista = ""
FOR lnI = 1 TO loCb.ListCount
lcLista = lcLista + "[" + ALLTRIM(loCb.List(lnI)) + "]"
ENDFOR
DO AfLog WITH " lista combo: " + lcLista
DO Verdict WITH ALLTRIM(loCb.List(1)) = "21.00", "primul rand afiseaza procentul 21 (obtinut [" + ALLTRIM(loCb.List(1)) + "])"
DO Verdict WITH ALLTRIM(loCb.List(loCb.ListCount)) = "<ALES LA FACTURARE>", "ultimul rand e <ALES LA FACTURARE> (obtinut [" + ALLTRIM(loCb.List(loCb.ListCount)) + "])"
DO Verdict WITH loCb.ListIndex = loCb.ListCount, "ListIndex pe randul 'ales la facturare' (PROC_TVAV NULL) (obtinut " + TRANSFORM(loCb.ListIndex) + ")"
DO Verdict WITH loForm._pageframe1.Page3.Cb_tx_proc_tvav.TabIndex = 3, "TabIndex Cb_tx_proc_tvav = 3"
gcCaz = "[form-date-neatinse] "
DO Verdict WITH ISNULL(loForm.oPretNom.nProcTvav), "nProcTvav a ramas NULL dupa Init (cota din baza nu a fost alterata) (obtinut " + IIF(ISNULL(loForm.oPretNom.nProcTvav),"NULL",TRANSFORM(loForm.oPretNom.nProcTvav)) + ")"
DO Verdict WITH loForm.oPretNom.lPreturiCuTva = .F., "lPreturiCuTva = .F. (politica 41)"
gcCaz = "[form-etichete] "
DO Verdict WITH loForm._pageframe1.Page3.Clb_tx_cont_dedus.Lb_simplu1.Caption = "Cont venit articol", "eticheta contului de venit = 'Cont venit articol' (obtinut [" + loForm._pageframe1.Page3.Clb_tx_cont_dedus.Lb_simplu1.Caption + "])"
DO Verdict WITH loForm._pageframe1.Page3.Clb_tx_pret_ftva.Lb_simplu1.Caption = "Pret fara TVA (pret lista)", "eticheta pretului de referinta = 'Pret fara TVA (pret lista)' (obtinut [" + loForm._pageframe1.Page3.Clb_tx_pret_ftva.Lb_simplu1.Caption + "])"
DO Verdict WITH loForm._pageframe1.Page3.Clb_tx_pret_ftva.Lb_simplu1.FontBold, "eticheta pretului de referinta e FontBold"
DO Verdict WITH loForm._pageframe1.Page3.Clb_tx_pret_ctva.Lb_simplu1.Caption = "Pret cu TVA", "eticheta celuilalt pret = 'Pret cu TVA' (obtinut [" + loForm._pageframe1.Page3.Clb_tx_pret_ctva.Lb_simplu1.Caption + "])"
DO Verdict WITH !loForm._pageframe1.Page3.Clb_tx_pret_ctva.Lb_simplu1.FontBold, "eticheta celuilalt pret NU e FontBold"
DO Verdict WITH PEMSTATUS(loForm._pageframe1.Page3,"Lb_info_conturi",5), "controlul Lb_info_conturi exista pe Page3"
DO Verdict WITH loForm._pageframe1.Page3.Lb_info_conturi.Caption = "Necompletate: debit 4111, credit contul de venit al articolului", "textul informativ al conturilor (obtinut [" + loForm._pageframe1.Page3.Lb_info_conturi.Caption + "])"
gcCaz = "[form-interactive-change] "
SELECT crs_cote_tva
LOCATE FOR !ISNULL(proc_tva) AND proc_tva = lnCoefStd
DO Verdict WITH FOUND(), "randul cotei standard (" + TRANSFORM(lnCoefStd) + ") gasit in crs_cote_tva"
loCb.ListIndex = RECNO()
loForm.oPretNom.nPretFtva = 100
loForm.oPretNom.nPretCtva = 0
loCb.InteractiveChange()
DO Verdict WITH ROUND(NVL(loForm.oPretNom.nProcTvav,0),4) = lnCoefStd, "InteractiveChange a scris coeficientul " + TRANSFORM(lnCoefStd) + " in nProcTvav (obtinut " + TRANSFORM(loForm.oPretNom.nProcTvav) + ")"
DO Verdict WITH ROUND(loForm.oPretNom.nPretCtva,2) = ROUND(100 * lnCoefStd,2), "pretul derivat recalculat de combo: 100 fara TVA -> " + TRANSFORM(ROUND(100 * lnCoefStd,2)) + " cu TVA (obtinut " + TRANSFORM(loForm.oPretNom.nPretCtva) + ")"
gcCaz = "[form-recalcul] "
loForm.oPretNom.nProcTvav = .NULL.
DO Verdict WITH loForm.oPretNom.recalculeaza_pret(100, .T.) = ROUND(100 * lnCoefStd, gnPc), "recalculeaza_pret cu cota lipsa (NULL) foloseste cota standard a lunii: 100 -> " + TRANSFORM(ROUND(100 * lnCoefStd, gnPc)) + " (obtinut " + TRANSFORM(loForm.oPretNom.recalculeaza_pret(100, .T.)) + ")"
loForm.oPretNom.nProcTvav = 1.21
DO Verdict WITH loForm.oPretNom.recalculeaza_pret(100, .T.) = 121, "recalculeaza_pret(100,.T.) cu coeficientul 1.21 = 121 (obtinut " + TRANSFORM(loForm.oPretNom.recalculeaza_pret(100, .T.)) + ")"
DO Verdict WITH loForm.oPretNom.recalculeaza_pret(121, .F.) = 100, "recalculeaza_pret(121,.F.) = 100 (reciproc, obtinut " + TRANSFORM(loForm.oPretNom.recalculeaza_pret(121, .F.)) + ")"
RELEASE loForm
ENDIF
*=================================================================================================
* Cazul NOMEN: clasa cus_pret_nomenclator - cota standard pe articol nou, PROC_TVAV NULL salvat
*=================================================================================================
CASE lcMod == "NOMEN"
gcCaz = "[nomen-articol-nou] "
LOCAL loPN
loPN = CREATEOBJECT('cus_pret_nomenclator')
DO Verdict WITH VARTYPE(loPN) = "O", "cus_pret_nomenclator instantiat"
DO Verdict WITH loPN.incarca(0), "incarca(0) (articol nou) = .T."
DO Verdict WITH !ISNULL(loPN.nProcTvav) AND ROUND(loPN.nProcTvav,4) = lnCoefStd, "articol nou: nProcTvav = coeficientul standard " + TRANSFORM(lnCoefStd) + " (obtinut " + TRANSFORM(loPN.nProcTvav) + ")"
DO Verdict WITH loPN.nPretFtva = 0 AND loPN.nPretCtva = 0, "articol nou: preturile pornesc de la 0"
DO Verdict WITH loPN.recalculeaza_pret(100, .T.) = ROUND(100 * lnCoefStd, gnPc), "articol nou: 100 fara TVA -> " + TRANSFORM(ROUND(100 * lnCoefStd, gnPc)) + " cu TVA"
DO Verdict WITH loPN.recalculeaza_pret(ROUND(100 * lnCoefStd, gnPc), .F.) = 100, "articol nou: revenire la 100 fara TVA (reciproc)"
gcCaz = "[nomen-articol-existent-null] "
LOCAL loPE
loPE = CREATEOBJECT('cus_pret_nomenclator')
DO Verdict WITH loPE.incarca(lnIdArtProba), "incarca(" + TRANSFORM(lnIdArtProba) + ") = .T."
DO Verdict WITH ISNULL(loPE.nProcTvav), "articol existent cu PROC_TVAV NULL: nProcTvav ramane NULL (obtinut " + IIF(ISNULL(loPE.nProcTvav),"NULL",TRANSFORM(loPE.nProcTvav)) + ")"
DO Verdict WITH loPE.lPreturiCuTva = .F., "lPreturiCuTva = .F. pentru politica 41"
DO Verdict WITH loPE.recalculeaza_pret(100, .T.) = ROUND(100 * lnCoefStd, gnPc), "cota lipsa: recalculeaza_pret foloseste cota standard (100 -> " + TRANSFORM(ROUND(100 * lnCoefStd, gnPc)) + ") (obtinut " + TRANSFORM(loPE.recalculeaza_pret(100, .T.)) + ")"
gcCaz = "[nomen-salvare-proc-tvav-null] "
LOCAL lnTransOrig, lnOk2
lnTransOrig = SQLGETPROP(gnHandle, "Transactions")
SQLSETPROP(gnHandle, "Transactions", 2)
loPE.nPretFtva = 50
loPE.nPretCtva = 60.5
DO Verdict WITH ISNULL(loPE.nProcTvav), "preconditie: nProcTvav e NULL inainte de salveaza()"
DO Verdict WITH loPE.salveaza(lnIdArtProba), "salveaza() = .T. cu PROC_TVAV NULL"
lnOk2 = SQLEXEC(gnHandle, "select proc_tvav, pretftva, pretctva from crm_politici_pret_art where id_pol = 41 and id_articol = " + TRANSFORM(lnIdArtProba), "crsnull")
DO Verdict WITH lnOk2 > 0 AND USED('crsnull') AND RECCOUNT('crsnull') = 1, "randul din crm_politici_pret_art citit in tranzactie"
IF USED('crsnull') AND RECCOUNT('crsnull') = 1
DO Verdict WITH ISNULL(crsnull.proc_tvav), "Oracle: PROC_TVAV a ramas NULL dupa salvare"
DO Verdict WITH ROUND(crsnull.pretftva,2) = 50, "Oracle: PRETFTVA = 50 (obtinut " + TRANSFORM(crsnull.pretftva) + ")"
DO Verdict WITH ROUND(crsnull.pretctva,2) = 60.5, "Oracle: PRETCTVA = 60.5 (obtinut " + TRANSFORM(crsnull.pretctva) + ")"
ENDIF
IF USED('crsnull')
USE IN crsnull
ENDIF
lnOk2 = SQLEXEC(gnHandle, "ROLLBACK")
SQLSETPROP(gnHandle, "Transactions", lnTransOrig)
DO Verdict WITH lnOk2 > 0, "ROLLBACK dupa verificare (datele de proba nu raman)"
ENDCASE
DO Final
PROCEDURE Verdict
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
LOCAL lnOk
gcCaz = "[final] "
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
lnOk = SQLEXEC(gnHandle, "ROLLBACK")
DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk) + " (plasa de siguranta)"
ENDIF
DO AfLog WITH "PARTIAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,23 @@
* s6c4_compile.prg
* Compilare headless onom_articole.vcx dupa garda NULL la INSERT (id_tara_origine).
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
lcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\s6c4_compile.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b")
MD "D:\ROA\ROAFACTURARE\docs\loguri_12b"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog)
ON ERROR DO CErr WITH ERROR(), MESSAGE(), LINENO()
SET DEFAULT TO "D:\ROA\ROAFACTURARE\COMUN\clase"
COMPILE CLASSLIB onom_articole.vcx
STRTOFILE("COMPILE OK" + CHR(13) + CHR(10), lcLog, 1)
STRTOFILE("END " + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog, 1)
QUIT
PROCEDURE CErr
LPARAMETERS tnErr, tcMsg, tnLine
STRTOFILE("COMPILE FAIL " + TRANSFORM(tnErr) + " " + tcMsg + " line=" + TRANSFORM(tnLine) + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -0,0 +1,35 @@
* s7b2_compile.prg - plan #12b, S7b-2: COMPILE CLASSLIB headless pe ofacturare.vcx dupa
* write-back-ul textului (nota implicita a politicii de stoc in optiuni). Fara Oracle -
* COMPILE CLASSLIB nu are nevoie de conexiune, doar verifica sintaxa claselor.
*
* Rulare: powershell -ExecutionPolicy Bypass -File ruleaza_suita.ps1 -Nume s7b2_compile
* Log: out\s7b2_compile.log (copiat apoi in docs\loguri_12b\s7b2_compile.log)
SET SAFETY OFF
SET TALK OFF
CLOSE DATABASES
PUBLIC gcLog, gcVcx
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\s7b2_compile.log"
gcVcx = "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
ON ERROR DO s7b2_err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
COMPILE CLASSLIB (gcVcx)
IF FILE(STRTRAN(gcVcx, ".vcx", ".err"))
STRTOFILE("COMPILE ESEC" + CHR(13) + CHR(10), gcLog, 1)
STRTOFILE(FILETOSTR(STRTRAN(gcVcx, ".vcx", ".err")), gcLog, 1)
ELSE
STRTOFILE("COMPILE OK" + CHR(13) + CHR(10), gcLog, 1)
ENDIF
QUIT
PROCEDURE s7b2_err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE("EROARE " + TRANSFORM(tnErr) + " " + tcMsg + " in " + tcProg + " linia " + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcLog, 1)
QUIT
ENDPROC

View File

@@ -0,0 +1,40 @@
* s8_3_compile.prg - plan #12b, S8-3: COMPILE CLASSLIB headless pe ofacturare.vcx dupa
* write-back-ul verificarii de cont de venit pe cele trei cai de adaugare a liniei.
* Fara Oracle - COMPILE CLASSLIB nu are nevoie de conexiune, doar verifica sintaxa claselor.
*
* Rulare: vfp9.exe -A -T s8_3_compile.prg
* Log: out\s8_3_compile.log
SET SAFETY OFF
SET TALK OFF
SET TABLEPROMPT OFF
CLOSE DATABASES
PUBLIC gcLog, gcVcx
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\s8_3_compile.log"
gcVcx = "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
ON ERROR DO s8_3_err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
IF FILE(STRTRAN(gcVcx, ".vcx", ".err"))
DELETE FILE (STRTRAN(gcVcx, ".vcx", ".err"))
ENDIF
COMPILE CLASSLIB (gcVcx)
IF FILE(STRTRAN(gcVcx, ".vcx", ".err"))
STRTOFILE("COMPILE ESEC" + CHR(13) + CHR(10), gcLog, 1)
STRTOFILE(FILETOSTR(STRTRAN(gcVcx, ".vcx", ".err")), gcLog, 1)
ELSE
STRTOFILE("COMPILE OK" + CHR(13) + CHR(10), gcLog, 1)
ENDIF
QUIT
PROCEDURE s8_3_err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE("EROARE " + TRANSFORM(tnErr) + " " + tcMsg + " in " + tcProg + " linia " + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcLog, 1)
QUIT
ENDPROC

View File

@@ -0,0 +1,23 @@
* s8_4a_compile.prg
* Compilare headless ofacturare.vcx dupa write-back S8-4a (toArticol.Id_Pol in do_adauga_articol_cautat).
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
lcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\s8_4a_compile.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b")
MD "D:\ROA\ROAFACTURARE\docs\loguri_12b"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog)
ON ERROR DO CErr WITH ERROR(), MESSAGE(), LINENO()
SET DEFAULT TO "D:\ROA\ROAFACTURARE\COMUN\clase"
COMPILE CLASSLIB ofacturare.vcx
STRTOFILE("COMPILE OK" + CHR(13) + CHR(10), lcLog, 1)
STRTOFILE("END " + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog, 1)
QUIT
PROCEDURE CErr
LPARAMETERS tnErr, tcMsg, tnLine
STRTOFILE("COMPILE FAIL " + TRANSFORM(tnErr) + " " + tcMsg + " line=" + TRANSFORM(tnLine) + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -0,0 +1,57 @@
* vanzare_ui_compile.prg
* Compilare headless a fisierelor atinse de pagina "Vanzare" din fisa articolului: class library
* onom_articole.vcx (clasa frm_catalog_articole_nou, combo cota TVA) si programul
* ofacturare_comun.prg (clasa cus_pret_nomenclator). Fara Oracle - verifica doar sintaxa.
*
* Rulare: powershell -ExecutionPolicy Bypass -File ruleaza_suita.ps1 -Nume vanzare_ui_compile
* Log: out\vanzare_ui_compile.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
PUBLIC gcLog, gcCaz, lnErori
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\vanzare_ui_compile.log"
gcCaz = ""
lnErori = 0
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
ON ERROR DO CErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO Compileaza WITH "D:\ROA\ROAFACTURARE\COMUN\clase", "onom_articole.vcx"
DO Compileaza WITH "D:\ROA\ROAFACTURARE\COMUN\programe", "ofacturare_comun.prg"
STRTOFILE("REZULTAT erori=" + TRANSFORM(lnErori) + CHR(13) + CHR(10), gcLog, 1)
STRTOFILE("END " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog, 1)
QUIT
PROCEDURE Compileaza
LPARAMETERS tcDir, tcFisier
LOCAL lcCale, lcErr
lcCale = ADDBS(tcDir) + tcFisier
lcErr = STRTRAN(lcCale, ".vcx", ".err")
lcErr = STRTRAN(lcErr, ".prg", ".err")
IF FILE(lcErr)
DELETE FILE (lcErr)
ENDIF
SET DEFAULT TO (tcDir)
IF UPPER(JUSTEXT(tcFisier)) = "VCX"
COMPILE CLASSLIB (tcFisier)
ELSE
COMPILE (tcFisier)
ENDIF
IF FILE(lcErr)
lnErori = lnErori + 1
STRTOFILE("COMPILE ESEC " + tcFisier + CHR(13) + CHR(10), gcLog, 1)
STRTOFILE(FILETOSTR(lcErr), gcLog, 1)
ELSE
STRTOFILE("COMPILE OK " + tcFisier + CHR(13) + CHR(10), gcLog, 1)
ENDIF
ENDPROC
PROCEDURE CErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
lnErori = lnErori + 1
STRTOFILE("EROARE " + TRANSFORM(tnErr) + " " + tcMsg + " in " + tcProg + " linia " + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcLog, 1)
ENDPROC