Job-ul agentului: "onboardează retaileri" — un singur flux, indiferent dacă magazinul are sau nu cont

În FMCG moldovenesc, distribuitorul își angajează agenți care vizitează magazinele pe teren. Munca lor zilnică e să aducă noi parteneri în catalog. Cele două scenarii tehnice — magazinul există deja în SDIApp vs. magazinul e nou — apar diferit ca implementare backend, dar pentru agent e același tap, același flux.

Soluția (deja în Phase 3, documentată în api-spec.md): două callable-uri separate cu intent identic din punctul de vedere al UI-ului. UI-ul agentului face lookup-ul după telefon/IDNO, decide ramura și apelează callable-ul potrivit. Permisiunea retailers.onboard e deja acordată ambelor roluri.

API mapping (Phase 3 — implementat):
Permisiuneretailers.onboard — acordat la distributor_owner + distributor_agent
Ramură A · org existăinviteExistingRetailerToLink({distributorIdno, retailerIdno, message?}) → scrie distributorLinkRequests/{id} · acceptat de retailer prin acceptDistributorLinkRequest
Ramură B · org nou (pas 1)inviteRetailerToOnboard({distributorIdno, invitedPhone, suggestedRetailerName?, suggestedRetailerIdno?, suggestedAddress?, message?}) → scrie retailerOnboardingInvitations/{id} keyed by phone
Ramură B · org nou (pas 2)claimRetailerOnboardingInvitation({invitationId, retailerIdno, retailerName, retailerAddress}) apelat de retailer după ce instalează app + sign in cu acel telefon · tranzacție atomică: creează org + adaugă owner + activează link cu sourceKind: 'onboarding'
In-person QRhandoff cu QR + cod 6-cifre (deep link). Magazin scanează cu camera → App Store/Play → app instalată → owner se autentifică cu telefonul + tap "Acceptă" care apelează claimRetailerOnboardingInvitation

distributor_agent

vizite tab · home

Hero "Adaugă magazin nou" — signature card cu accent. Acțiunea zilei: aduce noi parteneri. Vizitele programate dedesubt.

9:41● ● ●
V
Vitafor SRL
Agent · Centru
PM
Vizite
3 vizite azi · 2 magazine noi săptămâna asta
+
Adaugă magazin nou
Caută după telefon sau IDNO · trimite invitație pe loc
10:00
Magazin Central
Stefan cel Mare 17 · acum
activ
11:30
Bakal Vasile
Cuza Vodă 32 · acceptat ieri
activ
14:00
Universal Mart
Calea Ieșilor 64 · stoc check
activ
Onboardări în curs · 2
Magazinul Doina
Invitație SMS trimisă ieri · neacceptată
acum 22h
Mini Market 24
Acceptat — partener activ
azi 8:14
Statusul vine din distributorLinkRequests filtrat după initiatedBy == me. Magazinele pe care le-am adus rămân vizibile aici 30 zile.
Acasă
Clienți
Comenzi
Vizite

distributor_agent

lookup · găsit existent

Caută după telefon sau IDNO. Sistemul răspunde instant: magazinul există deja. Ramură A: doar trimite o cerere de legătură.

9:41● ● ●
×
Adaugă magazin
caută partenerul
Caută magazinul
📞 Telefon
⌗ IDNO
▦ Scanează QR
+373 60 123 456
Format E.164 · validăm în timp real
✓ Magazin găsit în SDIApp
Magazin Central
IDNO 1003600012345
Stefan cel Mare 17, Chișinău · proprietar Andrei Gîrlea
Membru SDIApp din 12.03.2026
Mesaj pentru proprietar · opțional
Ex: Ne-am cunoscut azi la magazin. Iată cererea de parteneriat din partea Vitafor.
Ramura A: UI-ul apelează inviteExistingRetailerToLink. Proprietarul primește notificare în app + SMS de backup; acceptă cu acceptDistributorLinkRequest.
Înapoi
Trimite cerere legătură
Acasă
Clienți
Comenzi
Vizite

distributor_agent

lookup · magazin nou (bootstrap)

Telefonul nu corespunde niciunui magazin. Ramură B: agentul completează rapid datele magazinului. Sistemul creează org + invitație + link request, totul atomic.

9:41● ● ●
Magazin nou
creează contul · trimite invitația
Telefon proprietar
+373 69 887 234 nu există încă
Denumire magazin
Magazinul Doina
IDNO · cod fiscal
1003600098765
13 cifre · sau 10 pentru întreprindere individuală
Adresă · pentru livrare
Strada Independenței 22, Chișinău
Numele proprietarului · opțional
Doina Cojocaru
Apare în invitație și pe rândul comenzilor lor
Ramura B · doi pași:
Acum (agent): inviteRetailerToOnboard({distributorIdno, invitedPhone: '+37369887234', suggestedRetailerName, suggestedRetailerIdno, suggestedAddress, message?}) · scrie retailerOnboardingInvitations/{id} keyed by phone · trimite SMS cu deep link
Mai târziu (retailer): instalează app, sign in cu +373 69 887 234, apelează claimRetailerOnboardingInvitation care atomic: creează organizations/{retailerIdno}, adaugă caller ca retailer_owner, scrie distributorLinks cu sourceKind: 'onboarding'
Renunță
Creează + trimite invitația
Acasă
Clienți
Comenzi
Vizite

distributor_agent

in-person · QR handoff

După trimitere, agentul vede QR + cod 6-cifre pe loc. Proprietarul scanează cu camera telefonului → App Store/Play → instalează → app deschide direct ecranul "Acceptă invitația".

9:41● ● ●
Magazinul Doina
arată-i proprietarului ecranul
Cont creat · invitație trimisă
SMS la +373 69 887 234 · deep link inclus
Sau scanează aici pe loc
Proprietarul deschide camera și scanează
VTF · 4382
Cod 6 cifre dacă nu funcționează scanarea. Valid 15 minute.
SMS din nou
Marchează acceptat manual
QR-ul conține un universal-link cu token de onboarding. App-ul citește tokenul după instalare, vine cu context-ul invitației completat. Pentru proprietarul care are deja app-ul: scanarea deschide direct ecranul "Vitafor te invită — Acceptă".
Mai târziu
Înapoi la vizite
Acasă
Clienți
Comenzi
Vizite