# PRICING · flagship round 2 · brand-006 RJ Laravel Admin

**Sheet:** https://pricing.pina-brand-006-rj-laravel-admin.pages.dev/ · **artboards:** /canvas/ (3 pages: P-a · P-b · both variants) · **one image:** /contact-sheet.png · **round 1:** /r1/ and /r1/canvas/
**Status:** round 2 for Frank's review, 2026-10-18. Design only. No code, no ledger, no commits.
**Boards:** 13 + 1 summary, same pipeline as r1 (burned-in band · 1440×900 screen in the locked 4b·R shell · annotation panel).
**Source:** `r2/src/q_pages.py` (screens; it reuses the r1 fixtures and table builders in `src/p_pages.py` + `src/p_data.py`) · `r2/src/q_build.py` (composites, shots, sheet, canvas, dist with r1 at `/r1/`) · `r2/src/pricing-r2.css`. Output: `r2/shots/`, `r2/canvas/`, `r2/contact-sheet.png`.

## Frank's feedback (2026-10-18)

> "Mostly good, but the fabric pricing section, you've just put a container box at the top? … Make it more prominent as part of the TWO-PRONG process: pricing for fabric combos and pricing for designs."

He also found round 1 too noisy. Round 2 applies the quiet rules: no explanatory captions in the UI, titles only on panels, fewer chips, colour only for meaning.

## Structure decision

A retailer's pricing is **two prongs of the same weight**, under one shared retailer header:

1. **Fabric combination pricing**: the combinations × fabric-code grid. It saves per cell and owns **Export (queued)** and **Import**.
2. **Design pricing**: main product → product → the design/option price list. It has **one Submit** per product and no CSV.

The **retailer header** is shared above both prongs and carries the money context: wholesale in the **settlement** currency (retailer ↔ RJ) and retail in the **consumer** currency (retailer ↔ customer). The retailer name is the switcher.

Both prongs use the same anatomy and the same words:
- a title and a one-line size (`28 fabric codes × 10 combinations` · `8 main products · 11 products`);
- a status (`9 / 10 combinations priced` · `4 / 11 products priced`) with a thin bar;
- a toolbar laid out the same way: find · scope · view on the left, the prong's own actions on the right (Export / Import on prong 1, Submit on prong 2).

## Variants: one lever, how the prongs are presented

| | P-a · two prong tabs ★ recommended | P-b · pricing overview landing |
|---|---|---|
| Entry after picking a retailer | the editor of the clicked prong, with both prong tabs on top | an overview page with two equal cards; **Open** goes into a prong |
| Inside an editor | both prongs stay in view, each with its own status | only its own prong; the sibling is behind "‹ Pricing overview" |
| Switch prong | 1 click, retailer and currency kept | back + open: 2 clicks and a page |
| Boards | Q02–Q06 | Q07 (overview), Q08 (editor) |

**Recommendation: P-a.** The two tabs give the prongs the same equal weight as P-b's cards. They stay visible on every screen, so neither prong is ever a box inside the other. Switching takes one click. P-b's overview adds a step, and once you are inside an editor the other prong's status is out of sight. P-b's two-card idea is not lost: the entry table (Q01) already shows both prongs' status for every retailer.

## Boards

| # | Board | Variant |
|---|---|---|
| S00 | Summary | — |
| Q01 | Entry: 13 retailers, both currencies, one status column per prong (equal width) | both |
| Q02 ★ | Fabric combination pricing (prong 1) under the two prong tabs: grid, Export (queued), Import | P-a |
| Q03 | Fabric grid editing: saved + Undo, "0 clears this price", "Entry not saved!" | P-a |
| Q04 | Import entry as a sheet inside prong 1: Upload · Check · Preview · Confirm · Run · Result, header check, unmatched combination mapping | P-a |
| Q05 ★ | Design pricing (prong 2): product list (main product → product, priced / options) + the 101-row Jacket list, Submit in the toolbar | P-a |
| Q06 | Design pricing editing: changed / cleared / error cells, `3 to fix · Discard · Submit 9 changes` | P-a |
| Q07 | Pricing overview: two equal prong cards with completeness and per-item status | P-b |
| Q08 | P-b editor: own prong only, back to the overview | P-b |
| Q09 | Retailer switcher: both currencies and **both prong statuses** per retailer; keeps the open prong | both |
| Q10 | Empty prong 1: the retailer has no fabric codes (the tab says so before it is opened) | both |
| Q11 | Empty prong 2: a product with no designs (Chinos) | both |
| Q12 | Permission denied: super admin only | both |
| Q13 | Phone `/m/pricing` (dedicated): retailer with two equal prong cards → fabric code lookup → read-only design prices; a two-way segment keeps both prongs one tap apart | both |

**Unchanged and not redrawn** (still at `/r1/`): P05 review before Submit · P06 unsaved guard · P07 saved + refusal copy · P11 import preview + typed confirm · P12 import run/result + export queued · P13 confirmation ladder · P14 surcharges · P15 pattern surcharges + express cost · P16 formulas · P19 loading · P20 long names + CNY.

## Kept from round 1 (every real field and rule)

