* 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