feat(pitch-deck): insurance optimization, new positions, funding, slide reorder
All checks were successful
Build pitch-deck / build-push-deploy (push) Successful in 1m11s
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 34s
CI / test-python-voice (push) Successful in 34s
CI / test-bqas (push) Successful in 34s

- Insurance: combined E&O+Produkt, realistic costs (~800 vs 1708 EUR/Mon)
- New: Betriebshaftpflicht, Dienstreise-KV, Gruppenunfall, Key Man
- New: Recruiting, ext. DSB, Zertifizierung (ISO 27001)
- BG: 0.5% instead of 2.77% (VBG IT/Büro)
- Marketing: 8% (2026-28), 10% (2029+)
- Bewirtungskosten: all customers x 50 EUR (not just Enterprise)
- Messen: 2x in 2029, 3x in 2030
- Liquidität: Fördergelder/Grants + Forschungszulage (§27a EStG)
- Serverkosten tooltip updated
- Slide reorder: Strategy+Finanzplan after 18, Risks before Glossary
- 110→380+ everywhere, Compliance Optimizer on exec summary

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-04-21 23:07:30 +02:00
parent 798c2c4373
commit 2dfc47d67e
9 changed files with 111 additions and 45 deletions

View File

@@ -219,9 +219,10 @@ export async function computeFinanzplan(pool: Pool, scenarioId: string): Promise
hcWithoutFounders[`m${m}`] = Math.max(0, headcount[`m${m}`] - NUM_FOUNDERS)
}
// 5c. Enterprise customers (for Bewirtungskosten)
// 5c. Total Bestandskunden (for Bewirtungskosten — uses totalBestandskunden from Serverkosten above)
// Also load enterprise customers separately for legacy compatibility
const kundenRows = await pool.query(
"SELECT segment_name, row_label, values FROM fp_kunden WHERE scenario_id = $1 AND row_label = 'Bestandskunden' ORDER BY sort_order",
"SELECT segment_name, row_label, values FROM fp_kunden WHERE scenario_id = $1 AND row_label LIKE 'Bestandskunden%' ORDER BY sort_order",
[scenarioId]
)
const enterpriseKunden = emptyMonthly()
@@ -243,7 +244,7 @@ export async function computeFinanzplan(pool: Pool, scenarioId: string): Promise
{ label: 'KFZ-Steuern (F)', perUnit: 25, source: hcWithoutFounders },
{ label: 'KFZ-Versicherung (F)', perUnit: 150, source: hcWithoutFounders },
{ label: 'Reisekosten (F)', perUnit: 75, source: headcount },
{ label: 'Bewirtungskosten (F)', perUnit: 100, source: enterpriseKunden },
{ label: 'Bewirtungskosten (F)', perUnit: 50, source: totalBestandskunden },
{ label: 'Internet/Mobilfunk (F)', perUnit: 50, source: headcount },
]
@@ -259,23 +260,24 @@ export async function computeFinanzplan(pool: Pool, scenarioId: string): Promise
}
}
// Berufsgenossenschaft: 2.77% of total brutto payroll
// Berufsgenossenschaft (VBG IT/Büro): ~0.5% of total brutto payroll
const bgRow = betrieb.find(r => r.row_label.includes('Berufsgenossenschaft'))
if (bgRow) {
const computed = emptyMonthly()
for (let m = FOUNDING_MONTH; m <= MONTHS; m++) {
computed[`m${m}`] = Math.round((totalBrutto[`m${m}`] || 0) * 0.0277)
computed[`m${m}`] = Math.round((totalBrutto[`m${m}`] || 0) * 0.005)
}
await pool.query('UPDATE fp_betriebliche_aufwendungen SET values = $1 WHERE id = $2', [JSON.stringify(computed), bgRow.id])
bgRow.values = computed
}
// Allgemeine Marketingkosten: 10% of revenue
// Allgemeine Marketingkosten: 8% of revenue (2026-2028), 10% from 2029
const marketingRow = betrieb.find(r => r.row_label.includes('Allgemeine Marketingkosten'))
if (marketingRow) {
const computed = emptyMonthly()
for (let m = FOUNDING_MONTH; m <= MONTHS; m++) {
computed[`m${m}`] = Math.round((totalRevenue[`m${m}`] || 0) * 0.10)
const rate = m <= 36 ? 0.08 : 0.10 // m36 = Dec 2028
computed[`m${m}`] = Math.round((totalRevenue[`m${m}`] || 0) * rate)
}
await pool.query('UPDATE fp_betriebliche_aufwendungen SET values = $1 WHERE id = $2', [JSON.stringify(computed), marketingRow.id])
marketingRow.values = computed