import express from 'express'; const router = express.Router(); import { PrismaClient } from '../../prisma/generated/client/index.js'; const prisma = new PrismaClient(); // GET all planillas router.get('/', async (req, res) => { try { const planillas = await prisma.planilla.findMany(); res.json(planillas); } catch (error) { console.error(error); res.status(500).json({ error: 'Error al obtener planillas.' }); } }); // GET planilla by ID router.get('/:id', async (req, res) => { const { id } = req.params; try { const planilla = await prisma.planilla.findUnique({ where: { id: parseInt(id) }, }); if (planilla) { res.json(planilla); } else { res.status(404).json({ error: 'Planilla no encontrada.' }); } } catch (error) { console.error(error); res.status(500).json({ error: 'Error al obtener planilla.' }); } }); // POST create new planilla router.post('/', async (req, res) => { const { empleado_id, fecha_desde, fecha_hasta, titulo, total, estado, fecha_anulado, creador_id, // Should ideally be from authenticated user anulador_id, } = req.body; try { // Basic validation if (!empleado_id || !fecha_desde || !fecha_hasta || !titulo) { return res.status(400).json({ error: 'Los campos empleado_id, fecha_desde, fecha_hasta y titulo son obligatorios.' }); } const nuevaPlanilla = await prisma.planilla.create({ data: { empleado_id: parseInt(empleado_id), fecha_desde: new Date(fecha_desde), fecha_hasta: new Date(fecha_hasta), titulo, total: total ? parseFloat(total) : null, // Prisma expects Decimal to be passed as number or string estado: estado || 'pagado', // Default to 'pagado' if not provided fecha_anulado: fecha_anulado ? new Date(fecha_anulado) : null, creador_id, anulador_id, }, }); res.status(201).json(nuevaPlanilla); } catch (error) { console.error(error); if (error.code === 'P2003') { // Foreign key constraint failed if (error.meta?.field_name?.includes('empleado_id')) { return res.status(400).json({ error: 'El empleado_id proporcionado no existe.' }); } } res.status(500).json({ error: 'Error al crear planilla.' }); } }); // PUT update planilla by ID router.put('/:id', async (req, res) => { const { id } = req.params; const { empleado_id, fecha_desde, fecha_hasta, titulo, total, estado, fecha_anulado, anulador_id, } = req.body; try { const updateData = {}; if (empleado_id !== undefined) updateData.empleado_id = parseInt(empleado_id); if (fecha_desde !== undefined) updateData.fecha_desde = new Date(fecha_desde); if (fecha_hasta !== undefined) updateData.fecha_hasta = new Date(fecha_hasta); if (titulo !== undefined) updateData.titulo = titulo; if (total !== undefined) updateData.total = total ? parseFloat(total) : null; if (estado !== undefined) updateData.estado = estado; if (fecha_anulado !== undefined) updateData.fecha_anulado = fecha_anulado ? new Date(fecha_anulado) : null; if (anulador_id !== undefined) updateData.anulador_id = anulador_id; // creador_id is typically not updated. const planillaActualizada = await prisma.planilla.update({ where: { id: parseInt(id) }, data: updateData, }); res.json(planillaActualizada); } catch (error) { console.error(error); if (error.code === 'P2025') { // Record to update not found return res.status(404).json({ error: 'Planilla 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({ error: 'El empleado_id proporcionado no existe.' }); } } res.status(500).json({ error: 'Error al actualizar planilla.' }); } }); // DELETE planilla by ID router.delete('/:id', async (req, res) => { const { id } = req.params; try { await prisma.planilla.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({ error: 'Planilla no encontrada para eliminar.' }); } res.status(500).json({ error: 'Error al eliminar planilla.' }); } }); export default router;