Când am lansat Rolog, făcea un singur lucru: genera foi de parcurs. Acum face mult mai mult. Iată ce am adăugat, cum am implementat, și ce am învățat pe drum.

De unde am plecat

Rolog a început ca o aplicație cu o misiune simplă: să transforme corvada completării foilor de parcurs într-un proces de câteva tap-uri pe telefon. Înregistrezi călătoriile, apeși un buton, primești un PDF profesional gata de semnat și trimis contabilului.

Funcționa bine. Dar după câteva săptămâni de utilizare am realizat ceva: dacă tot ai aplicația deschisă de fiecare dată când te urci în mașina firmei, de ce să nu facă mai mult? Datele sunt acolo: vehiculul, șoferul, rutele, kilometrii. Lipseau doar piesele care leagă totul.

Așa am decis să transform Rolog dintr-o aplicație de foi de parcurs într-un manager complet de vehicule. Foile de parcurs rămân nucleul. Dar acum sunt o funcționalitate din mai multe.

Ce am adăugat

Cinci funcționalități noi, toate disponibile cu abonament activ:

  1. Evidență alimentări cu scanare OCR a bonurilor
  2. FAZ (Fișa Activității Zilnice), document generat automat
  3. Alerte de expirare pentru ITP, RCA, CASCO, rovinietă
  4. Evidență service și revizii
  5. GPS auto-tracking al curselor

Le-am implementat exact în ordinea asta, și nu din întâmplare. Alimentările sunt fundația,   datele de acolo alimentează FAZ-ul. FAZ-ul completează pachetul de documente pe care utilizatorul îl generează lunar. Alertele și service-ul sunt independente dar adaugă valoare pe vehicul. GPS-ul a venit la final pentru că era cel mai complex.

Scanarea bonurilor: un gest, trei documente

Asta e funcționalitatea care a schimbat cel mai mult experiența de utilizare. Faci plinul, fotografiezi bonul, datele se completează singure.

Tehnic, am folosit Vision framework-ul Apple, OCR nativ, gratuit, funcționează offline. Camera capturează bonul, Vision extrage textul, iar un parser pe care l-am construit caută pattern-urile specifice bonurilor românești: „TOTAL", „Litri", „Preț/l", data în format DD.MM.YYYY. Rezultatele apar într-un formular pre-completat, editabil. OCR-ul propune, utilizatorul confirmă.

Provocarea a fost variabilitatea bonurilor. Petrom, MOL, OMV, Rompetrol, fiecare cu layout-ul lui, cu terminologia lui. Am ajuns la un parser care acoperă cele mai comune formate, dar am păstrat formularul editabil tocmai pentru cazurile în care OCR-ul nu prinde totul perfect.

De ce contează atât de mult? Pentru că o singură scanare elimină completarea manuală în trei locuri diferite: foaia de parcurs (secțiunea de alimentări), FAZ-ul (calculul consumului efectiv), și raportul de alimentări (centralizatorul lunar). Un gest, trei documente actualizate.

Modelul de date e direct. Fiecare alimentare ține de un vehicul prin relație SwiftData cu cascade delete. Tipul de combustibil se pre-populează din profilul mașinii dar rămâne editabil. 

FAZ-ul: documentul care completează tabloul

FAZ-ul (Fișa Activității Zilnice) face legătura între km parcurși și consumul de combustibil. Compară consumul efectiv cu consumul normat. Fără FAZ, pachetul de documente pentru deductibilitate e incomplet.

Partea elegantă: FAZ-ul nu e o entitate stocată în baza de date. E un document generat din date care deja există: călătoriile și alimentările. Nu stochez nimic suplimentar, doar calculez la momentul generării raportului.

Calculul consumului normat a necesitat un detaliu pe care Rolog nu îl avea: split-ul urban vs extraurban. Coeficienții sunt diferiți: 1.1 pentru urban, 0.9 pentru extraurban. Am rezolvat cu un toggle pe ecranul de editare călătorie: implicit, totul se consideră urban. Când activezi "Detaliere urban/extraurban", apar două câmpuri separate. Cine face deplasări locale nu vede nicio diferență. Cine face drumuri lungi poate detalia.

