Quotes
List Quotes
List quotes (paginated) using Spatie QueryBuilder. Authentication: Requires Bearer token (PAT). Filters (all optional): - filter[search] — fuzzy LIKE across quote_number, reference, customer_po_number (customer name is encrypted, not searched) - filter[status] — exact status (draft, sent, viewed, accepted, declined, expired, revised, converted) - filter[origin] — exact origin (staff, rfq) - filter[customer_id] — exact customer id - filter_groups — base64-encoded advanced-filter tree over id, quote_number, reference, customer_po_number, status, origin, customer_id, total, valid_until, created_at, updated_at Sort: sort=<field>, prefix - for DESC. Allowed sorts: id, quote_number, status, total, valid_until, created_at. Default: -id. Pagination: page (default 1), per_page (default 10). Returns a LengthAwarePaginator of QuoteResource.
Create Quote
Creates a quote with lines. Prices are resolved from the customer's pricing tier when `unit_price` is omitted and a `product_id` is given; totals are computed server-side.
Show Quote
Returns a single quote with its lines and customer summary.
Update Quote
Updates a quote's header fields and recomputes totals. Partial payload — only provided fields are applied. The quote must be editable (status draft or revised).
Delete Quote
Soft-deletes a quote and cascades to its lines, versions, and events.
Add Quote Line
Adds a line to an editable quote and recomputes totals.
Remove Quote Line
Removes a line from an editable quote and recomputes totals.
Send Quote
Snapshots an immutable version, issues a public token, sets status to `sent`, and stamps `sent_at` / `valid_until`. The quote must be editable.
Accept Quote
Marks an issued quote `accepted` and pins the accepted version (price-lock source for conversion).
Decline Quote
Marks a quote `declined` with an optional reason.
Expire Quote
Marks a quote `expired`.
Revise Quote
Reopens an issued/expired quote as a new editable working copy (status `revised`).
Convert Quote
Converts an accepted quote into a draft sales order with price-locked lines (line unit prices are copied verbatim from the frozen quote lines — never re-resolved against the catalog). The order is stamped with `quote_id` and the accepted `quote_version_id`.
Create Sales Order from Quote
Creates a draft sales order from an accepted quote with price-locked lines (line unit prices are copied verbatim from the frozen quote lines — never re-resolved against the catalog). The quote is the independent source record and is never consumed; the order is stamped with quote_id + the accepted quote_version_id for provenance. Pass line_ids to order a subset (partial/progressive ordering — one quote may yield several orders). Requires Bearer token + the quotes.create-order permission. The quote must be in accepted status.