From d0c1174829afe59d97a4061b3ce0347a61901703 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Sat, 19 Sep 2026 22:11:33 +0300 Subject: [PATCH] sync SVN r18186 --- clase/anaf_efactura.vc2 | 88 ++++++++++++++++++++++---------------- programe/anaf_efactura.prg | 13 +++--- 2 files changed, 59 insertions(+), 42 deletions(-) diff --git a/clase/anaf_efactura.vc2 b/clase/anaf_efactura.vc2 index 3cefc6d..bb2921c 100644 --- a/clase/anaf_efactura.vc2 +++ b/clase/anaf_efactura.vc2 @@ -5887,8 +5887,8 @@ DEFINE CLASS anaf_efactura AS _frmbase OF "_frm_base.vcx" 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 + LOCAL lcNumarNou, lcNumarNouSafe, lcClientSafe, lcFisierStorno, lcNotaIni, llSucces + LOCAL laModificari[1], lcAvertizare, laDubl[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 @@ -5973,8 +5973,12 @@ DEFINE CLASS anaf_efactura AS _frmbase OF "_frm_base.vcx" llB2C = (Len(m.lcCustomerCif) = 13) lcNumarNou = m.lcNumarOriginal + '-S' - lcNumarNouSafe = WindowsSpecialCharacters(m.lcNumarNou) - lcFisierStorno = GetPdfPath('EFACTURA','TRIMISE') + 'storno_' + m.lcNumarNouSafe + '_' + m.lcCifFirma + '.xml' + lcNumarNouSafe = WindowsSpecialCharacters(ALLTRIM(m.lcNumarNou), '_') + lcNumarNouSafe = Strtran(Alltrim(m.lcNumarNouSafe), [ ], [_], 1, 100, 1) + lcClientSafe = WindowsSpecialCharacters(Nvl(m.lcClient, ''), '_') + lcClientSafe = Strtran(Alltrim(m.lcClientSafe), [ ], [_], 1, 100, 1) + lcClientSafe = Alltrim(Left(WindowsSpecialCharacters(m.lcClientSafe, '_'), 70)) + lcFisierStorno = GetPdfPath('EFACTURA') + 'efactura_' + Dtos(m.ldIssueDate) + '_' + m.lcNumarNouSafe + '_' + m.lcClientSafe + '.xml' lcNotaIni = 'Stornare factura ' + m.lcNumarOriginal + ' din data ' + Dtoc(m.ldIssueDate) llSucces = StornoEFacturaXML(m.lcXmlOriginal, m.lcNumarNou, m.lcNotaIni, m.lcFisierStorno, @laModificari, @lcMesaj) @@ -5993,9 +5997,6 @@ DEFINE CLASS anaf_efactura AS _frmbase OF "_frm_base.vcx" 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 @@ -15507,7 +15508,6 @@ 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="lblClient" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblNumar" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="txtNumar" UniqueID="" Timestamp="" /> @@ -15527,6 +15527,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="cmdTrimite" UniqueID="" Timestamp="" /> * + *m: calculeazafisierstorno *m: enablebutoane *m: regenereazaxml *m: setstare @@ -15607,18 +15608,13 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx" Lb_titlu_alb_b121.Anchor = 3 Lb_titlu_alb_b121.Caption = "Stornare eFactura" Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121" + BUT_TERMIN1.Anchor = 8 + BUT_TERMIN1.Left = 727 BUT_TERMIN1.Name = "BUT_TERMIN1" - BUT_TERMIN1.Visible = .F. + BUT_TERMIN1.Top = 2 Gridsort1.Name = "Gridsort1" * - 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 'cmdGenereaza' AS cmd_executa WITH ; Anchor = 6, ; Caption = "\ + PROCEDURE CalculeazaFisierStorno + LPARAMETERS tcNumarNou + LOCAL lcNumarSafe, lcClientSafe + lcNumarSafe = WindowsSpecialCharacters(ALLTRIM(m.tcNumarNou), '_') + lcNumarSafe = Strtran(Alltrim(m.lcNumarSafe), [ ], [_], 1, 100, 1) + lcClientSafe = WindowsSpecialCharacters(Nvl(This.pcClient, ''), '_') + lcClientSafe = Strtran(Alltrim(m.lcClientSafe), [ ], [_], 1, 100, 1) + lcClientSafe = Alltrim(Left(WindowsSpecialCharacters(m.lcClientSafe, '_'), 70)) + RETURN GetPdfPath('EFACTURA') + 'efactura_' + Dtos(This.pdDataOriginal) + '_' + m.lcNumarSafe + '_' + m.lcClientSafe + '.xml' + ENDPROC + PROCEDURE EnableButoane LPARAMETERS tlEnable This.cmdGenereaza.Enabled = m.tlEnable @@ -15856,6 +15862,11 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx" This.Lb_titlu_alb_b121.Caption = This.Caption This.lblClient.Caption = 'Client: ' + m.tcClient + ' CIF: ' + m.tcCifFirma + ' Moneda: ' + m.tcMoneda This.lblAvertisment.Caption = m.tcAvertizare + IF Empty(m.tcAvertizare) + This.lblAvertisment.Visible = .F. + This.grdModificari.Height = This.grdModificari.Height + (This.grdModificari.Top - This.lblAvertisment.Top) + This.grdModificari.Top = This.lblAvertisment.Top + ENDIF This.grdModificari.SetAll("DynamicFontBold", "tip = 2", "Column") @@ -15872,6 +15883,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx" ENDIF lcNotaFinal = 'Stornare factura ' + This.pcNumarOriginal + ' din data ' + Dtoc(This.pdDataOriginal) + IIF(Empty(m.lcMotiv), '', '. ' + m.lcMotiv) + This.pcFisierStorno = This.CalculeazaFisierStorno(m.lcNumarNou) llSucces = StornoEFacturaXML(This.pcXmlOriginal, m.lcNumarNou, m.lcNotaFinal, This.pcFisierStorno, @laModif, @lcMesaj) IF !m.llSucces This.SetStare(0, 'Eroare la regenerare: ' + m.lcMesaj) @@ -15923,6 +15935,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx" 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 + GO TOP SELECT (m.lcSelect) This.grdModificari.Refresh() ENDPROC @@ -15944,39 +15957,47 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx" IF m.llValid This.SetStare(1) ELSE - This.SetStare(0, IIF(Empty(m.lcMesajValid), 'Validare indisponibila - verificati tokenul/reteaua.', 'Invalid: ' + m.lcMesajValid)) + This.SetStare(0, IIF(Empty(m.lcMesajValid), 'Validarea ANAF nu a raspuns - verificati tokenul/reteaua.', 'ANAF a gasit erori in XML (validare): ' + m.lcMesajValid)) ENDIF RETURN m.llValid ENDPROC PROCEDURE cmdGenereaza.Click - IF Thisform.RegenereazaXml() - Thisform.SetStare(0, 'XML regenerat.') + LOCAL lcRun + Thisform.Valideaza() + Thisform.SetStare(Thisform.pnStare, STREXTRACT(Thisform.lblStare.Caption + '. Fisier:', '', '. Fisier:') + '. Fisier: ' + Thisform.pcFisierStorno) + IF FILE(Thisform.pcFisierStorno) + lcRun = [RUN /N7 explorer.exe /select,"] + Thisform.pcFisierStorno + ["] + &lcRun ENDIF ENDPROC PROCEDURE cmdPdf.Click - LOCAL lcXmlCurent, lcFisierPdf + LOCAL lcXmlCurent, lcFisierPdf, lcRun lcXmlCurent = Filetostr(Thisform.pcFisierStorno) - lcFisierPdf = GetPdfPath('EFACTURA','TRIMISE') + 'storno_' + WindowsSpecialCharacters(ALLTRIM(Thisform.pcNumarNou)) + '.pdf' + lcFisierPdf = Forceext(Thisform.pcFisierStorno, 'pdf') lcFisierPdf = Thisform.poAnaf.Xml2PdfAnaf(m.lcXmlCurent, m.lcFisierPdf, .T.) IF !Empty(m.lcFisierPdf) AND File(m.lcFisierPdf) + Thisform.SetStare(Thisform.pnStare, STREXTRACT(Thisform.lblStare.Caption + '. Fisier:', '', '. Fisier:') + '. Fisier: ' + m.lcFisierPdf) open_default_app(m.lcFisierPdf) + lcRun = [RUN /N7 explorer.exe /select,"] + m.lcFisierPdf + ["] + &lcRun ENDIF ENDPROC PROCEDURE cmdTrimite.Click - LOCAL lcMesajConf, loReturn, lcDirProcesat, lcFisierProcesat, lnOptiune + LOCAL lcMesajConf, loReturn, lnOptiune, lcMesajEroare IF Thisform.pnStare = 2 RETURN ENDIF lnOptiune = xmenu('\ 6 RETURN ENDIF @@ -16001,21 +16022,16 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx" 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.EnableButoane(.T.) 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.') + 'Storno-ul apare in Trimise dupa descarcarea mesajelor.') ELSE Thisform.EnableButoane(.T.) - Thisform.SetStare(0, 'Eroare: ' + loReturn.cMesaj + '. Verificati in Trimise, dupa descarcare, inainte de a retrimite.') + *!* HTTP 200 = ANAF a raspuns; altfel nu se stie daca a primit fisierul + lcMesajEroare = IIF(loReturn.nStatus = 200, '', IIF(Thisform.plTest, 'TEST ', '')) + ALLTRIM(loReturn.cMesaj) + ; + IIF(loReturn.nStatus = 200, '', '. Nu se stie daca ANAF a primit fisierul: verificati in Trimise, dupa descarcare, inainte de a retrimite.') + Thisform.SetStare(0, m.lcMesajEroare) ENDIF ENDPROC diff --git a/programe/anaf_efactura.prg b/programe/anaf_efactura.prg index 3cedb65..5f27111 100644 --- a/programe/anaf_efactura.prg +++ b/programe/anaf_efactura.prg @@ -872,7 +872,7 @@ select a.*, cast(NULL as varchar2(1000)) as factura_detalii, 0 as modificat Case !Empty(m.lcErrorMessage) pcIdIncarcare = '' pnTrimis = 1 - pcMesajTrimis = m.pcMesajTrimis + Iif(This.lTest, 'TEST ', '') + 'Eroare. ' + m.lcErrorMessage + pcMesajTrimis = m.pcMesajTrimis + 'ANAF a respins incarcarea: ' + m.lcErrorMessage Case [VALID] $ Upper(loReturn.cResponse) pcIdIncarcare = '' @@ -880,14 +880,14 @@ select a.*, cast(NULL as varchar2(1000)) as factura_detalii, 0 as modificat pcMesajTrimis = m.pcMesajTrimis + loReturn.cResponse Otherwise - pcMesajTrimis = m.pcMesajTrimis + Iif(This.lTest, 'TEST ', '') + 'Eroare. ' + m.lcErrorMessage + pcMesajTrimis = m.pcMesajTrimis + 'Raspuns ANAF neasteptat (fara status): ' + Alltrim(Transform(loReturn.cResponse)) pcIdIncarcare = '' pnTrimis = 1 Endcase loReturn.cMesaj = m.pcMesajTrimis + ' ' + m.lcMesajValidare Else - pcMesajTrimis = ' Eroare transmitere - Http Status: ' + Transform(loReturn.nStatus) + ' Http Response: ' + Alltrim(Transform(loReturn.cResponse)) + ' ' + loReturn.cResponse + pcMesajTrimis = 'Eroare de comunicare cu ANAF - Http Status: ' + Transform(loReturn.nStatus) + IIF(loReturn.nStatus = 403, ' (token expirat - regenerati token-ul)', '') + '. Raspuns: ' + Alltrim(Transform(loReturn.cResponse)) loReturn.cResponse = pcMesajTrimis loReturn.cMesaj = m.pcMesajTrimis + ' ' + m.lcMesajValidare This.Log(loReturn.cResponse) @@ -1322,7 +1322,8 @@ https://api.anaf.ro/<>/FCTEL/rest/listaMesajePagi EXIT ENDIF - llSucces = This.SaveFile(loHttp.ResponseText, .T.,This.cSaveLogsPath,'response_json_' + TTOC(Datetime(),1) + '.txt') + *!* logul json e optional: esecul lui nu e esecul descarcarii (altfel mesaj gol "(nimic)") + This.SaveFile(loHttp.ResponseText, .T.,This.cSaveLogsPath,'response_json_' + TTOC(Datetime(),1) + '.txt') TRY loJson = nfjsonread(loHTTP.ResponseText) @@ -3182,14 +3183,14 @@ select id, id_efactura, nr, articol, descriere, detalii, cantitate, um, pret, pr Case !EMPTY(m.lcErrorMessage) pcIdIncarcare = '' pnTrimis = 1 - pcMesajTrimis = m.pcMesajTrimis + Iif(This.lTest, 'TEST ', '') + 'Eroare. ' + m.lcErrorMessage + pcMesajTrimis = m.pcMesajTrimis + 'ANAF a respins incarcarea: ' + m.lcErrorMessage Case [VALID] $ Upper(loReturn.cResponse) pcIdIncarcare = '' pnTrimis = 0 pcMesajTrimis = m.pcMesajTrimis + loReturn.cResponse Otherwise - pcMesajTrimis = m.pcMesajTrimis + Iif(This.lTest, 'TEST ', '') + 'Eroare. ' + m.lcErrorMessage + pcMesajTrimis = m.pcMesajTrimis + 'Raspuns ANAF neasteptat (fara status): ' + Alltrim(Transform(loReturn.cResponse)) pcIdIncarcare = '' pnTrimis = 1 Endcase