sync SVN r18181
This commit is contained in:
@@ -377,6 +377,7 @@ DEFINE CLASS anaf_efactura AS _frmbase OF "_frm_base.vcx"
|
||||
*m: bifeazatrimismanual && Bifeaza o factura ca trimisa manual
|
||||
*m: citesteraspunsuri
|
||||
*m: do_ataseaza
|
||||
*m: do_storno_efactura
|
||||
*m: gettoken
|
||||
*m: ltest_assign
|
||||
*m: refreshdetaliifacturi
|
||||
@@ -5656,7 +5657,7 @@ DEFINE CLASS anaf_efactura AS _frmbase OF "_frm_base.vcx"
|
||||
lcCursor = 'crsFacturiEmise'
|
||||
CASE m.lnPaginaActiva = 2
|
||||
* Facturi TRIMISE
|
||||
lnOptiune = xmenu('Centralizator facturi;Lista facturi trimise - detaliat;Factura trimisa curenta;\-;PDF ANAF facturi alese;PDF ANAF factura curenta;\-;Editare in browser')
|
||||
lnOptiune = xmenu('Centralizator facturi;Lista facturi trimise - detaliat;Factura trimisa curenta;\-;PDF ANAF facturi alese;PDF ANAF factura curenta;\-;Editare in browser;\-;Generare XML storno si trimitere la ANAF')
|
||||
lcCursor = 'crsFacturiTrimise'
|
||||
CASE m.lnPaginaActiva = 3
|
||||
* Facturi PRIMITE
|
||||
@@ -5822,11 +5823,15 @@ DEFINE CLASS anaf_efactura AS _frmbase OF "_frm_base.vcx"
|
||||
loSender = NEWOBJECT("eFacturaXmlPreview", "xmlefactura-preview.prg")
|
||||
loSender.webURL = "https://romfast.ro/efactura-generator/"
|
||||
loSender.SendXML(m.lcDetalii, m.llVariable)
|
||||
|
||||
CASE m.lnOptiune = 10 AND m.lnPaginaActiva = 2
|
||||
* Generare XML storno si trimitere la ANAF - doar pagina Trimise (D6)
|
||||
This.do_storno_efactura()
|
||||
Endcase
|
||||
|
||||
Select (m.lcSelect)
|
||||
|
||||
|
||||
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE do_sterge
|
||||
@@ -5877,6 +5882,144 @@ DEFINE CLASS anaf_efactura AS _frmbase OF "_frm_base.vcx"
|
||||
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE do_storno_efactura
|
||||
*!* 18.09.2026 stornare XML eFactura din borderou (docs\plan_storno_efactura.md)
|
||||
LOCAL lnId, lcXmlOriginal, lcMesaj, lnRecno, lcNumarOriginal, ldDataOriginal
|
||||
LOCAL lcClient, lcMoneda, lnTotal, lnTestRand, lcCifFirma, lcTempXml, loDom
|
||||
LOCAL lcCifXml, loNod, lcIssueDateStr, ldIssueDate, lcCustomerCif, llB2C, loNoduri, lnI
|
||||
LOCAL lcNumarNou, lcNumarNouSafe, lcFisierStorno, lcNotaIni, llSucces
|
||||
LOCAL laModificari[1], lcAvertizare, laDubl[1], laProcesate[1], loForma
|
||||
IF AMESSAGEBOX('Se genereaza XML-ul de stornare al facturii selectate (aceleasi linii, valori negative).' + CHR(13) + CHR(13) + ;
|
||||
'Nu se trimite nimic la ANAF pana nu verificati XML-ul in fereastra urmatoare si apasati "Trimite la ANAF".', 1+64, _screen.Caption) <> 1
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
SELECT crsFacturiTrimise
|
||||
lnRecno = Recno()
|
||||
|
||||
IF ALLTRIM(NVL(tip_mesaj_raspuns, '')) <> 'FACTURA TRIMISA'
|
||||
AMESSAGEBOX('Stornarea este posibila doar pentru facturi acceptate (FACTURA TRIMISA).', 0+48, _screen.Caption)
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
lnId = NVL(crsFacturiTrimise.Id, 0)
|
||||
IF Empty(m.lnId)
|
||||
RETURN
|
||||
ENDIF
|
||||
lcNumarOriginal = ALLTRIM(NVL(crsFacturiTrimise.numar_act, ''))
|
||||
lcClient = ALLTRIM(NVL(crsFacturiTrimise.xclient, ''))
|
||||
lcMoneda = ALLTRIM(NVL(crsFacturiTrimise.nume_valuta, ''))
|
||||
lnTotal = NVL(crsFacturiTrimise.total_cu_tva, 0)
|
||||
lnTestRand = NVL(crsFacturiTrimise.test, 0)
|
||||
|
||||
lcCifFirma = ALLTRIM(Thisform.oAnaf.AnafeFacturaServer.cCodFiscal)
|
||||
IF lnTestRand <> IIF(Thisform.oAnaf.AnafeFacturaServer.lTest, 1, 0)
|
||||
AMESSAGEBOX('Documentul original e din mediul ' + IIF(m.lnTestRand=1,'TEST','PRODUCTIE') + ;
|
||||
', dar borderoul este pe ' + IIF(Thisform.oAnaf.AnafeFacturaServer.lTest,'TEST','PRODUCTIE') + '. Comutati mediul inainte de stornare.', 0+16, _screen.Caption)
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
IF !GetXmlOriginalEFactura(m.lnId, @lcXmlOriginal, @lcMesaj)
|
||||
AMESSAGEBOX('Factura nu are XML descarcat: ' + m.lcMesaj, 0+16, _screen.Caption)
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
* parsez XML-ul pe fisier (nu .loadXML pe sir), ca sa nu risc reinterpretarea octetilor UTF-8
|
||||
lcTempXml = Addbs(Sys(2023)) + 'storno_check_' + Sys(2015) + '.xml'
|
||||
Strtofile(m.lcXmlOriginal, m.lcTempXml)
|
||||
loDom = Createobject('MSXML2.DOMDocument.6.0')
|
||||
loDom.setProperty('SelectionLanguage', 'XPath')
|
||||
loDom.preserveWhiteSpace = .T.
|
||||
llSucces = loDom.load(m.lcTempXml)
|
||||
TRY
|
||||
Delete File (m.lcTempXml)
|
||||
CATCH
|
||||
ENDTRY
|
||||
|
||||
IF !m.llSucces OR !Inlist(loDom.documentElement.baseName, 'Invoice', 'CreditNote')
|
||||
AMESSAGEBOX('Documentul nu e Invoice/CreditNote.', 0+16, _screen.Caption)
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
*!* 18.09.2026 CIF-ul poate fi in PartyTaxScheme sau PartyLegalEntity (acolo e uneori nr. Reg. Com.)
|
||||
lcCifXml = ''
|
||||
loNoduri = loDom.selectNodes("//*[local-name()='AccountingSupplierParty']//*[local-name()='CompanyID']")
|
||||
FOR lnI = 0 TO m.loNoduri.length - 1
|
||||
loNod = m.loNoduri.item(m.lnI)
|
||||
lcCifXml = GetNrFromString(ALLTRIM(m.loNod.Text))
|
||||
IF m.lcCifXml == ALLTRIM(m.lcCifFirma)
|
||||
EXIT
|
||||
ENDIF
|
||||
ENDFOR
|
||||
IF Empty(m.lcCifXml) OR !(m.lcCifXml == ALLTRIM(m.lcCifFirma))
|
||||
AMESSAGEBOX('Factura e emisa de alta firma (CIF ' + m.lcCifXml + ').', 0+16, _screen.Caption)
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
loNod = loDom.selectSingleNode("//*[local-name()='IssueDate']")
|
||||
lcIssueDateStr = IIF(Isnull(m.loNod), '', ALLTRIM(m.loNod.Text))
|
||||
ldIssueDate = IIF(Len(m.lcIssueDateStr) < 10, {}, Date(Val(Substr(m.lcIssueDateStr,1,4)), Val(Substr(m.lcIssueDateStr,6,2)), Val(Substr(m.lcIssueDateStr,9,2))))
|
||||
IF Empty(m.ldIssueDate)
|
||||
AMESSAGEBOX('Nu s-a putut citi data facturii din XML.', 0+16, _screen.Caption)
|
||||
RETURN
|
||||
ENDIF
|
||||
IF is_luna_blocata(gcS, gnId_Prg_Owner, Year(m.ldIssueDate), Month(m.ldIssueDate))
|
||||
AMESSAGEBOX('Luna ' + Padl(Month(m.ldIssueDate),2,'0') + '.' + Transform(Year(m.ldIssueDate)) + ' este inchisa.', 0+16, _screen.Caption)
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
loNod = loDom.selectSingleNode("//*[local-name()='AccountingCustomerParty']//*[local-name()='PartyLegalEntity']/*[local-name()='CompanyID']")
|
||||
lcCustomerCif = IIF(Isnull(m.loNod), '', ALLTRIM(m.loNod.Text))
|
||||
llB2C = (Len(m.lcCustomerCif) = 13)
|
||||
|
||||
lcNumarNou = m.lcNumarOriginal + '-S'
|
||||
lcNumarNouSafe = WindowsSpecialCharacters(m.lcNumarNou)
|
||||
lcFisierStorno = GetPdfPath('EFACTURA','TRIMISE') + 'storno_' + m.lcNumarNouSafe + '_' + m.lcCifFirma + '.xml'
|
||||
lcNotaIni = 'Stornare factura ' + m.lcNumarOriginal + ' din data ' + Dtoc(m.ldIssueDate)
|
||||
|
||||
llSucces = StornoEFacturaXML(m.lcXmlOriginal, m.lcNumarNou, m.lcNotaIni, m.lcFisierStorno, @laModificari, @lcMesaj)
|
||||
IF !m.llSucces
|
||||
AMESSAGEBOX('Nu s-a putut genera XML-ul de stornare: ' + m.lcMesaj, 0+16, _screen.Caption)
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
* Avertizari (nu blocheaza): termen transmitere, storno dublu, storno deja trimis local, sursa CreditNote/negativa (D13)
|
||||
lcAvertizare = ''
|
||||
IF (Date() - m.ldIssueDate) > 5
|
||||
lcAvertizare = m.lcAvertizare + 'Au trecut mai mult de 5 zile de la data facturii (' + Dtoc(m.ldIssueDate) + ') - verificati termenul de transmitere la ANAF.' + Chr(13) + Chr(10)
|
||||
ENDIF
|
||||
SELECT Count(*) as nCnt FROM crsFacturiTrimise WHERE Alltrim(numar_act) == m.lcNumarNou INTO CURSOR cVerifDubl
|
||||
IF cVerifDubl.nCnt > 0
|
||||
lcAvertizare = m.lcAvertizare + 'Exista deja un document ' + m.lcNumarNou + ' in Trimise - posibila stornare dubla.' + Chr(13) + Chr(10)
|
||||
ENDIF
|
||||
USE IN (SELECT('cVerifDubl'))
|
||||
IF !Empty(Adir(laProcesate, GetPdfPath('EFACTURA','TRIMISE') + 'procesat\*_storno_' + m.lcNumarNouSafe + '_' + m.lcCifFirma + '*.xml'))
|
||||
lcAvertizare = m.lcAvertizare + 'Un storno cu acest numar a fost deja trimis de pe acest calculator.' + Chr(13) + Chr(10)
|
||||
ENDIF
|
||||
IF loDom.documentElement.baseName == 'CreditNote' OR m.lnTotal < 0
|
||||
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))
|
||||
|
||||
loForma = NEWOBJECT('frm_storno_efactura', 'anaf_efactura.vcx', '', ;
|
||||
Thisform.oAnaf.AnafeFacturaServer, m.lnId, m.lcXmlOriginal, m.lcNumarOriginal, m.ldIssueDate, ;
|
||||
m.lcClient, m.lcCifFirma, m.lnTotal, m.lcMoneda, Thisform.oAnaf.AnafeFacturaServer.lTest, m.llB2C, ;
|
||||
m.lcFisierStorno, m.lcNumarNou, m.lcAvertizare)
|
||||
loForma.UmpleGrid(@laModificari)
|
||||
loForma.Show(1)
|
||||
|
||||
IF Used('crsStornoDetalii')
|
||||
USE IN (SELECT('crsStornoDetalii'))
|
||||
ENDIF
|
||||
|
||||
SELECT crsFacturiTrimise
|
||||
TRY
|
||||
Goto m.lnRecno
|
||||
CATCH
|
||||
ENDTRY
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE do_verifica
|
||||
Local lcText, lnActivePage
|
||||
lnActivePage = This.pgfeFactura.ActivePage
|
||||
@@ -15360,3 +15503,504 @@ DEFINE CLASS frm_import_efactura AS _frmbase OF "_frm_base.vcx"
|
||||
ENDPROC
|
||||
|
||||
ENDDEFINE
|
||||
|
||||
DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
|
||||
*< CLASSDATA: Baseclass="form" Timestamp="" Scale="Pixels" Uniqueid="" />
|
||||
|
||||
*-- 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="lblNumar" UniqueID="" Timestamp="" />
|
||||
*< OBJECTDATA: ObjPath="txtNumar" UniqueID="" Timestamp="" />
|
||||
*< OBJECTDATA: ObjPath="lblMotiv" UniqueID="" Timestamp="" />
|
||||
*< OBJECTDATA: ObjPath="txtMotiv" UniqueID="" Timestamp="" />
|
||||
*< OBJECTDATA: ObjPath="lblAvertisment" UniqueID="" Timestamp="" />
|
||||
*< OBJECTDATA: ObjPath="grdModificari" UniqueID="" Timestamp="" />
|
||||
*< OBJECTDATA: ObjPath="grdModificari.cElement.Header1" UniqueID="" Timestamp="" />
|
||||
*< OBJECTDATA: ObjPath="grdModificari.cElement.Text1" UniqueID="" Timestamp="" />
|
||||
*< OBJECTDATA: ObjPath="grdModificari.cOriginal.Header1" UniqueID="" Timestamp="" />
|
||||
*< OBJECTDATA: ObjPath="grdModificari.cOriginal.Text1" UniqueID="" Timestamp="" />
|
||||
*< 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="cmdPdf" UniqueID="" Timestamp="" />
|
||||
*< OBJECTDATA: ObjPath="cmdTrimite" UniqueID="" Timestamp="" />
|
||||
|
||||
*<DefinedPropArrayMethod>
|
||||
*m: enablebutoane
|
||||
*m: regenereazaxml
|
||||
*m: setstare
|
||||
*m: umplegrid
|
||||
*p: pcciffirma
|
||||
*p: pcclient
|
||||
*p: pcfisierstorno
|
||||
*p: pcmoneda
|
||||
*p: pcmotiv
|
||||
*p: pcnumarnou
|
||||
*p: pcnumaroriginal
|
||||
*p: pcxmloriginal
|
||||
*p: pddataoriginal
|
||||
*p: plb2c
|
||||
*p: pltest
|
||||
*p: pnidefactura
|
||||
*p: pnstare
|
||||
*p: pntotal
|
||||
*p: poanaf
|
||||
*</DefinedPropArrayMethod>
|
||||
|
||||
*<PropValue>
|
||||
BorderStyle = 1
|
||||
DoCreate = .T.
|
||||
Height = 560
|
||||
Name = "frm_storno_efactura"
|
||||
pcciffirma = ''
|
||||
pcclient = ''
|
||||
pcfisierstorno = ''
|
||||
pcmoneda = ''
|
||||
pcmotiv = ''
|
||||
pcnumarnou = ''
|
||||
pcnumaroriginal = ''
|
||||
pcxmloriginal = ''
|
||||
pddataoriginal = {}
|
||||
plb2c = .F.
|
||||
pltest = .F.
|
||||
pnidefactura = 0
|
||||
pnstare = 0
|
||||
pntotal = 0
|
||||
poanaf = .NULL.
|
||||
Width = 760
|
||||
_memberdata = <VFPData>
|
||||
<memberdata name="poanaf" display="oAnaf"/>
|
||||
<memberdata name="pnidefactura" display="nIdEfactura"/>
|
||||
<memberdata name="pcxmloriginal" display="cXmlOriginal"/>
|
||||
<memberdata name="pcnumaroriginal" display="cNumarOriginal"/>
|
||||
<memberdata name="pddataoriginal" display="dDataOriginal"/>
|
||||
<memberdata name="pcclient" display="cClient"/>
|
||||
<memberdata name="pcciffirma" display="cCifFirma"/>
|
||||
<memberdata name="pntotal" display="nTotal"/>
|
||||
<memberdata name="pcmoneda" display="cMoneda"/>
|
||||
<memberdata name="pltest" display="lTest"/>
|
||||
<memberdata name="plb2c" display="lB2C"/>
|
||||
<memberdata name="pcfisierstorno" display="cFisierStorno"/>
|
||||
<memberdata name="pcnumarnou" display="cNumarNou"/>
|
||||
<memberdata name="pcmotiv" display="cMotiv"/>
|
||||
<memberdata name="pnstare" display="nStare"/>
|
||||
<memberdata name="enablebutoane" display="EnableButoane"/>
|
||||
<memberdata name="regenereazaxml" display="RegenereazaXml"/>
|
||||
<memberdata name="setstare" display="SetStare"/>
|
||||
<memberdata name="umplegrid" display="UmpleGrid"/>
|
||||
</VFPData>
|
||||
_shape1.Height = 29
|
||||
_shape1.Left = 0
|
||||
_shape1.Name = "_shape1"
|
||||
_shape1.Top = 0
|
||||
_shape1.Width = 760
|
||||
_shape2.Left = 701
|
||||
_shape2.Name = "_shape2"
|
||||
_shape2.Top = 0
|
||||
Lb_titlu_alb_b121.Caption = "Stornare eFactura"
|
||||
Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121"
|
||||
BUT_TERMIN1.Name = "BUT_TERMIN1"
|
||||
BUT_TERMIN1.Visible = .F.
|
||||
Gridsort1.Name = "Gridsort1"
|
||||
*</PropValue>
|
||||
|
||||
ADD OBJECT 'But_renunt1' AS but_renunt WITH ;
|
||||
Anchor = 8, ;
|
||||
Left = 701, ;
|
||||
Name = "But_renunt1", ;
|
||||
Top = 2
|
||||
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
|
||||
|
||||
ADD OBJECT 'cmdPdf' AS cmd_executa WITH ;
|
||||
Caption = "\<PDF ANAF", ;
|
||||
Height = 30, ;
|
||||
Left = 160, ;
|
||||
Name = "cmdPdf", ;
|
||||
TabIndex = 4, ;
|
||||
Top = 512, ;
|
||||
Width = 140
|
||||
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
|
||||
|
||||
ADD OBJECT 'cmdTrimite' AS cmd_executa WITH ;
|
||||
Caption = "\<Trimite la ANAF", ;
|
||||
FontBold = .T., ;
|
||||
ForeColor = 0,128,0, ;
|
||||
Height = 30, ;
|
||||
Left = 588, ;
|
||||
Name = "cmdTrimite", ;
|
||||
TabIndex = 5, ;
|
||||
Top = 512, ;
|
||||
Width = 160
|
||||
*< 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 ;
|
||||
ColumnCount = 3, ;
|
||||
DeleteMark = .F., ;
|
||||
FontSize = 10, ;
|
||||
Height = 280, ;
|
||||
Left = 12, ;
|
||||
Name = "grdModificari", ;
|
||||
Panel = 1, ;
|
||||
ReadOnly = .T., ;
|
||||
RecordSource = "crsStornoDetalii", ;
|
||||
RowHeight = 19, ;
|
||||
TabIndex = 6, ;
|
||||
Top = 164, ;
|
||||
Width = 736, ;
|
||||
Column1.ControlSource = "crsStornoDetalii.element", ;
|
||||
Column1.FontSize = 10, ;
|
||||
Column1.Name = "cElement", ;
|
||||
Column1.ReadOnly = .T., ;
|
||||
Column1.Width = 300, ;
|
||||
Column2.Alignment = 1, ;
|
||||
Column2.ControlSource = "crsStornoDetalii.original", ;
|
||||
Column2.FontSize = 10, ;
|
||||
Column2.Name = "cOriginal", ;
|
||||
Column2.ReadOnly = .T., ;
|
||||
Column2.Width = 200, ;
|
||||
Column3.Alignment = 1, ;
|
||||
Column3.ControlSource = "crsStornoDetalii.nou", ;
|
||||
Column3.FontSize = 10, ;
|
||||
Column3.Name = "cNou", ;
|
||||
Column3.ReadOnly = .T., ;
|
||||
Column3.Width = 200
|
||||
*< END OBJECT: ClassLib="_grd_base.vcx" BaseClass="grid" />
|
||||
|
||||
ADD OBJECT 'grdModificari.cElement.Header1' AS header WITH ;
|
||||
Caption = "Element", ;
|
||||
FontSize = 10, ;
|
||||
Name = "Header1"
|
||||
*< END OBJECT: BaseClass="header" />
|
||||
|
||||
ADD OBJECT 'grdModificari.cElement.Text1' AS textbox WITH ;
|
||||
BackColor = 255,255,255, ;
|
||||
BorderStyle = 0, ;
|
||||
FontSize = 10, ;
|
||||
ForeColor = 0,0,0, ;
|
||||
Margin = 0, ;
|
||||
Name = "Text1", ;
|
||||
ReadOnly = .T., ;
|
||||
SelectedBackColor = 100,185,255
|
||||
*< END OBJECT: BaseClass="textbox" />
|
||||
|
||||
ADD OBJECT 'grdModificari.cNou.Header1' AS header WITH ;
|
||||
Alignment = 1, ;
|
||||
Caption = "Storno", ;
|
||||
FontSize = 10, ;
|
||||
Name = "Header1"
|
||||
*< END OBJECT: BaseClass="header" />
|
||||
|
||||
ADD OBJECT 'grdModificari.cNou.Text1' AS textbox WITH ;
|
||||
Alignment = 1, ;
|
||||
BackColor = 255,255,255, ;
|
||||
BorderStyle = 0, ;
|
||||
FontSize = 10, ;
|
||||
ForeColor = 0,0,0, ;
|
||||
Margin = 0, ;
|
||||
Name = "Text1", ;
|
||||
ReadOnly = .T., ;
|
||||
SelectedBackColor = 100,185,255
|
||||
*< END OBJECT: BaseClass="textbox" />
|
||||
|
||||
ADD OBJECT 'grdModificari.cOriginal.Header1' AS header WITH ;
|
||||
Alignment = 1, ;
|
||||
Caption = "Original", ;
|
||||
FontSize = 10, ;
|
||||
Name = "Header1"
|
||||
*< END OBJECT: BaseClass="header" />
|
||||
|
||||
ADD OBJECT 'grdModificari.cOriginal.Text1' AS textbox WITH ;
|
||||
Alignment = 1, ;
|
||||
BackColor = 255,255,255, ;
|
||||
BorderStyle = 0, ;
|
||||
FontSize = 10, ;
|
||||
ForeColor = 0,0,0, ;
|
||||
Margin = 0, ;
|
||||
Name = "Text1", ;
|
||||
ReadOnly = .T., ;
|
||||
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 ;
|
||||
AutoSize = .F., ;
|
||||
Caption = "", ;
|
||||
ForeColor = 192,0,0, ;
|
||||
Height = 40, ;
|
||||
Left = 12, ;
|
||||
Name = "lblAvertisment", ;
|
||||
Top = 118, ;
|
||||
Width = 736, ;
|
||||
WordWrap = .T.
|
||||
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
|
||||
|
||||
ADD OBJECT 'lblMotiv' AS _label WITH ;
|
||||
Caption = "Motiv (optional):", ;
|
||||
Left = 270, ;
|
||||
Name = "lblMotiv", ;
|
||||
Top = 90
|
||||
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
|
||||
|
||||
ADD OBJECT 'lblNumar' AS _label WITH ;
|
||||
Caption = "Numar storno:", ;
|
||||
Left = 12, ;
|
||||
Name = "lblNumar", ;
|
||||
Top = 90
|
||||
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
|
||||
|
||||
ADD OBJECT 'lblStare' AS _label WITH ;
|
||||
Caption = "Nevalidat", ;
|
||||
FontBold = .T., ;
|
||||
Left = 12, ;
|
||||
Name = "lblStare", ;
|
||||
Top = 452, ;
|
||||
Width = 200
|
||||
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
|
||||
|
||||
ADD OBJECT 'txtMotiv' AS _textbox WITH ;
|
||||
ControlSource = "Thisform.pcmotiv", ;
|
||||
Height = 23, ;
|
||||
Left = 375, ;
|
||||
MaxLength = 200, ;
|
||||
Name = "txtMotiv", ;
|
||||
TabIndex = 2, ;
|
||||
Top = 87, ;
|
||||
Width = 373
|
||||
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
|
||||
|
||||
ADD OBJECT 'txtNumar' AS _textbox WITH ;
|
||||
ControlSource = "Thisform.pcnumarnou", ;
|
||||
Height = 23, ;
|
||||
Left = 105, ;
|
||||
Name = "txtNumar", ;
|
||||
TabIndex = 1, ;
|
||||
Top = 87, ;
|
||||
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.cmdPdf.Enabled = m.tlEnable
|
||||
This.cmdTrimite.Enabled = m.tlEnable
|
||||
This.txtNumar.Enabled = m.tlEnable
|
||||
This.txtMotiv.Enabled = m.tlEnable
|
||||
_screen.MousePointer = IIF(m.tlEnable, 0, 11)
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE Init
|
||||
LPARAMETERS toAnaf, tnIdEfactura, tcXmlOriginal, tcNumarOriginal, tdDataOriginal, ;
|
||||
tcClient, tcCifFirma, tnTotal, tcMoneda, tlTest, tlB2C, tcFisierStorno, tcNumarNou, ;
|
||||
tcAvertizare
|
||||
|
||||
This.poAnaf = toAnaf
|
||||
This.pnIdEfactura = tnIdEfactura
|
||||
This.pcXmlOriginal = tcXmlOriginal
|
||||
This.pcNumarOriginal = tcNumarOriginal
|
||||
This.pdDataOriginal = tdDataOriginal
|
||||
This.pcClient = tcClient
|
||||
This.pcCifFirma = tcCifFirma
|
||||
This.pnTotal = tnTotal
|
||||
This.pcMoneda = tcMoneda
|
||||
This.plTest = tlTest
|
||||
This.plB2C = tlB2C
|
||||
This.pcFisierStorno = tcFisierStorno
|
||||
This.pcNumarNou = tcNumarNou
|
||||
|
||||
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.lblAvertisment.Caption = m.tcAvertizare
|
||||
|
||||
This.grdModificari.SetAll("DynamicFontBold", "tip = 2", "Column")
|
||||
|
||||
This.SetStare(0)
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE RegenereazaXml
|
||||
LOCAL lcNumarNou, lcMotiv, lcNotaFinal, laModif[1], lcMesaj, llSucces
|
||||
lcNumarNou = ALLTRIM(This.pcNumarNou)
|
||||
lcMotiv = ALLTRIM(This.pcMotiv)
|
||||
IF Empty(m.lcNumarNou)
|
||||
AMESSAGEBOX('Numarul stornului nu poate fi gol.', 0+48, _screen.Caption)
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
lcNotaFinal = 'Stornare factura ' + This.pcNumarOriginal + ' din data ' + Dtoc(This.pdDataOriginal) + IIF(Empty(m.lcMotiv), '', '. ' + m.lcMotiv)
|
||||
|
||||
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)
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
This.UmpleGrid(@laModif)
|
||||
RETURN .T.
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE SetStare
|
||||
LPARAMETERS tnStare
|
||||
This.pnStare = m.tnStare
|
||||
This.cmdPdf.Enabled = .T.
|
||||
DO CASE
|
||||
CASE m.tnStare = 2
|
||||
* trimis - stare terminala (D26/D35)
|
||||
This.lblStare.Caption = 'Trimis'
|
||||
This.cmdValideaza.Enabled = .F.
|
||||
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.cmdTrimite.Enabled = .T.
|
||||
This.txtNumar.Enabled = .T.
|
||||
This.txtMotiv.Enabled = .T.
|
||||
OTHERWISE
|
||||
This.lblStare.Caption = 'Nevalidat'
|
||||
This.cmdValideaza.Enabled = .T.
|
||||
This.cmdTrimite.Enabled = .F.
|
||||
This.txtNumar.Enabled = .T.
|
||||
This.txtMotiv.Enabled = .T.
|
||||
ENDCASE
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE UmpleGrid
|
||||
LPARAMETERS taModificari
|
||||
LOCAL lnI, lcSelect
|
||||
lcSelect = Select()
|
||||
SELECT crsStornoDetalii
|
||||
ZAP
|
||||
FOR lnI = 1 TO Alen(taModificari, 1)
|
||||
INSERT INTO crsStornoDetalii (element, original, nou, tip) VALUES ;
|
||||
(taModificari[m.lnI,1], Transform(taModificari[m.lnI,2]), Transform(taModificari[m.lnI,3]), taModificari[m.lnI,4])
|
||||
ENDFOR
|
||||
SELECT (m.lcSelect)
|
||||
This.grdModificari.Refresh()
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE cmdPdf.Click
|
||||
LOCAL lcXmlCurent, lcFisierPdf
|
||||
lcXmlCurent = Filetostr(Thisform.pcFisierStorno)
|
||||
lcFisierPdf = GetPdfPath('EFACTURA','TRIMISE') + 'storno_' + WindowsSpecialCharacters(ALLTRIM(Thisform.pcNumarNou)) + '.pdf'
|
||||
lcFisierPdf = Thisform.poAnaf.Xml2PdfAnaf(m.lcXmlCurent, m.lcFisierPdf, .T.)
|
||||
IF !Empty(m.lcFisierPdf) AND File(m.lcFisierPdf)
|
||||
open_default_app(m.lcFisierPdf)
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE cmdTrimite.Click
|
||||
LOCAL lcMesajConf, loReturn, lcDirProcesat, lcFisierProcesat
|
||||
IF Thisform.pnStare <> 1
|
||||
RETURN
|
||||
ENDIF
|
||||
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
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
Thisform.EnableButoane(.F.)
|
||||
WAIT WINDOW 'Se trimite...' NOWAIT
|
||||
Thisform.poAnaf.RefreshTokenAuto()
|
||||
loReturn = Thisform.poAnaf.TrimiteFacturaXML(Thisform.pcFisierStorno, .F., .F., .F., .F., Thisform.plB2C)
|
||||
CLEAR TYPEAHEAD
|
||||
WAIT CLEAR
|
||||
|
||||
IF !Empty(loReturn.cIdIncarcare)
|
||||
lcDirProcesat = GetPdfPath('EFACTURA','TRIMISE') + 'procesat\'
|
||||
lcFisierProcesat = loReturn.cIdIncarcare + '_' + Justfname(Thisform.pcFisierStorno)
|
||||
IF Thisform.poAnaf.SaveFile(Thisform.pcFisierStorno, .F., m.lcDirProcesat, m.lcFisierProcesat)
|
||||
TRY
|
||||
Delete File (Thisform.pcFisierStorno)
|
||||
CATCH
|
||||
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)
|
||||
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)
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE txtMotiv.InteractiveChange
|
||||
IF Thisform.pnStare <> 0
|
||||
Thisform.SetStare(0)
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE txtNumar.InteractiveChange
|
||||
IF Thisform.pnStare <> 0
|
||||
Thisform.SetStare(0)
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
ENDDEFINE
|
||||
|
||||
Reference in New Issue
Block a user