Sari la conținut
Pre-lansare · KONTAH nu e încă public, abonamentele se deschid în curând Pune-te pe listă
KONTAHFinance · Operations · Intelligence
Înapoi
Produs

Citirea documentelor și asistentul

Două lucruri pe care le face un model, și o singură regulă: ce iese din model e o propunere, iar în registru intră numai ce a confirmat un om.

Același model, aceeași regulă

Modelul propune, omul confirmă

Citirea documentelor și asistentul rulează pe un model Claude al Anthropic PBC (Statele Unite), declarat în lista subprocesatorilor, cu ce primește și cu garanția transferului.

Regula e aceeași la amândouă: ce iese din model e o propunere, nu un fapt. Documentul citit așteaptă în coadă; factura pregătită de asistent așteaptă într-un card. Abia după ce un om confirmă, ceva intră în registru, prin aceeași poartă ca ceva tastat de mână.

Citirea documentelor

Un bon fotografiat devine o propunere LIVRAT

Un bon sau o factură fotografiată devine o propunere, nu un fapt: cifrele se verifică aritmetic, CUI-ul la ANAF și VIES, iar omul confirmă înainte de poartă.

LIVRAT

Modelul citește, nu hotărăște

Documentul pleacă neatins la model, ca PDF sau imagine (JPEG, PNG, GIF, WebP); alte fișiere se refuză. Fiecare câmp vine cu un scor de încredere și cu textul de pe document din care a fost luat. Ce nu se vede iese gol, nu ghicit. Starea propunerii o hotărăsc verificările, nu încrederea modelului.

LIVRAT

Aritmetica se închide sau documentul merge la om

Pe fiecare cotă, baza × cota dă TVA-ul; TVA-urile cotelor dau TVA-ul documentului, bazele dau subtotalul, subtotalul plus TVA dă totalul, liniile dau subtotalul. Toleranța pentru rotunjiri e de un ban pe poziție, cel puțin doi bani, sau 0,01 % din total dacă iese mai mult. Ce nu se poate verifica se spune pe față, nu se trece drept curat.

LIVRAT

CUI-ul: cifra de control, apoi ANAF și VIES

Întâi cifra de control, local și fără rețea: un cod care pică acolo nu mai pleacă spre registre. Apoi ANAF pentru codurile românești și VIES pentru cele din UE: existența, denumirea, plătitor de TVA. Registrul căzut dă „indisponibil”, niciodată „valid”. Furnizorul din afara UE nu are registru, deci omul confirmă mereu.

LIVRAT

Cursul BNR și dublurile

Un document în valută are cursul confruntat cu BNR: ziua bancară, ultima zi publicată dacă data cade în weekend, HUF și JPY cotate la 100 de unități. O nepotrivire marchează câmpul, nu blochează: furnizorul își poate tipări cursul lui. Același fișier trimis de două ori e refuzat după amprentă; același document ajuns pe alte căi e prins după furnizor, număr, dată și total.

LIVRAT

Importul cu DVI, ca dosar

Un import nu e un document, e un dosar: declarația vamală, factura externă, T1, CMR și facturile comisionarului se leagă prin MRN și se verifică una prin alta. Cursul e cel vamal, nu cel BNR; baza TVA-ului se ia din DVI, nu din factură; vama rotunjește la leu, nu la ban. Un dosar incomplet nu produce propunere.

LIVRAT

Omul confirmă, cabinetul hotărăște

Clientul trimite documentul și își vede coada; confirmarea e act contabil și rămâne la cabinet. Pentru audit se păstrează fișierul brut (cu amprentă SHA-256), ce a citit modelul cu scorurile pe câmp, rezultatul verificărilor, cine a decis și ce a corectat. Un document care n-a putut fi citit ajunge la om, nu se pierde.

Cum arată

Clientul trimite, cabinetul confirmă

Documentele trimise de client, cu starea fiecăruia; la unul de verificat, câmpul CIF furnizor citit cu încredere sub prag
Documentele trimise de client, în instanța de demonstrație, cu starea fiecăruia: în prelucrare, citit și așteaptă contabilul, de verificat. La cel de verificat, câmpul sub prag e numit pe față: „CIF furnizor: citit cu încredere 55 % (prag 90 %)”.
Coada de propuneri a cabinetului: documentele citite așteaptă confirmarea, unul are câmpul cif_furnizor marcat de verificat
Coada de propuneri a cabinetului, aceeași instanță: documentele citite așteaptă confirmarea; unul are câmpul „cif_furnizor” marcat „de verificat”.
Ce se poate dovedi

Cifre, nu promisiuni

Fiecare cifră are în spate un fișier din depozit și, acolo unde e vorba de o probă, numele ei.

