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" + /> +
+ +