diff --git a/src/app/portfolio/[slug]/(portfolio)/reporting/DashboardSummaryCards.tsx b/src/app/portfolio/[slug]/(portfolio)/reporting/DashboardSummaryCards.tsx index ac910e18..34669af5 100644 --- a/src/app/portfolio/[slug]/(portfolio)/reporting/DashboardSummaryCards.tsx +++ b/src/app/portfolio/[slug]/(portfolio)/reporting/DashboardSummaryCards.tsx @@ -54,10 +54,13 @@ export function DashboardSummaryCards({ const missingEpcCount = estimatedCounts.estimated; const missingEpcPercent = total > 0 ? (missingEpcCount / total) * 100 : 0; const averageCurrentEpc = sapToEpc(averages.avg_sap || 0); + const hasScenario = Boolean(scenarioOverlay); + + // We pull the scenario data from the scenario overlay function deltaLabel(baseline: number, scenario: number) { const diff = scenario - baseline; - if (diff === 0) return "No change"; + if (diff === 0) return null; const sign = diff > 0 ? "▲" : "▼"; const color = diff > 0 ? "text-red-600" : "text-emerald-600"; @@ -86,7 +89,7 @@ export function DashboardSummaryCards({ scenarioOverlay?.avgSap && `${sapToEpc(scenarioOverlay.avgSap.scenario)} (${scenarioOverlay.avgSap.scenario} pts)`, subtitle: "Current SAP rating across all properties.", - extra: { epc: averageCurrentEpc ?? "Unknown" }, + isEpc: true, }, { key: "avgCarbon", @@ -130,7 +133,7 @@ export function DashboardSummaryCards({ const Icon = cardStyles[c.key as MetricKey].icon; const color = cardStyles[c.key as MetricKey].color; - const hasScenario = Boolean(c.scenario); + console.log("Card data:", c); return ( - {c.title} - - {/* --- BASELINE + SCENARIO SIDE BY SIDE --- */} + + {/* BASELINE + SCENARIO ROW */}
- {/* Baseline */} + {/* BASELINE */}
Baseline {c.key === "avgBills" ? `£${c.baseline}` : c.baseline} @@ -171,11 +173,25 @@ export function DashboardSummaryCards({ )}
- {/* Scenario (if selected) */} - {hasScenario && ( + {/* SCENARIO */} + {hasScenario && c.scenario && (
Scenario - + + {c.key === "avgBills" ? `£${c.scenario}` : c.scenario} @@ -184,14 +200,14 @@ export function DashboardSummaryCards({ )}
- {/* Totals */} + {/* TOTAlS */} {c.totalValue && ( -
{c.totalValue}
+
{c.totalValue}
)} - {/* Missing EPC Bar */} + {/* Missing EPC bar */} {c.key === "missingEpc" && ( -
+
(null); + const drawerOpen = Boolean(selectedScenarioId); // 🔥 Hardcoded scenario metrics (replace later with real fetch) useEffect(() => { @@ -47,13 +49,13 @@ export function ReportingClientArea({ const mocked = { averages: { - avg_sap: 74, - avg_carbon: 880, - avg_bills: 224000, + avg_sap: 82, + avg_carbon: 1.7, + avg_bills: 1300, }, totals: { - total_carbon: 880 * 120, - total_bills: 224000 * 120, + total_carbon: 1.7 * 120, + total_bills: 1300 * 120, }, valuation: { baseline: 130_000_000, @@ -65,18 +67,43 @@ export function ReportingClientArea({ }, [selectedScenarioId]); // 👇 Active metrics switch to scenario if present - const activeMetrics = scenarioMetrics + // Baseline always stays baseline + const activeMetrics = baseline; + + // Scenario overlay stays separate + const scenarioOverlay = scenarioMetrics ? { - ...baseline, - averages: { - ...baseline.averages, - avg_sap: scenarioMetrics.averages.avg_sap, - avg_carbon: scenarioMetrics.averages.avg_carbon, - avg_bills: scenarioMetrics.averages.avg_bills, + avgSap: { + baseline: baseline.averages.avg_sap || 0, + scenario: scenarioMetrics.averages.avg_sap, }, - totals: scenarioMetrics.totals, + avgCarbon: { + baseline: baseline.averages.avg_carbon || 0, + scenario: scenarioMetrics.averages.avg_carbon, + }, + avgBills: { + baseline: baseline.averages.avg_bills || 0, + scenario: scenarioMetrics.averages.avg_bills, + }, + valuation: scenarioMetrics.valuation, } - : baseline; + : null; + + // -------------------- + // Scenario Financial Metrics (mocked) + // -------------------- + const scenarioFinancial = scenarioMetrics + ? { + totalCost: 5_400_000, + contingency: 540_000, + funding: 2_100_000, + costPerSap: 3200, + costPerCo2: 180, + netCost: 5_400_000 - 2_100_000, + netCostPerUnit: (5_400_000 - 2_100_000) / 120, + nUnits: 120, + } + : null; return ( <> @@ -93,13 +120,15 @@ export function ReportingClientArea({ subtitle="High-level insights on performance, energy, and EPC quality." /> + +
+ {open && metrics && ( + +
+

+ Scenario Financial Summary +

+ +
+ + + + + + + + +
+
+
+ )} + + ); +} + +function Metric({ + label, + value, + icon: Icon, + color, + bg, +}: { + label: string; + value: string | number; + icon: any; + color: string; + bg: string; +}) { + return ( +
+
+ {/* coloured icon background */} +
+ +
+ + + {label} + +
+ + + {value} + +
+ ); +} diff --git a/src/app/portfolio/[slug]/(portfolio)/reporting/page.tsx b/src/app/portfolio/[slug]/(portfolio)/reporting/page.tsx index 290f14f3..7b8c8851 100644 --- a/src/app/portfolio/[slug]/(portfolio)/reporting/page.tsx +++ b/src/app/portfolio/[slug]/(portfolio)/reporting/page.tsx @@ -26,13 +26,6 @@ export default async function ReportingPage(props: { ]); const scenarios = await getScenarios(Number(portfolioId)); - const mockScenarioOverlay = { - avgSap: { baseline: 62, scenario: 74 }, - avgCarbon: { baseline: 1120, scenario: 880 }, - avgBills: { baseline: 240000, scenario: 224000 }, - valuation: { baseline: 130000000, scenario: 136000000 }, - }; - return (
diff --git a/src/app/portfolio/[slug]/(portfolio)/reporting/scenarioSelectorWrapper.tsx b/src/app/portfolio/[slug]/(portfolio)/reporting/scenarioSelectorWrapper.tsx index 03d788c4..a0956507 100644 --- a/src/app/portfolio/[slug]/(portfolio)/reporting/scenarioSelectorWrapper.tsx +++ b/src/app/portfolio/[slug]/(portfolio)/reporting/scenarioSelectorWrapper.tsx @@ -15,13 +15,18 @@ export function ScenarioSelectorWrapper({ setSelectedScenarioId: (id: number | null) => void; }) { // The ID we will eventually pass into React Query - const activeContextId = useMemo( - () => selectedScenarioId ?? portfolioId, - [selectedScenarioId, portfolioId] - ); + // const activeContextId = useMemo( + // () => selectedScenarioId ?? portfolioId, + // [selectedScenarioId, portfolioId] + // ); + const [selectedScenarioName, setSelectedScenarioName] = useState< + string | null + >(null); function handleSelect(id: number | null) { setSelectedScenarioId(id); + const scenario = scenarios.find((s) => s.id === id); + setSelectedScenarioName(scenario ? scenario.name : null); } return ( @@ -34,7 +39,7 @@ export function ScenarioSelectorWrapper({ {selectedScenarioId !== null ? (
- Scenario selected: {selectedScenarioId} + Scenario selected: {selectedScenarioName}
) : (
Using portfolio baseline