import express from 'express'; const router = express.Router(); import { PrismaClient, Prisma } from '../../prisma/generated/client/index.js'; const prisma = new PrismaClient(); // GET all asistencias router.get('/', async (req, res) => { try { const asistencias = await prisma.asistencia.findMany(); res.json(asistencias); } catch (error) { console.error(error); res.status(500).json({ message: 'Error al obtener asistencias.' }); } }); // GET asistencia by ID router.get('/:id', async (req, res) => { const { id } = req.params; try { const asistencia = await prisma.asistencia.findUnique({ where: { id: parseInt(id) }, }); if (asistencia) { res.json(asistencia); } else { res.status(404).json({ message: 'Asistencia no encontrada.' }); } } catch (error) { console.error(error); res.status(500).json({ message: 'Error al obtener asistencia.' }); } }); // POST ➜ crear asistencia router.post('/', async (req, res) => { const { empleado_id, entrada, salida, historial, observacion, estado, fecha_anulado, creador_id, modificado_id, anulador_id, } = req.body if (!empleado_id) return res.status(400).json({ message: 'El campo empleado_id es obligatorio.' }) try { const nuevaAsistencia = await prisma.asistencia.create({ data: { empleado_id: BigInt(empleado_id), // FK a Cliente.id entrada: entrada ? new Date(entrada) : null, salida: salida ? new Date(salida) : null, historial, // JSON observacion, estado, fecha_anulado: fecha_anulado ? new Date(fecha_anulado) : null, creador_id, modificado_id, anulador_id, }, }) res.status(201).json(nuevaAsistencia) } catch (e){ // ⚠️ captura FK error: Asistencia_empleado_id_fkey if(e instanceof Prisma.PrismaClientKnownRequestError ) { if( e.code === 'P2003') { return res.status(400).json({ message: 'El empleado_id proporcionado no existe.' }) } } console.error(e) res.status(500).json({ message: 'Error al crear asistencia.' }) } }) // PUT update asistencia by ID router.put('/:id', async (req, res) => { const { id } = req.params; const { empleado_id, entrada, salida, historial, observacion, estado, fecha_anulado, modificado_id, anulador_id } = req.body; try { const updateData = { entrada: entrada ? new Date(entrada) : undefined, salida: salida ? new Date(salida) : undefined, historial, observacion, estado, fecha_anulado: fecha_anulado ? new Date(fecha_anulado) : undefined, modificado_id, // Should ideally be taken from authenticated user anulador_id }; // If empleado_id is provided, include it in updateData. // Be cautious: changing empleado_id might not be a typical operation for an existing attendance record. if (empleado_id !== undefined) { updateData.empleado_id = parseInt(empleado_id); } const asistenciaActualizada = await prisma.asistencia.update({ where: { id: parseInt(id) }, data: updateData, }); res.json(asistenciaActualizada); } catch (error) { console.error(error); if (error.code === 'P2025') { // Record to update not found return res.status(404).json({ message: 'Asistencia no encontrada para actualizar.' }); } if (error.code === 'P2003') { // Foreign key constraint failed if (error.meta?.field_name?.includes('empleado_id')) { return res.status(400).json({ message: 'El empleado_id proporcionado no existe.' }); } } res.status(500).json({ message: 'Error al actualizar asistencia.' }); } }); // DELETE asistencia by ID router.delete('/:id', async (req, res) => { const { id } = req.params; try { await prisma.asistencia.delete({ where: { id: parseInt(id) }, }); res.status(204).send(); // No content } catch (error) { console.error(error); if (error.code === 'P2025') { // Record to delete not found return res.status(404).json({ message: 'Asistencia no encontrada para eliminar.' }); } res.status(500).json({ message: 'Error al eliminar asistencia.' }); } }); export default router;