Show the implied price on every ledger line, not just the totals
Price was blanked on the bridge lines and on the excluded row, so a ledger that had both measures on every line showed a price on two of them. Baseline sat there as 2,242,180.67 over 8,111,717.10 with the column empty. A bridge line's price is the implied price of that initiative's own contribution -- Scale #116 above works out to 0.2397 against a current 0.2735 -- which is the number that says whether the initiative was a price move or a volume move. That is the same question the plug toggle asks about the edit, answered for the adjustments already made. A line with no units is left blank, since its price is undefined rather than zero -- the "price" bridge line in that example moved dollars alone. The price column's hint said "holds units", which stopped being true when plug arrived: it holds units under plug = price and moves them under plug = volume. It now just says what the column is. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
de6064b4f2
commit
8726543e34
@ -277,11 +277,17 @@ function ScaleLedger({ currentTotals, scaleInputs, setScaleInputs, scalePlug, se
|
|||||||
return grand[key]
|
return grand[key]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Every line that has both measures has a price -- a bridge line's is the
|
||||||
|
// implied price of that initiative's own contribution, which is the number
|
||||||
|
// that says whether it was a price move or a volume move. Only a line with no
|
||||||
|
// units has nothing to show, since the price is undefined rather than zero.
|
||||||
|
const priceOf = (row) => (row && row.units) ? row.value / row.units : null
|
||||||
|
|
||||||
// measure columns, in ledger order
|
// measure columns, in ledger order
|
||||||
const measures = [
|
const measures = [
|
||||||
valueCol && { key: 'value', label: valueCol, current: total.value, dp: 2 },
|
valueCol && { key: 'value', label: valueCol, current: total.value, dp: 2 },
|
||||||
unitsCol && { key: 'units', label: unitsCol, current: total.units, dp: 2 },
|
unitsCol && { key: 'units', label: unitsCol, current: total.units, dp: 2 },
|
||||||
(valueCol && unitsCol) && { key: 'price', label: 'price', current: curPrice, dp: 4, hint: 'holds units' },
|
(valueCol && unitsCol) && { key: 'price', label: 'price', current: curPrice, dp: 4, hint: 'value / units' },
|
||||||
].filter(Boolean)
|
].filter(Boolean)
|
||||||
|
|
||||||
const derived = Object.fromEntries(
|
const derived = Object.fromEntries(
|
||||||
@ -383,7 +389,7 @@ function ScaleLedger({ currentTotals, scaleInputs, setScaleInputs, scalePlug, se
|
|||||||
</td>
|
</td>
|
||||||
{measures.map(m => (
|
{measures.map(m => (
|
||||||
<td key={m.key} className={`${numCell} text-gray-600`}>
|
<td key={m.key} className={`${numCell} text-gray-600`}>
|
||||||
{m.key === 'price' ? '' : fmtNum(e[m.key], m.dp)}
|
{m.key === 'price' ? fmtNum(priceOf(e), m.dp) : fmtNum(e[m.key], m.dp)}
|
||||||
</td>
|
</td>
|
||||||
))}
|
))}
|
||||||
</tr>
|
</tr>
|
||||||
@ -409,7 +415,7 @@ function ScaleLedger({ currentTotals, scaleInputs, setScaleInputs, scalePlug, se
|
|||||||
</td>
|
</td>
|
||||||
{measures.map(m => (
|
{measures.map(m => (
|
||||||
<td key={m.key} className={numCell}>
|
<td key={m.key} className={numCell}>
|
||||||
{m.key === 'price' ? '' : fmtNum(excl[m.key], m.dp)}
|
{m.key === 'price' ? fmtNum(priceOf(excl), m.dp) : fmtNum(excl[m.key], m.dp)}
|
||||||
</td>
|
</td>
|
||||||
))}
|
))}
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user