From c49fae87768fc180d1c0f7e1fa44d2be3b37e2aa Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Tue, 21 Apr 2026 18:48:15 +0200 Subject: [PATCH] =?UTF-8?q?chore:=20diagnose=20Umsatzerl=C3=B6se=20on=20pr?= =?UTF-8?q?oduction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pitch-deck/app/api/admin/fp-patch/route.ts | 46 ++++++++++++---------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/pitch-deck/app/api/admin/fp-patch/route.ts b/pitch-deck/app/api/admin/fp-patch/route.ts index 5a531aa..950a9af 100644 --- a/pitch-deck/app/api/admin/fp-patch/route.ts +++ b/pitch-deck/app/api/admin/fp-patch/route.ts @@ -4,28 +4,34 @@ import { computeFinanzplan } from '@/lib/finanzplan/engine' export async function POST() { const WD = 'c0000000-0000-0000-0000-000000000200' - const results: string[] = [] - // Delete duplicate Pos 10 Rechtsanwalt - const { rowCount: d1 } = await pool.query( - `DELETE FROM fp_personalkosten WHERE scenario_id = $1 AND sort_order = 10`, [WD]) - results.push(`DEL pos 10: ${d1}`) + // Diagnose + const { rows: guv } = await pool.query( + `SELECT row_label, values FROM fp_guv WHERE scenario_id = $1 AND row_label ILIKE '%Umsatz%'`, [WD]) + const { rows: liq } = await pool.query( + `SELECT row_label, values FROM fp_liquiditaet WHERE scenario_id = $1 AND row_label ILIKE '%Umsatz%' AND row_label NOT LIKE '%steuer%'`, [WD]) + const { rows: rev } = await pool.query( + `SELECT row_label, section, values FROM fp_umsatzerloese WHERE scenario_id = $1 AND row_label = 'GESAMTUMSATZ'`, [WD]) + const { rows: qty } = await pool.query( + `SELECT row_label, section, (values->>'m12')::numeric as m12, (values->>'m24')::numeric as m24 FROM fp_umsatzerloese WHERE scenario_id = $1 AND section = 'quantity' ORDER BY row_label`, [WD]) - // Fix umlauts in person names + positions across ALL scenarios - const nameFixSql = [ - "UPDATE fp_personalkosten SET person_name = REPLACE(person_name, 'Boenisch', 'Bönisch') WHERE person_name LIKE '%Boenisch%'", - "UPDATE fp_personalkosten SET position = REPLACE(position, 'Geschaeftsfuehrer', 'Geschäftsführer') WHERE position LIKE '%Geschaeftsfuehrer%'", - "UPDATE fp_personalkosten SET position = REPLACE(position, 'Geschaefts', 'Geschäfts') WHERE position LIKE '%Geschaefts%'", - "UPDATE fp_personalkosten SET position = REPLACE(position, 'fuehrer', 'führer') WHERE position LIKE '%fuehrer%'", - ] - for (const sql of nameFixSql) { - const { rowCount } = await pool.query(sql) - if (rowCount && rowCount > 0) results.push(`NAME FIX: ${rowCount}`) - } - - // Recompute WD + // Recompute const r = await computeFinanzplan(pool, WD) - results.push(`WD cash_m60=${r.liquiditaet?.endstand?.m60}`) - return NextResponse.json({ ok: true, results }) + // Re-check after compute + const { rows: guvAfter } = await pool.query( + `SELECT row_label, (values->>'y2026')::numeric as y2026, (values->>'y2027')::numeric as y2027 FROM fp_guv WHERE scenario_id = $1 AND row_label ILIKE '%Umsatz%'`, [WD]) + const { rows: liqAfter } = await pool.query( + `SELECT row_label, (values->>'m12')::numeric as m12, (values->>'m24')::numeric as m24 FROM fp_liquiditaet WHERE scenario_id = $1 AND row_label = 'Umsatzerlöse'`, [WD]) + + return NextResponse.json({ + before: { + guv: guv.map(r => ({ label: r.row_label, y2026: r.values?.y2026, y2027: r.values?.y2027 })), + liq: liq.map(r => ({ label: r.row_label, m12: r.values?.m12, m24: r.values?.m24 })), + gesamtumsatz: rev.map(r => ({ m12: r.values?.m12, m24: r.values?.m24 })), + quantities: qty, + }, + after: { guv: guvAfter, liq: liqAfter }, + cash_m60: r.liquiditaet?.endstand?.m60, + }) }