12
feluri de document pe care modelul le recunoaște: nouă de achiziție, plus declarația vamală, chitanța de ramburs și actele însoțitoare (T1, CMR, packing list)
app/extractie/schema.py · tests/test_extractie_schema.py::test_nomenclatorul_acopera_si_insotitoarele
90 %
încrederea cerută la CIF și la total, față de 80 % la un câmp obișnuit: 85 % trece la un câmp obișnuit, dar nu la un CIF
app/extractie/schema.py · tests/test_extractie_schema.py::test_cif_ul_are_prag_mai_sever_decat_restul
2 din 59
documente reale cu probleme de CUI într-un corpus de 59: unul greșit tipărit pe bon, unul citit greșit de model; cifra de control le-a prins pe amândouă
app/extractie/cif.py · tests/test_extractie_cif.py::test_cazurile_reale_din_corpus
Dovada

Ce testează fiecare fișier

Starea „livrat” de mai sus înseamnă teste verzi, iar secțiunea nu are voie să spună „livrat” fără ele: la construire, starea se verifică față de fișierul de capabilități. Ce nu dovedesc ele: testele nu cheamă modelul prin rețea (clientul lui se injectează), deci nu măsoară cât de bine citește; dovedesc tot ce stă în jurul lui, adică schema, verificările, coada și poarta.

Fișier de testProbe verziCe dovedește
test_extractie_schema.py21Câmpurile fiecărui fel de document, pragurile de încredere și aritmetica (cote, totaluri, linii), pe cifrele reale ale unor bonuri și facturi.
test_extractie_cif.py21Cifra de control, ANAF și VIES: forma codului, existența, registrul căzut („indisponibil”, nu „valid”) și memoria pe zi.
test_extractie_coada.py20Coada de propuneri: fișierul brut imutabil, deduplicarea pe amprentă, stările, confirmarea prin poarta achizițiilor, dosarul de audit și regula că modulul nu atinge niciodată poarta registrului.
test_extractie_model.py21Apelul de model: schema cerută, răspunsul tradus, refuzul și răspunsul tăiat respinse întregi, documentul necitibil ajuns la om, drumul complet de la fișier la propunere.
test_extractie_import.py18Dosarul de import cu DVI, pe cifrele reale ale unui import din decembrie 2022: legarea prin MRN, cursul vamal, baza TVA, rotunjirea la leu.
test_extractie_bnr.py19Cursul BNR (ziua bancară, weekendul, multiplicatorul, BNR căzut) și verificarea dublurilor.

Numerele vin din docs/CAPABILITATI.md, un fișier generat din teste, nu scris de mână (rularea din 8 octombrie 2026): 120 de probe verzi, în 6 fișiere.

Asistentul

Comanda în română devine un card LIVRAT

Comanda în limba română devine un card de confirmare. Citirea rulează, dar scrierea se oprește în propunere până apasă omul.

LIVRAT

Patru citiri, o singură scriere

Asistentul poate căuta un partener, lista facturile emise, arăta ce e de încasat și stocul unui produs. Singura scriere pe care o cunoaște e „propune o factură”: nu emite nimic, iar prima cerere de emitere oprește dialogul și se întoarce ca propunere.

LIVRAT

Cifrele sunt ale serverului

Cardul se construiește din cifre calculate de server: partenerul se verifică în bază, cantitățile se înmulțesc și TVA-ul se calculează acolo. Fraza modelului nu ajunge pe card. Un partener care nu există oprește propunerea, cu motiv.

LIVRAT

Cardul se confruntă cu nomenclatorul

O înmulțire corectă nu dovedește nimic despre conținut, așa că fiecare linie se confruntă cu nomenclatorul firmei: un produs inexistent sau o cotă de TVA diferită de a articolului sunt abateri grave; o unitate de măsură diferită se arată, dar nu e gravă. Prețul se compară cu ultimul facturat, întâi la același client, și se spune când reperul e al altui client.

LIVRAT

Nimic nu se blochează, totul se arată

Un preț de zece ori mai mare poate fi greșeala modelului sau chiar factura pe care omul vrea s-o emită. Abaterea nu oprește nimic: se arată înainte să apese, pentru că poarta e omul. La „Confirmă” ea se recalculează pe server și se scrie pe documentul emis, fiindcă cardul a trecut prin client și nu mai e o probă.

LIVRAT

Rolul hotărăște ce vede modelul

Uneltele pe care rolul utilizatorului nu le are nu se trimit modelului deloc, iar numărul de apeluri pe oră e plafonat pe utilizator. Citirile rulează pe sesiunea omului, cu izolarea per firmă a bazei, fără cont de serviciu: modelul nu atinge baza.

LIVRAT

Urma rămâne în registru

La „Confirmă”, factura se emite prin aceleași porți ca ruta manuală, într-o tranzacție; documentul poartă sursa „asistent” și comanda brută. Registrul poate spune ce a scris asistentul într-o firmă și cine a apăsat „Confirmă”: răspunderea e a omului.

Cum merge

