storno eFactura: forma rearanjata (butoane jos, meniu Trimite, stare pe un rand, redimensionabila), sume vizibile in grid (V(250)), fara SET STEP ON in borderou; e2e adaptat (mock xmenu)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WsxyCHJYL6W9MZ6FPnH8ax
This commit is contained in:
2026-09-18 23:18:30 +03:00
parent 4eae0bd4a6
commit a682e7985b
3 changed files with 212 additions and 120 deletions

View File

@@ -6000,7 +6000,7 @@ DEFINE CLASS anaf_efactura AS _frmbase OF "_frm_base.vcx"
lcAvertizare = m.lcAvertizare + 'Documentul original e nota de credit / are total negativ - stornarea va produce valori pozitive.' + Chr(13) + Chr(10) lcAvertizare = m.lcAvertizare + 'Documentul original e nota de credit / are total negativ - stornarea va produce valori pozitive.' + Chr(13) + Chr(10)
ENDIF ENDIF
CREATE CURSOR crsStornoDetalii (element C(60), original C(250), nou C(250), tip N(1)) CREATE CURSOR crsStornoDetalii (element C(60), original V(250), nou V(250), tip N(1))
loForma = NEWOBJECT('frm_storno_efactura', 'anaf_efactura.vcx', '', ; loForma = NEWOBJECT('frm_storno_efactura', 'anaf_efactura.vcx', '', ;
Thisform.oAnaf.AnafeFacturaServer, m.lnId, m.lcXmlOriginal, m.lcNumarOriginal, m.ldIssueDate, ; Thisform.oAnaf.AnafeFacturaServer, m.lnId, m.lcXmlOriginal, m.lcNumarOriginal, m.ldIssueDate, ;
@@ -6557,7 +6557,6 @@ DEFINE CLASS anaf_efactura AS _frmbase OF "_frm_base.vcx"
If !Empty(m.lnOptiune) If !Empty(m.lnOptiune)
plFaraValidareEFactura = (m.lnOptiune = 2) plFaraValidareEFactura = (m.lnOptiune = 2)
llNuTrimiteEFacturaANAF = (m.lnOptiune = 3) llNuTrimiteEFacturaANAF = (m.lnOptiune = 3)
SET STEP ON
llSucces = Thisform.oAnaf.TrimiteFacturi(m.llNuTrimiteEFacturaANAF) llSucces = Thisform.oAnaf.TrimiteFacturi(m.llNuTrimiteEFacturaANAF)
Thisform.pgfeFactura.page1.grdFacturiEmise.Refresh() Thisform.pgfeFactura.page1.grdFacturiEmise.Refresh()
Endif Endif
@@ -15509,7 +15508,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder *-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="But_renunt1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="But_renunt1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblAntet" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblClient" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblNumar" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblNumar" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="txtNumar" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="txtNumar" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblMotiv" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblMotiv" UniqueID="" Timestamp="" />
@@ -15523,8 +15522,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="grdModificari.cNou.Header1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="grdModificari.cNou.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grdModificari.cNou.Text1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="grdModificari.cNou.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblStare" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblStare" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="edtStatus" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="cmdGenereaza" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdValideaza" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdPdf" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="cmdPdf" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdTrimite" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="cmdTrimite" UniqueID="" Timestamp="" />
@@ -15533,6 +15531,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
*m: regenereazaxml *m: regenereazaxml
*m: setstare *m: setstare
*m: umplegrid *m: umplegrid
*m: valideaza
*p: pcciffirma *p: pcciffirma
*p: pcclient *p: pcclient
*p: pcfisierstorno *p: pcfisierstorno
@@ -15551,18 +15550,20 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
*</DefinedPropArrayMethod> *</DefinedPropArrayMethod>
*<PropValue> *<PropValue>
BorderStyle = 1 BorderStyle = 3
DoCreate = .T. DoCreate = .T.
Height = 560 Height = 480
MinHeight = 480
MinWidth = 760
Name = "frm_storno_efactura" Name = "frm_storno_efactura"
pcciffirma = '' pcciffirma =
pcclient = '' pcclient =
pcfisierstorno = '' pcfisierstorno =
pcmoneda = '' pcmoneda =
pcmotiv = '' pcmotiv =
pcnumarnou = '' pcnumarnou =
pcnumaroriginal = '' pcnumaroriginal =
pcxmloriginal = '' pcxmloriginal =
pddataoriginal = {} pddataoriginal = {}
plb2c = .F. plb2c = .F.
pltest = .F. pltest = .F.
@@ -15591,15 +15592,19 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
<memberdata name="regenereazaxml" display="RegenereazaXml"/> <memberdata name="regenereazaxml" display="RegenereazaXml"/>
<memberdata name="setstare" display="SetStare"/> <memberdata name="setstare" display="SetStare"/>
<memberdata name="umplegrid" display="UmpleGrid"/> <memberdata name="umplegrid" display="UmpleGrid"/>
<memberdata name="valideaza" display="Valideaza"/>
</VFPData> </VFPData>
_shape1.Anchor = 10
_shape1.Height = 29 _shape1.Height = 29
_shape1.Left = 0 _shape1.Left = 0
_shape1.Name = "_shape1" _shape1.Name = "_shape1"
_shape1.Top = 0 _shape1.Top = 0
_shape1.Width = 760 _shape1.Width = 760
_shape2.Anchor = 9
_shape2.Left = 701 _shape2.Left = 701
_shape2.Name = "_shape2" _shape2.Name = "_shape2"
_shape2.Top = 0 _shape2.Top = 0
Lb_titlu_alb_b121.Anchor = 3
Lb_titlu_alb_b121.Caption = "Stornare eFactura" Lb_titlu_alb_b121.Caption = "Stornare eFactura"
Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121" Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121"
BUT_TERMIN1.Name = "BUT_TERMIN1" BUT_TERMIN1.Name = "BUT_TERMIN1"
@@ -15614,78 +15619,73 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
Top = 2 Top = 2
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'cmdGenereaza' AS cmd_executa WITH ;
Anchor = 6, ;
Caption = "\<Genereaza XML", ;
Height = 30, ;
Left = 12, ;
Name = "cmdGenereaza", ;
TabIndex = 4, ;
Top = 438, ;
Width = 140
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'cmdPdf' AS cmd_executa WITH ; ADD OBJECT 'cmdPdf' AS cmd_executa WITH ;
Anchor = 6, ;
Caption = "\<PDF ANAF", ; Caption = "\<PDF ANAF", ;
Height = 30, ; Height = 30, ;
Left = 160, ; Left = 160, ;
Name = "cmdPdf", ; Name = "cmdPdf", ;
TabIndex = 4, ; TabIndex = 5, ;
Top = 512, ; Top = 438, ;
Width = 140 Width = 140
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'cmdTrimite' AS cmd_executa WITH ; ADD OBJECT 'cmdTrimite' AS cmd_executa WITH ;
Anchor = 12, ;
Caption = "\<Trimite la ANAF", ; Caption = "\<Trimite la ANAF", ;
FontBold = .T., ; FontBold = .T., ;
ForeColor = 0,128,0, ; ForeColor = 0,128,0, ;
Height = 30, ; Height = 30, ;
Left = 588, ; Left = 568, ;
Name = "cmdTrimite", ; Name = "cmdTrimite", ;
TabIndex = 5, ; TabIndex = 6, ;
Top = 512, ; Top = 438, ;
Width = 160 Width = 180
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'cmdValideaza' AS cmd_executa WITH ;
Caption = "\<Valideaza", ;
Height = 30, ;
Left = 12, ;
Name = "cmdValideaza", ;
TabIndex = 3, ;
Top = 512, ;
Width = 140
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'edtStatus' AS _editbox WITH ;
Height = 50, ;
Left = 220, ;
Name = "edtStatus", ;
ReadOnly = .T., ;
Top = 448, ;
Width = 528
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="editbox" />
ADD OBJECT 'grdModificari' AS _grdbase WITH ; ADD OBJECT 'grdModificari' AS _grdbase WITH ;
Anchor = 15, ;
ColumnCount = 3, ; ColumnCount = 3, ;
DeleteMark = .F., ; DeleteMark = .F., ;
FontSize = 10, ; FontSize = 10, ;
Height = 280, ; Height = 252, ;
Left = 12, ; Left = 12, ;
Name = "grdModificari", ; Name = "grdModificari", ;
Panel = 1, ; Panel = 1, ;
ReadOnly = .T., ; ReadOnly = .T., ;
RecordSource = "crsStornoDetalii", ; RecordSource = "crsStornoDetalii", ;
RowHeight = 19, ; RowHeight = 19, ;
TabIndex = 6, ; TabIndex = 3, ;
Top = 164, ; Top = 134, ;
Width = 736, ; Width = 736, ;
Column1.ControlSource = "crsStornoDetalii.element", ; Column1.ControlSource = "crsStornoDetalii.element", ;
Column1.FontSize = 10, ; Column1.FontSize = 10, ;
Column1.Name = "cElement", ; Column1.Name = "cElement", ;
Column1.ReadOnly = .T., ; Column1.ReadOnly = .T., ;
Column1.Width = 300, ; Column1.Width = 330, ;
Column2.Alignment = 1, ; Column2.Alignment = 1, ;
Column2.ControlSource = "crsStornoDetalii.original", ; Column2.ControlSource = "crsStornoDetalii.original", ;
Column2.FontSize = 10, ; Column2.FontSize = 10, ;
Column2.Name = "cOriginal", ; Column2.Name = "cOriginal", ;
Column2.ReadOnly = .T., ; Column2.ReadOnly = .T., ;
Column2.Width = 200, ; Column2.Width = 180, ;
Column3.Alignment = 1, ; Column3.Alignment = 1, ;
Column3.ControlSource = "crsStornoDetalii.nou", ; Column3.ControlSource = "crsStornoDetalii.nou", ;
Column3.FontSize = 10, ; Column3.FontSize = 10, ;
Column3.Name = "cNou", ; Column3.Name = "cNou", ;
Column3.ReadOnly = .T., ; Column3.ReadOnly = .T., ;
Column3.Width = 200 Column3.Width = 180
*< END OBJECT: ClassLib="_grd_base.vcx" BaseClass="grid" /> *< END OBJECT: ClassLib="_grd_base.vcx" BaseClass="grid" />
ADD OBJECT 'grdModificari.cElement.Header1' AS header WITH ; ADD OBJECT 'grdModificari.cElement.Header1' AS header WITH ;
@@ -15743,84 +15743,88 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
SelectedBackColor = 100,185,255 SelectedBackColor = 100,185,255
*< END OBJECT: BaseClass="textbox" /> *< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'lblAntet' AS _label WITH ;
AutoSize = .F., ;
Caption = "", ;
Height = 46, ;
Left = 12, ;
Name = "lblAntet", ;
Top = 38, ;
Width = 736, ;
WordWrap = .T.
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'lblAvertisment' AS _label WITH ; ADD OBJECT 'lblAvertisment' AS _label WITH ;
Anchor = 11, ;
AutoSize = .F., ; AutoSize = .F., ;
Caption = "", ; Caption = "", ;
ForeColor = 192,0,0, ; ForeColor = 192,0,0, ;
Height = 40, ; Height = 36, ;
Left = 12, ; Left = 12, ;
Name = "lblAvertisment", ; Name = "lblAvertisment", ;
Top = 118, ; Top = 90, ;
Width = 736, ; Width = 736, ;
WordWrap = .T. WordWrap = .T.
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'lblClient' AS _label WITH ;
Anchor = 1, ;
AutoSize = .F., ;
Caption = "", ;
Height = 18, ;
Left = 12, ;
Name = "lblClient", ;
Top = 34, ;
Width = 736
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'lblMotiv' AS _label WITH ; ADD OBJECT 'lblMotiv' AS _label WITH ;
Anchor = 1, ;
Caption = "Motiv (optional):", ; Caption = "Motiv (optional):", ;
Left = 270, ; Left = 270, ;
Name = "lblMotiv", ; Name = "lblMotiv", ;
Top = 90 Top = 62
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'lblNumar' AS _label WITH ; ADD OBJECT 'lblNumar' AS _label WITH ;
Anchor = 1, ;
Caption = "Numar storno:", ; Caption = "Numar storno:", ;
Left = 12, ; Left = 12, ;
Name = "lblNumar", ; Name = "lblNumar", ;
Top = 90 Top = 62
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'lblStare' AS _label WITH ; ADD OBJECT 'lblStare' AS _label WITH ;
Anchor = 14, ;
AutoSize = .F., ;
Caption = "Nevalidat", ; Caption = "Nevalidat", ;
FontBold = .T., ; FontBold = .T., ;
ForeColor = 96,96,96, ;
Height = 34, ;
Left = 12, ; Left = 12, ;
Name = "lblStare", ; Name = "lblStare", ;
Top = 452, ; Top = 396, ;
Width = 200 Width = 736, ;
WordWrap = .T.
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'txtMotiv' AS _textbox WITH ; ADD OBJECT 'txtMotiv' AS _textbox WITH ;
Anchor = 11, ;
ControlSource = "Thisform.pcmotiv", ; ControlSource = "Thisform.pcmotiv", ;
Format = "!K", ;
Height = 23, ; Height = 23, ;
Left = 375, ; Left = 375, ;
MaxLength = 200, ; MaxLength = 200, ;
Name = "txtMotiv", ; Name = "txtMotiv", ;
TabIndex = 2, ; TabIndex = 2, ;
Top = 87, ; Top = 59, ;
Width = 373 Width = 373
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'txtNumar' AS _textbox WITH ; ADD OBJECT 'txtNumar' AS _textbox WITH ;
Anchor = 1, ;
ControlSource = "Thisform.pcnumarnou", ; ControlSource = "Thisform.pcnumarnou", ;
Format = "!K", ;
Height = 23, ; Height = 23, ;
Left = 105, ; Left = 105, ;
Name = "txtNumar", ; Name = "txtNumar", ;
TabIndex = 1, ; TabIndex = 1, ;
Top = 87, ; Top = 59, ;
Width = 150 Width = 150
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
PROCEDURE Activate
DODEFAULT()
TRY
This.cmdValideaza.SetFocus()
CATCH
ENDTRY
ENDPROC
PROCEDURE EnableButoane PROCEDURE EnableButoane
LPARAMETERS tlEnable LPARAMETERS tlEnable
This.cmdValideaza.Enabled = m.tlEnable This.cmdGenereaza.Enabled = m.tlEnable
This.cmdPdf.Enabled = m.tlEnable This.cmdPdf.Enabled = m.tlEnable
This.cmdTrimite.Enabled = m.tlEnable This.cmdTrimite.Enabled = m.tlEnable
This.txtNumar.Enabled = m.tlEnable This.txtNumar.Enabled = m.tlEnable
@@ -15832,6 +15836,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
LPARAMETERS toAnaf, tnIdEfactura, tcXmlOriginal, tcNumarOriginal, tdDataOriginal, ; LPARAMETERS toAnaf, tnIdEfactura, tcXmlOriginal, tcNumarOriginal, tdDataOriginal, ;
tcClient, tcCifFirma, tnTotal, tcMoneda, tlTest, tlB2C, tcFisierStorno, tcNumarNou, ; tcClient, tcCifFirma, tnTotal, tcMoneda, tlTest, tlB2C, tcFisierStorno, tcNumarNou, ;
tcAvertizare tcAvertizare
DODEFAULT()
This.poAnaf = toAnaf This.poAnaf = toAnaf
This.pnIdEfactura = tnIdEfactura This.pnIdEfactura = tnIdEfactura
@@ -15849,8 +15854,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
This.Caption = 'Stornare eFactura ' + m.tcNumarOriginal + ' - ' + IIF(m.tlTest, 'TEST', 'PRODUCTIE') This.Caption = 'Stornare eFactura ' + m.tcNumarOriginal + ' - ' + IIF(m.tlTest, 'TEST', 'PRODUCTIE')
This.Lb_titlu_alb_b121.Caption = This.Caption This.Lb_titlu_alb_b121.Caption = This.Caption
This.lblAntet.Caption = 'Factura ' + m.tcNumarOriginal + ' din ' + Dtoc(m.tdDataOriginal) + ' -> Storno' + Chr(13) + Chr(10) + ; This.lblClient.Caption = 'Client: ' + m.tcClient + ' CIF: ' + m.tcCifFirma + ' Moneda: ' + m.tcMoneda
'Client: ' + m.tcClient + ' CIF firma: ' + m.tcCifFirma + ' Moneda: ' + m.tcMoneda
This.lblAvertisment.Caption = m.tcAvertizare This.lblAvertisment.Caption = m.tcAvertizare
This.grdModificari.SetAll("DynamicFontBold", "tip = 2", "Column") This.grdModificari.SetAll("DynamicFontBold", "tip = 2", "Column")
@@ -15870,8 +15874,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
llSucces = StornoEFacturaXML(This.pcXmlOriginal, m.lcNumarNou, m.lcNotaFinal, This.pcFisierStorno, @laModif, @lcMesaj) llSucces = StornoEFacturaXML(This.pcXmlOriginal, m.lcNumarNou, m.lcNotaFinal, This.pcFisierStorno, @laModif, @lcMesaj)
IF !m.llSucces IF !m.llSucces
This.edtStatus.Value = 'Eroare la regenerare: ' + m.lcMesaj This.SetStare(0, 'Eroare la regenerare: ' + m.lcMesaj)
This.SetStare(0)
RETURN .F. RETURN .F.
ENDIF ENDIF
This.UmpleGrid(@laModif) This.UmpleGrid(@laModif)
@@ -15879,27 +15882,32 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
ENDPROC ENDPROC
PROCEDURE SetStare PROCEDURE SetStare
LPARAMETERS tnStare LPARAMETERS tnStare, tcMesaj
IF PCOUNT() < 2
tcMesaj = ''
ENDIF
This.pnStare = m.tnStare This.pnStare = m.tnStare
This.cmdPdf.Enabled = .T. This.cmdPdf.Enabled = .T.
This.lblStare.ToolTipText = m.tcMesaj
DO CASE DO CASE
CASE m.tnStare = 2 CASE m.tnStare = 2
* trimis - stare terminala (D26/D35) * trimis - stare terminala (D26/D35)
This.lblStare.Caption = 'Trimis' This.lblStare.Caption = IIF(Empty(m.tcMesaj), 'Trimis', m.tcMesaj)
This.cmdValideaza.Enabled = .F. This.lblStare.ForeColor = RGB(0,64,160)
This.cmdTrimite.Enabled = .F. This.cmdTrimite.Enabled = .F.
This.txtNumar.Enabled = .F. This.txtNumar.Enabled = .F.
This.txtMotiv.Enabled = .F. This.txtMotiv.Enabled = .F.
CASE m.tnStare = 1 CASE m.tnStare = 1
This.lblStare.Caption = 'Valid' This.lblStare.Caption = IIF(Empty(m.tcMesaj), 'Valid', m.tcMesaj)
This.cmdValideaza.Enabled = .T. This.lblStare.ForeColor = RGB(0,128,0)
This.cmdTrimite.Enabled = .T. This.cmdTrimite.Enabled = .T.
This.txtNumar.Enabled = .T. This.txtNumar.Enabled = .T.
This.txtMotiv.Enabled = .T. This.txtMotiv.Enabled = .T.
OTHERWISE OTHERWISE
This.lblStare.Caption = 'Nevalidat' * mesaj gol = nevalidat (gri), mesaj dat = eroare de validare/regenerare (rosu)
This.cmdValideaza.Enabled = .T. This.lblStare.Caption = IIF(Empty(m.tcMesaj), 'Nevalidat', m.tcMesaj)
This.cmdTrimite.Enabled = .F. This.lblStare.ForeColor = IIF(Empty(m.tcMesaj), RGB(96,96,96), RGB(192,0,0))
This.cmdTrimite.Enabled = .T.
This.txtNumar.Enabled = .T. This.txtNumar.Enabled = .T.
This.txtMotiv.Enabled = .T. This.txtMotiv.Enabled = .T.
ENDCASE ENDCASE
@@ -15919,6 +15927,34 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
This.grdModificari.Refresh() This.grdModificari.Refresh()
ENDPROC ENDPROC
PROCEDURE Valideaza
LOCAL llValid, lcMesajValid, loSrv, loExport
IF !This.RegenereazaXml()
RETURN .F.
ENDIF
loSrv = This.poAnaf
This.EnableButoane(.F.)
WAIT WINDOW 'Se valideaza...' NOWAIT
loSrv.RefreshTokenAuto()
loExport = CREATEOBJECT('ExportEFactura', .T., loSrv.cToken)
llValid = m.loExport.ValidareEFacturaANAF(This.pcFisierStorno, @lcMesajValid)
CLEAR TYPEAHEAD
WAIT CLEAR
This.EnableButoane(.T.)
IF m.llValid
This.SetStare(1)
ELSE
This.SetStare(0, IIF(Empty(m.lcMesajValid), 'Validare indisponibila - verificati tokenul/reteaua.', 'Invalid: ' + m.lcMesajValid))
ENDIF
RETURN m.llValid
ENDPROC
PROCEDURE cmdGenereaza.Click
IF Thisform.RegenereazaXml()
Thisform.SetStare(0, 'XML regenerat.')
ENDIF
ENDPROC
PROCEDURE cmdPdf.Click PROCEDURE cmdPdf.Click
LOCAL lcXmlCurent, lcFisierPdf LOCAL lcXmlCurent, lcFisierPdf
lcXmlCurent = Filetostr(Thisform.pcFisierStorno) lcXmlCurent = Filetostr(Thisform.pcFisierStorno)
@@ -15930,10 +15966,27 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
ENDPROC ENDPROC
PROCEDURE cmdTrimite.Click PROCEDURE cmdTrimite.Click
LOCAL lcMesajConf, loReturn, lcDirProcesat, lcFisierProcesat LOCAL lcMesajConf, loReturn, lcDirProcesat, lcFisierProcesat, lnOptiune
IF Thisform.pnStare <> 1 IF Thisform.pnStare = 2
RETURN RETURN
ENDIF ENDIF
lnOptiune = xmenu('\<Valideaza online si Trimite la ANAF;\<Trimite la ANAF fara validare;\<Doar valideaza online')
DO CASE
CASE m.lnOptiune = 1
IF !Thisform.Valideaza()
RETURN
ENDIF
CASE m.lnOptiune = 2
IF !Thisform.RegenereazaXml()
RETURN
ENDIF
CASE m.lnOptiune = 3
Thisform.Valideaza()
RETURN
OTHERWISE
RETURN
ENDCASE
lcMesajConf = 'Trimiteti la ANAF (' + IIF(Thisform.plTest,'TEST','PRODUCTIE') + ') stornarea facturii ' + Thisform.pcNumarOriginal + ; lcMesajConf = 'Trimiteti la ANAF (' + IIF(Thisform.plTest,'TEST','PRODUCTIE') + ') stornarea facturii ' + Thisform.pcNumarOriginal + ;
' ca ' + ALLTRIM(Thisform.pcNumarNou) + ', total ' + Transform(Thisform.pnTotal) + ' ' + Thisform.pcMoneda + '? Operatia nu se poate anula.' ' ca ' + ALLTRIM(Thisform.pcNumarNou) + ', total ' + Transform(Thisform.pnTotal) + ' ' + Thisform.pcMoneda + '? Operatia nu se poate anula.'
IF AMESSAGEBOX(m.lcMesajConf, 4+32+256, _screen.Caption) <> 6 IF AMESSAGEBOX(m.lcMesajConf, 4+32+256, _screen.Caption) <> 6
@@ -15957,37 +16010,12 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
ENDTRY ENDTRY
ENDIF ENDIF
goLog.Log('Storno eFactura: ' + Thisform.pcNumarOriginal + ' -> ' + ALLTRIM(Thisform.pcNumarNou) + ', index ' + loReturn.cIdIncarcare + ', ' + IIF(Thisform.plTest,'TEST','PRODUCTIE')) goLog.Log('Storno eFactura: ' + Thisform.pcNumarOriginal + ' -> ' + ALLTRIM(Thisform.pcNumarNou) + ', index ' + loReturn.cIdIncarcare + ', ' + IIF(Thisform.plTest,'TEST','PRODUCTIE'))
Thisform.edtStatus.Value = 'Trimis. Index incarcare ' + loReturn.cIdIncarcare + ' (' + IIF(Thisform.plTest,'TEST','PRODUCTIE') + '). ' + ;
'Stergeti factura din ROA si emiteti factura corecta cu acelasi numar. Storno-ul apare in Trimise dupa descarcarea mesajelor.'
Thisform.EnableButoane(.T.) Thisform.EnableButoane(.T.)
Thisform.SetStare(2) Thisform.SetStare(2, 'Trimis. Index incarcare ' + loReturn.cIdIncarcare + ' (' + IIF(Thisform.plTest,'TEST','PRODUCTIE') + '). ' + ;
'Stergeti factura din ROA si emiteti factura corecta cu acelasi numar. Storno-ul apare in Trimise dupa descarcarea mesajelor.')
ELSE ELSE
Thisform.edtStatus.Value = 'Eroare: ' + loReturn.cMesaj + '. Verificati in Trimise, dupa descarcare, inainte de a retrimite.'
Thisform.EnableButoane(.T.) Thisform.EnableButoane(.T.)
Thisform.SetStare(0) Thisform.SetStare(0, 'Eroare: ' + loReturn.cMesaj + '. Verificati in Trimise, dupa descarcare, inainte de a retrimite.')
ENDIF
ENDPROC
PROCEDURE cmdValideaza.Click
LOCAL llValid, lcMesajValid, loSrv, loExport
IF !Thisform.RegenereazaXml()
RETURN
ENDIF
loSrv = Thisform.poAnaf
Thisform.EnableButoane(.F.)
WAIT WINDOW 'Se valideaza...' NOWAIT
loSrv.RefreshTokenAuto()
loExport = CREATEOBJECT('ExportEFactura', .T., loSrv.cToken)
llValid = m.loExport.ValidareEFacturaANAF(Thisform.pcFisierStorno, @lcMesajValid)
CLEAR TYPEAHEAD
WAIT CLEAR
Thisform.EnableButoane(.T.)
IF m.llValid
Thisform.edtStatus.Value = 'Valid.'
Thisform.SetStare(1)
ELSE
Thisform.edtStatus.Value = IIF(Empty(m.lcMesajValid), 'Validare indisponibila - verificati tokenul/reteaua.', 'Invalid: ' + m.lcMesajValid)
Thisform.SetStare(0)
ENDIF ENDIF
ENDPROC ENDPROC

View File

@@ -0,0 +1,24 @@
* mock_xmenu_storno.prg - mock XMENU specific testului E2E storno (test_storno_e2e.prg).
* Raspunde din coada PUBLIC gaXmenuQueue/gnXmenuQueuePos (populata de test inainte de fiecare
* Click care deschide meniul cmdTrimite); coada goala -> 0 (echivalent Esc/renuntare la xmenu).
* Logheaza toate apelurile in PUBLIC gaXmenuCalls/gnXmenuCalls.
FUNCTION xmenu
LPARAMETERS tcItems, tnBar
LOCAL lnRaspuns
IF TYPE('gnXmenuQueuePos') = 'N' AND gnXmenuQueuePos <= ALEN(gaXmenuQueue)
lnRaspuns = gaXmenuQueue[gnXmenuQueuePos]
gnXmenuQueuePos = gnXmenuQueuePos + 1
ELSE
lnRaspuns = 0
ENDIF
IF TYPE('gnXmenuCalls') = 'N'
gnXmenuCalls = gnXmenuCalls + 1
DIMENSION gaXmenuCalls[gnXmenuCalls, 2]
gaXmenuCalls[gnXmenuCalls, 1] = TRANSFORM(tcItems)
gaXmenuCalls[gnXmenuCalls, 2] = lnRaspuns
ENDIF
IF TYPE('gcUILog') = 'C'
DO PrLogLocal WITH 'MOCK xmenu: [' + LEFT(TRANSFORM(tcItems), 100) + '] -> ' + TRANSFORM(lnRaspuns)
ENDIF
RETURN lnRaspuns
ENDFUNC

View File

@@ -8,8 +8,9 @@
* *
* ZERO trimiteri ANAF: Thisform.oAnaf.AnafeFacturaServer e inlocuit cu MockAnafServerStorno * ZERO trimiteri ANAF: Thisform.oAnaf.AnafeFacturaServer e inlocuit cu MockAnafServerStorno
* (mock_anaf_server_storno.prg) imediat dupa ce forma reala citeste cCodFiscal/lTest de la * (mock_anaf_server_storno.prg) imediat dupa ce forma reala citeste cCodFiscal/lTest de la
* serverul real. cmdValideaza (ValidareEFacturaANAF, apel HTTP real, hardcodat /prod/ - * serverul real. Valideaza() (ValidareEFacturaANAF, apel HTTP real, hardcodat /prod/ -
* xmlefactura.prg:1275,1278) NU e apelat; se ocoleste cu SetStare(1) direct. * xmlefactura.prg:1275,1278) NU e apelat; se ocoleste cu SetStare(1) direct. cmdTrimite.Click
* deschide XMENU, mockuit din coada gaXmenuQueue (mock_xmenu_storno.prg).
SET SAFETY OFF SET SAFETY OFF
SET TALK OFF SET TALK OFF
@@ -21,15 +22,20 @@ SET NULLDISPLAY TO ''
CLOSE DATABASES CLOSE DATABASES
PUBLIC gcUILog, gcTestDir, gcTesteDir PUBLIC gcUILog, gcTestDir, gcTesteDir
PUBLIC gnPass, gnFail, gnMockRaspuns, gnAmsgCalls, gnMockApeluri PUBLIC gnPass, gnFail, gnMockRaspuns, gnAmsgCalls, gnMockApeluri, gnXmenuCalls, gnXmenuQueuePos
PUBLIC loAnaf, loForm, loMockSrv, loStornoForm, lnLastErrorNo, lcLastErrorMsg PUBLIC loAnaf, loForm, loMockSrv, loStornoForm, lnLastErrorNo, lcLastErrorMsg
DECLARE gaAmsgCalls[1,2] DECLARE gaAmsgCalls[1,2]
DECLARE gaMockApeluri[1,3] DECLARE gaMockApeluri[1,3]
DECLARE gaXmenuCalls[1,2]
DECLARE gaXmenuQueue[1]
gnPass = 0 gnPass = 0
gnFail = 0 gnFail = 0
gnAmsgCalls = 0 gnAmsgCalls = 0
gnMockApeluri = 0 gnMockApeluri = 0
gnMockRaspuns = 6 gnMockRaspuns = 6
gnXmenuCalls = 0
gnXmenuQueuePos = 1
gaXmenuQueue[1] = 0
lnLastErrorNo = 0 lnLastErrorNo = 0
lcLastErrorMsg = '' lcLastErrorMsg = ''
@@ -44,6 +50,7 @@ ON SHUTDOWN QUIT
* mock-urile INAINTEA test_init_env_auto: la nume duplicat de procedura castiga fisierul * mock-urile INAINTEA test_init_env_auto: la nume duplicat de procedura castiga fisierul
* cautat PRIMUL (vezi mock_amessagebox.prg / capcana testare-ui-vfp.md) * cautat PRIMUL (vezi mock_amessagebox.prg / capcana testare-ui-vfp.md)
SET PROCEDURE TO (gcTestDir + 'mock_amessagebox_storno.prg') ADDITIVE SET PROCEDURE TO (gcTestDir + 'mock_amessagebox_storno.prg') ADDITIVE
SET PROCEDURE TO (gcTestDir + 'mock_xmenu_storno.prg') ADDITIVE
SET PROCEDURE TO (gcTestDir + 'mock_anaf_server_storno.prg') ADDITIVE SET PROCEDURE TO (gcTestDir + 'mock_anaf_server_storno.prg') ADDITIVE
TRY TRY
@@ -365,7 +372,28 @@ DEFINE CLASS DriverStorno AS Custom
DO TVerdict WITH RECCOUNT('crsStornoDetalii') > 0, 'grid crsStornoDetalii populat', 'reccount=' + TRANSFORM(RECCOUNT('crsStornoDetalii')) DO TVerdict WITH RECCOUNT('crsStornoDetalii') > 0, 'grid crsStornoDetalii populat', 'reccount=' + TRANSFORM(RECCOUNT('crsStornoDetalii'))
DO TVerdict WITH 'TEST' $ UPPER(loStorno.Caption), 'Caption contine TEST', 'caption=[' + loStorno.Caption + ']' DO TVerdict WITH 'TEST' $ UPPER(loStorno.Caption), 'Caption contine TEST', 'caption=[' + loStorno.Caption + ']'
DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'NEVALIDAT', 'stare initiala Nevalidat', 'stare=[' + loStorno.lblStare.Caption + ']' DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'NEVALIDAT', 'stare initiala Nevalidat', 'stare=[' + loStorno.lblStare.Caption + ']'
DO TVerdict WITH loStorno.lblStare.ForeColor == RGB(96,96,96), 'lblStare gri la Nevalidat', 'forecolor=' + TRANSFORM(loStorno.lblStare.ForeColor)
DO TVerdict WITH FILE(loStorno.pcFisierStorno), 'fisier storno exista pe disc', 'fisier=[' + loStorno.pcFisierStorno + ']' DO TVerdict WITH FILE(loStorno.pcFisierStorno), 'fisier storno exista pe disc', 'fisier=[' + loStorno.pcFisierStorno + ']'
DO PrLogLocal WITH 'grid coloane: ' + TRANSFORM(loStorno.grdModificari.cElement.Width) + '/' + TRANSFORM(loStorno.grdModificari.cOriginal.Width) + '/' + TRANSFORM(loStorno.grdModificari.cNou.Width) + ;
' controlsource: ' + loStorno.grdModificari.cElement.ControlSource + '|' + loStorno.grdModificari.cOriginal.ControlSource + '|' + loStorno.grdModificari.cNou.ControlSource
DO TVerdict WITH loStorno.grdModificari.cElement.Width = 330 AND loStorno.grdModificari.cOriginal.Width = 180 AND loStorno.grdModificari.cNou.Width = 180, 'latimi coloane grid (330/180/180)', ''
DO TVerdict WITH LOWER(loStorno.grdModificari.cElement.ControlSource) == 'crsstornodetalii.element' AND LOWER(loStorno.grdModificari.cOriginal.ControlSource) == 'crsstornodetalii.original' AND LOWER(loStorno.grdModificari.cNou.ControlSource) == 'crsstornodetalii.nou', 'controlsource coloane grid calificat', ''
* V(250) in loc de C(250) (fix Marius, cf. docs/storno_forma_ux_diff.md pct.12b) -
* sumele nu mai vin cu padding la dreapta, care le scotea vizual din coloana.
LOCAL lnPadFail, lcPadDetail
lnPadFail = 0
lcPadDetail = ''
SELECT crsStornoDetalii
SCAN
IF LEN(crsStornoDetalii.original) != LEN(ALLTRIM(crsStornoDetalii.original)) OR LEN(crsStornoDetalii.nou) != LEN(ALLTRIM(crsStornoDetalii.nou))
lnPadFail = lnPadFail + 1
lcPadDetail = lcPadDetail + 'rand=' + TRANSFORM(RECNO()) + ' original=[' + crsStornoDetalii.original + '] nou=[' + crsStornoDetalii.nou + '] '
ENDIF
ENDSCAN
DO TVerdict WITH lnPadFail = 0, 'fara padding pe original/nou (V(250), sumele nu mai ies din coloana)', 'randuri cu padding=' + TRANSFORM(lnPadFail) + ' ' + lcPadDetail
DO TVerdict WITH EMPTY(loStorno.txtMotiv.Value), 'txtMotiv fara apostrofuri la init', 'value=[' + TRANSFORM(loStorno.txtMotiv.Value) + ']'
This.nState = 1 This.nState = 1
CASE This.nState = 1 CASE This.nState = 1
@@ -381,8 +409,20 @@ DEFINE CLASS DriverStorno AS Custom
loStorno = loStornoForm loStorno = loStornoForm
loStorno.SetStare(1) loStorno.SetStare(1)
DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'VALID', 'SetStare(1) -> Valid (ocolire ValidareEFacturaANAF, retea reala, cf. instructiuni)', 'stare=[' + loStorno.lblStare.Caption + ']' DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'VALID', 'SetStare(1) -> Valid (ocolire ValidareEFacturaANAF, retea reala, cf. instructiuni)', 'stare=[' + loStorno.lblStare.Caption + ']'
DO TVerdict WITH loStorno.lblStare.ForeColor == RGB(0,128,0), 'lblStare verde la Valid', 'forecolor=' + TRANSFORM(loStorno.lblStare.ForeColor)
* renuntare la xmenu (0) -> cmdTrimite.Click nu schimba nimic, fara retea
gaXmenuQueue[1] = 0
gnXmenuQueuePos = 1
loStorno.cmdTrimite.Click() loStorno.cmdTrimite.Click()
DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'TRIMIS', 'dupa cmdTrimite.Click -> Trimis', 'stare=[' + loStorno.lblStare.Caption + ']' DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'VALID', 'renuntare xmenu -> starea nu se schimba', 'stare=[' + loStorno.lblStare.Caption + ']'
* optiunea 2 (trimite fara validare, cf. instructiuni: fara Valideaza/retea reala)
gaXmenuQueue[1] = 2
gnXmenuQueuePos = 1
loStorno.cmdTrimite.Click()
DO TVerdict WITH loStorno.pnStare = 2, 'dupa cmdTrimite.Click (xmenu=2) -> Trimis', 'pnStare=' + TRANSFORM(loStorno.pnStare) + ' caption=[' + loStorno.lblStare.Caption + ']'
DO TVerdict WITH loStorno.lblStare.ForeColor == RGB(0,64,160), 'lblStare albastru la Trimis', 'forecolor=' + TRANSFORM(loStorno.lblStare.ForeColor)
DO TVerdict WITH ExistaApelMock('TrimiteFacturaXML'), 'mock a primit TrimiteFacturaXML', '' DO TVerdict WITH ExistaApelMock('TrimiteFacturaXML'), 'mock a primit TrimiteFacturaXML', ''
This.nState = 3 This.nState = 3