From a284dd353093ed9d30a3261fc0218dc6205bdb2c Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Sun, 26 Jul 2026 18:22:38 +0300 Subject: [PATCH] D406 SAF-T: verificare coduri fiscale pe toata declaratia + erori validator ANAF Stergere CNP-uri invalide: - bucla de update nu rula niciodata (export2xlsx lasa pointerul pe EOF, iar SCAN WHILE are scope implicit REST) - GO TOP + SCAN, cu Exit la eroare - candidatii se iau din cursoarele declaratiei, cu criteriile verificarii, nu dintr-un query separat pe balanta_parteneri Verificare coduri fiscale (do_verifica_cui): - acopera toti partenerii exportati in XML, nu doar cei cu is_activ = 1 - CodFiscalValidSaft: regulile de format ale validatorului ANAF (numai cifre, fara zero la inceput, 13 cifre la CNP, 2-10 la CUI) peste cifra de control; VALIDARE_CIF accepta litere la inceput si VALIDARE_CNP accepta prima cifra 0 - lista codurilor invalide in cursor + export xlsx (rand, partener, cod, CNP/CUI), mesaj cu defalcare CNP/CUI - corectat "Variable 'LCTEXT' is not found" (m.lcText inexistent in procedura) do_erori_partener_saft: extrage din fisierul de raspuns al validatorului codurile de partener respinse (pagina Customers/Suppliers, randul, codul, partenerul) si le afiseaza la finalul validarii, cu export xlsx optional. changelog 2.11.65 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_013dL9LNnmeY8nELjTLYiGJH --- Programe/saft_d406.prg | 300 +++++++++++++++++++++++++++++++++++------ changelog_roacont.txt | 16 +++ 2 files changed, 277 insertions(+), 39 deletions(-) diff --git a/Programe/saft_d406.prg b/Programe/saft_d406.prg index 7956cb6..2cae4d9 100644 --- a/Programe/saft_d406.prg +++ b/Programe/saft_d406.prg @@ -256,7 +256,7 @@ Define Class d406 As Custom Local lcAssetTransactions, lcAssets, lcCaleFisier, lcComunPath, lcConfigDir, lcFileName Local lcFisierRaspuns, lcMovementofGoods, lcNumeFisier, lcOwners, lcParams, lcPhysicalStock Local lcProducts, lcUOMTable, lcValidator, lcXMLTemp, lnFileHandle, lnSec, lcSufixCale, lcSufixFisier - LOCAL lcMessage, loChatBot + LOCAL lcMessage, loChatBot, lcMesajErori LOCAL lnAn1, lnAn2, lnLuna1, lnLuna2 lnAn1 = This.oUnitate.an1 @@ -555,7 +555,15 @@ Define Class d406 As Custom lcParams = ' "' + m.lcFileName + '"' OPEN_DEFAULT_APP(m.lcValidator, m.lcParams) - ELSE + ELSE + *!* 26.07.2026 scot din fisierul de erori codurile de partener respinse de validator + lcMesajErori = This.do_erori_partener_saft(m.lcFisierRaspuns) + IF !EMPTY(m.lcMesajErori) + IF AMESSAGEBOX(m.lcMesajErori + CHR(13) + CHR(10) + CHR(13) + CHR(10) + 'Doriti exportul listei in Excel?',0+4+48,_screen.Caption) = 6 + goExport.export2xlsx('cEroriPartSaft', 'erori_cod_partener_saft_' + ALLTRIM(STR(m.lnAn2)) + PADL(m.lnLuna2, 2, '0')) + ENDIF + USE IN (SELECT('cEroriPartSaft')) + ENDIF IF AMESSAGEBOX('Validare cu erori fisier: ' + m.lcFileName + CHR(13) + CHR(10) + 'Doriti sa interogati chatbot-ul de suport tehnic?',0+4+48,_screen.Caption) = 6 lcMessage = FILETOSTR(m.lcFisierRaspuns) loChatBot = CREATEOBJECT("oChatBotLaunch", m.lcMessage) @@ -918,7 +926,8 @@ select 1 as tip, #Define CRLF Chr(13) + Chr(10) LOCAL llSilent, lcMesaj, lcListaGol - LOCAL lcCod, lcListaInvalid, lcTextInvalid, llCnp, lnInvalid, loVerif + LOCAL lcCod, lcListaInvalid, lcTextInvalid, llCnp, lnInvalid, lnInvalidCnp, loVerif + LOCAL lcContInv, lcDenumireInv, lnIdPartInv, lnRandInv, lnTipPersInv lcMesaj = '' lcTextInvalid = '' @@ -1031,25 +1040,44 @@ and b1.cont = b2.cont ENDSCAN GO TOP - *!* 24.07.2026 verific validitatea codurilor fiscale (CNP/CUI) la partenerii cu activitate in perioada + *!* 24.07.2026 verific validitatea codurilor fiscale (CNP/CUI) la toti partenerii exportati in declaratie (nu doar cei activi in perioada) lcListaInvalid = '' lnInvalid = 0 + lnInvalidCnp = 0 loVerif = CREATEOBJECT('VerificareCod') - SCAN FOR !EMPTY(NVL(id_part,0)) AND !EMPTY(NVL(cod_fiscal, '')) AND NVL(is_activ, 0) = 1 ; + *!* 26.07.2026 retin codurile invalide intr-un cursor, ca sa poata fi exportate si corectate in nomenclator + CREATE CURSOR cCodInvalid (rand N(7), id_part N(10), denumire C(150), cod_fiscal C(30), tip_cod C(3), tip_persoana N(1), cont C(10)) + SELECT (m.lcCursor) + SCAN FOR !EMPTY(NVL(id_part,0)) AND !EMPTY(NVL(cod_fiscal, '')) ; AND INLIST(ALLTRIM(NVL(cod_tara, 'RO')), 'RO', '') lcCod = ALLTRIM(cod_fiscal) llCnp = (NVL(tip_persoana, 1) = 2) OR (LEN(CHRTRAN(m.lcCod, '0123456789', '')) = 0 AND LEN(m.lcCod) > 10) - IF !IIF(m.llCnp, VALIDARE_CNP(m.lcCod, m.loVerif), VALIDARE_CIF(m.lcCod, m.loVerif)) + IF !This.CodFiscalValidSaft(m.lcCod, m.llCnp, m.loVerif) lnInvalid = m.lnInvalid + 1 + lnInvalidCnp = m.lnInvalidCnp + IIF(m.llCnp, 1, 0) lcListaInvalid = m.lcListaInvalid + IIF(EMPTY(m.lcListaInvalid), '', ', ') + ALLTRIM(STR(RECNO())) + lnRandInv = RECNO() + lnIdPartInv = id_part + lcDenumireInv = NVL(denumire, '') + lnTipPersInv = NVL(tip_persoana, 1) + lcContInv = NVL(cont, '') + INSERT INTO cCodInvalid (rand, id_part, denumire, cod_fiscal, tip_cod, tip_persoana, cont) ; + VALUES (m.lnRandInv, m.lnIdPartInv, m.lcDenumireInv, m.lcCod, IIF(m.llCnp, 'CNP', 'CUI'), m.lnTipPersInv, m.lcContInv) + SELECT (m.lcCursor) ENDIF ENDSCAN GO TOP loVerif = .NULL. IF m.lnInvalid > 0 - lcTextInvalid = CRLF + SPACE(10) + 'ATENTIE! Randuri cu cod fiscal invalid (' + ALLTRIM(STR(m.lnInvalid)) + '): ' + ALLTRIM(LEFT(m.lcListaInvalid, 50)) + ; + lcTextInvalid = CRLF + SPACE(10) + 'ATENTIE! Randuri cu cod fiscal invalid (' + ALLTRIM(STR(m.lnInvalid)) + ; + ': CNP ' + ALLTRIM(STR(m.lnInvalidCnp)) + ', CUI ' + ALLTRIM(STR(m.lnInvalid - m.lnInvalidCnp)) + '): ' + ALLTRIM(LEFT(m.lcListaInvalid, 50)) + ; + CRLF + SPACE(10) + IIF(m.llSilent, 'Lista completa: apasati butonul "Verificare coduri fiscale" de pe clienti/furnizori', 'Lista completa in fisierul Excel exportat') + ; CRLF + SPACE(10) + 'Stergeti CNP-urile din "Initializari cod taxa/plata" > "Stergere CNP-uri invalide", restul se corecteaza in nomenclatorul de parteneri' + IF !m.llSilent + goExport.export2xlsx('cCodInvalid', 'coduri_fiscale_invalide' + IIF(m.llClient, '_clienti_', '_furnizori_') + ALLTRIM(STR(m.gnAn)) + PADL(m.gnLuna,2,'0')) + SELECT (m.lcCursor) + ENDIF ENDIF IF RECCOUNT('cPartDif') > 0 @@ -1067,13 +1095,14 @@ and b1.cont = b2.cont lcMesaj ='Nu sunt diferente fata de balanta parteneri' + ; IIF(EMPTY(m.lcListaGol), '', CHR(13) + CHR(10) + SPACE(10) + 'Randuri cu ' + IIF(m.llClient, 'clienti', 'furnizori') + ' fara cod fiscal: ' + ALLTRIM(LEFT(m.lcListaGol, 50))) + m.lcTextInvalid IF !m.llSilent - AMESSAGEBOX(lcMesaj + CHR(13) + CHR(10) + m.lcText,0+64,_screen.Caption) + AMESSAGEBOX(m.lcMesaj,0+64,_screen.Caption) ENDIF ENDIF ENDIF USE IN (SELECT('cBalPartTemp')) - USE IN (SELECT('cPartDif')) + USE IN (SELECT('cPartDif')) + USE IN (SELECT('cCodInvalid')) Else llDontCloseCursor = .F. llExperimental = .F. @@ -1106,6 +1135,182 @@ and b1.cont = b2.cont RETURN lcMesaj ENDPROC && do_verifica_cui + ************************************************* + * Validare cod fiscal dupa regulile validatorului ANAF pentru RegistrationNumber/CustomerID + * tlCnp: .T. = cod de persoana fizica (CNP), .F. = cod de persoana juridica (CUI) + * toVerif: obiect VerificareCod, optional (ca sa nu se instantieze la fiecare cod) + ************************************************* + PROCEDURE CodFiscalValidSaft + LPARAMETERS tcCod, tlCnp, toVerif + LOCAL lcCod + + lcCod = ALLTRIM(UPPER(NVL(m.tcCod, ''))) + *!* la persoana juridica GenCustSupCode scoate atributul fiscal din codul SAF-T, la persoana fizica nu + IF !m.tlCnp AND LEFT(m.lcCod, 2) = 'RO' + lcCod = ALLTRIM(SUBSTR(m.lcCod, 3)) + ENDIF + + *!* 26.07.2026 ANAF cere numai cifre, fara zero la inceput, exact 13 la CNP si maxim 10 la CUI - validarea cifrei de control nu prinde asta + IF !EMPTY(CHRTRAN(m.lcCod, '0123456789', '')) OR LEFT(m.lcCod, 1) = '0' OR ; + IIF(m.tlCnp, LEN(m.lcCod) <> 13, !BETWEEN(LEN(m.lcCod), 2, 10)) + RETURN .F. + ENDIF + + RETURN IIF(m.tlCnp, VALIDARE_CNP(m.lcCod, m.toVerif), VALIDARE_CIF(m.lcCod, m.toVerif)) + ENDPROC && CodFiscalValidSaft + + ************************************************* + * Extrage din fisierul de raspuns al validatorului ANAF erorile de cod partener + * (RegistrationNumber/CustomerID/SupplierID) si le pune in cursorul cEroriPartSaft + * Intoarce textul de afisat, gol daca nu sunt astfel de erori + ************************************************* + PROCEDURE do_erori_partener_saft + LPARAMETERS tcFisierRaspuns + + LOCAL lcCod, lcCursor, lcDenumire, lcId, lcLinie, lcLocatie, lcMesaj, lcPagina, lcRest, lcSelect, lcTag, lcTipCod, lcTipPart + LOCAL lnFile, lnI, lnIdPart, lnJ, lnNrErori, lnParteneri, lnPoz, lnRand + + lcMesaj = '' + lcSelect = Select() + + IF !FILE(m.tcFisierRaspuns) + RETURN m.lcMesaj + ENDIF + + *!* fiecare eroare are 2 linii: localizarea "E: MasterFiles (1) sectiune Customers (1) sectiune Customer (162) ..." + *!* si regula " eroare regula: CustomerID: Pentru CustomerID 00I14770212 formatul este invalid" + CREATE CURSOR cErrTemp (saftpartid C(30), pagina C(10), rand N(7)) + lnFile = FOPEN(m.tcFisierRaspuns, 0) + IF m.lnFile < 0 + USE IN (SELECT('cErrTemp')) + SELECT (m.lcSelect) + RETURN m.lcMesaj + ENDIF + lcLocatie = '' + DO WHILE !FEOF(m.lnFile) + lcLinie = FGETS(m.lnFile, 8192) + IF LEFT(LTRIM(m.lcLinie), 2) == 'E:' + lcLocatie = m.lcLinie + LOOP + ENDIF + lnPoz = ATC('Pentru ', m.lcLinie) + IF m.lnPoz = 0 + LOOP + ENDIF + lcRest = ALLTRIM(SUBSTR(m.lcLinie, m.lnPoz + 7)) + lcTag = GETWORDNUM(m.lcRest, 1) + IF !INLIST(m.lcTag, 'RegistrationNumber', 'CustomerID', 'SupplierID') + LOOP + ENDIF + lcId = GETWORDNUM(m.lcRest, 2) + IF EMPTY(m.lcId) + LOOP + ENDIF + + *!* pagina si randul din grid = sectiunea si indexul partenerului din MasterFiles ("sectiune Customer (162)") + lcPagina = '' + lnRand = 0 + lnPoz = ATC('sectiune Customer (', m.lcLocatie) + IF m.lnPoz > 0 + lcPagina = 'Customers' + ELSE + lnPoz = ATC('sectiune Supplier (', m.lcLocatie) + IF m.lnPoz > 0 + lcPagina = 'Suppliers' + ENDIF + ENDIF + IF m.lnPoz > 0 + lnRand = INT(VAL(SUBSTR(m.lcLocatie, m.lnPoz + 19))) + ENDIF + + INSERT INTO cErrTemp (saftpartid, pagina, rand) VALUES (m.lcId, m.lcPagina, m.lnRand) + ENDDO + = FCLOSE(m.lnFile) + + * Un cod poate aparea pe mai multe randuri (parteneri diferiti cu acelasi cod) si in sectiunile de documente + SELECT saftpartid, COUNT(*) AS nr_erori, MAX(rand) AS max_rand FROM cErrTemp GROUP BY 1 INTO CURSOR cErrCod + SELECT DISTINCT saftpartid, pagina, rand FROM cErrTemp WHERE rand > 0 ORDER BY 2, 3 INTO CURSOR cErrGrup + USE IN (SELECT('cErrTemp')) + + * Identific partenerul dupa codul SAF-T, in cursoarele declaratiei + CREATE CURSOR cEroriPartSaft (pagina C(10), rand N(7), saftpartid C(30), tip_cod C(3), id_part N(10), denumire C(150), cod_fiscal C(30), tip_part C(9), nr_erori N(6)) + SELECT cErrGrup + SCAN + lcId = ALLTRIM(cErrGrup.saftpartid) + lcPagina = cErrGrup.pagina + lnRand = cErrGrup.rand + lnNrErori = 0 + SELECT cErrCod + LOCATE FOR ALLTRIM(cErrCod.saftpartid) == m.lcId + IF FOUND() + lnNrErori = cErrCod.nr_erori + ENDIF + lcTipPart = '' + lnIdPart = 0 + lcDenumire = '' + lcCod = '' + FOR lnJ = 1 TO 2 + lcCursor = IIF(m.lnJ = 1, 'cCustomers', 'cSuppliers') + IF !USED(m.lcCursor) + LOOP + ENDIF + SELECT (m.lcCursor) + LOCATE FOR ALLTRIM(NVL(saftpartid, '')) == m.lcId + IF FOUND() + lcTipPart = IIF(m.lnJ = 1, 'Client', 'Furnizor') + lnIdPart = NVL(id_part, 0) + lcDenumire = NVL(denumire, '') + lcCod = ALLTRIM(NVL(cod_fiscal, '')) + ENDIF + GO TOP + IF !EMPTY(m.lcTipPart) + EXIT + ENDIF + ENDFOR + lcTipCod = IIF(LEFT(m.lcId, 2) = '03', 'CNP', IIF(INLIST(LEFT(m.lcId, 2), '00', '01', '02'), 'CUI', '')) + INSERT INTO cEroriPartSaft (pagina, rand, saftpartid, tip_cod, id_part, denumire, cod_fiscal, tip_part, nr_erori) ; + VALUES (m.lcPagina, m.lnRand, m.lcId, m.lcTipCod, m.lnIdPart, m.lcDenumire, m.lcCod, m.lcTipPart, m.lnNrErori) + SELECT cErrGrup + ENDSCAN + USE IN (SELECT('cErrGrup')) + + * Codurile semnalate numai in sectiunile de documente, fara rand in Customers/Suppliers + SELECT cErrCod + SCAN FOR cErrCod.max_rand = 0 + lcId = ALLTRIM(cErrCod.saftpartid) + lcTipCod = IIF(LEFT(m.lcId, 2) = '03', 'CNP', IIF(INLIST(LEFT(m.lcId, 2), '00', '01', '02'), 'CUI', '')) + INSERT INTO cEroriPartSaft (pagina, rand, saftpartid, tip_cod, nr_erori) ; + VALUES ('', 0, m.lcId, m.lcTipCod, cErrCod.nr_erori) + SELECT cErrCod + ENDSCAN + USE IN (SELECT('cErrCod')) + + lnParteneri = RECCOUNT('cEroriPartSaft') + IF m.lnParteneri = 0 + USE IN (SELECT('cEroriPartSaft')) + SELECT (m.lcSelect) + RETURN m.lcMesaj + ENDIF + + lcMesaj = 'Coduri de partener respinse de validatorul ANAF: ' + ALLTRIM(STR(m.lnParteneri)) + lnI = 0 + SELECT cEroriPartSaft + SCAN + lnI = m.lnI + 1 + IF m.lnI > 10 + lcMesaj = m.lcMesaj + CHR(13) + CHR(10) + SPACE(3) + '...' + EXIT + ENDIF + lcMesaj = m.lcMesaj + CHR(13) + CHR(10) + SPACE(3) + PADR(ALLTRIM(cEroriPartSaft.pagina), 11) + ; + PADL(IIF(cEroriPartSaft.rand > 0, ALLTRIM(STR(cEroriPartSaft.rand)), '-'), 5) + SPACE(2) + ; + PADR(ALLTRIM(cEroriPartSaft.saftpartid), 18) + PADR(ALLTRIM(cEroriPartSaft.tip_cod), 4) + ALLTRIM(cEroriPartSaft.denumire) + ENDSCAN + GO TOP + SELECT (m.lcSelect) + + RETURN m.lcMesaj + ENDPROC && do_erori_partener_saft + && IAU SOLDURILE DIN BALANTA DE VERIFICARE PENTRU CONTURILE DE IMOBLIZARI SI AMORTIZARI && SI LE COMPAR CU VALOAREA DE INVENTAR SI AMORTIZAREA TOTALA DIN IMOBILIZARI CORPORALE/NECORPORALE CONTABIL Procedure do_verifica_imobilizari @@ -2077,48 +2282,59 @@ select a.id_articol, a.denumire, SUM(r.cant) as cant, SUM(r.cante) as cante, SUM ENDPROC && CompletareCodTaxaPlata ************************************* - * Stergere cod fiscal la persoanele cu CNP invalid, din partenerii cu rulaje in perioada declaratiei + * Stergere cod fiscal la persoanele cu CNP invalid, din clientii/furnizorii declaratiei + * Aceleasi randuri pe care le semnaleaza verificarea codurilor fiscale (do_verifica_cui) PROCEDURE StergereCnpInvalid - Local lcCod, lcLista, lcMesaj, lcSelect, lcSql, llSucces, lnAn1, lnAn2, lnLuna1, lnLuna2, lnNr, lnRand + Local lcCod, lcCursor, lcLista, lcMesaj, lcSelect, lcSql, llCnp, llSucces, lnAn2, lnI, lnLuna2, lnNr, lnRand, loVerif + Local lcCodInv, lcDenumireInv, lnIdPartInv, lnTipPersInv lcSelect = Select() - lnAn1 = This.oUnitate.an1 - lnLuna1 = This.oUnitate.luna1 lnAn2 = This.oUnitate.an2 lnLuna2 = This.oUnitate.luna2 - * Candidati: cod fiscal numeric, persoana fizica sau cod mai lung de 10 cifre (nu poate fi CUI), cu rulaje in perioada - Text To m.lcSql Noshow Textmerge -select p.id_part, p.denumire, p.cod_fiscal, p.tip_persoana - from nom_parteneri p - where nvl(p.sters, 0) = 0 - and regexp_like(trim(p.cod_fiscal), '^[0-9]+$') - and (p.tip_persoana = 2 or length(trim(p.cod_fiscal)) > 10) - and exists (select 1 - from balanta_parteneri b - where b.id_part = p.id_part - and b.an * 12 + b.luna between <> and <> - and (nvl(b.debit, 0) <> 0 or nvl(b.credit, 0) <> 0) - and b.cont in ('4111','4118','461','418','419','401','404','462','408','409')) - order by p.denumire - Endtext - - llSucces = goExecutor.oExecuta(m.lcSql, 'cCnpTemp') - If !m.llSucces + If !Used('cCustomers') And !Used('cSuppliers') + Amessagebox('Apasati intai pe 1. Citeste date!', 0+64, _Screen.Caption) Select (m.lcSelect) Return .F. Endif - * Retin doar codurile care nu trec de validarea CNP (lungime + cifra de control) - Select id_part, denumire, cod_fiscal, tip_persoana ; + *!* 26.07.2026 candidatii se iau din cursoarele declaratiei, cu aceleasi criterii ca verificarea codurilor fiscale + Create Cursor cCnpTemp (id_part N(10), denumire C(150), cod_fiscal C(30), tip_persoana N(1)) + loVerif = Createobject('VerificareCod') + For lnI = 1 To 2 + lcCursor = Iif(m.lnI = 1, 'cCustomers', 'cSuppliers') + If !Used(m.lcCursor) + Loop + Endif + Select (m.lcCursor) + Scan For !Empty(Nvl(id_part, 0)) And !Empty(Nvl(cod_fiscal, '')) ; + And Inlist(Alltrim(Nvl(cod_tara, 'RO')), 'RO', '') + lcCod = Alltrim(cod_fiscal) + llCnp = (Nvl(tip_persoana, 1) = 2) Or (Len(Chrtran(m.lcCod, '0123456789', '')) = 0 And Len(m.lcCod) > 10) + If m.llCnp And !This.CodFiscalValidSaft(m.lcCod, .T., m.loVerif) + lnIdPartInv = id_part + lcDenumireInv = Nvl(denumire, '') + lcCodInv = m.lcCod + lnTipPersInv = Nvl(tip_persoana, 1) + Insert Into cCnpTemp (id_part, denumire, cod_fiscal, tip_persoana) ; + Values (m.lnIdPartInv, m.lcDenumireInv, m.lcCodInv, m.lnTipPersInv) + Select (m.lcCursor) + Endif + Endscan + Go Top + Endfor + loVerif = .NULL. + + * Un partener apare pe cate un rand pentru fiecare cont, deci elimin dublurile + Select Distinct id_part, denumire, cod_fiscal, tip_persoana ; From cCnpTemp ; - Where !ValidCNP(Alltrim(Nvl(cod_fiscal, ''))) ; + Order By denumire ; Into Cursor cCnpInvalid Use In (Select('cCnpTemp')) lnNr = Reccount('cCnpInvalid') If m.lnNr = 0 - Amessagebox('Nu sunt parteneri cu CNP invalid in perioada declaratiei!', 0+64, _Screen.Caption) + Amessagebox('Nu sunt parteneri cu CNP invalid in declaratie!', 0+64, _Screen.Caption) Use In (Select('cCnpInvalid')) Select (m.lcSelect) Return .T. @@ -2126,7 +2342,7 @@ select p.id_part, p.denumire, p.cod_fiscal, p.tip_persoana goExport.export2xlsx('cCnpInvalid', 'cnp_invalide_saft_' + Alltrim(Str(m.lnAn2)) + Padl(m.lnLuna2, 2, '0')) - lcMesaj = 'S-au gasit ' + Alltrim(Str(m.lnNr)) + ' parteneri cu CNP invalid in perioada declaratiei.' + Chr(13) + Chr(10) + ; + lcMesaj = 'S-au gasit ' + Alltrim(Str(m.lnNr)) + ' parteneri cu CNP invalid in declaratie.' + Chr(13) + Chr(10) + ; 'Doriti stergerea codului fiscal eronat si trecerea lor pe persoana fizica?' + Chr(13) + Chr(10) + ; '(la SAF-T persoanele fizice nu sunt obligate sa aiba CNP)' If Amessagebox(m.lcMesaj, 4+32, _Screen.Caption) <> 6 @@ -2140,7 +2356,9 @@ select p.id_part, p.denumire, p.cod_fiscal, p.tip_persoana lnRand = 0 llSucces = .T. Select cCnpInvalid - Scan While m.llSucces + *!* 26.07.2026 exportul lasa pointerul pe EOF, deci pozitionez pe primul rand inainte de parcurgere + Go Top + Scan lcLista = m.lcLista + Iif(Empty(m.lcLista), '', ',') + Alltrim(Str(cCnpInvalid.id_part)) lnRand = m.lnRand + 1 If m.lnRand = 1000 Or Recno() = m.lnNr @@ -2149,11 +2367,15 @@ select p.id_part, p.denumire, p.cod_fiscal, p.tip_persoana lcLista = '' lnRand = 0 Endif + If !m.llSucces + Exit + Endif Endscan If m.llSucces - Amessagebox('Stergere efectuata cu succes!' + Chr(13) + Chr(10) + ; - 'Apasati pe 1. Citeste date pentru a actualiza datele din declaratie', 0+64, _Screen.Caption) + Amessagebox('Stergere efectuata cu succes (' + Alltrim(Str(m.lnNr)) + ' parteneri)!' + Chr(13) + Chr(10) + ; + 'Apasati pe 1. Citeste date pentru a actualiza datele din declaratie' + Chr(13) + Chr(10) + ; + '(pana la re-citire, verificarile arata tot codurile vechi)', 0+64, _Screen.Caption) Endif Use In (Select('cCnpInvalid')) diff --git a/changelog_roacont.txt b/changelog_roacont.txt index 5adf597..dc97558 100644 --- a/changelog_roacont.txt +++ b/changelog_roacont.txt @@ -1,3 +1,19 @@ + +