Cea mai cerută functionalitate nu a venit de la utilizatori, ci de la contabilul lor. Iată cum am adăugat exportul de bonuri în format XML compatibil cu software-ul de contabilitate din România.
Cum a apărut ideea
Am construit Rolog să rezolve o problemă a șoferului: completarea foilor de parcurs. Apoi am adăugat alimentările, FAZ-ul, alertele, totul pentru omul din spatele volanului. Dar foile de parcurs și bonurile de combustibil nu rămân la șofer. Ele ajung la contabil.
Și contabilul are propria lui problemă: introducerea manuală a datelor în programul de contabilitate. Primește un PDF frumos de la Rolog, îl deschide, și începe să tasteze aceleași cifre într-un alt program. Dată, furnizor, litri, sumă, TVA, de mână, bon cu bon, lună de lună.
Am vorbit cu un contabil și m-a întrebat un lucru simplu: „Poți să-mi dai un fișier pe care să-l import direct în Saga?"
Am putut.
Formatul XML Saga, standardul de facto
Primul lucru pe care l-am descoperit: nu trebuie să inventez nimic. Saga, cel mai folosit program de contabilitate din România, are un format XML documentat pentru import de facturi. Și nu doar Saga, Oblio exportă în același format, SmartBill exportă în același format, FGO exportă în același format. E un standard de facto pe care toată industria de contabilitate din România îl înțelege.
Contabilul mi-a dat un fișier XML exportat din Oblio ca exemplu. L-am deschis, am studiat structura, și am realizat că se mapează aproape perfect pe datele pe care le am deja în Rolog.
Fiecare bon de combustibil devine o „factură" de tip C (bon fiscal cu CUI) în limbajul contabilității. Structura XML are un antet cu datele furnizorului (benzinăria) și ale clientului (firma), linii de detaliu cu produsele (combustibilul plus orice altceva e pe bon), și un sumar cu totalurile.

Provocarea TVA-ului
Cea mai interesantă provocare tehnică a fost TVA-ul. Bonul de la benzinărie arată prețul final, cu TVA inclus. Dar XML-ul de contabilitate cere valorile fără TVA, cu TVA-ul separat pe fiecare linie. Deci trebuie să inversez calculul.
Pentru o companie plătitoare de TVA cu cota de 21%: iei suma de pe bon, o împarți la 1.21, obții valoarea fără TVA. Diferența e TVA-ul. Simplu matematic, dar trebuie gestionat corect: rotunjiri la 2 zecimale, consistență între linii și sumar, și cazul companiilor neplatitoare de TVA unde totul e zero.
Am adăugat un comutator „Plătitor de TVA" pe ecranul de editare companie. Dacă e activat, exportul calculează și include TVA-ul. Dacă nu, TVA-ul e zero pe toate liniile. Un singur comutator care schimbă complet structura financiară a exportului.

Bonul complet, nu doar combustibilul
A doua provocare a venit tot de la contabil: „Bonul trebuie să fie complet. Dacă ai cumpărat și cafea și lichid de parbriz, totul trebuie să fie pe factură."
Asta a schimbat modelul de date. Până acum, o alimentare era un singur produs: combustibilul. Acum, o alimentare e un bon cu mai multe linii. Combustibilul rămâne linia principală, obligatorie. Restul sunt opționale.
Am creat un model nou, ReceiptItem, legat de alimentare prin relație SwiftData. Pe ecranul de alimentare, sub câmpurile de combustibil, am adăugat un NavigationLink către un ecran de „Produse adiționale". Cine nu cumpără nimic extra nu vede nimic extra. Cine cumpără, adaugă produsele, și bonul devine complet.
Detaliul important: am păstrat două totaluri separate. Totalul de combustibil e cel care apare în sumarul de alimentări, în raportul PDF, în FAZ. Totalul bonului (combustibil + produse extra) e cel care se exportă în XML. Contabilul vede bonul complet. Șoferul vede doar consumul de combustibil. Fiecare primește ce are nevoie.


Unde am pus butonul de export
Asta a fost o decizie de UX care m-a ținut pe loc. Exportul XML nu e un raport, e un transfer de date. Nu are previzualizare, nu are limbă RO/EN, nu depinde de o mașină anume. E diferit conceptual de rapoartele PDF.
Inițial am vrut să adaug un al patrulea buton în selectorul de tip raport (lângă Parcurs, Alimentări, FAZ). Dar trei butoane cu text în română ocupau deja tot spațiul orizontal. Pe un iPhone SE ar fi fost dezastru.
Soluția a venit din altă direcție: am transformat butonul de notificare lunară (bell-ul din dreapta sus pe tab-ul Rapoarte) într-un buton de setări. Sheet-ul care se deschide are acum trei secțiuni: rapoartele implicite (ce tip de raport vrei pre-selectat), exportul XML, și notificarea lunară.
Exportul XML e simplu: selectezi luna, apeși „Exportă XML", primești fișierul prin Share Sheet. Toate alimentările de pe toate mașinile, într-un singur fișier. Contabilul importă o dată și gata.

Bonus: rapoarte implicite
Cât am lucrat la ecranul de setări, am adăugat și altceva: selecția implicită de rapoarte. Trei comutatoare: Parcurs, Alimentări, FAZ, care controlează ce e pre-selectat când deschizi tab-ul Rapoarte.
Dacă generezi mereu Parcurs + FAZ, le bifezi o dată în setări și nu mai apeși de fiecare dată. Un detaliu mic care economisește câteva tap-uri pe lună. Genul de funcționalitate pe care nu o ceri dar o apreciezi când o ai.
Rezultatul
Fluxul complet arată acum așa: șoferul face plinul, scanează bonul, adaugă eventual și cafeaua de pe bon. La final de lună, deschide Rolog, intră în setări rapoarte, apasă „Exportă XML", și trimite fișierul contabilului pe email. Contabilul deschide Saga, Diverse - Import date, selectează fișierul, și toate bonurile se importă automat. Zero introducere manuală.
De la bon scanat cu telefonul la înregistrare contabilă, fără să tasteze nimeni nicio cifră de mână.
Ce am învățat
Vorbește cu utilizatorul final, dar și cu oamenii din jurul lui. Rolog e pentru șoferi și manageri de flotă. Dar contabilul e cel care procesează datele la final. O funcționalitate care rezolvă problema contabilului face aplicația mai valoroasă pentru toată lumea din lanț.
Standardele de facto sunt mai importante decât standardele oficiale. Nu am căutat un standard ISO pentru XML de contabilitate. Am cerut un fișier real de la un contabil real și l-am reprodus. Formatul Saga XML nu e documentat oficial nicăieri ca „standard", dar toată industria îl folosește.
Două totaluri sunt mai bune decât unul. Tentația inițială a fost să am un singur total per bon. Dar combustibilul și cafeaua sunt categorii complet diferite din punct de vedere contabil și din punct de vedere al analizei de consum. Separarea lor din start a simplificat totul, fiecare parte a aplicației ia ce are nevoie fără calcule suplimentare.
Rolog e disponibil în App Store. Exportul XML este disponibil cu abonamentul premium. Dacă ai întrebări tehnice despre integrarea cu Saga sau despre formatul XML, scrie-mi la contact@lorinbute.com.