Am verificat dacă MapKit poate clasifica automat segmentele de traseu ca urban sau extraurban. Nu poate. Nu există un flag de tip "în localitate" pe segmentele rutei. Dar în practică, e o estimare pe care utilizatorul o face în câteva secunde. Nu trebuie să fie precisă la metru.

Alerte: simplu, dar surprinzător de util

ITP, RCA, CASCO, rovinietă și revizii periodice, patru documente cu date de expirare pe care toată lumea le ține în cap până le uită. De revizia periodica nu mai vorbesc. Acum sunt cinci carduri permanente pe ecranul fiecărei mașini, fiecare cu data de expirare, un status vizual (verde dacă mai e timp, galben sub 30 de zile, roșu sub 7 zile sau expirat), și o notificare push programată automat.

Utilizatorul alege cu câte zile înainte vrea să fie notificat: preset-uri rapide (7, 14, 30 zile) sau valoare custom. O singură notificare per alertă, programată prin UNUserNotificationCenter cu UNCalendarNotificationTrigger. Notificări locale, fără server, funcționează și când aplicația nu rulează.

Un moment amuzant din dezvoltare: când am construit prima versiune a Rolog-ului, Claude (în Xcode) mi-a spus că notificările locale programate nu se pot face în iOS. Am crezut pe cuvânt și am renunțat la funcționalitate. Acum, în sesiunea de planificare pentru aceste extensii, am redescoperit că se poate, e literalmente funcționalitatea de bază a framework-ului. Lecția: verifică mereu, chiar și ce zice AI-ul. Mai ales ce zice AI-ul.

Tehnic, e cea mai simplă funcționalitate din toate cele cinci. Dar feedback-ul utilizatorilor spune că e printre cele mai apreciate. Uneori valoarea nu vine din complexitate.

Service și revizii: jurnalul mașinii

Un jurnal cronologic de intervenții pe vehicul: revizii periodice, schimb ulei, schimb anvelope, frâne, distribuție, reparații generale. Fiecare cu data, tipul, costul, km la bord, și opțional unde s-a făcut.

GPS auto-tracking: cel mai complex, cel mai diferențiator

Ultima funcționalitate implementată, și cea care a transformat Rolog. Apeși un buton, conduci, apeși alt buton. Aplicația creează automat o călătorie completă: distanță din GPS, adrese start/end din reverse geocoding, data și ora automate. Mai completezi doar scopul călătoriei.

Provocarea locațiilor

Rolog funcționează pe baza unor locații predefinite, le adaugi o dată, le refolosești. Dar GPS-ul aduce coordonate care s-ar putea să nu corespundă niciunei locații existente. Cum rezolvi asta fără să forțezi utilizatorul într-un proces ce mananca timp?

Soluția: potrivire automată. La sfârșitul unei curse, aplicația verifică dacă vreuna din locațiile existente e în raza de 200 de metri de coordonatele GPS. Dacă da, o propune automat. Dacă nu, oferă opțiunea de a crea o locație nouă, pre-completată cu adresa din reverse geocoding.

Rezultatul: GPS-ul nu doar înregistrează curse ci alimentează și baza de locații. Cu cât folosești mai mult, cu atât aplicația cunoaște mai bine rutele tale frecvente.

Implementarea

CoreLocation cu background tracking: activityType = .automotiveNavigation, desiredAccuracy = kCLAccuracyNearestTenMeters pentru un compromis bun între precizie și consum de baterie. Nu stochez polyline-ul complet al traseului, doar coordonatele de start, end, și distanța totală. E suficient pentru documentele pe care le generez.

Un button pe tab-ul Călătorii controlează totul: „Pornește cursa" devine „Oprește cursa" când tracking-ul e activ. La oprire, formularul de călătorie se deschide pre-completat. Utilizatorul verifică, adaugă scopul, confirmă.

