diff --git a/frontend/src/pages/Monthly.tsx b/frontend/src/pages/Monthly.tsx
index ad6ac1a..82d3057 100644
--- a/frontend/src/pages/Monthly.tsx
+++ b/frontend/src/pages/Monthly.tsx
@@ -14,6 +14,7 @@ function addDays(d: Date, n: number): Date { const r = new Date(d); r.setDate(r.
function daysInMonth(y: number, m: number): number { return new Date(y, m, 0).getDate() }
function fmtMoney(n: number): string { return `£${Math.round(n).toLocaleString('en-GB')}` }
function pctClass(pct: number): string { return pct <= 100 ? 'pct-green' : pct <= 110 ? 'pct-amber' : 'pct-red' }
+function fmtDelta(pct: number): string { const d = pct - 100; return `${d >= 0 ? '+' : ''}${d.toFixed(1)}%` }
const DEPT_COLORS = ['#065f46','#059669','#0891b2','#7c3aed','#c2410c','#b45309','#0f766e','#4338ca','#be185d','#15803d']
@@ -229,7 +230,7 @@ export default function Monthly() {
% Budget {isCurrentMonth ? '(Forecast)' : ''}
{pctBudget != null
- ? {pctBudget.toFixed(1)}%
+ ? {fmtDelta(pctBudget)}
: '—'}
{variance != null && (
@@ -310,7 +311,7 @@ export default function Monthly() {
{depBudg != null ? fmtMoney(depBudg) : '—'} |
- {dp != null ? {dp.toFixed(1)}% : '—'}
+ {dp != null ? {fmtDelta(dp)} : '—'}
|
{dv != null && 0 ? 'variance-over' : 'variance-under'}>{dv > 0 ? '+' : ''}{fmtMoney(dv)}}
@@ -325,7 +326,7 @@ export default function Monthly() {
| 100% |
{budget != null ? fmtMoney(budget) : '—'} |
- {pctBudget != null ? {pctBudget.toFixed(1)}% : '—'}
+ {pctBudget != null ? {fmtDelta(pctBudget)} : '—'}
|
{variance != null && 0 ? 'variance-over' : 'variance-under'}>{variance > 0 ? '+' : ''}{fmtMoney(variance)}}
diff --git a/frontend/src/pages/Rolling12Months.tsx b/frontend/src/pages/Rolling12Months.tsx
index a3bf2e4..2669ffb 100644
--- a/frontend/src/pages/Rolling12Months.tsx
+++ b/frontend/src/pages/Rolling12Months.tsx
@@ -11,6 +11,7 @@ function fmt(d: Date): string {
}
function fmtMoney(n: number): string { return `£${Math.round(n).toLocaleString('en-GB')}` }
function pctClass(p: number): string { return p <= 100 ? 'pct-green' : p <= 110 ? 'pct-amber' : 'pct-red' }
+function fmtDelta(p: number): string { const d = p - 100; return `${d >= 0 ? '+' : ''}${d.toFixed(1)}%` }
function daysInMonth(y: number, m: number): number { return new Date(y, m, 0).getDate() }
const DEPT_COLORS = ['#065f46','#059669','#0891b2','#7c3aed','#c2410c','#b45309','#0f766e','#4338ca','#be185d','#15803d']
@@ -182,7 +183,7 @@ export default function Rolling12Months() {
)}
|
- {pctB != null ? {pctB.toFixed(1)}% : '—'}
+ {pctB != null ? {fmtDelta(pctB)} : '—'}
|
{r.sales > 0 ? fmtMoney(r.sales) : '—'} |
{pctS != null ? `${pctS.toFixed(1)}%` : '—'} |
diff --git a/frontend/src/pages/Rolling12Weeks.tsx b/frontend/src/pages/Rolling12Weeks.tsx
index 734d6eb..5f9df4f 100644
--- a/frontend/src/pages/Rolling12Weeks.tsx
+++ b/frontend/src/pages/Rolling12Weeks.tsx
@@ -21,6 +21,7 @@ function startOfWeek(d: Date): Date {
function daysInMonth(d: Date): number { return new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate() }
function fmtMoney(n: number): string { return `£${Math.round(n).toLocaleString('en-GB')}` }
function pctClass(p: number): string { return p <= 100 ? 'pct-green' : p <= 110 ? 'pct-amber' : 'pct-red' }
+function fmtDelta(p: number): string { const d = p - 100; return `${d >= 0 ? '+' : ''}${d.toFixed(1)}%` }
const DEPT_COLORS = ['#065f46','#059669','#0891b2','#7c3aed','#c2410c','#b45309','#0f766e','#4338ca','#be185d','#15803d']
@@ -189,7 +190,7 @@ export default function Rolling12Weeks() {
)}
- {pctB != null ? {pctB.toFixed(1)}% : '—'}
+ {pctB != null ? {fmtDelta(pctB)} : '—'}
|
{r.sales > 0 ? fmtMoney(r.sales) : '—'} |
{pctS != null ? `${pctS.toFixed(1)}%` : '—'} |
diff --git a/frontend/src/pages/Weekly.tsx b/frontend/src/pages/Weekly.tsx
index b279527..f0d274d 100644
--- a/frontend/src/pages/Weekly.tsx
+++ b/frontend/src/pages/Weekly.tsx
@@ -41,6 +41,10 @@ function pctClass(pct: number | null): string {
if (pct <= 110) return 'pct-amber'
return 'pct-red'
}
+function fmtDelta(pct: number): string {
+ const d = pct - 100
+ return `${d >= 0 ? '+' : ''}${d.toFixed(1)}%`
+}
export default function Weekly() {
const [fromStr, setFromStr] = useState(() => mondayOf(new Date()))
@@ -195,7 +199,7 @@ export default function Weekly() {
% vs Budget
{pctBudget != null
- ? {pctBudget.toFixed(1)}%
+ ? {fmtDelta(pctBudget)}
: '—'}
@@ -247,7 +251,7 @@ export default function Weekly() {
{depBudg != null ? fmtMoney(depBudg) : '—'} |
{depPct != null
- ? {depPct.toFixed(1)}%
+ ? {fmtDelta(depPct)}
: '—'}
|
{depSPct != null ? `${depSPct.toFixed(1)}%` : '—'} |
@@ -261,7 +265,7 @@ export default function Weekly() {
{budget != null ? fmtMoney(budget) : '—'} |
{pctBudget != null
- ? {pctBudget.toFixed(1)}%
+ ? {fmtDelta(pctBudget)}
: '—'}
|
{pctSales != null ? `${pctSales.toFixed(1)}%` : '—'} |