ECB: calculul diferențelor de curs valutar
Versiunea 0.2 (draft), 05.11.2026. Responsabil: Raluca. Scris cu Bruce, din fișa modulului (docs/bruce/03-fisa-modul.md) și din fișa nevoii (docs/bruce/01-nevoie.md), unde stau sursele fiecărei decizii.
Marcaje: ⚠ = întrebare deschisă; (propus) = propunerea lui Bruce, neconfirmată încă de Raluca. Tot restul e decis de Raluca între 03.11 și 05.11.2026.
PRD-ul e scurt cu intenție: regulile și contractele stau aici, iar ecranul contabilului se definește în prototip.
1. Ce rezolvă
Când o firmă-client plătește sau încasează o factură în valută la alt curs decât cel la care a fost înregistrată factura, diferența de curs trebuie înregistrată contabil (6651 sau 7651). SAGA nu face această înregistrare automat, iar azi contabilul o face manual, pentru fiecare plată și încasare.
ECB (engine contabil Bono) e locul de lângă Nucleu care face calculele pe care SAGA nu le face automat. Submodulul de față calculează diferențele de curs valutar, generează notele contabile și le pune în fișierul CSV care se importă în SAGA. Contabilul nu mai calculează nimic.
2. Unde stă în închiderea lunii
ECB rulează lunar, pentru fiecare firmă-client, în această ordine:
- importul în SAGA al XML-ului de încasări și plăți ale lunii;
- rularea ECB;
- importul în SAGA al fișierului CSV cu notele de diferență;
- închiderea lunii în SAGA, cu reevaluarea. Notele de diferență trebuie să fie în SAGA înainte de reevaluare. Rularea ECB are doi pași, fiecare pornit de contabil cu un buton (Raluca, 05.11.2026):
- Populează lista — ECB aduce din Nucleu doar perechile factură–plată (sau factură–încasare) reconciliate de Lotus, din luna procesată. Perechile sunt 1 la 1: o factură plătită în două tranșe înseamnă două perechi (Raluca, 05.11.2026).
- Generează notele — ECB calculează diferențele și generează notele. Facturile și plățile procesate trec în statusul „Procesată” și ies din lista de procesat.
3. Când se aplică și când nu
Se aplică unei perechi factură–plată (sau factură–încasare) când toate condițiile sunt îndeplinite:
- factura e în valută și e deja înregistrată;
- plata sau încasarea a venit după factură, în aceeași lună sau la mai mult de o lună distanță;
- plata sau încasarea e în luna pentru care rulează ECB. Nu se aplică:
- plăților venite înainte de factură și plăților fără cursul plății în extras: IRIS le înregistrează pe contul 473, iar ele țin de alt proces, care nu e subiectul acestui PRD;
- legăturii dintre plăți și facturi, împărțirii unei plăți pe mai multe facturi, calculului sumei în valută și rotunjirilor: le face Lotus, înainte;
- reevaluării de la final de lună: o face SAGA;
- schimburilor valutare între conturile firmei;
- corectării notelor vechi din SAGA.
4. Datele de intrare
Datele stau în Nucleu. ECB își ia singur ce îi trebuie; Nucleu nu i le trimite. ECB ia doar perechile reconciliate de Lotus, 1 la 1. Despre plată sau încasare se știu toate informațiile: clientul de la care au intrat banii sau furnizorul căruia i s-a plătit, data, cursul, suma în valută și contul în care s-a făcut tranzacția (Raluca, 05.11.2026).
Pentru fiecare pereche factură–plată (sau factură–încasare):
- suma și data facturii;
- cursul valutar de înregistrare a facturii;
- suma și data plății sau a încasării; la plata din contul în lei, suma e în lei și are alături suma în valută și cursul;
- cursul valutar al plății;
- valuta;
- contul contabil al băncii. Conturile sunt fixate, la fel, în SAGA și în Nucleu (Raluca, 05.11.2026): 5121.01 — Cont RON (principal); 5124.01 — Cont EUR; 5124.02 — Cont USD; 5124.03 — Cont GBP;
- tipul facturii: primită sau emisă;
- tipul tranzacției: plată sau încasare. Mai sunt necesare (propus):
- firma-client, numărul facturii și partenerul, pentru explicația notei și pentru ecranul contabilului;
- cursul de închidere al ultimei luni închise, pentru facturile din lunile anterioare (vezi 5.1). ⚠ De stabilit cu IT de unde îl ia ECB (cursul BNR din ultima zi a lunii sau cel folosit la reevaluarea din SAGA).
5. Regulile de calcul
5.1. Cursul de bază (termen propus de Bruce: cursul față de care se calculează diferența; în ecran, coloana „Curs factură”)
- Factura și plata sunt în aceeași lună → cursul de bază e cursul de înregistrare a facturii. În ecran scrie „factură”.
- Factura e dintr-o lună anterioară și a fost reevaluată → cursul de bază e cursul de închidere al ultimei luni închise, pentru că SAGA a reevaluat factura la acel curs (OMFP 1802/2014, pct. 322 alin. 2). În ecran scrie „reevaluare”.
- Ce e „ultima lună închisă” (Raluca, 05.11.2026): ultima lună închisă în sistemele noastre, cu reevaluarea făcută. Exemplu: pe 05.11.2026 încă se procesează octombrie, care nu e închisă și nu e reevaluată, deci ultima lună închisă e septembrie, iar baza e cursul de închidere din 30.09.2026.
5.2. Plata sau încasarea dintr-un cont în valută
Diferența în lei = suma în valută plătită × (cursul plății − cursul de bază).
- Factură primită (plată către furnizor): rezultat pozitiv → diferență nefavorabilă; negativ → favorabilă.
- Factură emisă (încasare de la client): rezultat pozitiv → diferență favorabilă; negativ → nefavorabilă.
- La plata parțială, calculul se face doar pe suma plătită. Restul facturii rămâne la cursul de bază și intră în reevaluarea SAGA.
5.3. Plata dintr-un cont în lei
Diferența în lei = suma plătită în lei − suma în valută plătită × cursul de bază.
- Rezultat pozitiv → diferență nefavorabilă; negativ → favorabilă.
- Suma în valută și cursul plății vin din Nucleu; ECB nu le calculează.
- Încasările facturilor emise într-un cont în lei nu sunt cazul. Raluca a spus pe 04.11.2026 „nu va fi cazul” despre regula pentru încasări; citirea ca „nu există încasări în contul în lei” e a lui Bruce, de confirmat.
5.4. Rotunjire și diferență zero (propus)
- Diferența se rotunjește la 2 zecimale.
- Diferența 0,00 lei → nu se generează notă.
5.5. Exemple
- 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.xx 12,00 lei.
- Plată din cont în valută, factură din luna trecută. Factură primită de 500 EUR, cursul de închidere al lunii trecute 5,0200; se plătesc 500 EUR la 5,0000 → 500 × (−0,0200) = −10,00 lei, favorabilă: 5124.xx = 7651 10,00 lei.
- Plată parțială din cont în lei. Factură primită de 1.000 EUR la 4,9700; din contul în lei 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.xx 22,00 lei.
- Î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.xx 20,00 lei.
6. Nota contabilă
Toate notele se fac pe contul băncii din care s-a plătit sau în care s-a încasat (decizia Ralucăi din 04.11.2026: reevaluarea SAGA nu ia în calcul notele de diferență importate pe conturile de terți):
- diferență nefavorabilă: 6651 = 5124.xx sau 5121.xx;
- diferență favorabilă: 5124.xx sau 5121.xx = 7651. Data notei: data plății sau a încasării. Explicația notei (Raluca, 05.11.2026): „dif. curs fact. <numărul facturii> <partener>” — partenerul e furnizorul sau clientul.
7. Fișierul CSV pentru SAGA
- Un singur fișier pe firmă-client și pe lună, cu toate înregistrările de diferențe de curs ale lunii; nu câte un fișier pentru fiecare diferență (Raluca, 05.11.2026). La o nouă generare în aceeași lună, fișierul lunii se reface cu toate notele.
- Formatul (Raluca, 05.11.2026, același ca la importul notelor de salarii în SAGA, pentru document și pentru conținut):
- fișier text UTF-8 cu BOM, rânduri terminate cu CRLF, coloane despărțite prin virgulă;
- antetul:
DATA,NDP,CONT_D,CONT_C,SUMA,EXPLICATIE; - DATA: data plății sau a încasării, în formatul zz.ll.aaaa;
- NDP: numărul notei, creat de program: DIFF1, DIFF2…, unic în ziua notei;
- CONT_D: contul debitat — 6651 la diferența nefavorabilă, contul băncii la cea favorabilă;
- CONT_C: contul creditat — contul băncii la diferența nefavorabilă, 7651 la cea favorabilă;
- SUMA: valoarea diferenței de curs calculate;
- EXPLICATIE: „dif. curs fact.” + numărul facturii + partenerul.
- Exemplu de rând:
14.10.2026,DIFF1,6651,5124.01,12.00,dif. curs fact. FP-101 Adobe Systems Ireland. - ⚠ De verificat la primul import: separatorul zecimal al sumei. Modelul de la salarii are doar sume întregi; prototipul scrie punct (12.50), pentru că virgula desparte coloanele. Un text care conține virgulă (de exemplu un nume de partener) se pune între ghilimele.
- ⚠ De stabilit: importul în SAGA îl face contabilul, cu fișierul descărcat, sau se face automat, prin API-ul SAGA Web (minuta 22.10.2026 spune că importurile în SAGA Web se fac prin API).
8. Fără note duble
- Facturile și plățile (sau încasările) au câte două statusuri: unul înainte de generarea notei și unul după (Raluca, 05.11.2026). Statusul nu se afișează în ecran: ce e în casete e de procesat, ce e în tabelul de jos e procesat (Raluca, 05.11.2026). Numele interne propuse: „de procesat” și „procesată”.
- „Generează notele” procesează doar ce e „De procesat”. O plată „Procesată” nu mai primește notă, nici dacă lista e populată sau notele sunt generate din nou.
- O factură plătită în mai multe tranșe primește câte o notă pentru fiecare plată; nu e dublură.
- ⚠ Deschis: ce se întâmplă dacă legătura dintre o factură și plata ei se schimbă după ce nota a fost generată (nota e deja în fișier sau în SAGA).
9. Perechi oprite: nu există
Raluca (05.11.2026): nu există niciun scenariu în care o pereche să nu poată primi nota. Lista de cazuri oprite propusă de Bruce în versiunea 0.1 a fost scoasă, împreună cu fila „Oprite” din ecran.
10. Ecranul contabilului (se definește în prototip)
Pe firmă-client și pe lună (Raluca, 05.11.2026):
- sus, butoanele „Populează lista” și „Generează notele”;
- deasupra casetelor, eticheta „De procesat”;
- două casete alăturate: facturile primite și plățile lor, câte un rând pe pereche, 1 la 1, aliniate;
- dedesubt, două casete alăturate: facturile emise și încasările lor, la fel;
- rândul unei facturi (Raluca, 05.11.2026): „partener – număr factură – data facturii”, apoi „suma facturii – cursul facturii – suma plătită sau încasată”, ultima doar dacă plata e parțială;
- rândul unei plăți sau încasări (propus): „partener – data plății”, apoi „suma în valută (și în lei, la Cont RON) – cursul plății – contul”;
- sub casete, eticheta „Procesate”, apoi sub ea tabelul cu notele generate; la capătul tabelului, în aceeași ramă, „Note generate” cu numărul lor și butonul care duce în Documente, unde e fișierul CSV al lunii (Raluca, 05.11.2026). La generare, facturile și plățile ies din casete și trec în tabel. Tabelul arată notele tuturor lunilor procesate și are două filtre discrete, câte o săgeată mică lângă numele coloanei, care deschide filtrul doar la click (Raluca, 05.11.2026): la Factură, după partener; la Tranzacție, după luna tranzacției. Fiecare filtru are deasupra listei un câmp în care scrii numele partenerului sau luna, iar lista se restrânge pe măsură ce scrii (Raluca, 05.11.2026). Valoarea aleasă apare sub numele coloanei, fără să schimbe lățimea coloanelor; crește doar înălțimea antetului. Coloanele:
- Factură: numărul și data pe același rând, data în formatul zz/ll/aaaa;
- Tranzacție: plată sau încasare, cu data, și contul ca nume („Cont EUR”, „Cont USD”, „Cont GBP”, „Cont RON”), nu ca cont contabil;
- Sumă în valută (la contul în lei, și suma în lei);
- Curs factură: cursul de bază, cu „factură” sau „reevaluare”;
- Curs plată; Diferență; Nota;
- în stânga, o bandă îngustă cu două butoane: Clienți (ecranul de mai sus; firma se alege sus, din antet) și Documente;
- Documente: fișierele CSV generate până acum, de la toți clienții, câte unul pe client și pe lună, fiecare cu data și ora ultimei generări, numărul de note și butonul de descărcare.
⚠ De stabilit: în ce aplicație stă ecranul (de exemplu, back-office-ul Vertigo).
Prototipul (05.11.2026, desktop):
prototip/index.html. Fiecare apăsare pe „Populează lista” aduce 4–5 facturi de probă noi: EUR, USD și GBP, primite și emise, din luna procesată și din lunile anterioare, cu plăți din conturile în valută și din contul în lei, unele în două tranșe sau parțiale. Fișierul CSV din prototip are formatul din secțiunea 7. Pentru teste, prima populare aduce octombrie 2026, iar fiecare populare după o generare aduce luna următoare, cu fișierul ei în Documente (Raluca, 05.11.2026). „Populează lista” e inactiv cât luna curentă are perechi negenerate (propus).
11. Metrica de succes (propus)
Toate perechile factură–plată în valută ale lunii primesc nota de diferență în fișierul CSV fără alt calcul al contabilului, iar nicio plată nu primește două note.
12. Întrebări deschise
- Sursa cursului de închidere al ultimei luni închise, pentru facturile din lunile anterioare (secțiunea 4).
- Cine face importul în SAGA, și separatorul zecimal al sumei (secțiunea 7).
- Ce se întâmplă când legătura factură–plată se schimbă după generarea notei (secțiunea 8).
- Aplicația în care stă ecranul contabilului (secțiunea 10).
- Închis (Raluca, 05.11.2026): restul plății unei facturi plătite parțial, venit într-o lună următoare, e o pereche nouă. De asta se ocupă Lotus și IRIS; ECB doar o primește din Nucleu, ca pe oricare altă pereche.
13. Verificarea „spiritul Bono”
- Profil: echipa Bono (contabilii); indirect, firmele-client cu facturi în valută. Trece.
- Fază: liniștea că totul e în ordine. Trece.
- Simplitate: contabilul apasă două butoane pe lună; calculul îl face ECB. Trece.
- Fără jargon: ecranul e pentru contabili; clientul nu vede nimic. Trece.
- Transparență: fiecare notă își arată calculul pas cu pas, iar fiecare factură și plată își arată statusul. Trece.
- Momentul wow: notele de diferență apar singure în fișierul lunii. Trece.
- Vine singur, nu se caută: lista vine la contabil. Trece.
- Ton: nu se aplică.