feat: Phase 5+6 — Finanzplan Bridge + Financials-Slide Sync

- Adapter: fp_* Tabellen → FMResult Interface (60 Monate)
- Compute-Endpoint: source=finanzplan delegiert an Finanzplan-Engine
- useFinancialModel Hook: computeFromFinanzplan() + finanzplanResults
- FinancialsSlide: Toggle "Szenario-Modell" vs "Finanzplan (Excel)"
- Gruendungsdatum fix: EK+FK auf Aug (m8), Raumkosten ab Aug
- Startup-Preisstaffel: <10 MA ab 3.600 EUR/Jahr, 14-Tage-Test

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-26 20:15:30 +01:00
parent a58cd16f01
commit a01e6cb88e
4 changed files with 178 additions and 5 deletions

View File

@@ -41,17 +41,17 @@ export function useFinancialModel() {
}
}, [activeScenarioId]) // eslint-disable-line react-hooks/exhaustive-deps
const compute = useCallback(async (scenarioId: string) => {
const compute = useCallback(async (scenarioId: string, source?: string) => {
setComputing(true)
try {
const res = await fetch('/api/financial-model/compute', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ scenarioId }),
body: JSON.stringify({ scenarioId, source }),
})
if (res.ok) {
const data: FMComputeResponse = await res.json()
setResults(prev => new Map(prev).set(scenarioId, data))
setResults(prev => new Map(prev).set(source === 'finanzplan' ? 'finanzplan' : scenarioId, data))
}
} catch (err) {
console.error('Compute failed:', err)
@@ -60,6 +60,10 @@ export function useFinancialModel() {
}
}, [])
const computeFromFinanzplan = useCallback(async () => {
await compute('', 'finanzplan')
}, [compute])
const updateAssumption = useCallback(async (scenarioId: string, key: string, value: number | number[]) => {
// Optimistic update in local state
setScenarios(prev => prev.map(s => {
@@ -90,6 +94,7 @@ export function useFinancialModel() {
const activeScenario = scenarios.find(s => s.id === activeScenarioId) || null
const activeResults = activeScenarioId ? results.get(activeScenarioId) || null : null
const finanzplanResults = results.get('finanzplan') || null
return {
scenarios,
@@ -97,6 +102,7 @@ export function useFinancialModel() {
activeScenarioId,
setActiveScenarioId,
activeResults,
finanzplanResults,
results,
loading,
computing,
@@ -104,6 +110,7 @@ export function useFinancialModel() {
setCompareMode,
compute,
computeAll,
computeFromFinanzplan,
updateAssumption,
}
}