' +
'
' + escapeHtml(r.aspect) + ': ' + escapeHtml(r.value1) + '
' +
'
' + escapeHtml(r.aspect) + ': ' + escapeHtml(r.value2) + '
' +
@@ -4720,9 +4744,14 @@
];
},
'cost-distribution': function (d) {
+ // parseCostDistribution emitterer p50/p90 som {monthly, yearly}-objekter,
+ // ikke tall. Trekk ut monthly før formatNok (ellers returnerer den
+ // "[object Object]"). Number-fallback tillater også flate fixtures.
+ const p50m = (d.p50 && typeof d.p50 === 'object') ? d.p50.monthly : d.p50;
+ const p90m = (d.p90 && typeof d.p90 === 'object') ? d.p90.monthly : d.p90;
return [
- { label: 'P50', value: formatNok(d.p50), hint: 'median' },
- { label: 'P90', value: formatNok(d.p90), hint: 'pessimistisk', modifier: 'high' },
+ { label: 'P50', value: formatNok(p50m), hint: 'median' },
+ { label: 'P90', value: formatNok(p90m), hint: 'pessimistisk', modifier: 'high' },
{ label: 'KOMPONENTER', value: (d.monthly_breakdown || []).length }
];
},
@@ -4825,8 +4854,13 @@
return crit ? 'block' : 'warning';
}
case 'cost-distribution': {
+ // Samme p50/p90-objekt-shape som KEY_STATS_CONFIG over —
+ // trekk ut .monthly før Number-konvertering, ellers blir
+ // ratioen alltid NaN og verdict feiler stille til 'go'.
if (data.p90 != null && data.p50 != null) {
- const ratio = Number(data.p90) / Math.max(Number(data.p50), 1);
+ const p50m = (data.p50 && typeof data.p50 === 'object') ? data.p50.monthly : data.p50;
+ const p90m = (data.p90 && typeof data.p90 === 'object') ? data.p90.monthly : data.p90;
+ const ratio = Number(p90m) / Math.max(Number(p50m), 1);
return ratio > 2 ? 'warning' : 'go';
}
return 'n-a';