From 6ec27fdbf2001c7bcc6500556ae01d632da4e5d0 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Mon, 20 Apr 2026 10:14:39 +0200 Subject: [PATCH] =?UTF-8?q?feat(pitch-deck):=20larger=20chart=20labels=20+?= =?UTF-8?q?=202=20new=20charts=20(Liquidit=C3=A4t=20+=20Revenue=20vs=20Cos?= =?UTF-8?q?ts)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Charts tab: - All bar labels increased from 7-8px to 11px (readable) - New: Liquidität (Jahresende) bar chart — shows cash position per year - New: Umsatz vs. Gesamtkosten — side-by-side bars per year - All charts read from fpKPIs (fp_* source of truth) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../components/slides/FinanzplanSlide.tsx | 73 ++++++++++++++++++- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/pitch-deck/components/slides/FinanzplanSlide.tsx b/pitch-deck/components/slides/FinanzplanSlide.tsx index 06f8581..0e1527e 100644 --- a/pitch-deck/components/slides/FinanzplanSlide.tsx +++ b/pitch-deck/components/slides/FinanzplanSlide.tsx @@ -357,7 +357,7 @@ export default function FinanzplanSlide({ lang, investorId, preferredScenarioId,
{/* MRR bar */}
-
+
{d.mrr >= 100000 ? `${Math.round(d.mrr/1000)}k` : d.mrr.toLocaleString('de-DE')}
@@ -392,12 +392,12 @@ export default function FinanzplanSlide({ lang, investorId, preferredScenarioId,
{k.ebit >= 0 ? (
-
{Math.round(k.ebit/1000)}k
+
{Math.round(k.ebit/1000)}k
) : (
-
{Math.round(k.ebit/1000)}k
+
{Math.round(k.ebit/1000)}k
)} @@ -421,7 +421,7 @@ export default function FinanzplanSlide({ lang, investorId, preferredScenarioId,
-
{d.val}
+
{d.val}
{d.year} @@ -431,6 +431,71 @@ export default function FinanzplanSlide({ lang, investorId, preferredScenarioId,
+ + {/* Liquidität Chart */} + +

{de ? 'Liquidität (Jahresende)' : 'Cash Position (Year-End)'}

+
+ {(() => { + const years = ['y2026','y2027','y2028','y2029','y2030'] + const data = years.map(y => ({ year: y.slice(1), val: fpKPIs[y]?.liquiditaet || 0 })) + const maxAbs = Math.max(...data.map(d => Math.abs(d.val)), 1) + return data.map((d, idx) => { + const h = Math.abs(d.val) / maxAbs * 100 + const label = Math.abs(d.val) >= 1000000 ? `${(d.val/1000000).toFixed(1)}M` : `${Math.round(d.val/1000)}k` + return ( +
+
+
= 0 ? 'bg-cyan-500/60 rounded-t' : 'bg-red-500/60 rounded-b'} w-full`} style={{ height: `${Math.max(h, 4)}px` }}> +
= 0 ? 'text-cyan-300 -mt-4' : 'text-red-300 mt-1'} text-center whitespace-nowrap font-semibold`}>{label}
+
+
+ {d.year} +
+ ) + }) + })()} +
+
+ + {/* Umsatz vs. Kosten Chart */} + +

{de ? 'Umsatz vs. Gesamtkosten' : 'Revenue vs. Total Costs'}

+
+ {(() => { + const years = ['y2026','y2027','y2028','y2029','y2030'] + const data = years.map(y => ({ + year: y.slice(1), + rev: fpKPIs[y]?.revenue || 0, + costs: (fpKPIs[y]?.personal || 0) + Math.abs(fpKPIs[y]?.ebit || 0) + (fpKPIs[y]?.revenue || 0) - (fpKPIs[y]?.ebit || 0) - (fpKPIs[y]?.revenue || 0), + })) + // Simpler: costs = revenue - ebit + const data2 = years.map(y => ({ + year: y.slice(1), + rev: fpKPIs[y]?.revenue || 0, + costs: (fpKPIs[y]?.revenue || 0) - (fpKPIs[y]?.ebit || 0), + })) + const maxVal = Math.max(...data2.map(d => Math.max(d.rev, d.costs)), 1) + return data2.map((d, idx) => ( +
+
+
+
{d.rev >= 1000000 ? `${(d.rev/1000000).toFixed(1)}M` : `${Math.round(d.rev/1000)}k`}
+
+
+
{d.costs >= 1000000 ? `${(d.costs/1000000).toFixed(1)}M` : `${Math.round(d.costs/1000)}k`}
+
+
+ {d.year} +
+ )) + })()} +
+
+ {de ? 'Umsatz' : 'Revenue'} + {de ? 'Kosten' : 'Costs'} +
+
)}