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)