2.7 KiB
04 — Loading Event
Status: Not Started Depends On: 03 — Ride Lifecycle
Goal
Move stock from a source warehouse onto an opened ride's vehicle, with two-party confirmation.
Covers the dispatch half of mainPlan.md §6:
generatePickList, confirmPicking, packOrder, buildDispatchLoad, and calculateLoadPlan
from §5.
Background / Context
This is the first place the 02_stock_ledger.md movement model gets
exercised end-to-end: a Load movement debits the warehouse and credits the vehicle location
created when the ride opened (03_ride_lifecycle.md).
Data Model Changes
Loading Sheet
Header record: RideId, SourceWarehouseId, Status (Pending, DispatchConfirmed,
ReceiptConfirmed, DiscrepancyFlagged, Resolved).
Loading Line Item
LoadingSheetId, ItemId, QuantityDispatched (set by warehouse manager), QuantityReceived
(set by driver) — a mismatch between the two is a discrepancy.
Two-Party Confirmation
Warehouse manager confirms what was dispatched (generatePickList → confirmPicking →
packOrder); driver separately confirms what was received onto the vehicle. Both confirmations are
required before the ride can move Open → Active.
API Endpoints
| Function reference | Endpoint intent |
|---|---|
generatePickList(orderIds[]) (§6) |
POST /api/loading-sheets |
confirmPicking(pickListId, pickedItems[]) (§6) |
POST /api/loading-sheets/{id}/confirm-dispatch |
packOrder(orderId, packageDetails) (§6) |
POST /api/loading-sheets/{id}/pack |
buildDispatchLoad(vehicleId, orderIds[]) (§6) |
Groups multiple orders into one loading sheet |
calculateLoadPlan(vehicleId, orderIds[]) (§5) |
Validates total volume/weight against vehicle capacity before dispatch confirmation |
| — | POST /api/loading-sheets/{id}/confirm-receipt — driver-side confirmation |
Business Rules
QuantityDispatched != QuantityReceivedon any line flags the sheetDiscrepancyFlaggedand blocks ride activation until resolved.calculateLoadPlanmust reject a load exceeding vehicle capacity before dispatch is confirmed, not after.
Fraud / Control Considerations
- Discrepancies must be immediately visible, not silently averaged into stock adjustments — see 09_fraud_controls.md.
Open Questions
- Does
Vehicleneed aCapacityfield added now (volume/weight), or iscalculateLoadPlandeferred until that's available?
Implementation Notes
Fill this section in during planning discussion before writing any code.