fix: IDC in glossary, remove ARR from strategy phases, KFZ 2026/27 cleanup
Some checks failed
Build pitch-deck / build-push-deploy (push) Successful in 1m8s
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 33s
CI / test-bqas (push) Has been cancelled
Some checks failed
Build pitch-deck / build-push-deploy (push) Successful in 1m8s
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 33s
CI / test-bqas (push) Has been cancelled
This commit is contained in:
@@ -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 })
|
||||
|
||||
const result = await computeFinanzplan(pool, scenarioId)
|
||||
return NextResponse.json({ success: true, scenarioId, cash_m60: result.liquiditaet?.endstand?.m60 })
|
||||
// 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 r = await computeFinanzplan(pool, WD)
|
||||
return NextResponse.json({ ok: true, cash_m60: r.liquiditaet?.endstand?.m60 })
|
||||
}
|
||||
|
||||
@@ -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' },
|
||||
],
|
||||
},
|
||||
]
|
||||
|
||||
@@ -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'],
|
||||
|
||||
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user