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
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:
@@ -1,17 +1,80 @@
|
||||
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 q = (sql: string, p?: unknown[]) => pool.query(sql, p)
|
||||
|
||||
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. Insurance updates
|
||||
await q(`UPDATE fp_betriebliche_aufwendungen SET values=(SELECT jsonb_object_agg(key,CASE WHEN (value::text)::numeric>0 THEN to_jsonb(125) ELSE value END) FROM jsonb_each(values)) WHERE scenario_id=$1 AND row_label='D&O-Versicherung'`,[WD])
|
||||
await q(`UPDATE fp_betriebliche_aufwendungen SET row_label='IT-Haftpflicht (E&O + Produkt)', values=(SELECT jsonb_object_agg(key,CASE WHEN (value::text)::numeric>0 THEN to_jsonb(375) ELSE value END) FROM jsonb_each(values)) WHERE scenario_id=$1 AND row_label='E&O-Versicherung'`,[WD])
|
||||
await q(`DELETE FROM fp_betriebliche_aufwendungen WHERE scenario_id=$1 AND row_label='Produkthaftpflicht'`,[WD])
|
||||
await q(`UPDATE fp_betriebliche_aufwendungen SET values=(SELECT jsonb_object_agg(key,CASE WHEN (value::text)::numeric>0 THEN to_jsonb(200) ELSE value END) FROM jsonb_each(values)) WHERE scenario_id=$1 AND row_label='Cyber-Versicherung'`,[WD])
|
||||
await q(`UPDATE fp_betriebliche_aufwendungen SET values=(SELECT jsonb_object_agg(key,CASE WHEN (value::text)::numeric>0 THEN to_jsonb(100) ELSE value END) FROM jsonb_each(values)) WHERE scenario_id=$1 AND row_label='Rechtsschutzversicherung'`,[WD])
|
||||
results.push('Insurance updated')
|
||||
|
||||
const result = await computeFinanzplan(pool, scenarioId)
|
||||
return NextResponse.json({ success: true, scenarioId, cash_m60: result.liquiditaet?.endstand?.m60 })
|
||||
// 2. New insurances (if not exist)
|
||||
const newIns: [string,number][] = [['Betriebshaftpflicht',100],['Dienstreise-Krankenversicherung',15],['Gruppenunfallversicherung',40],['Schlüsselperson-Versicherung (Key Man)',150]]
|
||||
for (const [label, amt] of newIns) {
|
||||
const {rows}=await q(`SELECT id FROM fp_betriebliche_aufwendungen WHERE scenario_id=$1 AND row_label=$2`,[WD,label])
|
||||
if (rows.length===0) {
|
||||
const vals: Record<string,number> = {}; for(let m=8;m<=60;m++) vals[`m${m}`]=amt
|
||||
await q(`INSERT INTO fp_betriebliche_aufwendungen (scenario_id,category,row_label,row_index,is_editable,is_sum_row,values,sort_order) VALUES ($1,'versicherungen',$2,$3,true,false,$4,$3)`,[WD,label,17+newIns.indexOf([label,amt] as never),JSON.stringify(vals)])
|
||||
}
|
||||
}
|
||||
// Simpler: just check and insert by label
|
||||
for (const [label, amt, sort] of [['Betriebshaftpflicht',100,17],['Dienstreise-Krankenversicherung',15,18],['Gruppenunfallversicherung',40,19],['Schlüsselperson-Versicherung (Key Man)',150,20]] as [string,number,number][]) {
|
||||
const {rows}=await q(`SELECT id FROM fp_betriebliche_aufwendungen WHERE scenario_id=$1 AND row_label=$2`,[WD,label])
|
||||
if (rows.length===0) {
|
||||
const vals: Record<string,number> = {}; for(let m=8;m<=60;m++) vals[`m${m}`]=amt
|
||||
await q(`INSERT INTO fp_betriebliche_aufwendungen (scenario_id,category,row_label,row_index,is_editable,is_sum_row,values,sort_order) VALUES ($1,'versicherungen',$2,$3,true,false,$4,$3)`,[WD,label,sort,JSON.stringify(vals)])
|
||||
results.push(`ADD ${label}`)
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Rename Telefon → Internet/Mobilfunk
|
||||
await q(`UPDATE fp_betriebliche_aufwendungen SET row_label='Internet/Mobilfunk (F)' WHERE scenario_id=$1 AND row_label='Telefon'`,[WD])
|
||||
|
||||
// 4. New positions: Recruiting, ext. DSB, Zertifizierung
|
||||
for (const [cat, label, vals, sort] of [
|
||||
['sonstige','Recruiting / Stellenanzeigen', Object.fromEntries([...Array.from({length:17},(_,i)=>[`m${i+8}`,300]),...Array.from({length:36},(_,i)=>[`m${i+25}`,500])]), 21],
|
||||
['sonstige','Externer Datenschutzbeauftragter', Object.fromEntries(Array.from({length:53},(_,i)=>[`m${i+8}`,400])), 22],
|
||||
['besondere','Zertifizierung (ISO 27001 / BSI C5)', Object.fromEntries(Array.from({length:36},(_,i)=>[`m${i+25}`,1500])), 23],
|
||||
] as [string,string,Record<string,number>,number][]) {
|
||||
const {rows}=await q(`SELECT id FROM fp_betriebliche_aufwendungen WHERE scenario_id=$1 AND row_label=$2`,[WD,label])
|
||||
if (rows.length===0) {
|
||||
await q(`INSERT INTO fp_betriebliche_aufwendungen (scenario_id,category,row_label,row_index,is_editable,is_sum_row,values,sort_order) VALUES ($1,$2,$3,$4,true,false,$5,$4)`,[WD,cat,label,sort,JSON.stringify(vals)])
|
||||
results.push(`ADD ${label}`)
|
||||
}
|
||||
}
|
||||
|
||||
// 5. Messen: double 2029, triple 2030
|
||||
await q(`UPDATE fp_betriebliche_aufwendungen SET values=(SELECT jsonb_object_agg(key,CASE WHEN key IN ('m37','m40','m43','m46') THEN to_jsonb(10000) WHEN key IN ('m49','m52','m55','m58') THEN to_jsonb(15000) ELSE value END) FROM jsonb_each(values)) WHERE scenario_id=$1 AND row_label ILIKE '%Messe%'`,[WD])
|
||||
results.push('Messen scaled')
|
||||
|
||||
// 6. Fördergelder + Forschungszulage in Liquidität
|
||||
for (const [label, vals] of [
|
||||
['Fördergelder / Grants', Object.fromEntries(Array.from({length:48},(_,i)=>[`m${i+13}`,3000]))],
|
||||
['Forschungszulage (§ 27a EStG)', {...Object.fromEntries(Array.from({length:12},(_,i)=>[`m${i+13}`,2184])),...Object.fromEntries(Array.from({length:12},(_,i)=>[`m${i+25}`,6268])),...Object.fromEntries(Array.from({length:12},(_,i)=>[`m${i+37}`,9580])),...Object.fromEntries(Array.from({length:12},(_,i)=>[`m${i+49}`,12823]))}],
|
||||
] as [string,Record<string,number>][]) {
|
||||
const {rows}=await q(`SELECT id FROM fp_liquiditaet WHERE scenario_id=$1 AND row_label=$2`,[WD,label])
|
||||
if (rows.length===0) {
|
||||
await q(`INSERT INTO fp_liquiditaet (scenario_id,row_label,row_type,is_editable,values,sort_order) VALUES ($1,$2,'einzahlung',true,$3,3)`,[WD,label,JSON.stringify(vals)])
|
||||
results.push(`ADD liq: ${label}`)
|
||||
}
|
||||
}
|
||||
|
||||
// 7. GuV sort order + is_sum_row fixes
|
||||
await q(`UPDATE fp_guv SET is_sum_row=false WHERE scenario_id=$1 AND row_label IN ('Umsatzerlöse','Bestandsveränderungen','Sonst. betriebl. Erträge','Materialaufwand Waren','Materialaufwand Leistungen','Löhne und Gehälter','Soziale Abgaben','Abschreibungen','Sonst. betriebl. Aufwendungen','Zinsertraege','Zinsaufwendungen','Körperschaftssteuer','Gewerbesteuer','Sonstige Steuern')`,[WD])
|
||||
for (const [l,s] of [['Materialaufwand Waren',4],['Materialaufwand Leistungen',5],['Summe Materialaufwand',6],['Rohergebnis',7],['Löhne und Gehälter',8],['Soziale Abgaben',9],['Summe Personalaufwand',10],['Abschreibungen',11],['Sonst. betriebl. Aufwendungen',12],['Sonst. betriebl. Erträge',13],['Summe sonst. Erträge',14],['EBIT',15]] as [string,number][])
|
||||
await q(`UPDATE fp_guv SET sort_order=$1 WHERE scenario_id=$2 AND row_label=$3`,[s,WD,l])
|
||||
await q(`UPDATE fp_guv SET row_label=REPLACE(row_label,'Zinsertraege','Zinserträge') WHERE row_label LIKE '%Zinsertraege%'`)
|
||||
|
||||
// 8. Recompute
|
||||
const r = await computeFinanzplan(pool, WD)
|
||||
results.push(`WD cash_m60=${r.liquiditaet?.endstand?.m60}`)
|
||||
|
||||
return NextResponse.json({ ok: true, results })
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ Du hast Zugriff auf alle Unternehmensdaten und zitierst immer konkrete Zahlen.
|
||||
- **Zweisprachig**: Antworte in der Sprache, in der die Frage gestellt wird
|
||||
|
||||
## Kernbotschaften (IMMER betonen wenn passend)
|
||||
1. Kern-Produkt: "BreakPilot COMPLAI — DSGVO-konforme KI-Plattform mit 12 Modulen. Kontinuierliche Code-Security und Compliance-Automatisierung. 110 Gesetze und Regularien, 25.000+ Prüfaspekte."
|
||||
1. Kern-Produkt: "BreakPilot COMPLAI — DSGVO-konforme KI-Plattform mit 12 Modulen. Kontinuierliche Code-Security und Compliance-Automatisierung. 380+ Gesetze und Regularien, 25.000+ Prüfaspekte."
|
||||
2. Das Problem: "Unternehmen stehen vor einem strategischen Dilemma: Ohne KI verlieren sie Wettbewerbsfähigkeit. Mit US-KI riskieren sie Datenkontrollverlust. Über 30.000 Unternehmen in DE durch EU-Regulierungen belastet."
|
||||
3. 12 Module: "Code Security (SAST/DAST/SBOM/Pentesting), CE-Software-Risikobeurteilung, Compliance-Dokumente (VVT/DSFA/TOMs), Audit Manager, DSR/Betroffenenrechte, Consent Management, Notfallpläne, Cookie-Generator, Compliance LLM, Academy, Integration in Kundenprozesse, Sichere Kommunikation."
|
||||
4. Code & CE: "Kontinuierlich statt einmal im Jahr. CE-Software-Risikobeurteilung auf Code-Basis schon in der Entwicklung. Findings als Tickets mit Implementierungsvorschlägen."
|
||||
|
||||
Reference in New Issue
Block a user