i
Iris · operare manuală
Operator contabil
Tenant: BONO
OC
Specificația

PRD: Iris MVP — versiunea manuală

Faza 1 · Draft v1 · 10 Iulie 2026 · sursa: prd-iris-mvp-manual.md

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)


1. Rezumat

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).


2. Decizii de bază (confirmate BGN, 10 iul)

#Decizie
1Ingestie exclusiv prin API de la tenant (BONO: Dublin/Vertigo · SOLO: Falcon/Jedi). Fără upload manual în Iris.
2Toate cele 6 tipuri de documente în scope, inclusiv extras de cont. Formulare de conspectare diferite per tip de document.
3Contextul clientului vine prin API de la tenant + servicii externe (ANAF, BNR). Fiecare câmp de context are sursa definită explicit (vezi §6).
4Storage separat per tenant, temporar (~1 an). Stocarea permanentă a documentelor rămâne responsabilitatea tenantului.
5Export prin API — simetric cu ingestie (webhook + pull).
6Setări per tenant minime: operatori, clienți, callback. Taxonomia și regulile contabile sunt globale, needitabile per tenant în MVP.
7SRL + PFA în scope. Conspectarea e identică; la interpretare diferențele sunt mici și se mapează (de detaliat cu Cristi — §11).
8Gruparea liniilor în tranzacții o face operatorul, manual (split/merge în UI). Definiția funcțională a pasului care se automatizează în Faza 2.
93 roluri: Operator, Admin Tenant, Admin Iris.

3. Actori și joburi

ActorJob
Sistemul tenantului (Vertigo/Jedi)Trimite documentul + contextul clientului prin API și primește înapoi nota contabilă, fără interacțiune umană pe partea Iris.
OperatorIa următorul document din coadă, verifică/completează datele, grupează liniile în tranzacții, alocă categorie + folosință, confirmă deciziile contabile și finalizează nota.
Admin TenantVede toate documentele și operatorii tenantului lui; urmărește volumul și starea cozii.
Admin IrisAdministrează tenanții, utilizatorii, taxonomia și regulile globale; vede tot.

4. Fluxul documentului (end-to-end)

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

5. State machine

Document

StatusDescriereDinSpreCine
primitIntrat prin API, validat, în coadăîn lucru, respins_duplicatAPI
respins_duplicatHash identic cu document existent (terminal)primitAutomat
în lucruDeschis de un operator (claim)primitîn așteptare, finalizat, respinsOperator
în așteptareBlocat — lipsesc informații (context incomplet, document ilizibil, DVI etc.)în lucruîn lucruOperator
respinsOperatorul îl declară neprocesabil (irelevant, ilizibil), cu motiv (terminal)în lucruOperator
finalizatToate tranzacțiile au note generate și trimise (terminal)în lucruOperator

Statusuri expuse tenantului prin API: primit · în procesare (= în lucru/așteptare) · finalizat · respins (cu motiv). Detaliul intern nu se expune.

Tranzacție

StatusDescriere
draftCreată 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).

ID-uri


6. Contracte API

6.1 Ingestie — 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.

6.2 Output — webhook 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ă.

6.3 Contextul clientului — câmpuri și surse

CâmpSursăObligatoriuFolosit la
Firma_Nume, Firma_CUITenant APIDAVerificare identitate cumpărător
Tip_Entitate (SRL/PFA)Tenant APIDARamura de interpretare (§11)
Regim_TVA, Platitor_TVA, Cod_TVA_Activ, VIESTenant APIDAScenariul TVA
Regim_Impozitare (micro/profit/PFA)Tenant APIDATratament fiscal
Asociati, AdministratoriTenant APIopționalDetectare 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 APIopționalContext cheltuieli aferente MF
CAEN_Principal, CAEN_SecundareTenant APIopționalContext interpretare
Nr_SalariatiTenant APIopționalContext (plafoane la Engine Contabil)
Partener: nume, adresă, TVA activ, regim, VIESANAF (automat)Validare furnizor + scenariu TVA
Curs valutar la data documentuluiBNR (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.

6.4 Interogare status — GET /documents/{id} (tenant → Iris)

Status simplu + istoricul tranzițiilor.


7. Modelul de date

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).


