dodil/erp-brick-sales-order
DODIL ERP brick: sales order
src/brick_sales_order/domain/readiness.py
"""Readiness: every transition with preconditions answers a list of {gate, met, reason, fix} (shared.yaml conventions)."""
from dataclasses import asdict, dataclass
from brick_sales_order.domain.errors import GateUnmet
@dataclass(frozen=True)
class Gate:
gate: str
met: bool
reason: str
fix: str
def as_dict(self) -> dict:
return asdict(self)
def ok(gate: str, reason: str = "", fix: str = "") -> Gate:
return Gate(gate, True, reason, fix)
def no(gate: str, reason: str, fix: str) -> Gate:
return Gate(gate, False, reason, fix)
def unmet(gates) -> list:
return [g for g in gates if not g.met]
def require(gates) -> None:
"""Refuse with every unmet gate, in the words of the readiness answer."""
bad = unmet(gates)
if bad:
raise GateUnmet(bad)