import { useState } from 'react'; import DashboardLayout from '../components/dashboard/DashboardLayout'; import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, FormControl, IconButton, InputLabel, MenuItem, Paper, Select, Stack, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Typography, } from '@mui/material'; import { Add as AddIcon, Delete, Visibility } from '@mui/icons-material'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; import { buchhaltungApi } from '../services/buchhaltung'; import { useNotification } from '../contexts/NotificationContext'; import { usePermissionContext } from '../contexts/PermissionContext'; import type { Planung, PlanungStatus, Haushaltsjahr } from '../types/buchhaltung.types'; const STATUS_LABELS: Record = { entwurf: 'Entwurf', aktiv: 'Aktiv', abgeschlossen: 'Abgeschlossen', }; const STATUS_COLORS: Record = { entwurf: 'default', aktiv: 'success', abgeschlossen: 'info', }; function fmtDate(val: string) { return new Date(val).toLocaleDateString('de-DE'); } function fmtEur(val: number) { return new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(val); } export default function Haushaltsplan() { const navigate = useNavigate(); const qc = useQueryClient(); const { showSuccess, showError } = useNotification(); const { hasPermission } = usePermissionContext(); const canManage = hasPermission('buchhaltung:manage_accounts'); const [dialogOpen, setDialogOpen] = useState(false); const [form, setForm] = useState<{ bezeichnung: string; haushaltsjahr_id: string }>({ bezeichnung: '', haushaltsjahr_id: '' }); const { data: planungen = [], isLoading } = useQuery({ queryKey: ['planungen'], queryFn: buchhaltungApi.listPlanungen, }); const { data: haushaltsjahre = [] } = useQuery({ queryKey: ['haushaltsjahre'], queryFn: buchhaltungApi.getHaushaltsjahre, }); const createMut = useMutation({ mutationFn: buchhaltungApi.createPlanung, onSuccess: () => { qc.invalidateQueries({ queryKey: ['planungen'] }); setDialogOpen(false); showSuccess('Haushaltsplan erstellt'); }, onError: () => showError('Haushaltsplan konnte nicht erstellt werden'), }); const deleteMut = useMutation({ mutationFn: buchhaltungApi.deletePlanung, onSuccess: () => { qc.invalidateQueries({ queryKey: ['planungen'] }); showSuccess('Haushaltsplan gelöscht'); }, onError: () => showError('Haushaltsplan konnte nicht gelöscht werden'), }); return ( Haushaltspläne {canManage && ( )} Bezeichnung Haushaltsjahr Status Positionen Gesamt (GWG + Anl. + Inst.) Erstellt am Aktionen {!isLoading && planungen.length === 0 && ( Keine Haushaltspläne vorhanden )} {planungen.map((p: Planung) => { const total = Number(p.total_gwg) + Number(p.total_anlagen) + Number(p.total_instandhaltung); return ( navigate(`/haushaltsplan/${p.id}`)}> {p.bezeichnung} {p.haushaltsjahr_bezeichnung || '–'} {p.positionen_count} {fmtEur(total)} {fmtDate(p.erstellt_am)} e.stopPropagation()}> navigate(`/haushaltsplan/${p.id}`)}> {canManage && deleteMut.mutate(p.id)}>} ); })}
setDialogOpen(false)} maxWidth="sm" fullWidth> Neuer Haushaltsplan setForm(f => ({ ...f, bezeichnung: e.target.value }))} required /> Haushaltsjahr (optional)
); }