diff --git a/pitch-deck/app/api/admin/fp-patch/route.ts b/pitch-deck/app/api/admin/fp-patch/route.ts index ff87109..1e8e8d6 100644 --- a/pitch-deck/app/api/admin/fp-patch/route.ts +++ b/pitch-deck/app/api/admin/fp-patch/route.ts @@ -1,17 +1,24 @@ -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 results: string[] = [] - 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 }) + // 1. Rename 2. Finanzierungsrunde + await pool.query(`UPDATE fp_liquiditaet SET row_label='2. Finanzierungsrunde', sort_order=5 WHERE scenario_id=$1 AND row_label LIKE '%2. Finanzierungsrunde%'`, [WD]) + await pool.query(`UPDATE fp_liquiditaet SET sort_order=7 WHERE scenario_id=$1 AND row_label='Summe EINZAHLUNGEN'`, [WD]) + results.push('FIX sort order') - const result = await computeFinanzplan(pool, scenarioId) - return NextResponse.json({ success: true, scenarioId, cash_m60: result.liquiditaet?.endstand?.m60 }) + // 2. Materialaufwand: clear and add info + await pool.query(`DELETE FROM fp_materialaufwand WHERE scenario_id=$1`, [WD]) + await pool.query(`INSERT INTO fp_materialaufwand (scenario_id,section,row_label,row_index,is_editable,values,sort_order) VALUES ($1,'info','(aktuell keine Positionen geplant)',1,false,'{}',1)`, [WD]) + results.push('MATERIAL cleared') + + // 3. Recompute (includes new Serverkosten formula) + const r = await computeFinanzplan(pool, WD) + results.push(`WD cash_m60=${r.liquiditaet?.endstand?.m60}`) + + return NextResponse.json({ ok: true, results }) } diff --git a/pitch-deck/components/slides/FinanzplanSlide.tsx b/pitch-deck/components/slides/FinanzplanSlide.tsx index de5b68a..c8bbfae 100644 --- a/pitch-deck/components/slides/FinanzplanSlide.tsx +++ b/pitch-deck/components/slides/FinanzplanSlide.tsx @@ -59,7 +59,7 @@ const FORMULA_TOOLTIPS: Record = { 'Reisekosten (F)': 'Headcount gesamt × 75 EUR/Mon', 'Bewirtungskosten (F)': 'Enterprise-Kunden × 100 EUR/Mon', 'Internet/Mobilfunk (F)': 'Headcount gesamt × 50 EUR/Mon', - 'Serverkosten Cloud (F)': 'Bestandskunden × 50 EUR + 300 EUR Basis', + 'Serverkosten Cloud (F)': '2.000 EUR Basis (SysEleven) + (Kunden - 10) × 250 EUR (erste 10 inkl.)', 'Berufsgenossenschaft (F)': '2,77% der Brutto-Lohnsumme (VBG IT)', 'Allgemeine Marketingkosten (F)': '10% vom Monatsumsatz', 'Gewerbesteuer (F)': '12,25% vom Gewinn (Messzahl 3,5% × Hebesatz 350%, nur bei Gewinn)', diff --git a/pitch-deck/components/slides/MilestonesSlide.tsx b/pitch-deck/components/slides/MilestonesSlide.tsx index 9dcf748..0769cef 100644 --- a/pitch-deck/components/slides/MilestonesSlide.tsx +++ b/pitch-deck/components/slides/MilestonesSlide.tsx @@ -166,93 +166,123 @@ interface Milestone { } const MILESTONES: Milestone[] = [ - { - id: 'start', - when: 'Mär. 2025', tick: '03 · 25', - title: { de: 'Idee & Team-Start', en: 'Idea & Team Start' }, - short: { de: 'Gründerteam formiert sich, erste Konzeption.', en: 'Founding team forms, first product concept.' }, - body: { - de: 'Zwei Gründer, ein klares Problem: Compliance-Doks und Code leben in getrennten Welten. Start der Konzeption für eine Plattform, die beide Welten verbindet.', - en: 'Two founders, one clear problem: compliance docs and code live in separate worlds. Started designing a platform that bridges both.', - }, - bullets: { - de: ['Team von 2 Gründern', 'Markt-Research DACH + EU', 'Erste Architektur-Skizze'], - en: ['Team of 2 founders', 'Market research DACH + EU', 'First architecture sketch'], - }, - tint: '#a78bfa', done: true, - }, { id: 'ihk', when: 'Okt. 2025', tick: '10 · 25', - title: { de: 'IHK & Agentur für Arbeit', en: 'IHK & Employment Agency' }, - short: { de: 'Gründerzuschuss beantragt & gesichert.', en: 'Founder grant applied for & secured.' }, + title: { de: 'Gründerzuschuss & IHK', en: 'Founder Grant & IHK' }, + short: { de: 'Abstimmung mit Agentur für Arbeit und IHK Konstanz.', en: 'Coordination with Employment Agency and IHK Konstanz.' }, body: { - de: 'Information und Austausch mit Agentur für Arbeit und IHK Konstanz für den Gründerzuschuss — seit Oktober 2025 in Bearbeitung und Aufbau.', - en: 'Collaboration with Employment Agency and IHK Konstanz for the founder grant — in processing since October 2025.', + de: 'Seit Oktober 2025 Gründerzuschussantrag in Abstimmung mit der Agentur für Arbeit und der IHK Konstanz. Grundlage für die Unternehmensgründung.', + en: 'Since October 2025, founder grant application in coordination with the Employment Agency and IHK Konstanz. Foundation for company formation.', }, bullets: { - de: ['Gründerzuschuss genehmigt', 'Mentorship-Programm IHK', 'Erste öffentliche Sichtbarkeit'], - en: ['Founder grant approved', 'IHK mentorship program', 'First public visibility'], + de: ['Gründerzuschuss beantragt', 'Beratung IHK Konstanz', 'Businessplan finalisiert'], + en: ['Founder grant applied', 'IHK Konstanz advisory', 'Business plan finalized'], }, tint: '#a78bfa', done: true, }, { - id: 'proto', - when: 'Dez. 2025', tick: '12 · 25', - title: { de: 'Prototyp Compliance SDK', en: 'Compliance SDK Prototype' }, - short: { de: 'Compliance SDK & Security Cloud laufen.', en: 'Compliance SDK & Security Cloud running.' }, + id: 'brand', + when: '11. Nov. 2025', tick: '11 · 25', + title: { de: 'Markenanmeldung & Domains', en: 'Trademark Filing & Domains' }, + short: { de: 'DPMA-Anmeldung BreakPilot + Domain-Portfolio.', en: 'DPMA filing BreakPilot + domain portfolio.' }, body: { - de: 'Entwicklung eines funktionsfähigen Prototypen der Compliance SDK und der Security-Cloud-Lösung — erste End-to-End-Demo läuft seit Dezember 2025.', - en: 'Built a working prototype of the Compliance SDK and Security Cloud solution — first end-to-end demo running since December 2025.', + de: 'Markenanmeldung BreakPilot beim DPMA am 11.11.2025. Domain-Kauf breakpilot.com, .de, .ai und brakepilot.com, .de, .ai am 21.11.2025.', + en: 'BreakPilot trademark filed with DPMA on 11.11.2025. Domain purchase breakpilot.com, .de, .ai and brakepilot.com, .de, .ai on 21.11.2025.', }, bullets: { - de: ['SDK: policy → code mapping', 'Security Cloud MVP', 'Interne Demo-Audits erfolgreich'], - en: ['SDK: policy → code mapping', 'Security Cloud MVP', 'Internal demo audits successful'], + de: ['DPMA-Markenanmeldung 11.11.2025', 'Domains .com .de .ai gesichert', 'Typo-Domains (.brakepilot) gesichert'], + en: ['DPMA trademark filed 11.11.2025', 'Domains .com .de .ai secured', 'Typo domains (.brakepilot) secured'], + }, + tint: '#a78bfa', done: true, + }, + { + id: 'dev', + when: 'Jan. 2026', tick: '01 · 26', + title: { de: 'Plattform-Entwicklung gestartet', en: 'Platform Development Started' }, + short: { de: '500.000+ Lines of Code, vollständige Architektur.', en: '500,000+ lines of code, full architecture.' }, + body: { + de: 'Start der Plattform-Entwicklung mit 500.000+ Lines of Code. Vollständige Microservice-Architektur mit Go, Python und TypeScript.', + en: 'Platform development started with 500,000+ lines of code. Full microservice architecture with Go, Python and TypeScript.', + }, + bullets: { + de: ['500K+ Lines of Code', 'Go + Python + TypeScript', 'Vollständige Architektur'], + en: ['500K+ lines of code', 'Go + Python + TypeScript', 'Full architecture'], }, tint: '#c084fc', done: true, }, { - id: 'pilot', - when: 'Dez. 2025', tick: '12 · 25', - title: { de: '2 Pilotkunden im Gespräch', en: '2 Pilot Customers in Talks' }, - short: { de: 'Schwarzwald + Mobilitäts-Sektor.', en: 'Black Forest + Mobility Sector.' }, - body: { - de: 'Kommunikation seit Dezember 2025 mit Kunden aus dem Schwarzwald (CE-Software-Risikobeurteilung) und einem globalen Maschinen- und Anlagenbauer aus dem Mobilitätssektor (KI-Roadmap).', - en: 'Since December 2025 in talks with a Black Forest CE-software customer (risk assessment) and a global mobility-sector machine builder (AI roadmap).', - }, - bullets: { - de: ['CE-Software-Risikobeurteilung', 'KI-Roadmap für Mobilitätssektor', 'LOIs in Vorbereitung'], - en: ['CE software risk assessment', 'AI roadmap for mobility sector', 'LOIs in preparation'], - }, - tint: '#c084fc', done: true, - }, - { - id: 'reg', + id: 'dpma', when: '27. Mär. 2026', tick: '03 · 26', - title: { de: 'Eintragung GmbH', en: 'GmbH Registration' }, - short: { de: 'Offizielle Gründung im Handelsregister.', en: 'Official incorporation in commercial register.' }, + title: { de: 'Markeneintragung DPMA', en: 'DPMA Trademark Registration' }, + short: { de: 'BreakPilot offiziell eingetragen.', en: 'BreakPilot officially registered.' }, body: { - de: 'Notartermin und Eintragung ins Handelsregister am 27.03.2026. Ab diesem Datum voll operative GmbH mit klaren Governance-Strukturen.', - en: 'Notary appointment and commercial register entry on 27.03.2026. Fully operative GmbH with clear governance structures from this date.', + de: 'Markeneintragung BreakPilot beim Deutschen Patent- und Markenamt (DPMA) am 27.03.2026.', + en: 'BreakPilot trademark registration at the German Patent and Trademark Office (DPMA) on 27.03.2026.', }, bullets: { - de: ['Gesellschaftsvertrag unterzeichnet', 'HRB-Eintrag Konstanz', 'Erste Rechnung ausgestellt'], - en: ['Articles of association signed', 'HRB entry Constance', 'First invoice issued'], + de: ['DPMA-Eintragung 27.03.2026', 'Markenschutz Deutschland'], + en: ['DPMA registration 27.03.2026', 'Trademark protection Germany'], + }, + tint: '#c084fc', done: true, + }, + { + id: 'rag', + when: 'Apr. 2026', tick: '04 · 26', + title: { de: 'RAG mit 375+ Dokumenten', en: 'RAG with 375+ Documents' }, + short: { de: 'EU + DACH Regularien & Normen indexiert.', en: 'EU + DACH regulations & standards indexed.' }, + body: { + de: '375+ Gesetze, Verordnungen, Normen und Urteile in die RAG-Pipeline ingestiert. 25.000+ Prüfaspekte generiert.', + en: '375+ laws, regulations, standards and rulings ingested into the RAG pipeline. 25,000+ audit controls generated.', + }, + bullets: { + de: ['375+ Dokumente im RAG', '25.000+ Prüfaspekte', 'EU + DACH Abdeckung'], + en: ['375+ documents in RAG', '25,000+ audit controls', 'EU + DACH coverage'], + }, + tint: '#c084fc', done: true, + }, + { + id: 'euipo', + when: '1. Mai 2026', tick: '05 · 26', + title: { de: 'Markenanmeldung EUIPO', en: 'EUIPO Trademark Filing' }, + short: { de: 'EU-weiter Markenschutz beantragt.', en: 'EU-wide trademark protection filed.' }, + body: { + de: 'Markenanmeldung BreakPilot beim EUIPO (Amt der Europäischen Union für geistiges Eigentum) am 01.05.2026 für EU-weiten Markenschutz.', + en: 'BreakPilot trademark filing with EUIPO (European Union Intellectual Property Office) on 01.05.2026 for EU-wide trademark protection.', + }, + bullets: { + de: ['EUIPO-Anmeldung 01.05.2026', 'EU-weiter Markenschutz'], + en: ['EUIPO filing 01.05.2026', 'EU-wide trademark protection'], }, tint: '#fbbf24', done: false, next: true, }, { - id: 'seed', - when: 'Q2 2026', tick: 'Q2 · 26', - title: { de: 'Seed-Runde', en: 'Seed Round' }, - short: { de: '1,5 Mio € für 18 Monate Runway.', en: '€1.5M for 18 months runway.' }, + id: 'gmbh', + when: 'Aug. 2026', tick: '08 · 26', + title: { de: 'GmbH-Gründung', en: 'GmbH Incorporation' }, + short: { de: 'Breakpilot COMPLAI GmbH gegründet.', en: 'Breakpilot COMPLAI GmbH incorporated.' }, body: { - de: 'Pre-Seed / Seed-Runde zur Finanzierung des ersten Kundensegments, Ausbau des Teams und Zertifizierung (ISO 27001, BSI C5).', - en: 'Pre-Seed / Seed round to fund first customer segment, team growth and certification (ISO 27001, BSI C5).', + de: 'Gründung der Breakpilot COMPLAI GmbH im August 2026. Notartermin, Handelsregistereintrag, operative Aufnahme.', + en: 'Incorporation of Breakpilot COMPLAI GmbH in August 2026. Notary appointment, commercial register entry, start of operations.', }, bullets: { - de: ['Ziel: 1,5 Mio € Seed', 'Ausbau auf 8 FTE', 'Zertifizierungs-Track startet'], - en: ['Target: €1.5M seed', 'Scale to 8 FTE', 'Certification track starts'], + de: ['GmbH-Gründung August 2026', 'Handelsregistereintrag', 'Operativer Start'], + en: ['GmbH incorporation August 2026', 'Commercial register entry', 'Start of operations'], + }, + tint: '#fbbf24', done: false, + }, + { + id: 'customers', + when: 'Aug. 2026', tick: '08 · 26', + title: { de: '2 zahlende Kunden', en: '2 Paying Customers' }, + short: { de: 'Erste Umsätze ab Gründung.', en: 'First revenue from incorporation.' }, + body: { + de: 'Zwei zahlende Kunden ab August 2026 — Validierung des Produkts im Maschinenbau-Umfeld mit echten Compliance-Anforderungen.', + en: 'Two paying customers from August 2026 — product validation in manufacturing with real compliance requirements.', + }, + bullets: { + de: ['2 zahlende Kunden', 'Maschinenbau-Validierung', 'Erste Umsätze'], + en: ['2 paying customers', 'Manufacturing validation', 'First revenue'], }, tint: '#fbbf24', done: false, }, @@ -262,27 +292,12 @@ const MILESTONES: Milestone[] = [ title: { de: 'Öffentliches Beta', en: 'Public Beta' }, short: { de: 'Beta-Launch mit ersten zahlenden Kunden.', en: 'Beta launch with first paying customers.' }, body: { - de: 'Öffentliches Beta-Release der Plattform. Erste zahlende Kunden aus dem Pilotprogramm gehen live. Integration in Gitlab + GitHub Cloud.', - en: 'Public beta release of the platform. First paying customers from the pilot program go live. GitLab + GitHub Cloud integration.', + de: 'Öffentliches Beta-Release der Plattform. Erste zahlende Kunden aus dem Pilotprogramm gehen live.', + en: 'Public beta release of the platform. First paying customers from the pilot program go live.', }, bullets: { - de: ['3–5 zahlende Pilot-Kunden', 'Public Beta verfügbar', 'Git-Integration live'], - en: ['3–5 paying pilot customers', 'Public beta available', 'Git integration live'], - }, - tint: '#f59e0b', done: false, - }, - { - id: 'v1', - when: 'Q4 2026', tick: 'Q4 · 26', - title: { de: 'EU Trust Stack v1.0', en: 'EU Trust Stack v1.0' }, - short: { de: 'DSGVO · NIS-2 · DORA · EU AI Act.', en: 'GDPR · NIS-2 · DORA · EU AI Act.' }, - body: { - de: 'Alle vier zentralen EU-Frameworks voll abgedeckt. EU-souveränes Hosting, vollständige Audit-Trail-Unterstützung, Zertifizierung ISO 27001 abgeschlossen.', - en: 'All four central EU frameworks fully covered. EU-sovereign hosting, complete audit trail support, ISO 27001 certification completed.', - }, - bullets: { - de: ['4 EU-Frameworks live', 'EU-souveränes Hosting', 'ISO 27001 zertifiziert'], - en: ['4 EU frameworks live', 'EU-sovereign hosting', 'ISO 27001 certified'], + de: ['Public Beta verfügbar', 'Onboarding-Prozess live', 'Feedback-Loop etabliert'], + en: ['Public beta available', 'Onboarding process live', 'Feedback loop established'], }, tint: '#f59e0b', done: false, }, diff --git a/pitch-deck/lib/finanzplan/engine.ts b/pitch-deck/lib/finanzplan/engine.ts index 461d3ea..f2e3d54 100644 --- a/pitch-deck/lib/finanzplan/engine.ts +++ b/pitch-deck/lib/finanzplan/engine.ts @@ -281,18 +281,23 @@ export async function computeFinanzplan(pool: Pool, scenarioId: string): Promise marketingRow.values = computed } - // Serverkosten: Bestandskunden * 100 + 500 Basis - const totalKunden = emptyMonthly() + // Serverkosten: 2.000 EUR Basis (SysEleven) + 250 EUR pro Bestandskunde + const totalBestandskunden = emptyMonthly() for (const row of kundenRows.rows) { - for (let m = 1; m <= MONTHS; m++) { - totalKunden[`m${m}`] += row.values?.[`m${m}`] || 0 + const rl = (row as { row_label?: string }).row_label || '' + if (rl.includes('Bestandskunden') && !rl.includes('gesamt')) { + for (let m = 1; m <= MONTHS; m++) { + totalBestandskunden[`m${m}`] += row.values?.[`m${m}`] || 0 + } } } const serverRow = betrieb.find(r => r.row_label === 'Serverkosten Cloud (F)' || r.row_label === 'Serverkosten (Cloud)') if (serverRow) { const computed = emptyMonthly() for (let m = FOUNDING_MONTH; m <= MONTHS; m++) { - computed[`m${m}`] = Math.round((totalKunden[`m${m}`] || 0) * 50 + 300) + const kunden = totalBestandskunden[`m${m}`] || 0 + const extraKunden = Math.max(0, kunden - 10) // first 10 included in base + computed[`m${m}`] = Math.round(extraKunden * 250 + 2000) } await pool.query('UPDATE fp_betriebliche_aufwendungen SET values = $1 WHERE id = $2', [JSON.stringify(computed), serverRow.id]) serverRow.values = computed 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',