fix(pitch-deck): replace all hardcoded financial numbers with computed values
Some checks failed
Build pitch-deck / build-push-deploy (push) Failing after 40s
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 37s
CI / test-python-voice (push) Successful in 36s
CI / test-bqas (push) Successful in 33s
Some checks failed
Build pitch-deck / build-push-deploy (push) Failing after 40s
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 37s
CI / test-python-voice (push) Successful in 36s
CI / test-bqas (push) Successful in 33s
All financial data now flows from the same compute engine (useFinancialModel). No more hardcoded numbers in any slide — all values are derived from the finanzplan database, ensuring consistency across all pitch deck versions. - FinanzplanSlide: KPI table + charts now use computeAnnualKPIs() from FMResult[] - BusinessModelSlide: bottom-up calc (customers × ACV = ARR) from compute engine - AssumptionsSlide: Base case from compute, Bear/Bull scaled from Base - New helper: lib/finanzplan/annual-kpis.ts for 60-month → 5-year aggregation - PitchDeck: passes investorId to all financial slides for version-aware data Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
import { Language } from '@/lib/types'
|
||||
import { t } from '@/lib/i18n'
|
||||
import { useFinancialModel } from '@/lib/hooks/useFinancialModel'
|
||||
import GradientText from '../ui/GradientText'
|
||||
import FadeInView from '../ui/FadeInView'
|
||||
import GlassCard from '../ui/GlassCard'
|
||||
@@ -10,11 +11,19 @@ import { ArrowRight, TrendingUp, Target, Repeat, DollarSign, Users, BarChart3 }
|
||||
interface BusinessModelSlideProps {
|
||||
lang: Language
|
||||
products?: unknown[]
|
||||
investorId?: string | null
|
||||
}
|
||||
|
||||
export default function BusinessModelSlide({ lang }: BusinessModelSlideProps) {
|
||||
export default function BusinessModelSlide({ lang, investorId }: BusinessModelSlideProps) {
|
||||
const i = t(lang)
|
||||
const de = lang === 'de'
|
||||
const fm = useFinancialModel(investorId || null)
|
||||
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 acv = finalCustomers > 0 ? Math.round(finalArr / finalCustomers) : 0
|
||||
|
||||
const tiers = [
|
||||
{
|
||||
@@ -145,8 +154,8 @@ export default function BusinessModelSlide({ lang }: BusinessModelSlideProps) {
|
||||
</div>
|
||||
<p className="text-xs text-white/50">
|
||||
{de
|
||||
? '1.200 Kunden × 8.400 EUR ACV = ~10 Mio. EUR ARR (2030)'
|
||||
: '1,200 customers × EUR 8,400 ACV = ~EUR 10M ARR (2030)'}
|
||||
? `${finalCustomers.toLocaleString('de-DE')} Kunden × ${acv.toLocaleString('de-DE')} EUR ACV = ~${(finalArr / 1_000_000).toFixed(1).replace('.', ',')} Mio. EUR ARR (2030)`
|
||||
: `${finalCustomers.toLocaleString('en-US')} customers × EUR ${acv.toLocaleString('en-US')} ACV = ~EUR ${(finalArr / 1_000_000).toFixed(1)}M ARR (2030)`}
|
||||
</p>
|
||||
</div>
|
||||
</GlassCard>
|
||||
|
||||
Reference in New Issue
Block a user