# Decision: pricing totals signal the world-fallback share, not row coverage **Date:** 2026-07-24 **Status:** active ## Context The footer totals of both "Ценообразование" tables used to mean one thing: a red number with a trailing `*` said "prices are missing for some positions (N of M)". Two problems: - the asterisk was a separate `` after the number and wrapped onto its own line, pushing the footer layout around; - coverage was the wrong thing to warn about. Since [2026-07-10-world-pricelist-fallback.md](2026-07-10-world-pricelist-fallback.md) a missing price is silently filled from the `world` pricelist, so the total is rarely incomplete — it is *contaminated*. A sum resting on world stand-in prices looked exactly like a sum of real ones. ## Decision `_setPricingTotal` in `web/templates/index.html` renders every footer total for Estimate, Склад and Конкуренты in both tables (buy and sale): - No asterisk, ever. The number stands alone. - The total is red **if and only if** part of it was computed from `world` prices — that is, `worldTotal > 0`. A clean sum is not coloured. Red is a contamination signal, not a coverage signal. - The world share per column is accumulated from the same per-row flags that tint the cells amber (`estWorld` / `whWorld` / `compWorld`), summed over line totals, not unit prices. - Hovering the total opens a styled popup (`.pricing-total-tip` in `web/static/app.css`), not a `title=` tooltip — the native one appears too late to notice on a number the user is meant to distrust. It states the exact percentage and, when prices are genuinely missing for some rows, adds the coverage line that the asterisk used to carry. - "Ручная цена" is not part of this: it is user input, never world-derived. ## Consequences - Red in the pricing footer means "part of this sum is a stand-in price", nothing else. Do not reuse it for coverage, staleness or any other condition. - The colour and popup classes are re-applied on every render and stripped first, so they never accumulate across re-renders. - The totals are written with `innerHTML` (number plus popup element). Nothing may read `textContent` off `#pricing-total-*-estimate|warehouse|competitor`; the vendor-price column and row `data-` attributes remain the read path for `applyCustomPrice` and `_getPricingEstimateTotal`. - The old `_setPartialTotal` helper is gone; do not reintroduce a coverage-only signal.