diff --git a/pitch-deck/components/slides/FinancialsSlide.tsx b/pitch-deck/components/slides/FinancialsSlide.tsx index 1cdbb98..f067acf 100644 --- a/pitch-deck/components/slides/FinancialsSlide.tsx +++ b/pitch-deck/components/slides/FinancialsSlide.tsx @@ -144,60 +144,87 @@ export default function FinancialsSlide({ lang, investorId, preferredScenarioId, {/* Main content: full width */}
- {/* TAB: Overview — monatlicher Chart + Waterfall + Unit Economics */} + {/* TAB: Overview — annual charts from fp_* */} {activeTab === 'overview' && ( <> + {/* Revenue vs Costs */} -
-
-

- {de ? 'Umsatz vs. Kosten (60 Monate)' : 'Revenue vs. Costs (60 months)'} -

-
- {de ? 'Umsatz' : 'Revenue'} - {de ? 'Kosten' : 'Costs'} - {de ? 'Kunden' : 'Customers'} -
+
+

{de ? 'Umsatz vs. Kosten (pro Jahr) · Quelle: Finanzplan' : 'Revenue vs. Costs (per year) · Source: Financial Plan'}

+
+ {[2026,2027,2028,2029,2030].map((y, idx) => { + const rev = fpKPIs[`y${y}`]?.revenue || 0 + const costs = rev - (fpKPIs[`y${y}`]?.ebit || 0) + const cust = fpKPIs[`y${y}`]?.customers || 0 + const maxVal = Math.max(...[2026,2027,2028,2029,2030].map(yr => Math.max(fpKPIs[`y${yr}`]?.revenue || 0, (fpKPIs[`y${yr}`]?.revenue || 0) - (fpKPIs[`y${yr}`]?.ebit || 0))), 1) + return ( +
+
+
+
{rev >= 1000000 ? `${(rev/1000000).toFixed(1)}M` : `${Math.round(rev/1000)}k`}
+
+
+
{costs >= 1000000 ? `${(costs/1000000).toFixed(1)}M` : `${Math.round(costs/1000)}k`}
+
+
+ {y} + {cust} {de ? 'Kd.' : 'cust.'} +
+ ) + })} +
+
+ {de ? 'Umsatz' : 'Revenue'} + {de ? 'Kosten' : 'Costs'}
-
+ {/* EBIT + Liquidität */} -
-

- {de ? 'Cash-Flow (Quartal)' : 'Cash Flow (Quarterly)'} -

- {activeResults && } +
+

EBIT & {de ? 'Liquidität' : 'Cash'}

+
+ {[2026,2027,2028,2029,2030].map((y, idx) => { + const ebit = fpKPIs[`y${y}`]?.ebit || 0 + const liq = fpKPIs[`y${y}`]?.liquiditaet || 0 + const maxAbs = Math.max(...[2026,2027,2028,2029,2030].map(yr => Math.max(Math.abs(fpKPIs[`y${yr}`]?.ebit || 0), Math.abs(fpKPIs[`y${yr}`]?.liquiditaet || 0))), 1) + return ( +
+
+
= 0 ? 'bg-emerald-500/60 rounded-t' : 'bg-red-500/60 rounded-b'}`} style={{ height: `${Math.max(Math.abs(ebit)/maxAbs * 70, 2)}px` }} /> +
= 0 ? 'bg-cyan-500/60 rounded-t' : 'bg-red-500/40 rounded-b'}`} style={{ height: `${Math.max(Math.abs(liq)/maxAbs * 70, 2)}px` }} /> +
+ {y} +
+ ) + })} +
+
+ EBIT + {de ? 'Liquidität' : 'Cash'} +
+ {/* Key Metrics */} -
-
- +
+

Unit Economics (2030)

+
+ {[ + { label: 'ACV', value: fpLast?.arpu ? `${fpLast.arpu.toLocaleString('de-DE')} EUR` : '—', color: 'text-indigo-300' }, + { label: 'Gross Margin', value: fpLast?.grossMargin ? `${fpLast.grossMargin}%` : '—', color: 'text-emerald-300' }, + { label: 'NRR', value: fpLast?.nrr ? `${fpLast.nrr}%` : '—', color: 'text-purple-300' }, + { label: 'EBIT Margin', value: fpLast?.ebitMargin ? `${fpLast.ebitMargin}%` : '—', color: 'text-amber-300' }, + ].map((m, idx) => ( +
+

{m.label}

+

{m.value}

+
+ ))}
- {lastResult && ( - a.key === 'churn_rate_monthly')?.value as number || 3} - lang={lang} - /> - )}