Legend
- Supported in v1
- An existing standalone builder emits this shape (Itemized, Aggregate, Consolidated, Subtotal).
- Unsupported in v1
- No builder authored yet. Widget UI greys it out. Tile shows best-effort extrapolation of the rendering rules.
- Named business preset
- One of three preset buttons exposed in the widget UI: Customer Final, Customer Proof, Production Final. Each preset locks specific axis + cosmetic choices.
Synthetic dataset
Three bundles, canonical null-Option. F19 add-on indent rule (Product_Num contains "add-on" → "- " prefix) applies in every Keep-rows tile.
- Bundle A (Item Code 22211A, Style CUT-PRM-001): Custom Uniform Top — Premium ($100) + Rhinestone Logo ($50) + Embroidered Name ($50) = $200
- Bundle B (Item Code 22211B, Style CUS-STD-002): Custom Uniform Skirt — Standard ($100) + Sequin Trim ($50) = $150
- Bundle C (Item Code 22211C, Style WJP-003): Warm-up Jacket — Performance ($100) = $100
- Grand Total: $450
| Description | Item Code | Code # | Price |
| Custom Uniform Top — Premium | 22211A | CUT-PRM-001 | $100 |
| - Rhinestone Logo | 22211A | | $50 |
| - Embroidered Name | 22211A | | $50 |
| Custom Uniform Skirt — Standard | 22211B | CUS-STD-002 | $100 |
| - Sequin Trim | 22211B | | $50 |
| Warm-up Jacket — Performance | 22211C | WJP-003 | $100 |
Why no builder: a flat priced list with zero summarization. No current demand; widget UI greys it out.
| Description | Item Code | Code # | Price |
| Custom Uniform Top — Premium | 22211A | CUT-PRM-001 | $100 |
| - Rhinestone Logo | 22211A | | $50 |
| - Embroidered Name | 22211A | | $50 |
| Custom Uniform Skirt — Standard | 22211B | CUS-STD-002 | $100 |
| - Sequin Trim | 22211B | | $50 |
| Warm-up Jacket — Performance | 22211C | WJP-003 | $100 |
| Total | $450 |
Customer Final preset: single closing row reads "Total" (not "Grand Total"). Behind the scenes the Bug #6 fix resolves the label from "Option No Option Total" because current_option == "No Option" in canonical null-Option data; the Customer Final preset further overrides "Bundle Total" → "Total" for cleaner customer-facing presentation.
| Description | Item Code | Code # | Price |
| Custom Uniform Top — Premium | 22211A | CUT-PRM-001 | $100 |
| - Rhinestone Logo | 22211A | | $50 |
| - Embroidered Name | 22211A | | $50 |
| Option A Total | $200 |
| Custom Uniform Skirt — Standard | 22211B | CUS-STD-002 | $100 |
| - Sequin Trim | 22211B | | $50 |
| Option B Total | $150 |
| Warm-up Jacket — Performance | 22211C | WJP-003 | $100 |
| Option C Total | $100 |
Customer Proof 1 preset: shares axis label "Per product total" with Customer Final 1 (Combination 02); rendering differs because the Subtotals builder emits a subtotal row per product group. Per-bundle subtotals labeled "Option A/B/C Total" (F17 — substring rename unconditional across both states). Grand Total suppressed via preset override — each Product_Num group is presented as a discrete option the customer chooses between, not as an additive line item. In canonical null-Option data each bundle carries an implied "Option 1" structure; the per-Option subtotal IS the total for that choice, so summing them across rows would imply the customer is buying all bundles (wrong framing for a proof). Preset pins the suppression on for both states (previously a state-conditional behavior in buildSubtotalsProductList per F19 narrowing).
| Description | Item Code | Code # | Price |
| Custom Uniform Top — Premium | 22211A | CUT-PRM-001 | — |
| - Rhinestone Logo | 22211A | RHI-CRY-001 | — |
| - Embroidered Name | 22211A | EMB-NAM-001 | — |
| Custom Uniform Skirt — Standard | 22211B | CUS-STD-002 | — |
| - Sequin Trim | 22211B | SEQ-TRM-001 | — |
| Warm-up Jacket — Performance | 22211C | WJP-003 | — |
Production Final preset: fully-itemized inventory list with zero pricing AND Code # populated for every row including add-ons. Production handoffs need style numbers for sourcing every line item — parent garments AND every decoration applied (rhinestone packs, embroidered names, trim, etc.). No builder exists yet — Production Final will need either a new builder or routing through the Aggregate builder with a "Subtotal Style: None" flag plus an add-on Code # propagation pass (today's builders drop the add-on's own Style # when emitting indent rows). Synthetic Code #s here (RHI-CRY-001, EMB-NAM-001, SEQ-TRM-001) reflect what real add-on inventory items would carry from their own Sales_Orders.Style_Num — in production data this comes from the add-on's own product record, not the parent's.
| Description | Item Code | Code # | Price |
| Custom Uniform Top — Premium | 22211A | CUT-PRM-001 | — |
| - Rhinestone Logo | 22211A | | — |
| - Embroidered Name | 22211A | | — |
| Custom Uniform Skirt — Standard | 22211B | CUS-STD-002 | — |
| - Sequin Trim | 22211B | | — |
| Warm-up Jacket — Performance | 22211C | WJP-003 | — |
| Grand Total | $450 |
Aggregate shape: per F9 the parent-row Price is rendered blank; only the footer total carries a price. Builder still emits per-Option Total at the footer when Options exist; canonical null-Option case shows as "Grand Total" via Bug #6 fix and the global "Bundle Total → Grand Total" rename.
| Description | Item Code | Code # | Price |
| Custom Uniform Top — Premium | 22211A | CUT-PRM-001 | — |
| - Rhinestone Logo | 22211A | | — |
| - Embroidered Name | 22211A | | — |
| Option A Total | $200 |
| Custom Uniform Skirt — Standard | 22211B | CUS-STD-002 | — |
| - Sequin Trim | 22211B | | — |
| Option B Total | $150 |
| Warm-up Jacket — Performance | 22211C | WJP-003 | — |
| Option C Total | $100 |
Customer Proof 2 preset: shares the per-bundle-subtotal rendering shape with Customer Proof 1 (Combination 03), but row prices are hidden — line items show "what's in each option" without "how much per line." Per-Option subtotals carry all pricing. Grand Total suppressed per same proof framing as Customer Proof 1 — each Product_Num group is a discrete option the customer chooses between (implied "Option 1" structure in canonical null-Option data); the per-Option subtotal IS the total for that choice, so no Grand Total row. No builder exists yet — same shape as Customer Proof 1 with Row Prices flipped to Hide; needs new builder or buildSubtotalsProductList extension with a row-price-hide projection pass AND a suppress-Grand-Total preset flag.
| Description | Item Code | Code # | Price |
| Custom Uniform Top — Premium | 22211A | CUT-PRM-001 | $200 |
| Custom Uniform Skirt — Standard | 22211B | CUS-STD-002 | $150 |
| Warm-up Jacket — Performance | 22211C | WJP-003 | $100 |
Consolidated shape: add-ons collapsed into their parent row; parent price = parent + sum of children. Bundle A shows $200 (its $100 parent + $50 + $50 in add-ons). No add-on rows means F19 indent rule does not apply.
| Description | Item Code | Code # | Price |
| Custom Uniform Top — Premium | 22211A | CUT-PRM-001 | $200 |
| Custom Uniform Skirt — Standard | 22211B | CUS-STD-002 | $150 |
| Warm-up Jacket — Performance | 22211C | WJP-003 | $100 |
| Grand Total | $450 |
Why no builder: Consolidated-with-footer. Would behave identically to Consolidated except for the closing total row. Demand absent because Per-Option + Grand (Combo 09) covers the same information surface with more granularity.
| Description | Item Code | Code # | Price |
| Custom Uniform Top — Premium | 22211A | CUT-PRM-001 | $200 |
| Option A Total | $200 |
| Custom Uniform Skirt — Standard | 22211B | CUS-STD-002 | $150 |
| Option B Total | $150 |
| Warm-up Jacket — Performance | 22211C | WJP-003 | $100 |
| Option C Total | $100 |
| Grand Total | $450 |
Why no builder: per-Option subtotal rows are visually redundant with their adjacent parent rows (same price). Information value duplicated. Useful only when downstream layers (template highlighting, separators) consume the subtotal-row tag distinctly from the data row. No current demand.
| Description | Item Code | Code # | Price |
| Custom Uniform Top — Premium | 22211A | CUT-PRM-001 | $200 |
| - Rhinestone Logo | 22211A | | — |
| - Embroidered Name | 22211A | | — |
| Custom Uniform Skirt — Standard | 22211B | CUS-STD-002 | $150 |
| - Sequin Trim | 22211B | | — |
| Warm-up Jacket — Performance | 22211C | WJP-003 | $100 |
| Total | $450 |
Customer Final 2 preset: add-on rows visible (parent + decorations all listed) but prices roll up to the top-level product row. Bundle A's parent shows $200 (its $100 base + $50 Rhinestone + $50 Embroidered); add-on rows show no individual price. Bundle B's parent shows $150 ($100 + $50 trim); Bundle C shows $100 standalone. The customer sees what's in each bundle and one price per bundle — no decoration-level cost breakdown, no separate Grand Total math required at the line level. Closing "Total" footer matches Customer Final 1's terminal-label convention. Why no builder: "Roll up to parent" is a new Row Prices value outside the original axis enum {Show, Hide} — structurally distinct from Consolidated (Combination 07, which drops add-on rows entirely) and from Aggregate (Combination 05, which uniformly hides all per-row prices including parents). Either a new builder, or extend buildConsolidatedProductList with a keep_add_on_rows: true flag that re-emits the absorbed children as priceless indent rows under each rolled-up parent. Cross-reference: Customer Final 1 (Combination 02) for the show-all-prices variant.