From 2519cac3dcd3e12953c33dc1abb128d3809df02e Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Mon, 28 Sep 2026 15:51:11 +0300 Subject: [PATCH] sync SVN r18216 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019WVojuH5cuQwzKfxdn94oM --- Programe/oproceduri_import.prg | 109 +++++++++++++++++++++++++++++++-- 1 file changed, 103 insertions(+), 6 deletions(-) diff --git a/Programe/oproceduri_import.prg b/Programe/oproceduri_import.prg index d05bd2f..3153dad 100644 --- a/Programe/oproceduri_import.prg +++ b/Programe/oproceduri_import.prg @@ -282,6 +282,7 @@ Define Class ExtrasBanca As Custom lCreeazaParteneri = .F. && creeaza parteneri daca nu exista (dupa cod fiscal) lFactura = .F. lComanda = .F. + lCurier = .F. && borderou de curier: rambursul se potriveste doar pe suma exacta, fara FIFO si avans cFile = '' && fisierul de import @@ -634,6 +635,14 @@ Define Class ExtrasBanca As Custom lcPartener = '' ENDIF ENDIF + * la curier: toate fisele cu aceeasi denumire, in orice ordine a cuvintelor, intra in grupul partenerului + IF This.lCurier And !EMPTY(m.lnIdPartener) And Empty(m.lcCodFiscal) + AdaugaGrupNume(m.lnIdPartener, m.lcDenumire) + * si denumirea din baza, cand partenerul a fost gasit prin normalizare + IF !(Upper(m.lcPartener) == m.lcDenumire) + AdaugaGrupNume(m.lnIdPartener, Upper(m.lcPartener)) + ENDIF + ENDIF ENDIF * Caut partener dupa IBAN @@ -881,13 +890,13 @@ Define Class ExtrasBanca As Custom * Aloc facturile deschise ale partenerului pe suma randului: numar din text, suma exacta, FIFO, rest pe avans llAlocatFacturi = .F. If This.lFactura And !Empty(m.lnIdPartener) And Inlist(m.lcContPartener, '401', '4111') And m.llMonedaNationala - llAlocatFacturi = AlocaFacturiRand(m.lcTip, m.lcContPartener, m.lnIdPartener, m.lcPartener) + llAlocatFacturi = AlocaFacturiRand(m.lcTip, m.lcContPartener, m.lnIdPartener, m.lcPartener, This.lCurier) Endif * Acum asociez doar UN SINGUR DOCUMENT, daca este completat in detaliile operatiei * Incerc sa aflu documentul pereche dupa cont, partener, suma, numar document doar daca am un singur document!!! daca sunt mai multe se complica cazurile - If This.lComanda And !m.llAlocatFacturi && daca este configurata optiunea sa se caute documentele pereche dupa comanda + If This.lComanda And !m.llAlocatFacturi And !This.lCurier && daca este configurata optiunea sa se caute documentele pereche dupa comanda lcDocumente = Alltrim(cActTemp.comenzi) lnSuma = cActTemp.suma lnDocumente = Getwordcount(m.lcDocumente, ",") @@ -1108,9 +1117,10 @@ Enddefine && ExtrasBanca * Aloca randul curent din cActTemp (SCAN activ in CreeazaNote) pe facturile deschise ale partenerului, din cSolduriFact: * N (numar din text) -> S (suma exacta unica) -> F (FIFO) -> A (rest pe avans 419/409, doar pe contul de baza 4111/401) * Scrie alocarile in cAlocTemp (nrec, npoz, id_fact, nract, cont, acont, suma, csursa); intoarce .T. daca a alocat ceva +* La curier (tlCurier): S pe tot grupul de nume, fara F si A - fara potrivire unica randul ramane intreg * -------------------------------------------------------------------- Function AlocaFacturiRand - Lparameters tcTip, tcContPartener, tnIdPartener, tcPartener + Lparameters tcTip, tcContPartener, tnIdPartener, tcPartener, tlCurier Local lnRest, lnSuma, lcNumere, lnNpoz, lcContAloc, lcContAvans, llAvansDeschis Local lnIdPartCandidat, lcPartCandidat, lnRecCrt, lcSelect @@ -1152,6 +1162,15 @@ Function AlocaFacturiRand Endif Endif + * 2. S - suma exacta unica, doar daca pasul 1 n-a alocat nimic; la curier pe tot grupul de nume + If m.lnNpoz = 0 + If m.tlCurier + AlocaSumaExactaGrup(m.tnIdPartener, m.tcContPartener, m.lnSuma, m.lnRecCrt, @lnRest, @lnNpoz, @lcContAloc, @lnIdPartCandidat, @lcPartCandidat) + Else + AlocaSumaExacta(m.lnIdPartCandidat, m.tcContPartener, m.lnSuma, m.lnRecCrt, @lnRest, @lnNpoz, @lcContAloc) + Endif + Endif + If m.lnNpoz > 0 And m.lnIdPartCandidat <> m.tnIdPartener Select cActTemp Go m.lnRecCrt @@ -1162,9 +1181,10 @@ Function AlocaFacturiRand Endif Endif - * 2. S - suma exacta unica, doar daca pasul 1 n-a alocat nimic - If m.lnNpoz = 0 - AlocaSumaExacta(m.lnIdPartCandidat, m.tcContPartener, m.lnSuma, m.lnRecCrt, @lnRest, @lnNpoz, @lcContAloc) + * curier: un ramburs = o factura; fara potrivire unica randul ramane intreg, nealocat + If m.tlCurier + Select (m.lcSelect) + Return (m.lnNpoz > 0) Endif llAvansDeschis = Used('cAvansExistent') And Seek(m.tnIdPartener, 'cAvansExistent') @@ -1324,6 +1344,82 @@ Procedure AlocaSumaExacta Use In (Select('cCandRand')) Endproc +* -------------------------------------------------------------------- +* S la curier: exact un candidat cu ramasul egal cu suma, pe partenerul randului sau pe grupul lui (cGrupParteneriCui); +* il aloca integral si intoarce partenerul lui in tnIdPartCandidat / tcPartCandidat +* -------------------------------------------------------------------- +Procedure AlocaSumaExactaGrup + Lparameters tnIdPart, tcCont, tnSuma, tnRecCrt, tnRest, tnNpoz, tcContAloc, tnIdPartCandidat, tcPartCandidat + Local lnCandidati, lnRecPotrivit, lnIdPotrivit, lcPartPotrivit + + If Used('cGrupSuma') + Use In (Select('cGrupSuma')) + Endif + Create Cursor cGrupSuma (id_part N(10), denumire C(100)) + Insert Into cGrupSuma (id_part, denumire) Values (m.tnIdPart, m.tcPartCandidat) + If Used('cGrupParteneriCui') + Select cGrupParteneriCui + Scan For id_part_ales = m.tnIdPart And id_part <> m.tnIdPart + Insert Into cGrupSuma (id_part, denumire) Values (cGrupParteneriCui.id_part, cGrupParteneriCui.denumire) + Select cGrupParteneriCui + Endscan + Endif + + lnCandidati = 0 + lnRecPotrivit = 0 + lnIdPotrivit = 0 + lcPartPotrivit = '' + Select cGrupSuma + Scan + DeschideCandidatiFactura(cGrupSuma.id_part, m.tcCont) + Select cCandRand + Scan + If RamasFactura(nrecsold) = m.tnSuma + lnCandidati = m.lnCandidati + 1 + lnRecPotrivit = nrecsold + lnIdPotrivit = cGrupSuma.id_part + lcPartPotrivit = Alltrim(cGrupSuma.denumire) + Endif + Endscan + Use In (Select('cCandRand')) + Select cGrupSuma + Endscan + Use In (Select('cGrupSuma')) + + If m.lnCandidati = 1 + tnIdPartCandidat = m.lnIdPotrivit + tcPartCandidat = m.lcPartPotrivit + AplicaAlocareFactura(m.tnRecCrt, m.lnRecPotrivit, "S", @tnRest, @tnNpoz, @tcContAloc) + Endif +Endproc + +* -------------------------------------------------------------------- +* Adauga in cGrupParteneriCui, pentru partenerul ales, partenerii activi cu aceeasi denumire in orice ordine a cuvintelor +* -------------------------------------------------------------------- +Procedure AdaugaGrupNume + Lparameters tnIdPartener, tcDenumire + Local lcVariante, lcLista, lnI, lcSql + + lcVariante = m.tcDenumire + ';' + GetNamePermutations(m.tcDenumire, .T.) + lcLista = '' + For lnI = 1 To Getwordcount(m.lcVariante, ';') + lcLista = m.lcLista + Iif(Empty(m.lcLista), '', ',') + "'" + Strtran(Alltrim(Getwordnum(m.lcVariante, m.lnI, ';')), "'", "''") + "'" + Endfor + lcSql = [select id_part, denumire from nom_parteneri where sters = 0 and inactiv = 0 and trim(upper(denumire)) in (] + m.lcLista + [)] + If goExecutor.oExecuta(m.lcSql, 'cGrupNumeTemp') + Select cGrupNumeTemp + Scan For id_part <> m.tnIdPartener + Select cGrupParteneriCui + Locate For id_part_ales = m.tnIdPartener And id_part = cGrupNumeTemp.id_part + If !Found() + Insert Into cGrupParteneriCui (id_part_ales, id_part, denumire) Values (m.tnIdPartener, cGrupNumeTemp.id_part, Alltrim(Nvl(cGrupNumeTemp.denumire, ''))) + Endif + Select cGrupNumeTemp + Endscan + Use In (Select('cGrupNumeTemp')) + Endif +Endproc + * -------------------------------------------------------------------- * F - aloca in ordine cronologica pana la epuizarea sumei (ultima factura poate ramane platita partial), doar pe contul randului * -------------------------------------------------------------------- @@ -3086,6 +3182,7 @@ Define Class ExtrasBanca_General As ExtrasBanca IF EMPTY(this.cIBAN) This.cIBAN = m.mtipimport ENDIF + This.lCurier = Inlist(m.mtipimport, "GLS", "FAN", "Cargus", "SameDay") Endfunc * Procedure csvFirstBank