diff --git a/shop/components/order-wizard.tsx b/shop/components/order-wizard.tsx
index 2af1043..807f812 100644
--- a/shop/components/order-wizard.tsx
+++ b/shop/components/order-wizard.tsx
@@ -98,6 +98,8 @@ export function OrderWizard({
const [selectedCompanyId, setSelectedCompanyId] = useState(
initialOrder?.company_id ?? null
)
+ const [basketItems, setBasketItems] = useState([])
+ const [deviceName, setDeviceName] = useState('')
// Partner-Profil (Fallback)
const [customerData] = useState>(initialProfile || {})
@@ -549,40 +551,73 @@ export function OrderWizard({
}
}
+ const addToBasket = () => {
+ const currentItem = {
+ deviceName: deviceName || `Kasse ${basketItems.length + 1}`,
+ selections: JSON.parse(JSON.stringify(selections)),
+ moduleQuantities: { ...moduleQuantities },
+ billingInterval: selectedBillingInterval,
+ }
+ setBasketItems(prev => [...prev, currentItem])
+ setModuleQuantities({})
+ setDeviceName('')
+
+ // Reset selections
+ const resetSels: Record = {}
+ categories.forEach(cat => {
+ const isVisible = selectedBillingInterval === 'one_time' ? cat.show_in_kauf !== false : cat.show_in_abo !== false
+ if (!isVisible || cat.allow_multiselect || cat.preselect === false) {
+ resetSels[cat.id] = { productId: null, productIds: [], moduleIds: [] }
+ } else {
+ const first = products.find(p => p.category_id === cat.id && (selectedBillingInterval === 'one_time' ? p.show_in_kauf !== false : p.show_in_abo !== false))
+ resetSels[cat.id] = { productId: first?.id ?? null, productIds: first ? [first.id] : [], moduleIds: [] }
+ }
+ })
+ setSelections(resetSels)
+ }
+
const handleSubmit = async () => {
- if (isSubmitting) return // Doppelklick-Guard
+ if (isSubmitting) return
setIsSubmitting(true)
try {
- let order
- if (initialOrder) {
- order = await updateOrder(initialOrder.id, {
+ let finalItems = [...basketItems]
+ if (finalItems.length === 0 && allCategoriesFilled && productValidationErrors.length === 0) {
+ finalItems.push({
+ deviceName: deviceName || 'Kasse 1',
selections,
moduleQuantities,
- customerProfile: customerData,
- endCustomerId: selectedEndCustomerId,
- endCustomer: selectedEndCustomer,
- billingInterval: selectedBillingInterval,
- lastLicenseDate: lastLicenseDate || null,
- companyId: selectedCompanyId,
- })
- } else {
- order = await submitOrder({
- selections,
- moduleQuantities,
- products,
- categories,
- customerProfile: customerData,
- endCustomerId: selectedEndCustomerId,
- endCustomer: selectedEndCustomer,
- billingInterval: selectedBillingInterval,
- lastLicenseDate: lastLicenseDate || null,
+ billingInterval: selectedBillingInterval
})
}
- router.push(`/order/success?id=${order.id}`)
+
+ if (finalItems.length === 0) {
+ throw new Error('Bitte konfigurieren Sie mindestens eine Kasse.')
+ }
+
+ const res = await fetch('/api/orders/checkout', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ items: finalItems,
+ customerProfile: customerData,
+ endCustomerId: selectedEndCustomerId,
+ endCustomer: selectedEndCustomer,
+ })
+ })
+
+ const result = await res.json()
+ if (result.error) throw new Error(result.error)
+
+ const firstOrderId = result.orders?.[0]?.id
+ if (firstOrderId) {
+ router.push(`/order/success?id=${firstOrderId}`)
+ } else {
+ router.push('/my-orders')
+ }
} catch (error: any) {
console.error(error)
- alert(error?.message || (initialOrder ? 'Fehler beim Aktualisieren der Anfrage.' : 'Fehler bei der Bestellung. Bitte versuchen Sie es erneut.'))
- setIsSubmitting(false) // Nur bei Fehler wieder entsperren
+ alert(error?.message || 'Fehler bei der Bestellung. Bitte versuchen Sie es erneut.')
+ setIsSubmitting(false)
}
}
@@ -1323,12 +1358,43 @@ export function OrderWizard({
{err}
))}
+ {basketItems.length > 0 && (
+
+
Warenkorb ({basketItems.length}):
+ {basketItems.map((item, idx) => (
+
+ {item.deviceName}
+ {item.billingInterval === 'one_time' ? 'Kauf' : 'Abo'}
+
+ ))}
+
+ )}
-
+
+
+
+ setDeviceName(e.target.value)}
+ className="bg-white/5 border-white/10 text-white text-xs h-9 rounded-lg"
+ />
+
+
+