# Sales Order Lifecycle — Action Matrix

## Status ownership

| Field | Values | Owner |
|---|---|---|
| `orderStatus` | DRAFT, SUBMITTED, CONFIRMED, CANCELLED, CLOSED | Sales-order commands |
| `fulfillmentStatus` | NOT_FULFILLED, PARTIALLY_FULFILLED, FULFILLED | Posted outbound shipments |
| `billingStatus` | NOT_BILLED, PARTIALLY_BILLED, BILLED | Receivables integration |

## Commands

| Action | DRAFT | SUBMITTED | CONFIRMED | CANCELLED | CLOSED | Extra condition |
|---|---:|---:|---:|---:|---:|---|
| Update | Yes | No | No | No | No | — |
| Submit | Yes | No | No | No | No | Required order data and lines exist |
| Reject | No | Yes | No | No | No | Rejection reason required |
| Confirm | No | Yes | No | No | No | Initializes execution projections |
| Cancel | Yes | Yes | Yes | No | No | No fulfilled or billed progress |
| Close | No | No | Yes | No | No | Fulfillment and billing complete |

Outbound Shipment posting advances line `fulfilledQuantity` and derives
`fulfillmentStatus` transactionally. The template does not include an
accounts-receivable flow, but the sales module exposes an internal billing
projection command for that integration.
