'use client' import { useState, useEffect } from 'react' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Badge } from '@/components/ui/badge' import { CheckCircle, XCircle, Clock, Users } from 'lucide-react' import { toast } from 'sonner' interface Section { id: string name: string className: string periodName: string studentCount: number isActive: boolean } interface Partial { id: string name: string startDate: string endDate: string isActive: boolean } interface Student { id: string name: string email: string attendance?: { id: string status: 'present' | 'absent' | 'late' date: string } } export default function AttendancePage() { const [sections, setSections] = useState([]) const [partials, setPartials] = useState([]) const [students, setStudents] = useState([]) const [selectedSection, setSelectedSection] = useState('') const [selectedPartial, setSelectedPartial] = useState('') const [selectedDate, setSelectedDate] = useState(new Date().toISOString().split('T')[0]) const [loading, setLoading] = useState(false) const [saving, setSaving] = useState(false) useEffect(() => { fetchSections() fetchPartials() }, []) useEffect(() => { if (selectedSection && selectedPartial && selectedDate) { fetchStudents() } }, [selectedSection, selectedPartial, selectedDate]) const fetchSections = async () => { try { const response = await fetch('/api/teacher/sections') if (response.ok) { const data = await response.json() setSections(data.filter((s: Section) => s.isActive)) } } catch (error) { toast.error('Error al cargar las secciones') } } const fetchPartials = async () => { try { const response = await fetch('/api/admin/partials') if (response.ok) { const data = await response.json() setPartials(data.filter((p: Partial) => p.isActive)) } } catch (error) { toast.error('Error al cargar los parciales') } } const fetchStudents = async () => { if (!selectedSection || !selectedPartial || !selectedDate) return setLoading(true) try { const response = await fetch( `/api/teacher/attendance?sectionId=${selectedSection}&partialId=${selectedPartial}&date=${selectedDate}` ) if (response.ok) { const data = await response.json() setStudents(data) } } catch (error) { toast.error('Error al cargar los estudiantes') } finally { setLoading(false) } } const updateAttendance = (studentId: string, status: 'present' | 'absent' | 'late') => { setStudents(prev => prev.map(student => student.id === studentId ? { ...student, attendance: { id: student.attendance?.id || '', status, date: selectedDate } } : student )) } const saveAttendance = async () => { if (!selectedSection || !selectedPartial || !selectedDate) { toast.error('Selecciona sección, parcial y fecha') return } setSaving(true) try { const attendanceData = students.map(student => ({ studentId: student.id, sectionId: selectedSection, partialId: selectedPartial, date: selectedDate, status: student.attendance?.status || 'absent' })) const response = await fetch('/api/teacher/attendance', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ attendance: attendanceData }) }) if (response.ok) { toast.success('Asistencia guardada correctamente') fetchStudents() // Refresh data } else { toast.error('Error al guardar la asistencia') } } catch (error) { toast.error('Error al guardar la asistencia') } finally { setSaving(false) } } const getStatusIcon = (status: string) => { switch (status) { case 'present': return case 'late': return case 'absent': return default: return } } const getStatusBadge = (status: string) => { switch (status) { case 'present': return Presente case 'late': return Tardanza case 'absent': return Ausente default: return Sin marcar } } return (

Gestión de Asistencia

Registra la asistencia de tus estudiantes

{/* Filters */} Seleccionar Clase
setSelectedDate(e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" />
{/* Students List */} {students.length > 0 && (
Lista de Estudiantes
{students.map((student) => (
{getStatusIcon(student.attendance?.status || 'absent')}

{student.name}

{student.email}

{getStatusBadge(student.attendance?.status || 'absent')}
))}
)} {selectedSection && selectedPartial && students.length === 0 && !loading && (

No hay estudiantes matriculados en esta sección.

)}
) }