"""A stand-in for the sales-order brick (M1, not built yet), for the scenarios only: the one route this brick calls
(SO-23 record_delivery, keyed by delivery_ref so a repeat records once) and a read of what it was told. No tables:
it keeps what it hears in memory, which is all a scenario needs to see what crossed the seam."""
from typing import Optional
from erp_platform.bricks import Brick
SO = Brick("so", version="0.0.1", instructions="A test double of the sales-order brick's delivery seam.")
TOLD: dict = {} # (order_id, delivery_ref) -> what was recorded
@SO.use_case(kind="command", route="POST /orders/{order_id}/deliveries", permission="so:order:deliver",
idempotent=True, tool=False)
def record_delivery(caller: dict, order_id: str, line_no: str, quantity: int, delivery_ref: str,
delivered_on: Optional[str] = None) -> dict:
"""Record that `quantity` of an order's line was delivered; the same delivery_ref records once."""
TOLD.setdefault((order_id, delivery_ref), {"line_no": line_no, "quantity": quantity, "delivered_on": delivered_on})
return {"order_id": order_id, "delivery_ref": delivery_ref, "recorded": True}
@SO.use_case(kind="query", route="GET /orders/{order_id}/deliveries")
def deliveries(caller: dict, order_id: str) -> dict:
"""What this order has been told was delivered."""
return {"deliveries": [{"delivery_ref": ref, **v} for (oid, ref), v in sorted(TOLD.items()) if oid == order_id]}