import { useState, useEffect, useRef } from 'react'; import { useParams, useNavigate, useSearchParams } from 'react-router-dom'; import { useQuery, useMutation } from '@tanstack/react-query'; import { Alert, Box, Button, Card, CardContent, CardHeader, Divider, FormControl, Grid, InputLabel, MenuItem, Select, Skeleton, Stack, TextField, Typography, } from '@mui/material'; import { ArrowBack, Save } from '@mui/icons-material'; import DashboardLayout from '../components/dashboard/DashboardLayout'; import { buchhaltungApi } from '../services/buchhaltung'; import { bestellungApi } from '../services/bestellung'; import { useNotification } from '../contexts/NotificationContext'; import type { AusgabenTyp, TransaktionFormData } from '../types/buchhaltung.types'; export default function BuchhaltungTransaktionForm() { const { id } = useParams<{ id: string }>(); const [searchParams] = useSearchParams(); const navigate = useNavigate(); const { showSuccess, showError } = useNotification(); const isEdit = !!id; const today = new Date().toISOString().slice(0, 10); const [form, setForm] = useState({ haushaltsjahr_id: 0, typ: 'ausgabe', betrag: 0, datum: today, konto_id: null, bankkonto_id: null, beschreibung: '', empfaenger_auftraggeber: '', verwendungszweck: '', beleg_nr: '', bestellung_id: null, ausgaben_typ: null, }); const { data: haushaltsjahre = [], isLoading: loadingJahre } = useQuery({ queryKey: ['haushaltsjahre'], queryFn: buchhaltungApi.getHaushaltsjahre, }); const { data: existing, isLoading: loadingExisting } = useQuery({ queryKey: ['transaktion', Number(id)], queryFn: () => buchhaltungApi.getTransaktion(Number(id)), enabled: isEdit, }); const { data: konten = [] } = useQuery({ queryKey: ['buchhaltung-konten', form.haushaltsjahr_id], queryFn: () => buchhaltungApi.getKonten(form.haushaltsjahr_id), enabled: form.haushaltsjahr_id > 0, }); const { data: bankkonten = [] } = useQuery({ queryKey: ['bankkonten'], queryFn: buchhaltungApi.getBankkonten, }); const { data: bestellungen = [] } = useQuery({ queryKey: ['bestellungen-all'], queryFn: () => bestellungApi.getOrders(), staleTime: 5 * 60 * 1000, }); // Default to active fiscal year on create useEffect(() => { if (!isEdit && haushaltsjahre.length > 0 && form.haushaltsjahr_id === 0) { const jahrParam = searchParams.get('jahr'); const openYear = haushaltsjahre.find(hj => !hj.abgeschlossen) || haushaltsjahre[0]; setForm(f => ({ ...f, haushaltsjahr_id: jahrParam ? Number(jahrParam) : openYear.id })); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [haushaltsjahre]); const hasPrefilled = useRef(false); // Pre-fill from existing transaction when editing — only once useEffect(() => { if (existing && !hasPrefilled.current) { hasPrefilled.current = true; setForm({ haushaltsjahr_id: existing.haushaltsjahr_id, typ: existing.typ as 'einnahme' | 'ausgabe', betrag: Number(existing.betrag), datum: existing.datum.slice(0, 10), konto_id: existing.konto_id, bankkonto_id: existing.bankkonto_id, beschreibung: existing.beschreibung || '', empfaenger_auftraggeber: existing.empfaenger_auftraggeber || '', verwendungszweck: existing.verwendungszweck || '', beleg_nr: existing.beleg_nr || '', bestellung_id: existing.bestellung_id, ausgaben_typ: existing.ausgaben_typ, }); } }, [existing]); const createMut = useMutation({ mutationFn: buchhaltungApi.createTransaktion, onSuccess: () => { showSuccess('Transaktion erstellt'); navigate('/buchhaltung'); }, onError: () => showError('Transaktion konnte nicht erstellt werden'), }); const updateMut = useMutation({ mutationFn: (data: Partial) => buchhaltungApi.updateTransaktion(Number(id), data), onSuccess: () => { showSuccess('Transaktion aktualisiert'); navigate('/buchhaltung'); }, onError: () => showError('Aktualisierung fehlgeschlagen'), }); const selectedKonto = konten.find(k => k.id === form.konto_id); const isEinfach = selectedKonto && (selectedKonto.budget_typ || 'detailliert') === 'einfach'; const isPending = createMut.isPending || updateMut.isPending; const canSubmit = !!form.haushaltsjahr_id && !!form.betrag && !!form.datum && !!form.konto_id && !!form.bankkonto_id && !!form.beschreibung; const handleSubmit = () => { if (isEdit) updateMut.mutate(form); else createMut.mutate(form); }; if (loadingJahre || (isEdit && loadingExisting)) { return ( ); } return ( {/* Header */} {isEdit ? 'Transaktion bearbeiten' : 'Neue Transaktion'} {/* Section: General */} Haushaltsjahr Typ setForm(f => ({ ...f, betrag: parseFloat(e.target.value) || 0 }))} inputProps={{ step: '0.01', min: '0.01' }} /> setForm(f => ({ ...f, datum: e.target.value }))} InputLabelProps={{ shrink: true }} /> {form.typ === 'ausgabe' && !isEinfach && ( Ausgaben-Typ )} {/* Section: Accounts */} Konto (Topf) Bankkonto {/* Section: Details */} setForm(f => ({ ...f, beschreibung: e.target.value }))} /> setForm(f => ({ ...f, empfaenger_auftraggeber: e.target.value }))} /> setForm(f => ({ ...f, verwendungszweck: e.target.value }))} /> setForm(f => ({ ...f, beleg_nr: e.target.value }))} /> {/* Section: Order link (optional) */} Bestellung {!canSubmit && ( Pflichtfelder: Haushaltsjahr, Typ, Betrag, Datum, Konto (Topf), Bankkonto und Beschreibung müssen ausgefüllt sein. )} ); }