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
Modul

Rapoarte LIVRAT

Un raport e o definiție ca date, cu un singur executor. Filtrele anunțate filtrează cu adevărat: pe ecran, pe rută și în fișierul exportat.

Ce face

Un executor, nu câte un ecran pe raport

Rapoartele nu sunt ecrane scrise pe rând. Sunt rânduri într-o listă de definiții, iar cifrele lor ies din proiecțiile registrului.

LIVRAT

O definiție ca date

Cod, nume, față (client, cabinet sau amândouă), sursă, filtre, coloane, totaluri și grafice. Un raport nou e un rând în listă, nu un ecran nou. Tabelul și graficele ies din același executor, pe aceeași perioadă și cu aceleași filtre.

LIVRAT

Totalul e al jurnalului

Sursa e întotdeauna o proiecție, niciodată registrul brut, deci se poate goli și rederiva. „Vânzări pe produs” folosește aceeași listă de documente ca jurnalul de vânzări, iar patru tăieturi ale vânzărilor dau același total fără TVA ca el.

LIVRAT

Filtrele filtrează cu adevărat

Un filtru apare pe ecran numai dacă îl primește sursa raportului și sursa fiecărui grafic: se citește din semnătura funcției, nu dintr-o listă ținută de mână. Același filtru trece prin rută și prin export, iar ce raportul nu poate aplica e refuzat cu un mesaj, nu ignorat în tăcere.

LIVRAT

Se exportă ce se vede

XLSX cu cifre, nu text formatat, PDF și CSV, cu aceleași coloane, aceleași filtre și același rol ca pe ecran. CSV-ul are punct și virgulă și virgulă zecimală, cum îl citește Excelul românesc; ziua se scrie românește în toate trei.

LIVRAT

Fiecare față, rapoartele ei

Din cele 50, 36 se văd la ambele fețe, 10 numai la cabinet și 4 numai la client. Coloanele și filtrele contabile se taie la server pentru client: un câmp care nu pleacă pe rețea nu se poate citi din rețea.

LIVRAT

Salvat ca fapt

Pe „Tabloul meu” se salvează întrebarea, nu răspunsul: raportul și filtrele lui, ca fapt în registru. Resalvarea înlocuiește filtrele fără să șteargă istoria, iar scoaterea de pe tablou adaugă un fapt, nu șterge.

Cum arată

Piața rapoartelor

Piața rapoartelor, fața cabinetului: 46 de rapoarte pe 11 grupuri, câte un stâlp de hexagoane pe grup
Piața rapoartelor, pe fața cabinetului, în instanța de demonstrație: 46 de rapoarte pe 11 grupuri, câte un stâlp pe familie. Pe firma de restaurant din captură, „produs” se vede „preparat”: numele rapoartelor iau cuvintele firmei.
Familiile

50 de rapoarte, 11 familii

Numărate din catalogul din cod. Fiecare e o definiție: sursa, filtrele, coloanele și, unde are, graficele ei.

FamiliaRapoarteCare sunt
Vânzări15Lista vânzări · Vânzări pe produs · Vânzări pe client · Vânzări pe operator · Vânzări pe forma de plată · Vânzări pe zile · Vânzări pe zi din săptămână · Facturi emise din POS · Top produse · Vânzări pe categorie · Vânzări pe oră · Retururi cu motiv · Zilele punctelor de lucru · Timpii secțiilor · Centralizatorul reducerilor
Stoc11Stoc la o dată · Mișcări de stoc · Stoc sub minim · Expirări · Balanța de stoc · Vechimea stocului · Rotația stocului · Inventar față de scriptic · Diferențele de inventar, valoric · Fișa materiei prime · Stoc pe loturi
Producție4Consum real față de rețetă · Randament pe șarjă · Cost pe produs · Cost complet pe șarjă
Bani4Lista achiziții · Restanțe pe client · Cash pe zi · De încasat și de plătit
Clienți2Top clienți · Vechimea creanțelor
Marje5Marja pe produs · Marja pe categorie · Marja pe client · Marja pe rețetă · Profit pe secție
Contabile2Cheltuieli pe deductibilitate · Venituri pe impozabilitate
Fiscale1Cash-flow fiscal
Parteneri3Vechimea creanțelor și datoriilor · Fișa partenerului · Reconcilierea cu 4111 și 401
Salarizare1Statele de plată pe luni
Cabinet2Ore lucrate · Activitate pe utilizator

Din cele 50 de definiții din app/core/rapoarte.py, 36 se văd la ambele fețe, 10 numai la cabinet și 4 numai la client. În aplicație, cabinetul vede 46 de rapoarte, iar clientul 40.

Un raport, deschis

Filtre, grafic, export

Vânzări pe produs, cu numele de restaurant „pe preparat”: bara de filtre, tabelul cu totalul lui, graficul din aceleași rânduri și butoanele XLSX, PDF și pe Tabloul meu
„Vânzări pe produs”, pe trimestrul III, în instanța de demonstrație (firma de restaurant îl numește „Vânzări pe preparat”): bara de filtre, tabelul cu totalul lui, graficul din aceleași rânduri și butoanele XLSX, PDF și „pe Tabloul meu”. Sub tabel, raportul spune ce parte din el stă pe produse; restul e vânzare prin casa de marcat, fără liniile bonului, intrată pe cotă.
Ce refuză

Cifrele nu se aproximează pe tăcute

Fiecare dintre acestea e o probă verde, nu o intenție: raportul refuză, lasă gol sau își spune limita, în loc să arate o cifră care pare în regulă.

Nu amestecă gestiunile

