HOA Manager 2.0 — ce s-a schimbat și de ce contează pentru asociația ta
Versiunea 2.0 nu e doar o listă de feature-uri noi — e răspunsul la frustrările pe care ni le-au transmis administratorii și președinții cu care am lucrat în primele luni. Marketplace cu furnizori verificați. Vot ponderat corect conform Legii 196. Aplicație mobilă cu vot offline. Onboarding ghidat de la zero. Plus un audit de securitate care a scos la iveală — și a reparat — 24 de probleme înainte ca prima asociație reală să le întâlnească.
Mai jos e lista completă cu explicații. Sări direct la secțiunea care te interesează:
- 1. Marketplace de furnizori cu cerere de ofertă (RFQ)
- 2. Vot online ponderat pe cotă indiviză
- 3. Aplicație mobilă PWA cu vot offline
- 4. Onboarding ghidat în 6 pași pentru asociații cu istoric
- 5. Template categorii cheltuieli — un click și ai start
- 6. Gestionare invitații: șterge, retrimite, repară
- 7. Login mobil care chiar merge (fix iOS Mail)
- 8. Audit de securitate: 24 de probleme rezolvate
- 9. Email-uri care chiar ajung la destinatari
1. Marketplace de furnizori cu cerere de ofertă (RFQ)
Soluția 2.0: Marketplace-ul HOA Manager e un catalog de furnizori verificați (CUI valid, IBAN, categorii de servicii, recenzii) accesibil din orice asociație. Din pagina unui proiect, apesi „Cere oferte" și alegi 3-5 furnizori. Fiecare primește email cu un link unic — completează oferta într-un formular standard (preț, termen execuție, garanție, condiții plată). Tu vezi toate ofertele într-un tabel comparabil, exportabil ca PDF pentru procesul verbal.
Două flow-uri pentru a aduce furnizori în catalog
Public — furnizorii deja verificați de echipa HOA Manager apar în catalogul comun. Aici ajung cu recenziile lor, evaluările, statisticile (câte asociații i-au folosit, rata de răspuns la RFQ).
Privat → Pending → Public — adăugi tu un furnizor pe care l-ai folosit (de exemplu, instalatorul cu care lucrezi de 10 ani). Inițial e vizibil doar pentru asociația ta. Opțional, îl recomanzi pentru catalogul public — echipa noastră verifică datele (CUI, IBAN, activitate) și-l publică pentru alte asociații. Așa creștem catalogul împreună, dar fără spam.
2. Vot online ponderat pe cotă indiviză — corect, conform Legii 196
Legea 196/2018 art. 48-52 e foarte clară: pragul pentru deciziile importante (lucrări peste un prag, modificare fond, schimbare administrator) este 2/3 din cotele indivize prezente, nu 2/3 din numărul persoanelor care au votat. Diferența:
Bloc cu 40 apartamente, cotele indivize variază între 1,8% (garsoniere) și 3,5% (4 camere). La Adunare se prezintă proprietarii cu cote însumate de 78% (restul absenți). Pragul de 2/3 din cotele prezente = 52% din total bloc (78% × 2/3 = 52%).
Au votat „pentru" 13 proprietari, dar erau dintre cei cu apartamente mici (cote totale 31%). Au votat „împotrivă" 5 proprietari, dar erau apartamente mari (cote totale 22%). Mai era unul abținut (5%).
Conform Legii: 31% pentru < 52% prag → VOTUL NU TRECE. Chiar dacă numeric 13 vs 5 pare clar pentru. Procesul verbal cu „13/18 voturi pentru, decizie aprobată" devine atacabil în instanță.
Soluția 2.0: sistemul calculează automat tipul de vot corect:
- Adunare Generală (AG) → vot ponderat. Fiecare „pentru/împotrivă/abținere" e ponderat cu cota indiviză a apartamentului. Sistemul afișează live: suma cotelor prezente, pragul de 2/3, statusul curent.
- Comitet Executiv (CEX) → vot simplu. Aici Legea cere majoritate simplă din membri, deci 1 persoană = 1 vot.
- Procesul verbal automat include: lista prezenților cu cotele lor, fiecare vot nominal (sau anonim dacă alegi „secret"), calculul transparent. Semnătură electronică pentru președinte și cenzor. Auditabil 100%.
3. Aplicație mobilă PWA cu vot offline
Soluția 2.0: HOA Manager funcționează ca Progressive Web App — o categorie de aplicații web care se comportă ca native pe mobil:
Instalare în 3 secunde, fără App Store
Proprietarii nu trebuie să caute în App Store / Play Store. Deschid `hoa-manager.ro` în Safari (iPhone) sau Chrome (Android), apasă „Add to Home Screen" și primesc o iconiță pe ecran care deschide aplicația în full-screen, fără bara browser-ului. Arată și se comportă exact ca o aplicație nativă.
Vot offline cu sincronizare automată
Aici e magia: dacă semnalul pică în timpul votului la AGA, votul tău nu se pierde. E salvat local în telefon (într-o coadă IndexedDB) și trimis automat de îndată ce telefonul recapătă conexiunea. Vezi un banner discret galben „Ești offline — voturile se salvează local". Când vine internet-ul înapoi, un toast verde „✓ Votul tău offline a fost trimis cu succes".
Sub capotă, asta merge prin Service Worker + Background Sync API — exact tehnologia folosită de aplicațiile mari (Gmail, Twitter) pentru offline.
Scurtături rapide din ecranul de start
Long-press pe iconița HOA Manager pe iPhone/Android scoate 4 scurtături: Apartament, Vot, Sesizare, Plată. Click pe „Vot" și ești direct în ședința activă, fără să navighezi prin meniuri.
Touch targets corecte pentru deget
Toate butoanele, intrările, dropdown-urile sunt acum 44×44 pixeli minim (standardul Apple HIG + Material Design). Nu mai dai click pe „Anulează" când voiai „Confirmă". Testat pe iPhone Safari și Android Chrome la rezoluții mici și mari.
4. Onboarding ghidat în 6 pași pentru asociații cu istoric
Soluția 2.0: Wizard la /dashboard/onboarding care te ghidează în 6 pași, cu strategie de „cutoff date" — pici o dată (ex. 30 iunie 2026) și totul de dinainte devine snapshot importat, totul de după managementat nativ.
- Locație (bloc / scară) — un formular simplu cu nume, adresă, oraș.
- Apartamente — CSV upload (sau paste). Header strict, preview înainte de import, eroare pe rând cu rândul greșit. Coloane: număr, tip (apartament/garaj/parcare/boxă), etaj, suprafață, cotă indiviză, date proprietar.
- Restanțe legacy — partea cea mai grea, deja rezolvată. Format CSV cu o linie per (apartament × lună):
amount_due(cât a fost facturat),amount_paid(cât a plătit). Sistemul calculează automat restanța =due − paid, creează o datorie cu data scadenței corectă, iar penalitățile (0,2%/zi conform art. 78) se vor recalcula corect cu aging păstrat. - Categorii cheltuieli — pas nou care înlocuiește o oră de muncă manuală. Vezi detalii în secțiunea 5.
- Solduri inițiale fonduri — câți bani sunt în fond reparații, rulment, cotizație specială la data cutoff. Setezi opening_balance și sistemul îl ia ca punct de pornire.
- Invitație proprietari în bulk — toate apartamentele cu
owner_emailcompletat primesc email cu link unic. Fiecare își creează cont și apartamentul se atașează automat la userul lor.
5. Template categorii cheltuieli — un click și ai start
La onboarding, pasul „Categorii cheltuieli" are un buton „🚀 Inițializează cu template standard" care creează într-o tranzacție atomică toate categoriile tipice de HOA: apă rece, apă caldă, energie electrică spații comune, gaz, salubritate, salarii, asigurare, mentenanță, cheltuieli neprevăzute. Cu setări corecte de distribuție (per apartament, per cotă, per persoană) pe fiecare.
Înlocuiește o oră de muncă cu 1 click. Le poți edita oricând după — adăugi, ștergi, redenumești.
6. Gestionare invitații: șterge, retrimite, repară
Lista de invitații pending acum are 2 butoane pe fiecare rând:
- 📧 Retrimite — resetează expirarea la 7 zile și trimite email proaspăt cu același link. Util când proprietarul l-a pierdut sau l-ai introdus greșit.
- 🗑 Șterge — pentru cazuri când invitația a fost emisă greșit. Link-ul vechi nu mai funcționează imediat.
Plus: bug major la transferul de proprietate, rezolvat
Anterior, butonul „Detașează proprietar" curăța doar numele, telefonul și email-ul din apartament — dar nu curăța referința la userul vechi (owner_user_id). Rezultatul: apartamentul părea „fără proprietar" în UI, dar la momentul invitării unui nou proprietar, sistemul îl filtra ca „ocupat". Acum se curăță complet, iar apartamentul devine disponibil pentru invitație nou proprietar fără reziduuri.
7. Login mobil care chiar merge (fix iOS Mail)
Mai mulți proprietari ne-au scris: „Am dat click pe link-ul de invitație din email-ul de pe iPhone, dar mi-a zis că link-ul nu poate fi verificat." Investigația a scos la iveală un bug specific iOS Mail.
Înainte, link-urile de magic-login conțineau token-ul după # (URL hash fragment) — un pattern standard pentru autentificare în SPA-uri. Doar că iOS Mail strip-uia hash-ul când deschidea link-ul, transformând ...?type=magiclink#access_token=xyz în ...?type=magiclink și autentificarea pică.
Soluția 2.0: link-urile folosesc acum ?token_hash= ca query param, verificat server-side. Compatibil cu iOS Mail, Gmail, Outlook, WhatsApp in-app browser și orice client de email exotic. Plus un fallback pentru recovery link (utilizatorul setează parolă) dacă magic link-ul tot pică — bonus, primesc o parolă personală pe care o pot folosi în viitor.
8. Audit complet de securitate: 24 de probleme rezolvate
Înainte de a primi prima asociație reală în producție, am rulat un audit intern pe matricea RBAC (drepturi pe roluri), race conditions, injection, rate limiting. Rezultat: 6 probleme BLOCKER + 10 HIGH + 8 MEDIUM identificate și rezolvate. Câteva exemple:
RBAC: locații și onboarding restricționate la admin
Anterior, un proprietar care nu citea atent textul putea crea un bloc nou prin wizard-ul de onboarding (matrice RBAC dă Full pe „properties" la proprietar pentru a-și edita apartamentul, dar același flag a fost aplicat și la operațiuni de top-level). Acum operațiunile de structură (creare bloc, bulk-import apartamente) cer permisiunea settings — disponibilă doar pentru administrator, președinte, vicepreședinte.
Race condition la submiterea de oferte RFQ
Dacă doi furnizori submiteau oferte la aceeași cerere în același moment, era teoretic posibil ca al doilea să suprascrie pe primul. Acum la nivel de bază de date: UNIQUE(rfq_id) pe tabelul de quotes + SELECT FOR UPDATE în RPC + tratare grațioasă a conflictului în UI („Cererea a fost deja completată, încearcă din nou").
Rate limiting pe endpoint-uri publice
Submitarea ofertei RFQ și acceptarea invitației sunt endpoint-uri publice (fără autentificare). Acum au rate limit per IP — nu mai poate cineva să spamuieze 1000 de oferte pe un RFQ ca să-l facă inutilizabil.
Cron auth timing-safe
Cron-urile (notificări garanție, e-Factura sync, SLA escalator, plăți recurente) verifică un Bearer token. Anterior, compararea folosea === — vulnerabilă la timing attacks (un atacator poate să deducă byte cu byte token-ul corect din diferențele subtile de timp de răspuns). Acum folosește crypto.timingSafeEqual — constant-time, indiferent unde e byte-ul greșit, timpul de răspuns e identic.
9. Email-uri care chiar ajung la destinatari
Un episode neplăcut pe care l-am rezolvat: contul nostru de email service (Resend) s-a confruntat cu o problemă administrativă pe domeniul hoa-manager.ro (revocare cheie DKIM unilaterală la migrarea lor pe AWS SES, fără notificare). Câteva ore am livrat invitații cu warning „Email NU a fost livrat" și un workaround manual (copy-paste link în WhatsApp).
Soluția: am mutat domeniul pe un cont nou, am recreat DNS-ul DKIM, am separat chei pentru production și dev. Email-urile pleacă acum instant, cu rate de livrare normală. Plus, am actualizat codul ca toate cele 16 endpoint-uri care trimit email să citească adresa din env variable — astfel viitoarele probleme similare nu mai necesită deploy, ci doar o schimbare de config în Vercel.
Pe scurt: orice asociație nouă care se înregistrează acum primește email-urile de invitație, notificările de plată, alertele de garanție, comunicările oficiale, fără întârzieri.
Tot ce e mai sus, plus 60 de îmbunătățiri mărunte
Demo-ul gratuit te lasă să vezi toate cele 9 funcționalități noi în acțiune: marketplace cu 8 furnizori, RFQ cu oferte mock, AGA simulat cu vot ponderat, PWA install, onboarding wizard de la zero. Fără card, fără înregistrare. 2 minute să arunci o privire.