diff --git a/pitch-deck/components/slides/FinanzplanSlide.datagrid.tsx b/pitch-deck/components/slides/FinanzplanSlide.datagrid.tsx index e7a2e0b..3a4b162 100644 --- a/pitch-deck/components/slides/FinanzplanSlide.datagrid.tsx +++ b/pitch-deck/components/slides/FinanzplanSlide.datagrid.tsx @@ -1,18 +1,19 @@ 'use client' import { - SheetRow, MONTH_LABELS, FORMULA_TOOLTIPS, + SheetRow, MONTH_LABELS, MONTH_LABELS_EN, FORMULA_TOOLTIPS, FORMULA_TOOLTIPS_EN, ROW_LABEL_MAP, getLabel, getValues, formatCell, } from './FinanzplanSlide.helpers' /* ── Tooltip for formula-linked labels ── */ -function LabelWithTooltip({ label }: { label: string }) { - const tooltip = FORMULA_TOOLTIPS[label] - if (!tooltip) return {label} +function LabelWithTooltip({ label, de }: { label: string; de: boolean }) { + const displayLabel = de ? label : (ROW_LABEL_MAP[label] ?? label) + const tooltip = de ? FORMULA_TOOLTIPS[label] : (FORMULA_TOOLTIPS_EN[label] ?? FORMULA_TOOLTIPS[label]) + if (!tooltip) return {displayLabel} return ( - {label} + {displayLabel} {tooltip} @@ -51,7 +52,7 @@ export function GuvTable({ rows, de }: GuvTableProps) { return ( - + {[2026, 2027, 2028, 2029, 2030].map(y => { const v = values[`y${y}`] || 0 @@ -195,7 +196,7 @@ export function MonthlyGrid({ rows, activeSheet, de, yearOffset, openCats, toggl {currentYear} - {MONTH_LABELS.map((label, idx) => ( + {(de ? MONTH_LABELS : MONTH_LABELS_EN).map((label, idx) => ( {label} @@ -241,7 +242,7 @@ export function MonthlyGrid({ rows, activeSheet, de, yearOffset, openCats, toggl
{isCatHeader && {isCatOpen ? '▾' : '▸'}} {isEditable && } - + {row.position && ({row.position})}
diff --git a/pitch-deck/components/slides/FinanzplanSlide.helpers.ts b/pitch-deck/components/slides/FinanzplanSlide.helpers.ts index 72e1383..43e59c1 100644 --- a/pitch-deck/components/slides/FinanzplanSlide.helpers.ts +++ b/pitch-deck/components/slides/FinanzplanSlide.helpers.ts @@ -37,10 +37,86 @@ export const MONTH_LABELS = [ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez', ] +export const MONTH_LABELS_EN = [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', +] + export function getLabel(row: SheetRow): string { return row.row_label || row.person_name || row.item_name || '—' } +// German → English row label translations +export const ROW_LABEL_MAP: Record = { + // GuV / P&L + 'Umsatzerlöse': 'Revenue', + 'Materialaufwand': 'Cost of Materials', + 'Material-/Wareneinsatz': 'Materials / COGS', + 'Fremdleistungen': 'External Services', + 'Rohertrag': 'Gross Profit', + 'Rohergebnis': 'Gross Result', + 'Gesamtleistung': 'Total Output', + 'Personalkosten': 'Personnel Costs', + 'Abschreibungen': 'Depreciation', + 'Betriebliche Aufwendungen': 'Operating Expenses', + 'Sonstige betriebliche Aufwendungen': 'Other Operating Expenses', + 'EBIT': 'EBIT', + 'Betriebsergebnis': 'Operating Result', + 'Zinsergebnis': 'Net Interest', + 'Zinsaufwand': 'Interest Expense', + 'Zinsertrag': 'Interest Income', + 'Ergebnis vor Steuern': 'Earnings Before Tax', + 'EBT': 'EBT', + 'Gewerbesteuer': 'Trade Tax', + 'Körperschaftsteuer': 'Corporate Tax', + 'Steuern gesamt': 'Total Taxes', + 'Steuern': 'Taxes', + 'Jahresüberschuss': 'Net Income', + 'Jahresfehlbetrag': 'Net Loss', + 'Ergebnis nach Steuern': 'Net Result', + // Liquidität + 'Einzahlungen': 'Cash Inflows', + 'Summe Einzahlungen': 'Total Inflows', + 'Auszahlungen': 'Cash Outflows', + 'Summe Auszahlungen': 'Total Outflows', + 'Überschuss/Fehlbetrag': 'Surplus / Deficit', + 'ÜBERSCHUSS': 'SURPLUS', + 'FEHLBETRAG': 'DEFICIT', + 'ÜBERSCHUSS/FEHLBETRAG': 'SURPLUS / DEFICIT', + 'Kontostand': 'Account Balance', + 'Kontostand (Anfang)': 'Opening Balance', + 'Kontostand (Ende)': 'Closing Balance', + 'LIQUIDITÄT': 'LIQUIDITY', + 'LIQUIDITAET': 'LIQUIDITY', + 'Kredittilgung': 'Loan Repayment', + 'Zins- und Tilgungszahlung': 'Interest & Principal', + 'Investitionen': 'Investments', + 'Sonstige Erträge': 'Other Income', + // Kunden + 'Neukunden': 'New Customers', + 'Bestandskunden': 'Existing Customers', + 'Bestandskunden gesamt': 'Total Existing Customers', + 'Anzahl Kunden': 'Customer Count', + 'GESAMT': 'TOTAL', + 'GESAMTUMSATZ': 'TOTAL REVENUE', + // Betriebliche Aufwendungen + 'Fort-/Weiterbildungskosten (F)': 'Training & Development (F)', + 'Fahrzeugkosten (F)': 'Vehicle Costs (F)', + 'KFZ-Steuern (F)': 'Vehicle Tax (F)', + 'KFZ-Versicherung (F)': 'Vehicle Insurance (F)', + 'Reisekosten (F)': 'Travel Expenses (F)', + 'Bewirtungskosten (F)': 'Entertainment Costs (F)', + 'Internet/Mobilfunk (F)': 'Internet / Mobile (F)', + 'Cloud-Hosting (SysEleven/Hetzner)': 'Cloud Hosting (SysEleven/Hetzner)', + 'Berufsgenossenschaft (F)': 'Employers\' Liability Insurance (F)', + 'Allgemeine Marketingkosten (F)': 'General Marketing Costs (F)', + 'Gewerbesteuer (F)': 'Trade Tax (F)', + 'Summe sonstige Aufwendungen': 'Total Other Expenses', + 'SUMME Betriebliche Aufwendungen': 'TOTAL Operating Expenses', + 'SUMME': 'TOTAL', + 'Summe': 'Total', +} + export const FORMULA_TOOLTIPS: Record = { 'Fort-/Weiterbildungskosten (F)': 'Mitarbeiter (ohne Gründer) × 300 EUR/Mon', 'Fahrzeugkosten (F)': 'Mitarbeiter (ohne Gründer) × 200 EUR/Mon', @@ -57,6 +133,22 @@ export const FORMULA_TOOLTIPS: Record = { 'Abschreibungen': 'Summe AfA aus Tab Investitionen', } +export const FORMULA_TOOLTIPS_EN: Record = { + 'Fort-/Weiterbildungskosten (F)': 'Employees (excl. founders) × €300/month', + 'Fahrzeugkosten (F)': 'Employees (excl. founders) × €200/month', + 'KFZ-Steuern (F)': 'Employees (excl. founders) × €25/month', + 'KFZ-Versicherung (F)': 'Employees (excl. founders) × €150/month', + 'Reisekosten (F)': 'Total headcount × €75/month', + 'Bewirtungskosten (F)': 'Existing customers × €50/month', + 'Internet/Mobilfunk (F)': 'Total headcount × €50/month', + 'Cloud-Hosting (SysEleven/Hetzner)': '€1,500 base + (customers − 10) × €100 (first 10 included)', + 'Berufsgenossenschaft (F)': '0.5% of gross payroll (VBG IT/Office)', + 'Allgemeine Marketingkosten (F)': '8% of revenue (2026–2028), 10% from 2029', + 'Gewerbesteuer (F)': '12.25% of profit (rate 3.5% × multiplier 350%, only when profitable)', + 'Personalkosten': 'Sum from Personnel Costs tab', + 'Abschreibungen': 'Sum of depreciation from Investments tab', +} + export function getValues(row: SheetRow): Record { return row.values || row.values_total || row.values_brutto || (row as Record).values_invest as Record || {} }