Cantitățile din gestiuni diferite nu se adună: 12 kg de făină plus 12 sticle de bere dau 24 de nimic. Raportul cere o gestiune anume, iar refuzul vine cu lista din care se alege, nu cu o eroare seacă.

Spune cât din el e produs adevărat

Vânzarea prin casa de marcat, fără liniile bonului, intră pe cotă, nu pe produs. Intră în total, dar pe rânduri marcate, iar raportul își numără singur ce parte din el stă pe produse adevărate.

Nu inventează marjă

Un serviciu n-are cost de gestiune. Dacă ar intra în raportul de marjă cu cost zero, ar arăta marjă de 100 % și ar trage în sus totalul. Nu intră: valoarea lui se numără în acoperire, ca să se vadă cât din raport are cost.

Golul nu e zero

La „Rotația stocului”, marfa care n-a ieșit deloc are rotația zero, dar durata rămâne goală: perioada împărțită la zero rotații nu dă un număr de zile. Un 0 acolo s-ar citi „se mișcă instantaneu”, adică exact pe dos.

Vechimea e a zilei cerute

Un raport pe august, cerut în septembrie, spune ce era bătrân atunci, nu azi: marfa intrată pe 1 august are 30 de zile la 31 august și 60 la 30 septembrie. Avansurile primite stau separat de creanțe: sunt datorie, nu creanță cu minus.

Un cont greșit nu dă un raport gol

Un cont de casă scris greșit ar da un raport gol, care se citește „n-au fost mișcări”. „Cash pe zi” îl refuză cu mesaj. La fel, o factură de ieri nu e restanță: „Restanțe pe client” numără doar ce a trecut de termen.

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.

50
de rapoarte în catalog; fiecare rulează într-un test pe o bază de date reală și își întoarce forma așteptată
app/core/rapoarte.py · tests/test_rapoarte.py::test_fiecare_raport_ruleaza_si_intoarce_forma_asteptata
11
familii de rapoarte, de la Vânzări și Stoc până la Salarizare și Cabinet
app/core/rapoarte.py
36 · 10 · 4
rapoarte la ambele fețe · numai la cabinet · numai la client
tests/test_rapoarte.py::test_CELE_DOUA_FETE_au_fiecare_rapoartele_ei
4
tăieturi ale vânzărilor (pe produs, client, zile, operator) cu același total fără TVA ca jurnalul de vânzări
tests/test_rapoarte.py::test_toate_taieturile_vanzarilor_dau_ACELASI_total
3
formate de export, pe aceeași rută pentru tot catalogul: XLSX, PDF, CSV; fișierul se redeschide în test și i se citește conținutul
app/api/rapoarte.py · tests/test_export_gestiune.py::test_pdf_ul_poarta_antetul_si_randurile
Dovada

Ce testează fiecare fișier

Starea „livrat” de mai sus înseamnă teste verzi, pe o bază de date adevărată, nu pe imitații. Pagina nu are voie să spună „livrat” fără ele: la construire, starea se verifică față de fișierul de capabilități.

Fișier de testProbe verziCe dovedește
test_rapoarte.py121Definițiile și executorul, cele două fețe, fiecare dintre cele 50 de rapoarte rulat pe o bază reală și cifrele lor: totaluri, vechimi, marje, rotații, cash.
test_rapoarte_definite.py22Rapoartele localului (costul vânzării din bonurile de consum, marja pe rețetă, profitul pe secție, vânzările pe oră) și garda că fiecare cod din fiecare profil de firmă are o definiție care rulează.
test_rapoarte_filtre.py20Ce se anunță filtrează: pe ecran, prin rută și în fișierul exportat; clientul nu primește filtre de cabinet; un filtru pe care raportul nu-l poate aplica e refuzat, nu ignorat.
test_export_gestiune.py7XLSX, PDF și CSV: fișierul se redeschide și i se citește conținutul, nu doar se declară făcut.
test_exporturile_rapoartelor.py3Balanța imobilizărilor, concediile anului și manopera lunii pe centre de cost, scoase ca fișier cu aceleași rânduri ca pe ecran.

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

Întrebări

Ce ne întreabă lumea

Pot scoate un raport în Excel?

Da. Orice raport se ia ca XLSX (cu cifre, nu text formatat), PDF sau CSV, cu coloanele, filtrele și rolul de pe ecran. CSV-ul folosește punct și virgulă și virgulă zecimală, cum îl citește Excelul românesc.

Clientul vede aceleași rapoarte ca cabinetul?

Nu toate. Din cele 50, 36 se văd la ambele fețe, 10 numai la cabinet (de pildă fișa partenerului și reconcilierea cu 4111 și 401) și 4 numai la client. Coloanele și filtrele contabile se taie la server pentru client, nu se ascund doar în ecran.

Ce se întâmplă dacă cer un filtru pe care raportul nu-l poate aplica?

Cererea e refuzată cu un mesaj, nu ignorată în tăcere. De aceea un filtru apare pe ecran numai dacă îl primește sursa raportului și sursa fiecărui grafic.

Un raport salvat își păstrează cifrele?

Nu. Se salvează întrebarea (raportul și filtrele lui), iar cifrele se recalculează la fiecare deschidere. Salvarea și scoaterea de pe tablou sunt fapte în registru, nu ștergeri.

Există rapoarte pentru un local?

Da: marja pe rețetă, profitul pe secție, vânzările pe oră, fișa materiei prime, stocul pe loturi, costul complet pe șarjă. Costul vânzării prin casă vine din bonurile de consum ale raportului Z, nu de pe factură.

Vezi rapoartele pe demo

Instanța de demonstrație are rapoarte pe date de probă, cu filtre, grafice și export. Se umblă prin ele.