Un retailer_worker plasează aceeași comandă în mare parte săptămânal. Designul recunoaște asta: "Comandă din nou" e hero-ul, favoritele apar înaintea cataloagelor, iar quick + adaugă produsul în coș cu un singur tap. Bara de jos arată coșul curent cu CTA-ul Mergi la coș.
Cataloagele distribuitorilor sunt strict separate — chips-urile de sus comută între ele. Distribuitorii întrerupți apar gri cu dashed border și nu pot fi selectați.
distributorLinks where retailerIdno == me AND status == 'active' ·
Produse pentru distribuitor selectat → query products where distributorIdno == X AND isActive == true ·
Quick + → createOrderDraft() (idempotent per pereche) apoi setDraftLineQuantity({retailerIdno, draftId, productId, quantityMilli}) (scriere directă în subcolecția orderDrafts/{id}/lines/{productId}) ·
Reorder din ultima → copy din orders/{lastId}.lines[] în draft nou ·
Plafon stoc (UX): + dezactivat la stockOnHandMilli − stockReservedMilli; submitOrder rămâne garda autoritativă.
Strip distribuitori sus, categorii, lista de produse. Un produs în coș (Iaurt) e roșu cu stepper. Cart-float jos arată totalul.
Înainte de a selecta un distribuitor: hero "Comandă din nou" + favoritele tale. Acțiune zilnică = un tap.
orders/{lastId}. Stocul redus între timp e marcat inline (vezi cart.html).
Aceeași experiență ca worker — niciun gating de permisiune aici. Diferența: owner are 4th tab "Comenzi" (oversight), nu "Loialitate".
Catalog nu poate fi accesat fără un distributorLink activ. CTA-ul îndreaptă spre fluxul de cerere — vezi link-inbox.html.
În B2B, agentul distribuitorului vine în magazin și te adaugă pe loc. Vei primi o invitație în această aplicație + un SMS.
inviteRetailerToOnboard (org nou) sau inviteExistingRetailerToLink (org există) în vizită. Vezi vizite.html pentru fluxul agentului.
Plafonul de stoc, vizibil imediat. Când linia atinge stocul disponibil, + se dezactivează cu motiv inline. Produsul epuizat rămâne vizibil, cu badge Stoc epuizat și +Adaugă dezactivat — nu mai e nevoie să afli la trimitere.
stockOnHandMilli − stockReservedMilli
+ off când: !canAddStepMilli(current, available, uom)
Server: submitOrder rămâne garda finală pentru cursa de stoc