import { useState } from "react"; import { useQuery, useMutation } from "@tanstack/react-query"; import { queryClient, apiRequest } from "@/lib/queryClient"; import type { TrainingCourse, Absence } from "@shared/schema"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Badge } from "@/components/ui/badge"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, DialogFooter, } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { useToast } from "@/hooks/use-toast"; import { Calendar, GraduationCap, HeartPulse, PartyPopper, Plus, Trash2 } from "lucide-react"; import { format } from "date-fns"; import { it } from "date-fns/locale"; export default function PlanningPage() { const { toast } = useToast(); const [activeTab, setActiveTab] = useState("training"); return (

Gestione Pianificazioni

Gestisci formazione, assenze e festività per ottimizzare la pianificazione turni

Formazione Assenze Festività
); } function TrainingTab() { const { toast } = useToast(); const [isCreateOpen, setIsCreateOpen] = useState(false); const { data: courses = [], isLoading } = useQuery({ queryKey: ["/api/training-courses"], }); const createMutation = useMutation({ mutationFn: (data: any) => apiRequest("/api/training-courses", "POST", data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/training-courses"] }); toast({ title: "Corso creato con successo" }); setIsCreateOpen(false); }, }); const deleteMutation = useMutation({ mutationFn: (id: string) => apiRequest(`/api/training-courses/${id}`, "DELETE"), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/training-courses"] }); toast({ title: "Corso eliminato" }); }, }); if (isLoading) { return
Caricamento corsi...
; } return (
Nuovo Corso di Formazione
{ e.preventDefault(); const formData = new FormData(e.currentTarget); createMutation.mutate({ guardId: formData.get("guardId"), courseName: formData.get("courseName"), courseType: formData.get("courseType"), scheduledDate: formData.get("scheduledDate"), status: "scheduled", }); }} >
{courses.map((course: any) => (
{course.courseName} Programmato: {course.scheduledDate ? format(new Date(course.scheduledDate), "dd MMM yyyy", { locale: it }) : "N/D"}
{course.courseType === "mandatory" ? "Obbligatorio" : "Facoltativo"} {course.status}
))} {courses.length === 0 && (
Nessun corso di formazione programmato
)}
); } function AbsencesTab() { const { toast } = useToast(); const [isCreateOpen, setIsCreateOpen] = useState(false); const { data: absences = [], isLoading } = useQuery({ queryKey: ["/api/absences"], }); const createMutation = useMutation({ mutationFn: (data: any) => apiRequest("/api/absences", "POST", data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/absences"] }); toast({ title: "Assenza registrata" }); setIsCreateOpen(false); }, }); const deleteMutation = useMutation({ mutationFn: (id: string) => apiRequest(`/api/absences/${id}`, "DELETE"), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/absences"] }); toast({ title: "Assenza eliminata" }); }, }); if (isLoading) { return
Caricamento assenze...
; } return (
Registra Assenza
{ e.preventDefault(); const formData = new FormData(e.currentTarget); createMutation.mutate({ guardId: formData.get("guardId"), type: formData.get("type"), startDate: formData.get("startDate"), endDate: formData.get("endDate"), notes: formData.get("notes"), isApproved: false, needsSubstitute: true, }); }} >
{absences.map((absence: any) => (
{absence.type === "sick_leave" && "Malattia"} {absence.type === "vacation" && "Ferie"} {absence.type === "personal_leave" && "Permesso"} {absence.type === "injury" && "Infortunio"} Dal {format(new Date(absence.startDate), "dd MMM", { locale: it })} al{" "} {format(new Date(absence.endDate), "dd MMM yyyy", { locale: it })}
{absence.isApproved ? "Approvata" : "In attesa"}
))} {absences.length === 0 && (
Nessuna assenza registrata
)}
); } function HolidaysTab() { const { toast } = useToast(); const [isCreateOpen, setIsCreateOpen] = useState(false); const currentYear = new Date().getFullYear(); const { data: holidays = [], isLoading } = useQuery({ queryKey: ["/api/holidays", currentYear], queryFn: () => fetch(`/api/holidays?year=${currentYear}`).then((r) => r.json()), }); const createMutation = useMutation({ mutationFn: (data: any) => apiRequest("/api/holidays", "POST", data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/holidays", currentYear] }); toast({ title: "Festività creata" }); setIsCreateOpen(false); }, }); const deleteMutation = useMutation({ mutationFn: (id: string) => apiRequest(`/api/holidays/${id}`, "DELETE"), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/holidays", currentYear] }); toast({ title: "Festività eliminata" }); }, }); if (isLoading) { return
Caricamento festività...
; } return (
Nuova Festività
{ e.preventDefault(); const formData = new FormData(e.currentTarget); const dateValue = formData.get("date") as string; createMutation.mutate({ name: formData.get("name"), date: dateValue, year: new Date(dateValue).getFullYear(), isNational: formData.get("isNational") === "true", }); }} >
{holidays.map((holiday: any) => (
{holiday.name} {format(new Date(holiday.date), "EEEE dd MMMM yyyy", { locale: it })}
{holiday.isNational ? "Nazionale" : "Regionale"}
))} {holidays.length === 0 && (
Nessuna festività configurata per {currentYear}
)}
); }