sync SVN r18216

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019WVojuH5cuQwzKfxdn94oM
This commit is contained in:
2026-09-28 15:51:11 +03:00
parent 88bd6627d5
commit 2519cac3dc

View File

@@ -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