From b0918fd946a6fce402e0ecd5b34fb897708db01a Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Sun, 19 Apr 2026 20:33:30 +0200 Subject: [PATCH] fix(pitch-deck): GuV + Cashflow tabs read from fp_* data, Break-Even as year FinancialsSlide: - Break-Even: shows year (2029) instead of formatted number (2.029) - GuV tab: replaced AnnualPLTable (useFinancialModel) with fp_guv data table Shows: Revenue, Personnel, EBIT, Taxes, Net Income per year - Cashflow tab: replaced AnnualCashflowChart (useFinancialModel) with fp_liquiditaet bar chart showing cash position + EBIT per year - Both tabs now show "Quelle: Finanzplan" label Co-Authored-By: Claude Opus 4.6 (1M context) --- .../components/slides/FinancialsSlide.tsx | 89 ++++++++++++++----- 1 file changed, 69 insertions(+), 20 deletions(-) diff --git a/pitch-deck/components/slides/FinancialsSlide.tsx b/pitch-deck/components/slides/FinancialsSlide.tsx index e25b4f2..1cdbb98 100644 --- a/pitch-deck/components/slides/FinancialsSlide.tsx +++ b/pitch-deck/components/slides/FinancialsSlide.tsx @@ -103,14 +103,15 @@ export default function FinancialsSlide({ lang, investorId, preferredScenarioId, color="#22c55e" delay={0.15} /> - + +
+

Break-Even

+

{kpiBreakEven || '—'}

+ + {kpiBreakEven && kpiBreakEven <= 2029 ? '↑' : kpiBreakEven ? '↓' : ''} + +
+
)} - {/* TAB: GuV — Annual P&L Table */} - {activeTab === 'guv' && activeResults && ( + {/* TAB: GuV — from fp_guv */} + {activeTab === 'guv' && (
@@ -212,26 +213,74 @@ export default function FinancialsSlide({ lang, investorId, preferredScenarioId, {de ? 'Gewinn- und Verlustrechnung (5 Jahre)' : 'Profit & Loss Statement (5 Years)'}

- {de ? 'Alle Werte in EUR' : 'All values in EUR'} + {de ? 'Alle Werte in EUR · Quelle: Finanzplan' : 'All values in EUR · Source: Financial Plan'}

- + + + + + {[2026,2027,2028,2029,2030].map(y => )} + + + + {[ + { label: de ? 'Umsatzerlöse' : 'Revenue', key: 'revenue', bold: true }, + { label: de ? 'Personalkosten' : 'Personnel', key: 'personal', bold: false }, + { label: 'EBIT', key: 'ebit', bold: true }, + { label: de ? 'Steuern' : 'Taxes', key: 'steuern', bold: false }, + { label: de ? 'Jahresüberschuss' : 'Net Income', key: 'netIncome', bold: true }, + ].map((row, idx) => ( + + + {[2026,2027,2028,2029,2030].map(y => { + const v = fpKPIs[`y${y}`]?.[row.key as keyof typeof fpKPIs['y2026']] || 0 + const num = typeof v === 'number' ? v : 0 + return ( + + ) + })} + + ))} + +
{y}
{row.label} + {num === 0 ? '—' : (num >= 1000000 || num <= -1000000) ? `${(num/1000000).toFixed(1)}M` : `${Math.round(num/1000)}k`} +
)} - {/* TAB: Cashflow & Finanzbedarf */} - {activeTab === 'cashflow' && activeResults && ( + {/* TAB: Cashflow — from fp_* */} + {activeTab === 'cashflow' && (

- {de ? 'Jaehrlicher Cashflow & Finanzbedarf' : 'Annual Cash Flow & Funding Requirements'} + {de ? 'Liquidität & Cashflow (5 Jahre) · Quelle: Finanzplan' : 'Liquidity & Cash Flow (5 Years) · Source: Financial Plan'}

- +
+ {[2026,2027,2028,2029,2030].map((y, idx) => { + const liq = fpKPIs[`y${y}`]?.liquiditaet || 0 + const ebit = fpKPIs[`y${y}`]?.ebit || 0 + const maxAbs = Math.max(...[2026,2027,2028,2029,2030].map(yr => Math.abs(fpKPIs[`y${yr}`]?.liquiditaet || 0)), 1) + const h = Math.abs(liq) / maxAbs * 140 + return ( +
+
{liq >= 1000000 ? `${(liq/1000000).toFixed(1)}M` : liq <= -1000000 ? `${(liq/1000000).toFixed(1)}M` : `${Math.round(liq/1000)}k`}
+
+
= 0 ? 'bg-emerald-500/60 rounded-t' : 'bg-red-500/60 rounded-b'} w-full`} style={{ height: `${Math.max(h, 4)}px` }} /> +
+ {y} + = 0 ? 'text-emerald-400/60' : 'text-red-400/60'}`}> + EBIT: {ebit >= 1000000 ? `${(ebit/1000000).toFixed(1)}M` : `${Math.round(ebit/1000)}k`} + +
+ ) + })} +
+
+ {de ? 'Liquidität (positiv)' : 'Cash (positive)'} + {de ? 'Liquidität (negativ)' : 'Cash (negative)'} +
)}