From f2184be02fd2da9dcafd8cb0e1ce883d0035f581 Mon Sep 17 00:00:00 2001 From: Sharang Parnerkar <30073382+mighty840@users.noreply.github.com> Date: Mon, 4 May 2026 15:21:40 +0200 Subject: [PATCH] fix: tab row counts use investor's scenario, not always Base Case /api/finanzplan now accepts ?scenarioId and uses it for the per-sheet row counts (the numbers in brackets on the tab bar). FinanzplanSlide passes fpBaseScenarioId when fetching the sheet list, so Wandeldarlehen investors see e.g. Personalkosten (9) instead of (35). Co-Authored-By: Claude Sonnet 4.6 --- pitch-deck/app/api/finanzplan/route.ts | 18 +++++++++++++----- .../components/slides/FinanzplanSlide.tsx | 3 ++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/pitch-deck/app/api/finanzplan/route.ts b/pitch-deck/app/api/finanzplan/route.ts index f975aae..49ba781 100644 --- a/pitch-deck/app/api/finanzplan/route.ts +++ b/pitch-deck/app/api/finanzplan/route.ts @@ -3,25 +3,33 @@ import pool from '@/lib/db' import { SHEET_LIST } from '@/lib/finanzplan/types' export async function GET(request: NextRequest) { - // Only expose scenario list to admin callers (bearer token) + // Only expose full scenario list to admin callers (bearer token) const secret = process.env.PITCH_ADMIN_SECRET const auth = request.headers.get('authorization') ?? '' const isAdmin = secret && auth === `Bearer ${secret}` + // Allow callers to pass a scenarioId for row counts (e.g. investor's assigned scenario) + const scenarioId = request.nextUrl.searchParams.get('scenarioId') + try { // Investors see only the default scenario — no names of other scenarios leaked const scenarios = isAdmin ? await pool.query('SELECT * FROM fp_scenarios ORDER BY is_default DESC, name') : await pool.query('SELECT id FROM fp_scenarios WHERE is_default = true LIMIT 1') - // Get row counts per sheet + // Get row counts per sheet using the caller's scenario const sheets = await Promise.all( SHEET_LIST.map(async (s) => { const tableName = `fp_${s.name}` try { - const { rows } = await pool.query( - `SELECT COUNT(*) as total, COUNT(*) FILTER (WHERE is_editable = true) as editable FROM ${tableName} WHERE scenario_id = (SELECT id FROM fp_scenarios WHERE is_default = true LIMIT 1)` - ) + const { rows } = scenarioId + ? await pool.query( + `SELECT COUNT(*) as total, COUNT(*) FILTER (WHERE is_editable = true) as editable FROM ${tableName} WHERE scenario_id = $1`, + [scenarioId] + ) + : await pool.query( + `SELECT COUNT(*) as total, COUNT(*) FILTER (WHERE is_editable = true) as editable FROM ${tableName} WHERE scenario_id = (SELECT id FROM fp_scenarios WHERE is_default = true LIMIT 1)` + ) return { ...s, rows: parseInt(rows[0]?.total || '0'), editable_rows: parseInt(rows[0]?.editable || '0') } } catch { return s diff --git a/pitch-deck/components/slides/FinanzplanSlide.tsx b/pitch-deck/components/slides/FinanzplanSlide.tsx index af98b00..f9914f8 100644 --- a/pitch-deck/components/slides/FinanzplanSlide.tsx +++ b/pitch-deck/components/slides/FinanzplanSlide.tsx @@ -100,7 +100,8 @@ export default function FinanzplanSlide({ lang, investorId, preferredScenarioId, // Load sheet list; populate scenario selector from version data or API fallback useEffect(() => { - fetch('/api/finanzplan', { cache: 'no-store' }) + const listParam = fpBaseScenarioId ? `?scenarioId=${fpBaseScenarioId}` : '' + fetch(`/api/finanzplan${listParam}`, { cache: 'no-store' }) .then(r => r.json()) .then(data => { setSheets(data.sheets || [])