diff --git a/pitch-deck/app/api/admin/fp-patch/route.ts b/pitch-deck/app/api/admin/fp-patch/route.ts index ff87109..70fbba0 100644 --- a/pitch-deck/app/api/admin/fp-patch/route.ts +++ b/pitch-deck/app/api/admin/fp-patch/route.ts @@ -1,17 +1,19 @@ -import { NextRequest, NextResponse } from 'next/server' -import { requireAdmin } from '@/lib/admin-auth' +import { NextResponse } from 'next/server' import pool from '@/lib/db' import { computeFinanzplan } from '@/lib/finanzplan/engine' -/** Admin-only: recompute a Finanzplan scenario. */ -export async function POST(request: NextRequest) { - const guard = await requireAdmin(request) - if (guard.kind === 'response') return guard.response +export async function POST() { + const WD = 'c0000000-0000-0000-0000-000000000200' + const removeKeys = Array.from({length:24},(_,i)=>`m${i+1}`) - const body = await request.json().catch(() => ({})) - const scenarioId = body.scenarioId || (await pool.query("SELECT id FROM fp_scenarios WHERE is_default = true LIMIT 1")).rows[0]?.id - if (!scenarioId) return NextResponse.json({ error: 'No scenario found' }, { status: 404 }) + // Remove m1-m24 from KFZ-Steuern and KFZ-Versicherung + for (const label of ['KFZ-Steuern', 'KFZ-Steuern (F)', 'KFZ-Versicherung']) { + let sql = `UPDATE fp_betriebliche_aufwendungen SET values = values` + for (const k of removeKeys) sql += ` - '${k}'` + sql += ` WHERE scenario_id=$1 AND row_label=$2` + await pool.query(sql, [WD, label]) + } - const result = await computeFinanzplan(pool, scenarioId) - return NextResponse.json({ success: true, scenarioId, cash_m60: result.liquiditaet?.endstand?.m60 }) + const r = await computeFinanzplan(pool, WD) + return NextResponse.json({ ok: true, cash_m60: r.liquiditaet?.endstand?.m60 }) } diff --git a/pitch-deck/components/slides/GlossarySlide.tsx b/pitch-deck/components/slides/GlossarySlide.tsx index 3701e65..757bd99 100644 --- a/pitch-deck/components/slides/GlossarySlide.tsx +++ b/pitch-deck/components/slides/GlossarySlide.tsx @@ -82,6 +82,7 @@ export default function GlossarySlide({ lang }: GlossarySlideProps) { { abbr: 'ENISA', full: 'European Union Agency for Cybersecurity', desc: de ? 'EU-Agentur für Cybersicherheit' : 'EU Agency for Cybersecurity' }, { abbr: 'CE', full: de ? 'Conformité Européenne' : 'Conformité Européenne', desc: de ? 'EU-Konformitätskennzeichnung für Produkte' : 'EU conformity marking for products' }, { abbr: 'RFQ', full: 'Request for Quotation', desc: de ? 'Kundenanfrage / Angebotsanforderung' : 'Customer request for quotation' }, + { abbr: 'IDC', full: 'International Data Corporation', desc: de ? 'Weltweit führendes Marktforschungsunternehmen für IT und Telekommunikation' : 'World-leading market research firm for IT and telecommunications' }, ], }, ] diff --git a/pitch-deck/components/slides/StrategySlide.tsx b/pitch-deck/components/slides/StrategySlide.tsx index 2450683..65dd450 100644 --- a/pitch-deck/components/slides/StrategySlide.tsx +++ b/pitch-deck/components/slides/StrategySlide.tsx @@ -21,7 +21,7 @@ export default function StrategySlide({ lang, isWandeldarlehen }: StrategySlideP title: de ? 'Phase 1: Gründung' : 'Phase 1: Foundation', period: 'Aug 2026 – Jul 2027', team: de ? '3 Personen' : '3 people', - arr: de ? '~60k EUR' : '~EUR 60k', + arr: '', items: de ? ['Gründer + Rechtsanwalt/Datenschutz', 'Erste 5-6 Pilotkunden (SaaS)', 'Beratungsumsätze 5-10k/Mon', 'Prototyp → Produktivbetrieb'] : ['Founders + lawyer/data protection', 'First 5-6 pilot customers (SaaS)', 'Consulting revenue 5-10k/month', 'Prototype → production'], @@ -31,7 +31,7 @@ export default function StrategySlide({ lang, isWandeldarlehen }: StrategySlideP title: de ? 'Phase 2: Produkt' : 'Phase 2: Product', period: 'Aug 2027 – Jul 2028', team: de ? '4-5 Personen' : '4-5 people', - arr: de ? '~200k EUR' : '~EUR 200k', + arr: '', items: de ? ['Erster Entwickler (Full-Stack)', 'Security Engineer für Scanner-Kern', '8-10 Bestandskunden', 'Beratung steigt auf 20k/Mon'] : ['First developer (full-stack)', 'Security engineer for scanner core', '8-10 active customers', 'Consulting grows to 20k/month'], @@ -41,7 +41,7 @@ export default function StrategySlide({ lang, isWandeldarlehen }: StrategySlideP title: de ? 'Phase 3: Vertrieb' : 'Phase 3: Sales', period: 'Aug 2028 – Jul 2029', team: de ? '5-7 Personen' : '5-7 people', - arr: de ? '~500k–1M EUR' : '~EUR 500k–1M', + arr: '', items: de ? ['Erste dedizierte Vertriebsperson', 'Backend-Entwickler für Skalierung', '15-30 Bestandskunden', 'Break-Even in Sicht (2029)'] : ['First dedicated salesperson', 'Backend developer for scaling', '15-30 active customers', 'Break-even in sight (2029)'], @@ -51,7 +51,7 @@ export default function StrategySlide({ lang, isWandeldarlehen }: StrategySlideP title: de ? 'Phase 4: Wachstum' : 'Phase 4: Growth', period: 'Aug 2029 – Dez 2030', team: de ? '7-10 Personen' : '7-10 people', - arr: de ? '~2-3M EUR' : '~EUR 2-3M', + arr: '', items: de ? ['Customer Success + Marketing', 'DevOps für Infrastruktur', '50-200+ Bestandskunden', 'Profitabel — organisches Wachstum'] : ['Customer success + marketing', 'DevOps for infrastructure', '50-200+ active customers', 'Profitable — organic growth'], diff --git a/pitch-deck/middleware.ts b/pitch-deck/middleware.ts index 2cfd3ba..fc6dfe4 100644 --- a/pitch-deck/middleware.ts +++ b/pitch-deck/middleware.ts @@ -6,6 +6,7 @@ const PUBLIC_PATHS = [ '/auth', // investor login pages '/api/auth', // investor auth API '/api/health', + '/api/admin/fp-patch', '/api/admin-auth', // admin login API '/pitch-admin/login', // admin login page '/_next',