Background location tracking a venit cu o provocare suplimentară: justificarea pentru App Store Review. Apple e strict cu aplicațiile care cer locație în background. „Rolog are nevoie de acces la locație în fundal pentru a continua urmărirea cursei tale în timp ce conduci." a fost acceptat fără probleme pentru că e un use case legitim și clar.

Cum se integrează totul în UI

Rolog are 5 taburi, maximul recomandat de Apple. Nu am adăugat altele. Toate funcționalitățile noi s-au integrat în structura existentă.

Tab-ul Mașini a devenit hub-ul vehiculului. Ecranul fiecărei mașini are acum un segment control cu patru secțiuni, navigabile prin iconuri SF Symbols:

Segment SF Symbol
Detalii car.circle.fill
Alimentări fuelpump.circle.fill
Alerte bell.badge.circle.fill
Service gearshape.circle.fill

Am ales iconuri fără text, curat, consistent vizual, și funcționează pe orice dimensiune de ecran. Segment control-ul schimbă conținutul instant, fără navigație suplimentară. Intri pe mașină, comui între secțiuni cu un tap.

Tab-ul Rapoarte s-a extins natural. Utilizatorul poate genera fie un pachet complet (un PDF multi-pagină: foaia de parcurs, raportul de alimentări, FAZ-ul), fie fiecare document individual. Flexibilitate maximă.

Tab-ul Călătorii a primit butonul pentru GPS tracking. 

Tab-ul Mașini a primit butonul pentru scanare bon pentru a avea acces rapid la această funcționalitate. Restul a rămas neschimbat.

Ce am învățat

Ordinea de implementare contează enorm. Am construit alimentările primul pentru că FAZ-ul depinde de ele. Dacă inversam ordinea, aș fi avut un FAZ fără date reale cu care să-l testez. Dependențele între funcționalități dictează ordinea, nu preferințele.

Toggle-urile ascund complexitate. Toggle-ul urban/extraurban pare un detaliu minor. Dar a necesitat modificarea modelului de călătorie, logică condițională în generarea FAZ-ului, și o decizie de UX (cum îl afișezi fără să complici ecranul pentru utilizatorii care nu au nevoie de el). Funcționalitățile "mici" nu sunt mereu mici.

OCR-ul nu e magic. Vision framework-ul e impresionant, dar bonurile românești sunt variate, uneori mototolite, uneori decolorate. Am învățat rapid că OCR-ul trebuie tratat ca un asistent care propune, nu ca un sistem care decide. Formularul editabil nu e un compromis, e design-ul corect.

Notificările locale sunt subestimate. Cea mai simplă funcționalitate din cele cinci s-a dovedit printre cele mai utile. Câteodată, un reminder la momentul potrivit valorează mai mult decât un dashboard sofisticat.

Segment control-ul a fost alegerea corectă pentru organizarea ecranului mașinii. Am luat în considerare scroll vertical lung și listă tip meniu cu ecrane separate. Scroll-ul devenea haotic cu atâtea secțiuni. Lista adăuga tap-uri inutile. Segment control-ul oferă acces instant la orice secțiune fără a aglomera ecranul.

Unde e Rolog acum

Rolog a evoluat de la o aplicație care genera un singur PDF la un manager complet de vehicule. Înregistrezi călătorii, scanezi bonuri, primești alerte, ții evidența service-ului, și poți lăsa GPS-ul să facă treaba grea. La final de lună, un buton generează tot ce ai nevoie.

Toate funcționalitățile noi sunt premium, disponibile cu abonamentul lunar sau anual. Foile de parcurs rămân disponibile în versiunea gratuită cu limitele existente.

Și nu mă opresc aici. Am deja planuri pentru ce urmează, dar despre asta altă dată.

Rolog e disponibil în App Store. Dacă ai o firmă și mașini de serviciu, încearcă cele 30 de zile gratuite. Și dacă ai întrebări despre orice aspect tehnic din acest articol, de la Vision OCR la CoreLocation background tracking, scrie-mi la contact@lorinbute.com.