Specificație pentru ECB

Algoritmul de calcul

Calculul diferenței de curs, pas cu pas

Algoritm · versiunea 1 · 6 noiembrie 2026 · după PRD, versiunea 0.2

1. Când rulează

Lunar, pentru fiecare firmă-client, după importul în SAGA al XML-ului de încasări și plăți și înainte de închiderea lunii. Contabilul pornește doi pași: „Populează lista” (ECB aduce perechile din Nucleu) și „Generează notele” (ECB face calculul de mai jos).

2. Intrarea: o pereche factură–plată

ECB ia din Nucleu doar perechile reconciliate de Lotus, 1 la 1. O factură plătită în două tranșe înseamnă două perechi. Pentru fiecare pereche:

CâmpCe e
factura.suma, factura.datasuma în valută și data facturii
factura.curscursul la care a fost înregistrată factura
factura.tipprimită (de la furnizor) sau emisă (către client)
plata.sumaValsuma plătită sau încasată, în valuta facturii
plata.sumaLeidoar la plata din Cont RON: suma plătită în lei
plata.data, plata.cursdata și cursul plății sau al încasării
plata.contcontul bancar: 5121.01 RON, 5124.01 EUR, 5124.02 USD, 5124.03 GBP
plata.tipplată sau încasare
valuta, partener, factura.numarvaluta, furnizorul sau clientul, numărul facturii

3. Pasul 1 — cursul facturii (cursul de bază)

4. Pasul 2 — diferența în lei

5. Pasul 3 — favorabilă sau nefavorabilă

Tranzacțiadif > 0dif < 0
Plată (factură primită)nefavorabilăfavorabilă
Încasare (factură emisă)favorabilănefavorabilă

6. Pasul 4 — nota contabilă

7. Pasul 5 — fișierul CSV pentru SAGA

Un singur fișier pe firmă-client și pe lună, cu toate notele lunii, refăcut la fiecare generare. UTF-8 cu BOM, coloane despărțite prin virgulă, rânduri CRLF, data în formatul zz.ll.aaaa:

DATA,NDP,CONT_D,CONT_C,SUMA,EXPLICATIE
14.10.2026,DIFF1,6651,5124.01,12.00,dif. curs fact. FP-101 Adobe Systems Ireland

⚠ Separatorul zecimal al sumei se confirmă la primul import în SAGA.

8. Pasul 6 — fără note duble

După generare, factura și plata trec din „de procesat” în „procesată”. O plată procesată nu mai primește notă, nici la o nouă populare sau generare.

9. Pe scurt, ca pseudocod

pentru fiecare pereche (factura, plata) cu status "de procesat":
    daca luna(factura.data) == luna(plata.data):
        baza = factura.curs                          # „factură”
    altfel:
        baza = curs_inchidere(ultima_luna_inchisa, valuta)   # „reevaluare”

    daca plata.cont == "5121.01":
        dif = plata.sumaLei - plata.sumaVal * baza
    altfel:
        dif = plata.sumaVal * (plata.curs - baza)
    dif = rotunjeste(dif, 2)

    daca dif != 0:
        nefav = (dif > 0) daca plata.tip == "plata" altfel (dif < 0)
        debit, credit = ("6651", plata.cont) daca nefav altfel (plata.cont, "7651")
        nota = (plata.data, NDP_urmator(plata.data), debit, credit, abs(dif),
                "dif. curs fact. " + factura.numar + " " + partener)
        adauga nota in fisierul CSV al lunii

    marcheaza factura si plata "procesata"

10. Exemple

  1. Plată din cont în valută, factură din aceeași lună. Factură primită de 1.000 EUR la 4,9700; se plătesc 400 EUR la 5,0000 → 400 × 0,0300 = 12,00 lei, nefavorabilă: 6651 = 5124.01.
  2. Plată din cont în valută, factură din luna trecută. Cursul de închidere al lunii trecute 5,0200; se plătesc 500 EUR la 5,0000 → 500 × (−0,0200) = −10,00 lei, favorabilă: 5124.01 = 7651.
  3. Plată parțială din Cont RON. Factură primită de 1.000 EUR la 4,9700; se plătesc 2.010,00 lei, adică 400,00 EUR la 5,0250 → 2.010,00 − 400,00 × 4,9700 = 22,00 lei, nefavorabilă: 6651 = 5121.01.
  4. Încasare în cont în valută. Factură emisă de 2.000 EUR la 4,9800; se încasează 2.000 EUR la 4,9700 → 2.000 × (−0,0100) = −20,00 lei, nefavorabilă: 6651 = 5124.01.