Import eFactura in lot: borderou cu ce lipseste, coada de contabilizare, alegerea contului

Borderoul tine per factura ce mai are de completat si daca are articole de gestiune
(camp gest, coloana si filtru), coada contabilizeaza in serie facturile bifate si
incheie cu un rezumat, iar contul de furnizor/client se alege din planul de conturi.
Cheia normalizata de articol, rezolvarea automata a partenerului si anularea in bloc
intra tot aici. Pozitia in lista se pastreaza peste reaplicarea filtrului.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Aroafxp4z8bmM5oVECZRXY
This commit is contained in:
2026-09-09 21:35:07 +03:00
parent 8e022d332e
commit 940bb39701
48 changed files with 10602 additions and 519 deletions

View File

@@ -0,0 +1,151 @@
* rezolvare_partener_ef.prg
*!* 07.09.2026
*!* marius.mutu
*!* identifica partenerul ROA dupa codul fiscal din eFactura (o singura interogare pentru ambele
*!* variante, cu si fara prefix RO) si, daca nu exista deloc, il creeaza automat, refolosind
*!* maparea din But_nou1.Click (anaf_efactura.vc2). Fara UI: rezultatul e o structura pe care
*!* ecranul o consuma si decide singur ce arata utilizatorului.
DEFINE CLASS RezolvarePartenerEF AS Custom
*!* Cauta partenerul dupa codul fiscal (ambele variante RO) si, daca nu-l gaseste deloc, il
*!* creeaza automat din datele eFacturii. Intoarce un obiect: cStare (gasit/gasit_inactiv/
*!* mai_multi/inexistent/creat), nIdPartener (ales sau nou creat, 0 daca nu s-a decis),
*!* cAtentionare (text pentru utilizator, gol daca nu e cazul), nCandidati/aCandidati
*!* (nIdPart, cDenumire, cCodFiscal, lActiv) pentru starea mai_multi.
PROCEDURE Rezolva
LPARAMETERS tcCodFiscal, tcDenumire, tlPrimite
LOCAL loRezultat, lcSql, llSucces, lnActivi, lnInactivi, lnIdActiv, lnIdInactiv, lnIdNou
PRIVATE pcCifBare, pcCifRo
loRezultat = This.RezultatGol()
pcCifBare = This.CifBare(m.tcCodFiscal)
IF EMPTY(m.pcCifBare)
loRezultat.cAtentionare = 'eFactura nu are cod fiscal, nu se poate identifica partenerul'
RETURN loRezultat
ENDIF
pcCifRo = 'RO' + m.pcCifBare
lcSql = "select id_part, denumire, cod_fiscal, inactiv from nom_parteneri" + ;
" where sters = 0 and replace(upper(cod_fiscal),' ','') in (?pcCifBare, ?pcCifRo)"
llSucces = goExecutor.oExecuta(m.lcSql, 'cRezolvarePartener')
IF !m.llSucces
loRezultat.cAtentionare = 'eroare la cautarea partenerului: ' + goExecutor.cEroare
RETURN loRezultat
ENDIF
lnActivi = 0
lnInactivi = 0
lnIdActiv = 0
lnIdInactiv = 0
SELECT cRezolvarePartener
SCAN
This.AdaugaCandidat(loRezultat, id_part, denumire, cod_fiscal, NVL(inactiv, 0) = 0)
IF NVL(inactiv, 0) = 0
lnActivi = lnActivi + 1
lnIdActiv = id_part
ELSE
lnInactivi = lnInactivi + 1
lnIdInactiv = id_part
ENDIF
ENDSCAN
USE IN (SELECT('cRezolvarePartener'))
DO CASE
CASE m.lnActivi = 1
loRezultat.cStare = 'gasit'
loRezultat.nIdPartener = m.lnIdActiv
CASE m.lnActivi >= 2
loRezultat.cStare = 'mai_multi'
loRezultat.cAtentionare = 'CIF ambiguu in ROA: ' + TRANSFORM(m.lnActivi) + ' parteneri activi, alegeti partenerul'
CASE m.lnActivi = 0 AND m.lnInactivi = 1
loRezultat.cStare = 'gasit_inactiv'
loRezultat.nIdPartener = m.lnIdInactiv
loRezultat.cAtentionare = 'partenerul gasit este inactiv in ROA'
CASE m.lnActivi = 0 AND m.lnInactivi >= 2
loRezultat.cStare = 'mai_multi'
loRezultat.cAtentionare = 'CIF ambiguu in ROA: ' + TRANSFORM(m.lnInactivi) + ' parteneri inactivi, alegeti partenerul'
OTHERWISE
lnIdNou = This.CreeazaPartener(m.tcCodFiscal, m.tcDenumire, m.tlPrimite)
IF m.lnIdNou > 0
loRezultat.cStare = 'creat'
loRezultat.nIdPartener = m.lnIdNou
loRezultat.cAtentionare = 'partener nou, creat automat din eFactura'
ELSE
loRezultat.cStare = 'inexistent'
loRezultat.cAtentionare = 'partenerul nu exista in ROA si nu a putut fi creat automat'
ENDIF
ENDCASE
RETURN loRezultat
ENDPROC
*!* Normalizeaza codul fiscal la forma fara prefix RO (scoate doar prefixul, nu 'RO' oriunde in sir)
PROCEDURE CifBare
LPARAMETERS tcCodFiscal
LOCAL lcCif
lcCif = STRTRAN(UPPER(ALLTRIM(NVL(m.tcCodFiscal, ''))), ' ', '')
IF LEFT(m.lcCif, 2) == 'RO'
lcCif = SUBSTR(m.lcCif, 3)
ENDIF
RETURN ALLTRIM(m.lcCif)
ENDPROC
*!* Creeaza silentios partenerul, cu maparea folosita si de But_nou1.Click (anaf_efactura.vc2):
*!* denumire, cod_fiscal (exact cum vine din eFactura), id_tip_part (17 furnizor/16 client),
*!* tip_persoana din ValidCNP. Aici lSilentios = .T. (fara formular), spre deosebire de butonul
*!* manual. Intoarce id-ul noului partener sau 0 la esec.
PROCEDURE CreeazaPartener
LPARAMETERS tcCodFiscal, tcDenumire, tlPrimite
LOCAL loDate, loDate2, llCNP, lnTipPersoana, lnIdPartener
lnIdPartener = 0
llCNP = ValidCNP(m.tcCodFiscal)
lnTipPersoana = IIF(m.llCNP, 2, 1)
loDate = CREATEOBJECT('Empty')
* id_part = 0: nom_parteneri_nou scrie id-ul nou creat inapoi in aceasta proprietate,
* pe calea silentioasa trebuie sa existe deja pe obiect (altfel "Property ID_PART is not found")
ADDPROPERTY(loDate, 'id_part', 0)
ADDPROPERTY(loDate, 'denumire', ALLTRIM(NVL(m.tcDenumire, '')))
ADDPROPERTY(loDate, 'cod_fiscal', ALLTRIM(NVL(m.tcCodFiscal, '')))
ADDPROPERTY(loDate, 'id_tip_part', IIF(m.tlPrimite, 17, 16))
* creare silentioasa (cus_odata_parteneri.make_sql) citeste tip_partener, nu id_tip_part
ADDPROPERTY(loDate, 'tip_partener', IIF(m.tlPrimite, 17, 16))
ADDPROPERTY(loDate, 'lSilentios', .T.)
loDate2 = nom_parteneri_nou(, , , m.lnTipPersoana, , m.loDate)
IF TYPE('loDate2') = 'O' AND TYPE('loDate2.id_part') = 'N'
lnIdPartener = NVL(loDate2.id_part, 0)
ENDIF
RETURN m.lnIdPartener
ENDPROC
PROCEDURE RezultatGol
LOCAL loRezultat
loRezultat = CREATEOBJECT('Empty')
ADDPROPERTY(loRezultat, 'cStare', 'inexistent')
ADDPROPERTY(loRezultat, 'nIdPartener', 0)
ADDPROPERTY(loRezultat, 'cAtentionare', '')
ADDPROPERTY(loRezultat, 'nCandidati', 0)
ADDPROPERTY(loRezultat, 'aCandidati[1]')
RETURN loRezultat
ENDPROC
PROCEDURE AdaugaCandidat
LPARAMETERS toRezultat, tnIdPart, tcDenumire, tcCodFiscal, tlActiv
LOCAL loCandidat, lnN
loCandidat = CREATEOBJECT('Empty')
ADDPROPERTY(loCandidat, 'nIdPart', m.tnIdPart)
ADDPROPERTY(loCandidat, 'cDenumire', ALLTRIM(NVL(m.tcDenumire, '')))
ADDPROPERTY(loCandidat, 'cCodFiscal', ALLTRIM(NVL(m.tcCodFiscal, '')))
ADDPROPERTY(loCandidat, 'lActiv', m.tlActiv)
lnN = toRezultat.nCandidati + 1
DIMENSION toRezultat.aCandidati(m.lnN)
toRezultat.aCandidati(m.lnN) = m.loCandidat
toRezultat.nCandidati = m.lnN
ENDPROC
ENDDEFINE