fix(pitch-deck): all financial slides now read from fp_* tables via useFpKPIs
All checks were successful
Build pitch-deck / build-push-deploy (push) Successful in 1m18s
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 32s
CI / test-bqas (push) Successful in 32s

New shared hook: useFpKPIs — loads annual KPIs from fp_guv/liquiditaet/personal/kunden.
Replaces useFinancialModel (simplified model) for KPI display on all slides.

Slides updated:
- CompetitionSlide: "110 Gesetze" → "380+ Regularien & Normen"
- BusinessModelSlide: ACV + Gross Margin from fp_* (was useFinancialModel)
- ExecutiveSummarySlide: Unternehmensentwicklung from fp_* (was useFinancialModel)
- FinancialsSlide: KPI cards from fp_* (ARR, Customers, Break-Even, EBIT 2030)

All slides now show consistent numbers from the same source of truth (fp_* tables).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-04-19 17:00:27 +02:00
parent de308b7397
commit f66f32ee9d
6 changed files with 141 additions and 40 deletions

View File

@@ -2,7 +2,7 @@
import { Language } from '@/lib/types'
import { t } from '@/lib/i18n'
import { useFinancialModel } from '@/lib/hooks/useFinancialModel'
import { useFpKPIs } from '@/lib/hooks/useFpKPIs'
import GradientText from '../ui/GradientText'
import FadeInView from '../ui/FadeInView'
import GlassCard from '../ui/GlassCard'
@@ -13,18 +13,17 @@ interface BusinessModelSlideProps {
products?: unknown[]
investorId?: string | null
preferredScenarioId?: string | null
isWandeldarlehen?: boolean
}
export default function BusinessModelSlide({ lang, investorId, preferredScenarioId }: BusinessModelSlideProps) {
export default function BusinessModelSlide({ lang, isWandeldarlehen }: BusinessModelSlideProps) {
const i = t(lang)
const de = lang === 'de'
const fm = useFinancialModel(investorId || null, preferredScenarioId)
const summary = fm.activeResults?.summary
const results = fm.activeResults?.results || []
const lastResult = results[results.length - 1]
const finalCustomers = summary?.final_customers || 0
const finalArr = summary?.final_arr || 0
const { last } = useFpKPIs(isWandeldarlehen)
const finalCustomers = last?.customers || 0
const finalArr = last?.arr || 0
const acv = finalCustomers > 0 ? Math.round(finalArr / finalCustomers) : 0
const grossMargin = last?.grossMargin ?? 0
const tiers = [
{
@@ -62,7 +61,7 @@ export default function BusinessModelSlide({ lang, investorId, preferredScenario
},
]
const grossMargin = lastResult?.gross_margin_pct ?? 0
// grossMargin already defined above from useFpKPIs
const acvLabel = acv > 0
? (de ? `${(acv / 1000).toFixed(1).replace('.', ',')}k EUR` : `EUR ${(acv / 1000).toFixed(1)}k`)
: '—'