Handle substitutions
Propose a replacement and record the shopper's decision.
Check the preference
Each basket item has a preference: call_me, best_match, or refund.
Propose
On the fulfillment board choose the replacement product, quantity, and a reason. This calls proposeOrderLineSubstitution.
Shopper decides
The shopper opens /order/[id] and accepts or declines (respondToOrderLineSubstitution).
Record the pick
If accepted, resolve the line as substituted with the replacement's actual weight. If declined, resolve it as short.
If you agreed by phone, record the consent channel, who agreed, and evidence when you resolve the line as substituted.