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)
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', '', ;
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)
plFaraValidareEFactura = (m.lnOptiune = 2)
llNuTrimiteEFacturaANAF = (m.lnOptiune = 3)
SET STEP ON
llSucces = Thisform.oAnaf.TrimiteFacturi(m.llNuTrimiteEFacturaANAF)
Thisform.pgfeFactura.page1.grdFacturiEmise.Refresh()
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: ObjPath="But_renunt1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblAntet" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblClient" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblNumar" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="txtNumar" 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.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblStare" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="edtStatus" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdValideaza" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdGenereaza" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdPdf" 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: setstare
*m: umplegrid
*m: valideaza
*p: pcciffirma
*p: pcclient
*p: pcfisierstorno
@@ -15551,18 +15550,20 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
*</DefinedPropArrayMethod>
*<PropValue>
BorderStyle = 1
BorderStyle = 3
DoCreate = .T.
Height = 560
Height = 480
MinHeight = 480
MinWidth = 760
Name = "frm_storno_efactura"
pcciffirma = ''
pcclient = ''
pcfisierstorno = ''
pcmoneda = ''
pcmotiv = ''
pcnumarnou = ''
pcnumaroriginal = ''
pcxmloriginal = ''
pcciffirma =
pcclient =
pcfisierstorno =
pcmoneda =
pcmotiv =
pcnumarnou =
pcnumaroriginal =
pcxmloriginal =
pddataoriginal = {}
plb2c = .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="setstare" display="SetStare"/>
<memberdata name="umplegrid" display="UmpleGrid"/>
<memberdata name="valideaza" display="Valideaza"/>
</VFPData>
_shape1.Anchor = 10
_shape1.Height = 29
_shape1.Left = 0
_shape1.Name = "_shape1"
_shape1.Top = 0
_shape1.Width = 760
_shape2.Anchor = 9
_shape2.Left = 701
_shape2.Name = "_shape2"
_shape2.Top = 0
Lb_titlu_alb_b121.Anchor = 3
Lb_titlu_alb_b121.Caption = "Stornare eFactura"
Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121"
BUT_TERMIN1.Name = "BUT_TERMIN1"
@@ -15614,78 +15619,73 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
Top = 2
*< 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 ;
Anchor = 6, ;
Caption = "\<PDF ANAF", ;
Height = 30, ;
Left = 160, ;
Name = "cmdPdf", ;
TabIndex = 4, ;
Top = 512, ;
TabIndex = 5, ;
Top = 438, ;
Width = 140
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'cmdTrimite' AS cmd_executa WITH ;
Anchor = 12, ;
Caption = "\<Trimite la ANAF", ;
FontBold = .T., ;
ForeColor = 0,128,0, ;
Height = 30, ;
Left = 588, ;
Left = 568, ;
Name = "cmdTrimite", ;
TabIndex = 5, ;
Top = 512, ;
Width = 160
TabIndex = 6, ;
Top = 438, ;
Width = 180
*< 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 ;
Anchor = 15, ;
ColumnCount = 3, ;
DeleteMark = .F., ;
FontSize = 10, ;
Height = 280, ;
Height = 252, ;
Left = 12, ;
Name = "grdModificari", ;
Panel = 1, ;
ReadOnly = .T., ;
RecordSource = "crsStornoDetalii", ;
RowHeight = 19, ;
TabIndex = 6, ;
Top = 164, ;
TabIndex = 3, ;
Top = 134, ;
Width = 736, ;
Column1.ControlSource = "crsStornoDetalii.element", ;
Column1.FontSize = 10, ;
Column1.Name = "cElement", ;
Column1.ReadOnly = .T., ;
Column1.Width = 300, ;
Column1.Width = 330, ;
Column2.Alignment = 1, ;
Column2.ControlSource = "crsStornoDetalii.original", ;
Column2.FontSize = 10, ;
Column2.Name = "cOriginal", ;
Column2.ReadOnly = .T., ;
Column2.Width = 200, ;
Column2.Width = 180, ;
Column3.Alignment = 1, ;
Column3.ControlSource = "crsStornoDetalii.nou", ;
Column3.FontSize = 10, ;
Column3.Name = "cNou", ;
Column3.ReadOnly = .T., ;
Column3.Width = 200
Column3.Width = 180
*< END OBJECT: ClassLib="_grd_base.vcx" BaseClass="grid" />
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
*< 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 ;
Anchor = 11, ;
AutoSize = .F., ;
Caption = "", ;
ForeColor = 192,0,0, ;
Height = 40, ;
Height = 36, ;
Left = 12, ;
Name = "lblAvertisment", ;
Top = 118, ;
Top = 90, ;
Width = 736, ;
WordWrap = .T.
*< 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 ;
Anchor = 1, ;
Caption = "Motiv (optional):", ;
Left = 270, ;
Name = "lblMotiv", ;
Top = 90
Top = 62
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'lblNumar' AS _label WITH ;
Anchor = 1, ;
Caption = "Numar storno:", ;
Left = 12, ;
Name = "lblNumar", ;
Top = 90
Top = 62
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'lblStare' AS _label WITH ;
Anchor = 14, ;
AutoSize = .F., ;
Caption = "Nevalidat", ;
FontBold = .T., ;
ForeColor = 96,96,96, ;
Height = 34, ;
Left = 12, ;
Name = "lblStare", ;
Top = 452, ;
Width = 200
Top = 396, ;
Width = 736, ;
WordWrap = .T.
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'txtMotiv' AS _textbox WITH ;
Anchor = 11, ;
ControlSource = "Thisform.pcmotiv", ;
Format = "!K", ;
Height = 23, ;
Left = 375, ;
MaxLength = 200, ;
Name = "txtMotiv", ;
TabIndex = 2, ;
Top = 87, ;
Top = 59, ;
Width = 373
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'txtNumar' AS _textbox WITH ;
Anchor = 1, ;
ControlSource = "Thisform.pcnumarnou", ;
Format = "!K", ;
Height = 23, ;
Left = 105, ;
Name = "txtNumar", ;
TabIndex = 1, ;
Top = 87, ;
Top = 59, ;
Width = 150
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
PROCEDURE Activate
DODEFAULT()
TRY
This.cmdValideaza.SetFocus()
CATCH
ENDTRY
ENDPROC
PROCEDURE EnableButoane
LPARAMETERS tlEnable
This.cmdValideaza.Enabled = m.tlEnable
This.cmdGenereaza.Enabled = m.tlEnable
This.cmdPdf.Enabled = m.tlEnable
This.cmdTrimite.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, ;
tcClient, tcCifFirma, tnTotal, tcMoneda, tlTest, tlB2C, tcFisierStorno, tcNumarNou, ;
tcAvertizare
DODEFAULT()
This.poAnaf = toAnaf
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.Lb_titlu_alb_b121.Caption = This.Caption
This.lblAntet.Caption = 'Factura ' + m.tcNumarOriginal + ' din ' + Dtoc(m.tdDataOriginal) + ' -> Storno' + Chr(13) + Chr(10) + ;
'Client: ' + m.tcClient + ' CIF firma: ' + m.tcCifFirma + ' Moneda: ' + m.tcMoneda
This.lblClient.Caption = 'Client: ' + m.tcClient + ' CIF: ' + m.tcCifFirma + ' Moneda: ' + m.tcMoneda
This.lblAvertisment.Caption = m.tcAvertizare
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)
IF !m.llSucces
This.edtStatus.Value = 'Eroare la regenerare: ' + m.lcMesaj
This.SetStare(0)
This.SetStare(0, 'Eroare la regenerare: ' + m.lcMesaj)
RETURN .F.
ENDIF
This.UmpleGrid(@laModif)
@@ -15879,27 +15882,32 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
ENDPROC
PROCEDURE SetStare
LPARAMETERS tnStare
LPARAMETERS tnStare, tcMesaj
IF PCOUNT() < 2
tcMesaj = ''
ENDIF
This.pnStare = m.tnStare
This.cmdPdf.Enabled = .T.
This.lblStare.ToolTipText = m.tcMesaj
DO CASE
CASE m.tnStare = 2
* trimis - stare terminala (D26/D35)
This.lblStare.Caption = 'Trimis'
This.cmdValideaza.Enabled = .F.
This.lblStare.Caption = IIF(Empty(m.tcMesaj), 'Trimis', m.tcMesaj)
This.lblStare.ForeColor = RGB(0,64,160)
This.cmdTrimite.Enabled = .F.
This.txtNumar.Enabled = .F.
This.txtMotiv.Enabled = .F.
CASE m.tnStare = 1
This.lblStare.Caption = 'Valid'
This.cmdValideaza.Enabled = .T.
This.lblStare.Caption = IIF(Empty(m.tcMesaj), 'Valid', m.tcMesaj)
This.lblStare.ForeColor = RGB(0,128,0)
This.cmdTrimite.Enabled = .T.
This.txtNumar.Enabled = .T.
This.txtMotiv.Enabled = .T.
OTHERWISE
This.lblStare.Caption = 'Nevalidat'
This.cmdValideaza.Enabled = .T.
This.cmdTrimite.Enabled = .F.
* mesaj gol = nevalidat (gri), mesaj dat = eroare de validare/regenerare (rosu)
This.lblStare.Caption = IIF(Empty(m.tcMesaj), 'Nevalidat', m.tcMesaj)
This.lblStare.ForeColor = IIF(Empty(m.tcMesaj), RGB(96,96,96), RGB(192,0,0))
This.cmdTrimite.Enabled = .T.
This.txtNumar.Enabled = .T.
This.txtMotiv.Enabled = .T.
ENDCASE
@@ -15919,6 +15927,34 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
This.grdModificari.Refresh()
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
LOCAL lcXmlCurent, lcFisierPdf
lcXmlCurent = Filetostr(Thisform.pcFisierStorno)
@@ -15930,10 +15966,27 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
ENDPROC
PROCEDURE cmdTrimite.Click
LOCAL lcMesajConf, loReturn, lcDirProcesat, lcFisierProcesat
IF Thisform.pnStare <> 1
LOCAL lcMesajConf, loReturn, lcDirProcesat, lcFisierProcesat, lnOptiune
IF Thisform.pnStare = 2
RETURN
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 + ;
' 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
@@ -15957,37 +16010,12 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
ENDTRY
ENDIF
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.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
Thisform.edtStatus.Value = 'Eroare: ' + loReturn.cMesaj + '. Verificati in Trimise, dupa descarcare, inainte de a retrimite.'
Thisform.EnableButoane(.T.)
Thisform.SetStare(0)
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)
Thisform.SetStare(0, 'Eroare: ' + loReturn.cMesaj + '. Verificati in Trimise, dupa descarcare, inainte de a retrimite.')
ENDIF
ENDPROC