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

@@ -52,8 +52,10 @@
*!* 03.09.2024
*!* ProcentTva2IdJtva - tratare procent TVA 0 si taxare inversa (eFactura)
*!* 05.12.2024
*!* GetArticolEFByPartDenumire - caut si articolele fara id_articol, in caz ca sunt servicii, nu articole gestionabile ROA
*!* 03.09.2026
*!* marius.mutu
*!* GetArticolEFByPartDenumire - invelis peste RecunoastereArticolEF: cascada text exact ->
*!* cheie normalizata in istoricul furnizorului, plus parametrul de iesire tcSursa (EXACT/APROX)
*!* 15.01.2025
*!* GetDocumentByContPartenerAct - se cauta comanda si in IREG_PARTENERI.EXPLICATIA
@@ -7335,61 +7337,46 @@ ENDPROC && GetArticolById
**************************************
*** Intoarce un obiect din ANAF_VEFACTURA_DETALII/id_articol dupa cod fiscal furnizor/client si denumire
*** Cauta in articolele furnizorului/clientului, ultima aparitie a articolului respectiv
*** Cauta in istoricul furnizorului/clientului cascada RecunoastereArticolEF.PotrivesteArticol
*** (text exact, apoi cheie normalizata), ultima aparitie a articolului respectiv
*** lnIdArticol = GetArticolEFByPartDenumire("cod fiscal", "articol", .T.)
*** loArticol = GetArticolByCodDenumire("articol", "cod bare", "cod furnizor", "cod client", IdPart, .F.)
**************************************
Procedure GetArticolEFByPartDenumire
lParameters tcCodFiscal, tlPrimite, tcDenumire, tlReturnId, tnIdEfactura
lParameters tcCodFiscal, tlPrimite, tcDenumire, tlReturnId, tnIdEfactura, tcSursa
* tcCodFiscal : cod fiscal client/furnizor
* tlPrimite: facturi primite / emise
* tcDenumire: denumire articol
* tlReturnId: .T. = intoarce id_articol, .F. = intoarce obiect
* tlReturnId: .T. = intoarce id_articol, .F. = intoarce obiect
* tnIdEfactura: id_efactura curenta. sa nu caut articolul in factura curenta, ci in facturile anterioare
Private pcDenumire, pcCodBare, pcCodFurnizor, pcCodCLient, pnIdPart, pnIdEfactura
Local lcSql, lnSucces, lcSelect, loArticol, loReturn, lcColoanaCodFiscal
* tcSursa: parametru de iesire optional (@tcSursa) - 'EXACT'/'APROX' la gasire, '' cand nu s-a gasit nimic
Local lcSelect, loArticol, loReturn, loRecunoastere, lcSursa
lcSelect = SELECT()
loArticol = null
loReturn = Null
pcDenumire = UPPER(Alltrim(NVL(m.tcDenumire, '')))
pcCodFiscal = UPPER(ALLTRIM(NVL(m.tcCodFiscal, '')))
pnIdArticol = 0
pnIdEfactura = IIF(!EMPTY(NVL(tnIdEfactura, 0)), m.tnIdEfactura, 0)
lcColoanaCodFiscal = IIF(m.tlPrimite, "e.cod_fiscal_emitent", "e.cod_fiscal_beneficiar")
TEXT TO lcSql TEXTMERGE NOSHOW
SELECT * FROM (SELECT d.* FROM ANAF_VEFACTURA_DETALII d LEFT JOIN ANAF_EFACTURA e ON (e.id = d.id_efactura)
WHERE <<m.lcColoanaCodFiscal>> = ?pcCodFiscal AND TRIM(UPPER(d.articol)) = ?pcDenumire and id_articol is not null ORDER BY d.id desc) WHERE rownum = 1
ENDTEXT
loReturn = Null
llSucces = goExecutor.oSelecteaza2Object(m.lcSql, @loArticol)
loRecunoastere = Createobject('RecunoastereArticolEF')
loArticol = loRecunoastere.PotrivesteArticol(m.tcCodFiscal, m.tlPrimite, m.tcDenumire, m.tnIdEfactura, @lcSursa)
tcSursa = m.lcSursa
If m.llSucces
* Daca nu am gasit factura cu articol ROA (este posibil sa fie de servicii, fara articole gestionabile)
* Caut articolelele anterioare, fara id_articol
IF EMPTY(NVL(loArticol.id_articol,0)) AND !EMPTY(NVL(m.tnIdEfactura,0))
TEXT TO lcSql TEXTMERGE NOSHOW
SELECT * FROM (SELECT d.* FROM ANAF_VEFACTURA_DETALII d LEFT JOIN ANAF_EFACTURA e ON (e.id = d.id_efactura)
WHERE <<m.lcColoanaCodFiscal>> = ?pcCodFiscal AND TRIM(UPPER(d.articol)) = ?pcDenumire and e.id <> ?pnIdEFactura ORDER BY d.id desc) WHERE rownum = 1
ENDTEXT
IF ISNULL(m.loArticol)
* obiect cu proprietatile ANAF_VEFACTURA_DETALII la valoarea implicita a tipului, nu NULL, cand cascada nu gaseste nimic
loArticol = loRecunoastere.oGol
IF ISNULL(m.loArticol)
* cascada s-a oprit pe eroare de date, fara sa aduca structura
goExecutor.oSelecteaza2Object("SELECT * FROM ANAF_VEFACTURA_DETALII WHERE 1 = 0", @loArticol)
ENDIF
ENDIF
llSucces = goExecutor.oSelecteaza2Object(m.lcSql, @loArticol)
ENDIF
ENDIF
IF m.llSucces
IF m.tlReturnId
loReturn = loArticol.id_articol
ELSE
loReturn = loArticol
ENDIF
IF m.tlReturnId
loReturn = loArticol.id_articol
ELSE
loReturn = loArticol
ENDIF
SELECT (m.lcSelect)
Return loReturn
ENDPROC && GetArticolEFByPartDenumire