Energie-Bonus aufgeteilt in Sofort + Neukunden

EnergyContractDetails.bonus war ein einzelnes Feld. Strom-/Gas-
Verträge haben aber typischerweise zwei Boni (Sofort beim Wechsel
+ Neukunden-Bonus nach 12 Monaten), die getrennt verbucht werden
müssen.

Migration 20260524100000_split_energy_bonus:
- ADD COLUMN IF NOT EXISTS instantBonus, newCustomerBonus
- bestehende `bonus`-Werte → instantBonus (Annahme: Sofort)
- DROP COLUMN IF EXISTS bonus

UI:
- ContractForm zeigt zwei Input-Felder
- Detail-Ansicht zeigt beide einzeln + Gesamtbonus
- Kostenvorschau listet beide einzeln, dann Gesamt, dann effektive
  Jahreskosten

Cost-Calc: calculateCosts() bekommt beide Boni; CostCalculation
liefert instantBonus, newCustomerBonus, totalBonus.

PDF-Template: drei neue Variablen energyDetails.instantBonus,
.newCustomerBonus, .totalBonus.

Live-verifiziert auf dev: PUT mit beiden Werten → DB persistiert,
GET liefert zurueck.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-24 14:27:54 +02:00
parent 92c3b0dc95
commit 20d42c5270
10 changed files with 143 additions and 29 deletions
+12 -6
View File
@@ -23,8 +23,10 @@ export interface CostCalculation {
annualConsumptionCostNt?: number; // NT-Verbrauch × unitPriceNt
annualTotalCost: number; // Summe
monthlyPayment: number; // annualTotalCost / 12
bonus?: number;
effectiveAnnualCost: number; // annualTotalCost - bonus
instantBonus?: number; // Sofort-Bonus
newCustomerBonus?: number; // Neukunden-Bonus
totalBonus?: number; // Summe = instantBonus + newCustomerBonus
effectiveAnnualCost: number; // annualTotalCost - totalBonus
}
/**
@@ -207,9 +209,10 @@ export function calculateCosts(
consumptionKwh: number,
basePrice?: number,
unitPrice?: number,
bonus?: number,
instantBonus?: number,
consumptionNtKwh?: number,
unitPriceNt?: number
unitPriceNt?: number,
newCustomerBonus?: number,
): CostCalculation | null {
// Mindestens ein Preis muss vorhanden sein
if (basePrice == null && unitPrice == null) {
@@ -221,7 +224,8 @@ export function calculateCosts(
const annualConsumptionCost = consumptionKwh * (unitPrice ?? 0);
const annualConsumptionCostNt = (consumptionNtKwh ?? 0) * (unitPriceNt ?? 0);
const annualTotalCost = annualBaseCost + annualConsumptionCost + annualConsumptionCostNt;
const effectiveAnnualCost = annualTotalCost - (bonus ?? 0);
const totalBonus = (instantBonus ?? 0) + (newCustomerBonus ?? 0);
const effectiveAnnualCost = annualTotalCost - totalBonus;
const monthlyPayment = effectiveAnnualCost / 12;
return {
@@ -230,7 +234,9 @@ export function calculateCosts(
annualConsumptionCostNt: annualConsumptionCostNt > 0 ? annualConsumptionCostNt : undefined,
annualTotalCost,
monthlyPayment,
bonus: bonus ?? undefined,
instantBonus: instantBonus && instantBonus > 0 ? instantBonus : undefined,
newCustomerBonus: newCustomerBonus && newCustomerBonus > 0 ? newCustomerBonus : undefined,
totalBonus: totalBonus > 0 ? totalBonus : undefined,
effectiveAnnualCost,
};
}