import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Calendar, Shield, Car, MapPin, Clock, ChevronLeft, ChevronRight } from "lucide-react"; import { format, addDays, startOfWeek } from "date-fns"; import { it } from "date-fns/locale"; type Location = "roccapiemonte" | "milano" | "roma"; export default function PlanningViewFixedAgent() { const [selectedLocation, setSelectedLocation] = useState("roccapiemonte"); const [selectedGuardId, setSelectedGuardId] = useState(""); const [weekStart, setWeekStart] = useState( format(startOfWeek(new Date(), { weekStartsOn: 1 }), "yyyy-MM-dd") ); const locationLabels: Record = { roccapiemonte: "Roccapiemonte", milano: "Milano", roma: "Roma", }; // Query guardie per location const { data: guards } = useQuery({ queryKey: ["/api/guards", selectedLocation], queryFn: async () => { const response = await fetch("/api/guards"); if (!response.ok) throw new Error("Failed to fetch guards"); const allGuards = await response.json(); return allGuards.filter((g: any) => g.location === selectedLocation && g.isActive); }, }); // Query planning agente fisso const { data: planningData, isLoading } = useQuery<{ guard: { id: string; firstName: string; lastName: string; badgeNumber: string; location: string; }; weekStart: string; assignments: Array<{ id: string; siteId: string; siteName: string; siteAddress: string; startTime: Date; endTime: Date; isArmedOnDuty: boolean; hasVehicle: boolean; vehicleId: string | null; location: string; }>; }>({ queryKey: ["/api/planning/fixed-agent", selectedGuardId, weekStart], queryFn: async () => { const params = new URLSearchParams({ guardId: selectedGuardId, weekStart, }); const response = await fetch(`/api/planning/fixed-agent?${params.toString()}`); if (!response.ok) throw new Error("Failed to fetch planning"); return response.json(); }, enabled: !!selectedGuardId, }); const handlePreviousWeek = () => { const prevWeek = new Date(weekStart); prevWeek.setDate(prevWeek.getDate() - 7); setWeekStart(format(prevWeek, "yyyy-MM-dd")); }; const handleNextWeek = () => { const nextWeek = new Date(weekStart); nextWeek.setDate(nextWeek.getDate() + 7); setWeekStart(format(nextWeek, "yyyy-MM-dd")); }; // Raggruppa assignments per giorno const assignmentsByDay: Record = {}; if (planningData) { for (let i = 0; i < 7; i++) { const dayDate = format(addDays(new Date(weekStart), i), "yyyy-MM-dd"); assignmentsByDay[dayDate] = planningData.assignments.filter((a) => { const assignmentDate = format(new Date(a.startTime), "yyyy-MM-dd"); return assignmentDate === dayDate; }); } } return (

Planning Agente Fisso - Consultazione

Visualizza i turni fissi pianificati per un agente

{/* Filtri */} Filtri
{/* Navigazione settimana */} {selectedGuardId && (
{format(new Date(weekStart), "dd MMM", { locale: it })} -{" "} {format(addDays(new Date(weekStart), 6), "dd MMM yyyy", { locale: it })}
)}
{/* Planning Data */} {selectedGuardId && planningData && ( <> {/* Info Guardia */} {planningData.guard.firstName} {planningData.guard.lastName} #{planningData.guard.badgeNumber} {locationLabels[planningData.guard.location as Location]} Turni fissi pianificati per la settimana {/* Griglia Settimanale */}
{[0, 1, 2, 3, 4, 5, 6].map((dayOffset) => { const dayDate = addDays(new Date(weekStart), dayOffset); const dayKey = format(dayDate, "yyyy-MM-dd"); const dayAssignments = assignmentsByDay[dayKey] || []; return ( {format(dayDate, "EEEE dd MMMM", { locale: it })} {dayAssignments.length > 0 ? (
{dayAssignments.map((assignment) => (
{assignment.siteName}
{assignment.siteAddress}
{format(new Date(assignment.startTime), "HH:mm")} -{" "} {format(new Date(assignment.endTime), "HH:mm")} {assignment.isArmedOnDuty && ( Armato )} {assignment.hasVehicle && ( Automezzo )}
))}
) : (

Nessun turno pianificato

)}
); })}
)} {selectedGuardId && isLoading && (

Caricamento planning...

)} {!selectedGuardId && (

Seleziona una guardia

Scegli una guardia per visualizzare i turni fissi pianificati

)}
); }