import { useState } from 'react'; import { Box, Typography, Paper, Button, TextField, IconButton, Autocomplete, Tooltip, } from '@mui/material'; import { Add as AddIcon, RemoveCircleOutline as RemoveIcon, } from '@mui/icons-material'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; import DashboardLayout from '../components/dashboard/DashboardLayout'; import { PageHeader, FormLayout } from '../components/templates'; import { useNotification } from '../contexts/NotificationContext'; import { bestellungApi } from '../services/bestellung'; import type { BestellungFormData, BestellpositionFormData, LieferantFormData, Lieferant } from '../types/bestellung.types'; const emptyOrderForm: BestellungFormData = { bezeichnung: '', lieferant_id: undefined, besteller_id: '', notizen: '', positionen: [] }; const emptyVendorForm: LieferantFormData = { name: '', kontakt_name: '', email: '', telefon: '', adresse: '', website: '', notizen: '' }; const emptyPosition: BestellpositionFormData = { bezeichnung: '', menge: 1, einheit: 'Stk' }; export default function BestellungNeu() { const navigate = useNavigate(); const queryClient = useQueryClient(); const { showSuccess, showError } = useNotification(); const [orderForm, setOrderForm] = useState({ ...emptyOrderForm }); const [inlineVendorOpen, setInlineVendorOpen] = useState(false); const [inlineVendorForm, setInlineVendorForm] = useState({ ...emptyVendorForm }); // ── Queries ── const { data: vendors = [] } = useQuery({ queryKey: ['lieferanten'], queryFn: bestellungApi.getVendors, }); const { data: orderUsers = [] } = useQuery({ queryKey: ['bestellungen', 'order-users'], queryFn: bestellungApi.getOrderUsers, }); // ── Mutations ── const createOrder = useMutation({ mutationFn: (data: BestellungFormData) => bestellungApi.createOrder(data), onSuccess: (created) => { queryClient.invalidateQueries({ queryKey: ['bestellungen'] }); showSuccess('Bestellung erstellt'); navigate(`/bestellungen/${created.id}`); }, onError: (error: any) => showError(error?.response?.data?.message || 'Fehler beim Erstellen der Bestellung'), }); const createVendor = useMutation({ mutationFn: (data: LieferantFormData) => bestellungApi.createVendor(data), onSuccess: (newVendor: Lieferant) => { queryClient.invalidateQueries({ queryKey: ['lieferanten'] }); showSuccess('Lieferant erstellt'); setOrderForm((f) => ({ ...f, lieferant_id: newVendor.id })); setInlineVendorOpen(false); setInlineVendorForm({ ...emptyVendorForm }); }, onError: () => showError('Fehler beim Erstellen des Lieferanten'), }); const handleSubmit = () => { if (!orderForm.bezeichnung.trim()) return; createOrder.mutate(orderForm); }; return ( } > setOrderForm((f) => ({ ...f, bezeichnung: e.target.value }))} /> {/* Lieferant + inline create */} o.name} value={vendors.find((v) => v.id === orderForm.lieferant_id) || null} onChange={(_e, v) => setOrderForm((f) => ({ ...f, lieferant_id: v?.id }))} renderInput={(params) => } sx={{ flexGrow: 1 }} /> setInlineVendorOpen(!inlineVendorOpen)} color={inlineVendorOpen ? 'primary' : 'default'} sx={{ mt: 1 }} > {inlineVendorOpen && ( Neuer Lieferant setInlineVendorForm((f) => ({ ...f, name: e.target.value }))} /> setInlineVendorForm((f) => ({ ...f, kontakt_name: e.target.value }))} /> setInlineVendorForm((f) => ({ ...f, email: e.target.value }))} /> setInlineVendorForm((f) => ({ ...f, telefon: e.target.value }))} /> )} o.name} value={orderUsers.find((u) => u.id === orderForm.besteller_id) || null} onChange={(_e, v) => setOrderForm((f) => ({ ...f, besteller_id: v?.id || '' }))} renderInput={(params) => } /> setOrderForm((f) => ({ ...f, notizen: e.target.value }))} /> {/* ── Positionen ── */} Positionen {(orderForm.positionen || []).map((pos, idx) => ( { const next = [...(orderForm.positionen || [])]; next[idx] = { ...next[idx], bezeichnung: e.target.value }; setOrderForm((f) => ({ ...f, positionen: next })); }} sx={{ flexGrow: 1 }} /> { const next = [...(orderForm.positionen || [])]; next[idx] = { ...next[idx], menge: Math.max(1, Number(e.target.value) || 1) }; setOrderForm((f) => ({ ...f, positionen: next })); }} sx={{ width: 90 }} inputProps={{ min: 1 }} /> { const next = [...(orderForm.positionen || [])]; next[idx] = { ...next[idx], einheit: e.target.value }; setOrderForm((f) => ({ ...f, positionen: next })); }} sx={{ width: 100 }} /> { const next = (orderForm.positionen || []).filter((_, i) => i !== idx); setOrderForm((f) => ({ ...f, positionen: next })); }} > ))} {/* ── Submit ── */} ); }