fix: make last license date input only applicable to one-time purchases and ensure multiplier only affects one_time products
All checks were successful
Staging Build / build (push) Successful in 2m22s

This commit is contained in:
DanielS
2026-06-25 23:07:14 +02:00
parent 1a2ace937c
commit 71c6ad3721
2 changed files with 29 additions and 23 deletions

View File

@@ -274,6 +274,9 @@ export function OrderWizard({
const handleBillingIntervalChange = (val: 'one_time' | 'monthly') => {
setSelectedBillingInterval(val)
setModuleQuantities({})
if (val === 'monthly') {
setLastLicenseDate("")
}
const newSelections: Record<string, CategorySelection> = {}
categories.forEach(cat => {
const matchingProd = products.find(p =>
@@ -437,24 +440,6 @@ export function OrderWizard({
))}
</div>
)}
{selectedEndCustomerId && (
<div className="p-4 rounded-xl bg-white/5 border border-white/10 space-y-3 mt-4 max-w-md">
<Label htmlFor="last-license-date" className="text-white font-medium flex items-center gap-2">
<Calendar className="w-4 h-4 text-primary" />
Datum der letzten CAS-Lizenz (falls vorhanden)
</Label>
<Input
id="last-license-date"
type="date"
value={lastLicenseDate}
onChange={e => setLastLicenseDate(e.target.value)}
className="bg-[#0b1329] border-white/10 text-white focus:border-primary"
/>
<p className="text-xs text-slate-400">
Falls dieser Kunde bereits Lizenzen besitzt, tragen Sie das Datum der letzten Lizenzierung ein. Damit werden die korrekten Update-Gebühren ermittelt.
</p>
</div>
)}
</div>
)}
@@ -583,6 +568,24 @@ export function OrderWizard({
)}
</div>
</div>
{selectedBillingInterval === 'one_time' && customerMode === 'select' && selectedEndCustomerId && (
<div className="p-4 rounded-xl bg-white/5 border border-white/10 space-y-3 mt-6 max-w-md animate-in fade-in slide-in-from-top-2 duration-300">
<Label htmlFor="last-license-date" className="text-white font-medium flex items-center gap-2">
<Calendar className="w-4 h-4 text-primary" />
Datum der letzten CAS-Lizenz (falls vorhanden)
</Label>
<Input
id="last-license-date"
type="date"
value={lastLicenseDate}
onChange={e => setLastLicenseDate(e.target.value)}
className="bg-[#0b1329] border-white/10 text-white focus:border-primary"
/>
<p className="text-xs text-slate-400">
Falls dieser Kunde bereits Lizenzen besitzt, tragen Sie das Datum der letzten Lizenzierung ein. Damit werden die korrekten Update-Gebühren ermittelt.
</p>
</div>
)}
</CardContent>
<CardFooter className="flex justify-between border-t border-white/10 pt-6">
<Button variant="ghost" className="text-white" onClick={prevStep}>

View File

@@ -138,7 +138,8 @@ export function buildOrderSnapshot(
: 'monthly')
let multiplier = 1
if (lastLicenseDate && billingCycle === 'one_time') {
const hasOneTime = items.some(item => item.billing_interval === 'one_time')
if (lastLicenseDate && hasOneTime) {
const lastDate = new Date(lastLicenseDate)
const today = new Date()
const yearsDiff = today.getFullYear() - lastDate.getFullYear()
@@ -159,11 +160,13 @@ export function buildOrderSnapshot(
multiplier = 0.90
}
// Multiply item_total in items by multiplier
// Multiply only one_time item totals by multiplier
items.forEach(item => {
item.item_total = item.item_total * multiplier
if (item.billing_interval === 'one_time') {
item.item_total = item.item_total * multiplier
}
})
subtotal = subtotal * multiplier
subtotal = items.reduce((acc, item) => acc + item.item_total, 0)
}
const taxAmount = Math.round(subtotal * (dominantTaxRate / 100) * 100) / 100
@@ -178,7 +181,7 @@ export function buildOrderSnapshot(
tax_amount: taxAmount,
total,
last_license_date: lastLicenseDate || null,
price_multiplier: lastLicenseDate && billingCycle === 'one_time' ? multiplier : null,
price_multiplier: lastLicenseDate && hasOneTime ? multiplier : null,
}
}