Produs propriu, facturare electronică, ro e-factura
Emitera: aplicație SaaS de facturare cu integrare RO e-Factura
Un site se judecă după câte telefoane produce. O aplicație, după cât din munca unui om preia.


- 1,6 KB
- ≈202 KB
- 401
- no-store
Ce am făcut
- Produs și arhitectură
- Interfață
- API și integrare ANAF
- Securitate
- Infrastructură comercială
Contextul
Emitera e produsul nostru, nu o lucrare plătită de un client. O spunem de la început, ca să nu existe confuzie: tot ce urmează e despre ce am construit pentru noi, nu despre un rezultat livrat altcuiva.
E o platformă de facturare pentru firme din România, cu facturi, clienți, cheltuieli și rapoarte financiare într-un singur produs, plus comunicare OAuth cu sistemul RO e-Factura al ANAF. Nișa e dictată de lege: firmele nu aleg dacă trimit facturile electronic, ci doar cu ce unealtă. O eroare de integrare nu e un bug de interfață, e o factură care nu ajunge la ANAF.
Ce a dictat forma produsului
Integrarea cu ANAF nu iartă aproximări
RO e-Factura are format impus, autentificare OAuth și erori pe care utilizatorul final nu are cum să le descifreze. Aplicația gestionează tokenuri, retrimiteri și stări intermediare, iar utilizatorul înțelege în ce stare e factura fără documentație tehnică.
Datele financiare cer alt nivel de securitate
Într-un site de prezentare, cel mai rău lucru e un formular de spam. Aici sunt facturi, coduri fiscale și date de firmă. Nivelul de protecție se decide la început, în arhitectură, nu la final, cu un plugin.
Un produs cu abonament are nevoie de infrastructură de produs
Pagini legale, politică de anulare și rambursare, termeni, cookies, contact. Fără ele nu poți încasa abonamente și nu treci de verificările procesatorilor de plăți.
Deciziile luate
Aplicație, nu site, și asumat ca atare
Browserul primește un schelet HTML de 4,5 KB și construiește interfața din JavaScript: alegerea corectă pentru o unealtă în care omul stă și lucrează. Costul e real și îl spunem pe față: pagina publică nu are conținut pentru motoarele de căutare. Pentru un produs vândut prin campanii și recomandări, e un compromis acceptat.
API-ul e separat și închis implicit
Orice cerere către rutele de date primește 401 fără sesiune validă; se poate verifica din exterior. Separarea permite ca mâine să existe o aplicație de mobil peste același API, fără rescrierea logicii.
Politici de securitate scrise, nu presupuse
Content-Security-Policy cu surse enumerate una câte una și hash-uri pentru scripturile inline, HSTS pe un an cu subdomenii, Cross-Origin-Opener-Policy, Referrer-Policy „no-referrer”, permisiuni de cameră și microfon revocate explicit. Aplicația refuză să fie încărcată în iframe de pe alt domeniu.
Autentificare cu Google, pe lângă cea clasică
Un cont nou se face în câteva secunde, fără încă o parolă. La un produs cu abonament, frecarea de la înregistrare e primul loc unde pierzi utilizatori.
Scheletul nu se cache-uiește niciodată
Scheletul e servit cu „no-store”, iar fișierele de cod au hash în nume. La fiecare versiune nouă utilizatorii primesc imediat codul nou, fără să rămână blocați într-o versiune veche din cache.
Partea comercială, tratată ca parte din produs
Sitemap-ul public are 6 rute, patru dintre ele legale: termeni, confidențialitate, cookies, anulare și rambursare. Un SaaS pe abonament fără paginile astea nu e un SaaS, e un demo.
Ce s-a livrat
- Rute pentru autentificare, înregistrare, panou, facturi, clienți, cheltuieli, rapoarte și setări; frontend Angular, API separat care răspunde 401 fără sesiune
- Comunicare OAuth cu RO e-Factura (ANAF); autentificare cu Google, singura sursă externă de script permisă; WebSocket permis pentru actualizări în timp real
- Content-Security-Policy cu surse enumerate și hash-uri, HSTS 1 an cu subdomenii, HTTP/2 cu HTTP/3 anunțat, COOP, Referrer-Policy, X-Content-Type-Options, Permissions-Policy
- Date structurate SoftwareApplication cu prețul afișat, manifest PWA, set complet de favicon-uri, sitemap cu 6 rute și robots.txt
Cum am măsurat
Aici lipsește intenționat timpul de răspuns: aplicația e găzduită pe același server de pe care rulăm măsurătorile, așa că orice valoare ar fi spectaculoasă și fără sens. Ce vezi sunt mărimi și coduri de răspuns, identice indiferent de unde măsori. Pentru timpi reali, rulează PageSpeed Insights pe domeniu.
Pagina, cap-coadă
Derulează captura sau deschide site-ul.
Captura e făcută pe site-ul live, la 1440 și 412 px lățime. Ține cursorul pe ramă ca să vezi pagina întreagă.

