128 lines
5.7 KiB
TypeScript
128 lines
5.7 KiB
TypeScript
'use client'
|
|
|
|
import React from 'react'
|
|
import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '@/components/ui/card'
|
|
import { Label } from '@/components/ui/label'
|
|
import { Button } from '@/components/ui/button'
|
|
import { Input } from '@/components/ui/input'
|
|
import { CreditCard, Calendar, Check, ChevronLeft, ChevronRight } from 'lucide-react'
|
|
|
|
interface StepBillingProps {
|
|
selectedBillingInterval: 'one_time' | 'monthly'
|
|
handleBillingIntervalChange: (val: 'one_time' | 'monthly') => void
|
|
customerMode: 'select' | 'create'
|
|
selectedEndCustomerId: string | null
|
|
lastLicenseDate: string
|
|
setLastLicenseDate: (date: string) => void
|
|
prevStep: () => void
|
|
nextStep: () => void
|
|
}
|
|
|
|
export function StepBilling({
|
|
selectedBillingInterval,
|
|
handleBillingIntervalChange,
|
|
customerMode,
|
|
selectedEndCustomerId,
|
|
lastLicenseDate,
|
|
setLastLicenseDate,
|
|
prevStep,
|
|
nextStep,
|
|
}: StepBillingProps) {
|
|
return (
|
|
<Card className="glass-dark border-white/10">
|
|
<CardHeader>
|
|
<CardTitle className="text-2xl flex items-center gap-2 text-white">
|
|
<CreditCard className="w-6 h-6 text-primary" />
|
|
Abrechnungsmodell wählen
|
|
</CardTitle>
|
|
<CardDescription className="text-slate-300">
|
|
Möchten Sie Lizenzen dauerhaft kaufen oder monatlich mieten?
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<div className="grid md:grid-cols-2 gap-6 py-4">
|
|
{/* Option 1: Kauf */}
|
|
<div
|
|
onClick={() => handleBillingIntervalChange('one_time')}
|
|
className={`relative p-6 rounded-2xl border-2 cursor-pointer transition-all duration-300 flex flex-col justify-between h-48 hover:shadow-[0_0_20px_rgba(255,255,255,0.05)] ${
|
|
selectedBillingInterval === 'one_time'
|
|
? 'border-primary bg-primary/10 shadow-[0_0_25px_rgba(59,130,246,0.2)]'
|
|
: 'border-white/5 bg-white/5 hover:border-white/20'
|
|
}`}
|
|
>
|
|
<div>
|
|
<div className="flex items-center gap-3 mb-3">
|
|
<div className={`p-3 rounded-xl ${selectedBillingInterval === 'one_time' ? 'bg-primary/20 text-primary' : 'bg-white/5 text-slate-400'}`}>
|
|
<CreditCard className="w-6 h-6" />
|
|
</div>
|
|
<h3 className="text-lg font-bold text-white">Einmaliger Kauf</h3>
|
|
</div>
|
|
<p className="text-slate-400 text-sm">
|
|
Einmalige Anschaffungskosten für die Softwarelizenz. Keine monatlichen Mietgebühren.
|
|
</p>
|
|
</div>
|
|
{selectedBillingInterval === 'one_time' && (
|
|
<div className="absolute top-4 right-4 w-6 h-6 rounded-full bg-primary flex items-center justify-center text-white">
|
|
<Check className="w-4 h-4" />
|
|
</div>
|
|
)}
|
|
</div>
|
|
|
|
{/* Option 2: Abo */}
|
|
<div
|
|
onClick={() => handleBillingIntervalChange('monthly')}
|
|
className={`relative p-6 rounded-2xl border-2 cursor-pointer transition-all duration-300 flex flex-col justify-between h-48 hover:shadow-[0_0_20px_rgba(255,255,255,0.05)] ${
|
|
selectedBillingInterval === 'monthly'
|
|
? 'border-primary bg-primary/10 shadow-[0_0_25px_rgba(59,130,246,0.2)]'
|
|
: 'border-white/5 bg-white/5 hover:border-white/20'
|
|
}`}
|
|
>
|
|
<div>
|
|
<div className="flex items-center gap-3 mb-3">
|
|
<div className={`p-3 rounded-xl ${selectedBillingInterval === 'monthly' ? 'bg-primary/20 text-primary' : 'bg-white/5 text-slate-400'}`}>
|
|
<Calendar className="w-6 h-6" />
|
|
</div>
|
|
<h3 className="text-lg font-bold text-white">Monatliches Abo (Miete)</h3>
|
|
</div>
|
|
<p className="text-slate-400 text-sm">
|
|
Laufende monatliche Gebühren. Inklusive aller Updates und flexibler Laufzeit.
|
|
</p>
|
|
</div>
|
|
{selectedBillingInterval === 'monthly' && (
|
|
<div className="absolute top-4 right-4 w-6 h-6 rounded-full bg-primary flex items-center justify-center text-white">
|
|
<Check className="w-4 h-4" />
|
|
</div>
|
|
)}
|
|
</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}>
|
|
<ChevronLeft className="mr-2 w-4 h-4" /> Zurück
|
|
</Button>
|
|
<Button onClick={nextStep}>
|
|
Weiter zur Software <ChevronRight className="ml-2 w-4 h-4" />
|
|
</Button>
|
|
</CardFooter>
|
|
</Card>
|
|
)
|
|
}
|