- **0 means different things on the two grids.** On design pricing, 0.00 is a real price and — means not priced. On fabric pricing, ≤ 0 stores empty, and the cell warns (Q03).
- **One Submit for design pricing.** It is disabled while a cell is red, because the real form refuses the whole save. **Per-cell saves on the fabric grid**, with the real "Entry not saved!".
- **Currency per column.** Wholesale = settlement (navy badge) and retail = consumer (green badge). Amounts are never converted.
- **Grid shape.** 28 codes × 10 combinations × 5 columns. Collection + Code are pinned. Excess is shown as **Plus Size**. The group title is "main product › combination".
- **Design list.** The real 101-row 2-Piece › Jacket list (22 categories, 79 options). Days 0–30 whole, wholesale / retail min 0.
- **Import / Export belong to fabric pricing only.** Import checks the real header (Username + Currency must match; Settlement Currency is not checked today) and maps an unknown combination name.
- **English only.** The build asserts that there is no Han character in any board. Master pricing (403) is never drawn. Super admin only.

## What changed

- **Two prongs at page level.** Round 1 put fabric pricing in a dashed box on top of the design-pricing entry, under an uppercase eyebrow. Round 2 makes the two prongs equal tabs (P-a) or equal cards (P-b).
- **The retailer header is shared.** The r1 scope bar (Retailer › Main product › Product selects plus a currency sentence) is gone. The retailer name is the switcher, and the two currencies sit at the header's right.
- **Design scope is a product list inside prong 2.** Main product → product, each with priced / options and an amber dot when nothing is priced. It replaces the Main product / Product selects and the 300 px category jump rail; category jump is now a toolbar menu.
- **Submit moved into the prong toolbar.** It sits in the same slot as Import / Export on prong 1, so both prongs have the same layout. The floating save bar is gone.
- **Import opens as a sheet inside prong 1.** Round 1 used a separate page. The grid and both prong tabs stay in view.
- **Prong status everywhere a retailer appears:** the entry table, the prong tabs, the overview cards, the switcher and the phone.

## Quiet-rule removals (UI → annotation panel / tooltips)

| Removed from the screen | Where it went |
|---|---|
| "Exports are queued — the download link arrives in your notifications." page caption | Export button tooltip + annotation |
| Grid footer sentences ("Each cell saves on its own…", "0 or empty = not priced", "Collection + Code stay pinned · ← → scrolls") | annotation; footer keeps counts only |
| Column sub-captions "0–30 · whole days", "retailer ↔ RJ (settlement)", "retailer ↔ customer" | header tooltips + annotation |
| Design footer "— = not priced (null) · 0.00 is a real price", "Tab ↹ / ↵ move · Esc restores…" | annotation |
| "This price list" side card + "Prices carry no currency of their own" hint | the retailer header carries the currencies |
| Legend chips (changed / error / not priced), "Collapse categories" link | annotation |
| 9 main-product filter chips with counts on the fabric grid | one **Main product** menu |
| Plus Size / Days toggle chips | one **Columns** menu |
| Product chips with tag icons + "Design pricing per product · combinations: …" lines on the entry cards | plain product list with counts |
| In-screen proposal / needs-backend tags (purple / amber dashed) | annotation panel only |
| Dotted underline on every example number | one note per board in the band ("names fictional, amounts examples") + annotation |
| Fill / Paste-from-sheet overlay (r1 proposal, not real) | parked, see open question 6 in r1 |
| Empty/denied body copy (why it is empty, who to ask) | annotation; the screen keeps a title + one action |

Colour left on screen, each for one meaning: navy = settlement money, green = consumer money, amber = not priced / changed, red = error, green flash = saved, steel = the open prong / focus.

## Needs backend (new in r2)

| # | Item | Where |
|---|---|---|
| NB-5 (optional) | One pricing summary per retailer (combinations priced, products priced). Without it, the page derives the counts from the existing reads: one `GET /pricing/retailer/{retailer}` for fabric and one `GET /pricing/designs` per product for design (11 for this retailer). | Q01, Q02, Q05, Q07, Q09, Q13 |

All of r1's backend list stands (P-G1 gate, P-G2 change log, P-G4 ids, NB-1..4, H01 recent lists).

## Open questions for Frank

1. **Prong presentation** · **1a** P-a, two prong tabs (recommended) · 1b P-b, overview landing · 1c both: P-a tabs, plus the overview as the first view of a retailer.
2. **Prong order** · **2a** fabric combinations first, as in your two-prong wording (drawn) · 2b design pricing first, as on the old selector (Designs | Combinations).
3. **Default prong when you open a retailer** · **3a** the last prong you used for that retailer (needs per-person prefs, H01) · 3b always fabric combinations.
4. **Status wording** · **4a** "combinations priced" / "products priced" (drawn; a product counts as priced when it has at least one price) · 4b count cells / options instead.

## Could not verify

- Where a retailer's fabrics (the grid rows) are assigned. Q10's "Open account" target is unverified.
- Priced counts per product beyond 2-Piece › Jacket's 79 options. The other option counts and every priced count are examples.
