10 Iulie 2026 · Draft v1 · BONO × SOLO · Confidențial Owner: BGN · Input: PRD Iris v2 (12 mai), PRD Larry + Adam final (Cristi, 8 iun), decizii BGN (11 iun + 10 iul)
Nevoie: documentele justificative ale clienților finali (facturi, bonuri, extrase) trebuie transformate în note contabile gata de postat, într-un sistem centralizat multi-tenant. Azi asta se face dispersat și manual în sistemele fiecărui tenant.
Decizie de secvențiere (BGN, 11 iun): construim întâi Iris operat integral de om — operatorul face conspectarea, gruparea, interpretarea și deciziile contabile de mână, pe aceeași suprafață care în Faza 2 va fi pre-completată de Castor/Larry/Adam. Faza manuală definește modelul de date, nota contabilă și granițele dintre motoare, și produce dataset-ul de evaluare pentru automatizare.
Ce este Iris în Faza 1: un serviciu multi-tenant care primește documente + context prin API de la tenanți, le pune într-o coadă de lucru pentru operatori umani, și returnează note contabile prin API către tenant.
Ce NU este: nu are OCR, nu are AI, nu are scoruri de încredere, nu are Zero-Touch. Singurele automatisme permise sunt cele pur deterministe și ieftine: deduplicare hash, interogări ANAF/BNR, aritmetica valorilor contabile (calc spreadsheet, nu decizie).
| # | Decizie |
|---|---|
| 1 | Ingestie exclusiv prin API de la tenant (BONO: Dublin/Vertigo · SOLO: Falcon/Jedi). Fără upload manual în Iris. |
| 2 | Toate cele 6 tipuri de documente în scope, inclusiv extras de cont. Formulare de conspectare diferite per tip de document. |
| 3 | Contextul clientului vine prin API de la tenant + servicii externe (ANAF, BNR). Fiecare câmp de context are sursa definită explicit (vezi §6). |
| 4 | Storage separat per tenant, temporar (~1 an). Stocarea permanentă a documentelor rămâne responsabilitatea tenantului. |
| 5 | Export prin API — simetric cu ingestie (webhook + pull). |
| 6 | Setări per tenant minime: operatori, clienți, callback. Taxonomia și regulile contabile sunt globale, needitabile per tenant în MVP. |
| 7 | SRL + PFA în scope. Conspectarea e identică; la interpretare diferențele sunt mici și se mapează (de detaliat cu Cristi — §11). |
| 8 | Gruparea liniilor în tranzacții o face operatorul, manual (split/merge în UI). Definiția funcțională a pasului care se automatizează în Faza 2. |
| 9 | 3 roluri: Operator, Admin Tenant, Admin Iris. |
| Actor | Job |
|---|---|
| Sistemul tenantului (Vertigo/Jedi) | Trimite documentul + contextul clientului prin API și primește înapoi nota contabilă, fără interacțiune umană pe partea Iris. |
| Operator | Ia următorul document din coadă, verifică/completează datele, grupează liniile în tranzacții, alocă categorie + folosință, confirmă deciziile contabile și finalizează nota. |
| Admin Tenant | Vede toate documentele și operatorii tenantului lui; urmărește volumul și starea cozii. |
| Admin Iris | Administrează tenanții, utilizatorii, taxonomia și regulile globale; vede tot. |
1. Tenantul trimite POST /documents: fișier + tip + context client + idempotency key
2. Iris verifică: idempotență, dedup hash (per tenant), validare payload
→ duplicat identic = respins imediat, tenantul notificat
3. Documentul intră în coada tenantului cu status "primit"
4. Operatorul îl deschide → status "în conspectare"
4a. CONSPECTARE: verifică/completează câmpurile documentului pe formularul
specific tipului (datele vin goale în Faza 1 — operatorul le introduce
citind documentul afișat alături)
4b. Iris rulează automat: interogare ANAF (partener), curs BNR (dacă valută),
dedup semantică (nr doc + dată + CUI + sumă → flag "posibil duplicat")
5. GRUPARE: operatorul grupează/splituiește liniile în tranzacții
(default: toate liniile cu tratament identic = o tranzacție)
6. INTERPRETARE per tranzacție: operatorul alege categoria (taxonomie globală)
+ folosința în firmă (DA/NU)
7. DECIZII CONTABILE per tranzacție: operatorul confirmă scenariul TVA și
deductibilitatea; sistemul precompletează determinist din reguli (§8) și
calculează aritmetica (baze, valori ded/neded, conturi din TAC)
8. NOTĂ CONTABILĂ: preview per tranzacție → operatorul finalizează documentul
9. Iris trimite nota/notele prin webhook către tenant + le expune pe GET
10. Documentul devine "finalizat"; audit trail complet păstrat
| Status | Descriere | Din | Spre | Cine |
|---|---|---|---|---|
primit | Intrat prin API, validat, în coadă | — | în lucru, respins_duplicat | API |
respins_duplicat | Hash identic cu document existent (terminal) | primit | — | Automat |
în lucru | Deschis de un operator (claim) | primit | în așteptare, finalizat, respins | Operator |
în așteptare | Blocat — lipsesc informații (context incomplet, document ilizibil, DVI etc.) | în lucru | în lucru | Operator |
respins | Operatorul îl declară neprocesabil (irelevant, ilizibil), cu motiv (terminal) | în lucru | — | Operator |
finalizat | Toate tranzacțiile au note generate și trimise (terminal) | în lucru | — | Operator |
Statusuri expuse tenantului prin API: primit · în procesare (= în lucru/așteptare) · finalizat · respins (cu motiv). Detaliul intern nu se expune.
| Status | Descriere |
|---|---|
draft | Creată prin grupare, needitată complet |
interpretată | Categorie + folosință + decizii contabile complete |
notă_generată | Nota contabilă compusă și validată |
exportată | Trimisă la tenant |
Reguli: un document nu poate fi finalizat cu tranzacții în draft. O tranzacție se poate redeschide cât timp documentul nu e finalizat. Corecțiile după export = out of scope MVP (marcat TBD — vezi §13).
{TENANT}-{AN}-{NNNNN} (ex: BN-2026-00042) — secvență per tenant{ID-document}-T{n} (ex: BN-2026-00042-T2)POST /documents (tenant → Iris)
request_id, idempotency_key
tenant_id (din autentificare — cheie API per tenant)
source_document_id // ID-ul documentului în sistemul tenantului
document_type // efactura_xml | factura_pdf | bon | factura_externa
// | factura_emisa_json | extras_cont
file // binar sau URI semnat
client_context // snapshot complet (vezi 6.3)
callback_url // opțional, override per document
Răspuns: iris_document_id, status inițial. Erori: duplicat (cu referința documentului existent), payload invalid, tip nesuportat.
document.finalizat + GET /documents/{id}/notes
iris_document_id, source_document_id, status
transactions[]: {
transaction_id, source_line_ids[],
// CONSPECTARE (introduse de operator)
descriere, cantitate, valori (netă / TVA / totală / valută+curs),
// CONTEXT folosit
context_snapshot_id, partener (date ANAF),
// INTERPRETARE (decise de operator)
categorie {cod, nume, grupa}, folosinta_firma,
// DECIZII CONTABILE
scenariu_tva, ded_ch_pct, baza_tva, baza_ch, val_ded_ch, val_neded_ch,
tac {cheltuiala, tva}, conturi {debit, credit, tva_debit, tva_credit},
flags[], comentarii_operator,
// AUDIT
operator_id, timestamps, ruleset_version
}
Structura e identică cu cea din Faza 2 — singura diferență va fi apariția câmpurilor de confidence și model_versions. Tenantul integrează o singură dată.
| Câmp | Sursă | Obligatoriu | Folosit la |
|---|---|---|---|
| Firma_Nume, Firma_CUI | Tenant API | DA | Verificare identitate cumpărător |
| Tip_Entitate (SRL/PFA) | Tenant API | DA | Ramura de interpretare (§11) |
| Regim_TVA, Platitor_TVA, Cod_TVA_Activ, VIES | Tenant API | DA | Scenariul TVA |
| Regim_Impozitare (micro/profit/PFA) | Tenant API | DA | Tratament fiscal |
| Asociati, Administratori | Tenant API | opțional | Detectare factură pe persoană fizică |
| Regim_Auto (Fara/Mixt/100%) | Tenant API (profil setat de contabil) | opțional* | Deductibilitate grupa AUTO (R3) |
| Activitate_La_Sediu (DA/NU) | Tenant API (profil) | opțional* | Deductibilitate grupa SEDIU (R4) |
| Mijloace_Fixe (listă) | Tenant API | opțional | Context cheltuieli aferente MF |
| CAEN_Principal, CAEN_Secundare | Tenant API | opțional | Context interpretare |
| Nr_Salariati | Tenant API | opțional | Context (plafoane la Engine Contabil) |
| Partener: nume, adresă, TVA activ, regim, VIES | ANAF (automat) | — | Validare furnizor + scenariu TVA |
| Curs valutar la data documentului | BNR (automat) | — | Facturi în valută |
\* dacă lipsesc, regulile R3/R4 nu pot precompleta — operatorul decide și marchează lipsa; lipsa apare în audit. Câmp lipsă ≠ blocare (principiu din PRD v2).
Contextul se salvează ca snapshot imutabil per document (context_snapshot_id) — decizia contabilă e auditabilă față de contextul de la momentul procesării, nu față de profilul curent.
GET /documents/{id} (tenant → Iris)Status simplu + istoricul tranzițiilor.
Tenant — id, nume, chei API, callback_url, operatori
Client — firma clientului final (per tenant), profil = ultimul context primit
Document — id, tenant, client, tip, fișier (storage per tenant), hash,
source_document_id, status, operator curent, timestamps
ContextSnapshot — imutabil, per document
DocumentLine — linia brută introdusă de operator la conspectare
Transaction — grup de linii; interpretare + decizii contabile; status
NotaContabila — output final per tranzacție (structura 6.2)
AuditEntry — cine, ce câmp, valoare veche → nouă, când (write-once)
RulesetVersion — versiunea taxonomiei + regulilor active la procesare
Stocare: documentele și datele de procesare, izolate per tenant, retenție 12 luni de la finalizare (parametru global). După retenție: ștergere, cu notă în audit. Stocarea permanentă = responsabilitatea tenantului (arhitectura permite mutarea ownership-ului la un viitor modul de documente — „Findocs" în propunerea Prodi — fără schimbarea contractelor).
Sursa: PRD Adam final (8 iun, Cristi). În Faza 1 regulile NU rulează ca motor autonom — ele precompletează câmpurile, operatorul confirmă sau modifică (orice modificare cere motiv, logat în audit).
Taxonomia (globală, ~50 categorii în 8 grupe): AUTO (A1–A13) · SEDIU (B1–B7) · PERSONAL (C1–C9) · BIROU & ADMINISTRATIV (D1–D10) · IT & SOFTWARE (E1–E5) · SERVICII EXTERNE (F1–F8) · FINANCIAR (G1–G4) · ASOCIAT (H1). Fiecare categorie cară: cod, nume, descriere, grupă, TAC, deductibilitate default.
Reguli de deductibilitate (precompletare):
Scenariile TVA (precompletare din date): NO-TVA (~80%) · TVA-SERV (~10%, taxare inversă servicii, D 635 → C 4423) · TVA-AIC_BUNURI (~5%) · TVA-IMP_BUNURI (<1%, mereu manual — DVI introdus de operator). Validări globale G1–G3 (VIES invalid → manual; achiziție externă >2.000 EUR → alertă; bun extern din categorii speciale → manual) rulează ca atenționări pentru operator.
Prag mijloc fix 5.000 RON: reclasificare automată sugerată (R1-Adam: categorie MF sub prag → D2 cu comentariu; R2-Adam: D2 peste prag → flag verificare).
Aritmetica (automată, needitabilă decât prin schimbarea inputurilor): Baza_ch, Baza_TVA, Val_ded_ch, Val_neded_ch conform formulelor per scenariu.
Taxonomia + regulile au versiune globală (ruleset_version), stampilată pe fiecare notă.
în așteptare evidențiate| Parametru | Opțiuni | Default MVP | Nivel |
|---|---|---|---|
| Callback URL | URL | — | per tenant |
| Chei API | generate/revocate | — | per tenant |
| Tipuri documente acceptate | subset din cele 6 | toate | per tenant |
| Retenție date | luni | 12 | global |
| Prag mijloc fix | RON | 5.000 | global |
| Prag alertă achiziție externă (G2) | EUR | 2.000 | global |
| Taxonomie + reguli | versionate | ruleset v1 | global, doar Admin Iris |
| Ce nu facem | De ce / când |
|---|---|
| OCR (Castor), clasificare AI (Larry), motor Adam autonom | Faza 2 — suprafața le primește prin precompletare |
| Scoruri de încredere, filtre n/x, Zero-Touch, sampling | Faza 2 — au sens doar cu motoare |
| Layer cake per tenant, learning din corecții, reguli candidat | Faza 2+ — corecțiile se loghează structurat de acum |
| Upload manual / email / SPV pull direct în Iris | Ingestia = exclusiv API tenant (decizie BGN) |
| Postarea în contabilitate | Modul intern la tenant (decizie Prodi/BGN) |
| Amortizare în timp, plafoane (medical/sport/protocol/sponsorizări), REF | Engine Contabil, la tenant |
| Notificări email/Slack, prioritizare URGENT, escalări | v1.x — MVP are doar coada |
| Editare taxonomie per tenant | Global în MVP |
| Corecția notelor după export | TBD §13 — probabil v1.x cu evenimente de corecție |
| Dashboard analitic complet | MVP are doar contoare de coadă + metrici §14 |
Pregătit în arhitectură pentru Faza 2: câmpurile de confidence în modelul de date (nullable) · ruleset_version de la început · contractele API neschimbate · fiecare decizie de operator = pereche (input, decizie) exportabilă ca training/eval data.
note.corrected. *(BGN + Prodi)*| Metrică | De ce | Target inițial |
|---|---|---|
| Timp mediu de procesare per document și per tranzacție | Baseline-ul business case-ului pentru automatizare (30 sec vs 2 min per review schimbă tot calculul Zero-Touch) | măsurăm, fără target |
| Documente procesate / operator / zi | Capacitate operațională | măsurăm |
| Distribuția categoriilor + frecvența „Altă categorie" | Validează taxonomia; >2–3% „Altă categorie" = taxonomia are goluri | <3% |
| Frecvența modificării precompletărilor (scenarii TVA, deductibilități) | Validează regulile Adam înainte de a deveni motor | măsurăm per regulă |
Documente în așteptare + motive | Arată golurile de context/date de la tenanți | măsurăm |
| Rata duplicatelor (hash + semantic) | Sănătatea ingestiei | măsurăm |
| Tranzacții acumulate ca eval dataset | Fiecare tranzacție procesată manual = un exemplu etichetat pentru Faza 2 | 500+ înainte de pornirea Larry |
| Sistem | Direcție | Ce |
|---|---|---|
| Vertigo/Dublin (BONO), Jedi/Falcon (SOLO) | in + out | Documente + context in; note contabile + statusuri out |
| ANAF | in (automat) | Validare CUI partener, TVA activ, VIES |
| BNR | in (automat) | Curs valutar la data documentului |
| SPV / eFactura | — | Indirect: tenantul preia XML-ul din SPV și îl trimite prin API |
Fără migrare de date — sistem nou.