- Shipped
- August 3, 2026 at 8:43 PM UTC
- Author
- Kamo
- Commit
- fb8989e
A quote can now present several mutually-exclusive ways to buy — monthly, annual, three-year — instead of forcing three separate documents that drift apart the moment the seat count changes. - QuoteOption owns its own line items and totals; siblings are never summed. - QuoteOptionTotals normalises each option to a monthly equivalent, which is the only basis on which different billing terms can be compared, plus a contract total and savings against the flagged baseline. - Billing term and commitment length stay separate: paying annually is not the same commitment as a three-year term billed annually. - Quote.quantity is a shared driver; a line opting in with usesQuoteQuantity reprices across every option at once. QuoteTotals honours it identically on flat sheets so a line cannot price differently inside and outside an option. - Accepting a multi-option quote requires naming the option; siblings close as NOT_SELECTED and acceptedOptionUid records the choice. QuoteTotalsTest 15, QuoteOptionTotalsTest 11, QuoteShareTokenTest 9 — all pass.