Catalogul retailerului e gol până există un distributorLink activ. În practica reală, agentul distribuitorului vizitează magazinul și inițiază legătura pe loc (vezi vizite.html). Inbox-ul de aici e ce vezi după momentul fizic: pe partea distribuitorului — onboardările echipei tale; pe partea retailerului — invitațiile primite.
Calea retailer-pulled (cere singur o legătură știind IDNO-ul distribuitorului) rămâne ca opțiune de fallback pentru cazuri rare — retaileri stabiliți care vor să găsească ei activ un distribuitor specific. Demotată vizual.
retailers.onboard (agent + owner) ·
Branch A (retailer există) → inviteExistingRetailerToLink({distributorIdno, retailerIdno, message?}) ·
Branch B (retailer nou, fără org) → inviteRetailerToOnboard({distributorIdno, invitedPhone, suggestedRetailerName?, suggestedRetailerIdno?, suggestedAddress?, message?}) apoi retailerul apelează claimRetailerOnboardingInvitation({invitationId, retailerIdno, retailerName, retailerAddress}) ·
Acceptă (Branch A) → acceptDistributorLinkRequest({requestId}) ·
Respinge → rejectDistributorLinkRequest / rejectRetailerOnboardingInvitation ·
Anulează (initiator) → cancelDistributorLinkRequest / cancelRetailerOnboardingInvitation ·
Pauză / Reia → pauseDistributorLink / resumeDistributorLink({linkId, reason?}) ·
Termină → terminateDistributorLink({linkId}) (ireversibil, oricare parte) ·
Fallback retailer-pulled — nu există în v1 (deferred). Vezi vizite.html pentru fluxul agentului.
Hero CTA "Adaugă magazin" sus. Tab default = "Onboardări" (cele inițiate de tine / agenții tăi). Cererile retailer-pulled apar într-un tab separat, mai rare.
Cazul comun: distribuitorul te-a invitat (agent în vizită sau remote). Signature card cu Accept/Respinge — un singur tap. Parteneri activi dedesubt. "Caut singur" e demoted la sfârșit.
Acest flux nu există în v1. Mockat aici ca referință dacă/când va fi adăugat (feedback real-world ar arăta dacă există cerere pentru self-request). În v1, retailerul așteaptă vizita unui agent — vezi vizite.html.