8. Reguli contabile în varianta manuală (asistare deterministă)

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ă.


9. Ecrane

E1 — Coada de documente

E2 — Conspectare (formular per tip de document)

E3 — Grupare în tranzacții (pas în E2 sau ecran propriu)

E4 — Interpretare + decizii contabile (per tranzacție)

E5 — Notă contabilă (preview + finalizare)

E6 — Lista tranzacții

E7 — Administrare


10. Parametri configurabili

ParametruOpțiuniDefault MVPNivel
Callback URLURLper tenant
Chei APIgenerate/revocateper tenant
Tipuri documente acceptatesubset din cele 6toateper tenant
Retenție dateluni12global
Prag mijloc fixRON5.000global
Prag alertă achiziție externă (G2)EUR2.000global
Taxonomie + reguliversionateruleset v1global, doar Admin Iris

11. SRL vs PFA


12. Non-goals (explicit NU în Faza 1)

Ce nu facemDe ce / când
OCR (Castor), clasificare AI (Larry), motor Adam autonomFaza 2 — suprafața le primește prin precompletare
Scoruri de încredere, filtre n/x, Zero-Touch, samplingFaza 2 — au sens doar cu motoare
Layer cake per tenant, learning din corecții, reguli candidatFaza 2+ — corecțiile se loghează structurat de acum
Upload manual / email / SPV pull direct în IrisIngestia = exclusiv API tenant (decizie BGN)
Postarea în contabilitateModul intern la tenant (decizie Prodi/BGN)
Amortizare în timp, plafoane (medical/sport/protocol/sponsorizări), REFEngine Contabil, la tenant
Notificări email/Slack, prioritizare URGENT, escalăriv1.x — MVP are doar coada
Editare taxonomie per tenantGlobal în MVP
Corecția notelor după exportTBD §13 — probabil v1.x cu evenimente de corecție
Dashboard analitic completMVP 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.


13. Întrebări deschise (TBD)

  1. Formularul de extras de cont — model de date diferit (operațiuni eterogene: comisioane, plăți, încasări, fără TVA). De definit la prototip. *(Owner: BGN + Cristi)*
  2. Maparea PFA la interpretare/notă (§11). *(Cristi)*
  3. Corecții post-export — dacă tenantul găsește o eroare după primirea notei, care e fluxul? Propunere: v1.x, eveniment note.corrected. *(BGN + Prodi)*
  4. Autentificare API — chei statice per tenant sau OAuth client credentials? Propunere: chei per tenant în MVP. *(Prodi)*
  5. Alerta G2 (achiziții externe >2.000 EUR) — email zilnic din Iris sau responsabilitatea tenantului? *(Prodi + Cristi)*
  6. Alocarea discount/transport — proporțional pe valoare netă? Confirmare formulă exactă. *(Cristi)*

14. Metrici de succes

MetricăDe ceTarget inițial
Timp mediu de procesare per document și per tranzacțieBaseline-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 / ziCapacitate 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 motormăsurăm per regulă
Documente în așteptare + motiveArată golurile de context/date de la tenanțimăsurăm
Rata duplicatelor (hash + semantic)Sănătatea ingestieimăsurăm
Tranzacții acumulate ca eval datasetFiecare tranzacție procesată manual = un exemplu etichetat pentru Faza 2500+ înainte de pornirea Larry

15. Integrări

SistemDirecțieCe
Vertigo/Dublin (BONO), Jedi/Falcon (SOLO)in + outDocumente + context in; note contabile + statusuri out
ANAFin (automat)Validare CUI partener, TVA activ, VIES
BNRin (automat)Curs valutar la data documentului
SPV / eFacturaIndirect: tenantul preia XML-ul din SPV și îl trimite prin API

Fără migrare de date — sistem nou.