Spec-ul listează invalid-argument: outlet missing ca eroare frecventă pentru submitOrder(). Designul îl elimină la nivel de UX:
1. Outletul implicit e pre-selectat (configurat de owner, vine din outlets where isDefault). 2. Banner sticky sus, vizibil mereu, niciodată ascuns în sheet. 3. Submit dezactivat cu copy inline dacă outletul lipsește, în loc de toast pop-up după click.
Totalurile folosesc exact aritmetica computeOrderTotals: pure-integer (bani × milliQty), TVA per rată, fără floating point.
addDraftLine({draftId, productId, quantityMilli}) (înlocuiește prin productId) ·
Linie − → removeDraftLine({draftId, productId}) ·
Schimbă outlet → setDraftOutlet({draftId, outletId}) ·
Trimite → submitOrder({draftId}) · tranzacție unică · rezervă stoc + creează orders/{id} + șterge draft + scrie primul events/.
Banner outlet sus (ink — atrage ochiul). Linii cu stepper. Totaluri pe signature card. CTA "Trimite comanda" mare jos, cu suma vizibilă.
Worker poate trimite, dar nu poate schimba outletul (rolul organization.edit aparține doar proprietarului). Banner-ul devine surface-2 cu copy explicativ, nu un toast frustrant.
Eroarea apare pe linia afectată, nu ca toast. Submit-ul devine gri cu helper explicativ. Banner sus dacă link-ul e între timp pus pe pauză de distribuitor.