De la comandă la factură, în patru pași

  1. Scrii comanda
    În limba română, ca unui om: „cât am de încasat?” sau „fă o factură de 500 de lei către Alfa SRL, consultanță”.
  2. Citirile rulează pe loc
    Modelul cere unealta potrivită: caută partenerul, listează facturile, citește stocul. Ele rulează pe sesiunea omului, nu pe un cont de serviciu.
  3. Scrierea se oprește în card
    Cererea de emitere nu emite nimic. Serverul construiește cardul din cifrele lui și îl confruntă cu nomenclatorul firmei; abaterile apar pe card.
  4. Omul hotărăște
    „Confirmă” emite factura prin aceleași porți ca ruta manuală: emitere, UBL și validare locală. „Modifică” refă cardul pe server. Cât timp n-a apăsat nimeni, factura nu există.
Ce se poate dovedi

Cifre, nu promisiuni

Fiecare cifră are în spate un fișier din depozit și, acolo unde e vorba de o probă, numele ei.

4 + 1
unelte în catalog: patru citiri (partener, facturi emise, ce e de încasat, stocul unui produs) și o singură scriere, care doar propune o factură
app/asistent/catalog.py · tests/test_asistent.py::test_citirea_ruleaza_si_scrierea_se_opreste_in_propunere
20 %
cât de departe de ultimul preț facturat trebuie să fie o cifră ca să se aprindă pe card; pragul e o alegere a noastră, nu o normă
app/asistent/nomenclator.py · tests/test_asistent_nomenclator.py::test_pretul_departe_de_ultimul_facturat_se_aprinde
Dovada

Ce testează fiecare fișier

Starea „livrat” de mai sus înseamnă teste verzi, iar secțiunea nu are voie să spună „livrat” fără ele: la construire, starea se verifică față de fișierul de capabilități. Ce nu dovedesc ele: testele nu cheamă modelul prin rețea (clientul lui se injectează), deci nu măsoară cât de bine înțelege o comandă; dovedesc ce se întâmplă cu ce propune el, adică cardul, confruntarea și poarta.

Fișier de testProbe verziCe dovedește
test_asistent.py4Poarta asistentului: catalogul tăiat pe rol și plafonul de apeluri, citirea care rulează și scrierea care se oprește în propunere, partenerul inexistent, executarea confirmată prin porțile manuale.
test_asistent_nomenclator.py14Confruntarea cardului cu nomenclatorul: ce e abatere gravă și ce nu, reperul de preț, alarma falsă care nu trebuie să se aprindă și urma citibilă în registru.

Numerele vin din docs/CAPABILITATI.md, un fișier generat din teste, nu scris de mână (rularea din 8 octombrie 2026): 18 probe verzi, în 2 fișiere.

Întrebări

Ce ne întreabă lumea

Modelul scrie în contabilitate?

Nu singur. Niciun fișier din modulul de citire nu are voie să cheme direct poarta de scriere în registru, iar un test păzește asta; confirmarea omului trece prin poarta achizițiilor, ca un document tastat de mână. Asistentul se oprește în card: nimic nu se emite până nu apasă omul.

Cine confirmă un document citit?

Cabinetul. Clientul poate trimite documentul și își vede coada, dar confirmarea e act contabil. Ce a schimbat omul față de ce a citit modelul se păstrează câmp cu câmp, separat de citire, ca să se vadă unde a greșit modelul și cu ce încredere.

Ce se întâmplă dacă ANAF sau VIES nu răspund?

Rezultatul e „indisponibil”, niciodată „valid”: CIF-ul rămâne marcat și propunerea nu se poate accepta singură. O pană de rețea nu se ține minte toată ziua: următoarea cerere reîncearcă.

Ce se întâmplă cu un document pe care modelul nu-l poate citi?

Ajunge la om, cu motivul. Un document necitibil, un refuz al modelului sau un răspuns tăiat nu devin propuneri pe jumătate: mai bine niciun rezultat decât un document citit pe jumătate. Citirea se poate relua după o pană de rețea.

Ce se întâmplă dacă trimit același bon de două ori?

Același fișier e refuzat după amprentă (SHA-256), iar propunerea existentă se arată. Două fotografii ale aceluiași bon sunt fișiere diferite: pe ele le prinde verificarea dublurilor, după furnizor, număr, dată și total. Nimic nu se respinge singur: documentul cu care seamănă se arată, iar omul hotărăște.

Poate asistentul să facă altceva decât facturi?

Azi, nu: are patru citiri (partener, facturi emise, ce e de încasat, stocul unui produs) și o singură scriere, propunerea unei facturi. Uneltele stau într-un catalog de date versionate, iar rolul utilizatorului taie din el ce nu i se cuvine.

Vezi coada pe demo

Instanța de demonstrație are documente de verificat în coadă, cu câmpurile marcate. Se umblă prin ea.