feat(pitch-deck): milestones update, Serverkosten formula, material/liquidität fixes
Some checks failed
Build pitch-deck / build-push-deploy (push) Successful in 1m38s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-consent (push) Successful in 44s
CI / test-bqas (push) Has been cancelled
CI / test-python-voice (push) Has been cancelled

- Milestones: correct dates + events (DPMA, domains, RAG, EUIPO, GmbH)
- Serverkosten: 2000 base + max(0, customers-10)*250 (first 10 included)
- Materialaufwand: cleared, info placeholder
- 2. Finanzierungsrunde: renamed, sort order fixed

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-04-21 21:24:37 +02:00
parent 80376c90b3
commit 15b6e8614c
5 changed files with 123 additions and 95 deletions

View File

@@ -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 })
}

View File

@@ -59,7 +59,7 @@ const FORMULA_TOOLTIPS: Record<string, string> = {
'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)',

View File

@@ -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: ['35 zahlende Pilot-Kunden', 'Public Beta verfügbar', 'Git-Integration live'],
en: ['35 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,
},

View File

@@ -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

View File

@@ -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',