diff --git a/api/routes/asistencias/asistencias.js b/api/routes/asistencias/asistencias.js index 99f3860..b398bb7 100644 --- a/api/routes/asistencias/asistencias.js +++ b/api/routes/asistencias/asistencias.js @@ -8,8 +8,8 @@ router.get('/', async (req, res) => { try { const asistencias = await prisma.asistencia.findMany(); res.json(asistencias); - } catch (error) { - console.error(error); + } catch (e) { + console.error(e); res.status(500).json({ message: 'Error al obtener asistencias.' }); } }); @@ -26,13 +26,13 @@ router.get('/:id', async (req, res) => { } else { res.status(404).json({ message: 'Asistencia no encontrada.' }); } - } catch (error) { - console.error(error); + } catch (e) { + console.error(e); res.status(500).json({ message: 'Error al obtener asistencia.' }); } }); -// POST ➜ crear asistencia +// POST crear asistencia router.post('/', async (req, res) => { const { empleado_id, @@ -45,99 +45,107 @@ router.post('/', async (req, res) => { creador_id, modificado_id, anulador_id, - } = req.body + } = req.body; if (!empleado_id) - return res.status(400).json({ message: 'El campo empleado_id es obligatorio.' }) + 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 + empleado_id: BigInt(empleado_id), + entrada: entrada ? new Date(entrada) : null, + salida: salida ? new Date(salida) : null, + historial, observacion, estado, - fecha_anulado: fecha_anulado ? new Date(fecha_anulado) : null, + 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.' }) + }); + res.status(201).json(nuevaAsistencia); + } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2003' && e.meta?.field_name?.includes('empleado_id')) { + return res.status(400).json({ message: 'El empleado_id proporcionado no existe.' }); } } - console.error(e) - res.status(500).json({ message: 'Error al crear asistencia.' }) + console.error(e); + res.status(500).json({ message: 'Error al crear asistencia.' }); } -}) +}); - - -// PUT update asistencia by ID +// PUT actualizar asistencia 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; - + 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 + 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, + 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); + updateData.empleado_id = BigInt(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.' }); - } + } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2025') { + return res.status(404).json({ message: 'Asistencia no encontrada para actualizar.' }); + } + if (e.code === 'P2003' && e.meta?.field_name?.includes('empleado_id')) { + return res.status(400).json({ message: 'El empleado_id proporcionado no existe.' }); + } } + + console.error(e); res.status(500).json({ message: 'Error al actualizar asistencia.' }); } }); -// DELETE asistencia by ID +// DELETE asistencia 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(204).send(); + } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2025') { + return res.status(404).json({ message: 'Asistencia no encontrada para eliminar.' }); + } } + + console.error(e); res.status(500).json({ message: 'Error al eliminar asistencia.' }); } }); diff --git a/api/routes/empleados/empleados.js b/api/routes/empleados/empleados.js index 1736671..f6973a3 100644 --- a/api/routes/empleados/empleados.js +++ b/api/routes/empleados/empleados.js @@ -1,10 +1,9 @@ import express from 'express' -import { PrismaClient } from '../../prisma/generated/client/index.js' +import { PrismaClient, Prisma } from '../../prisma/generated/client/index.js' const router = express.Router() const prisma = new PrismaClient() -// ⚙️ helper: evita el crash al serializar BigInt const fixBigInt = (data) => JSON.parse(JSON.stringify(data, (_, v) => (typeof v === 'bigint' ? v.toString() : v))) @@ -59,9 +58,13 @@ router.post('/', async (req, res) => { }) res.status(201).json(fixBigInt(nuevo)) } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2002' && e.meta?.target?.includes('cedula')) { + return res.status(400).json({ message: 'Ya existe un cliente con esa cédula.' }) + } + } + console.error(e) - if (e.code === 'P2002' && e.meta?.target?.includes('cedula')) - return res.status(400).json({ message: 'Ya existe un cliente con esa cédula.' }) res.status(500).json({ message: 'Error al crear empleado.' }) } }) @@ -97,11 +100,16 @@ router.put('/:id', async (req, res) => { }) res.json(fixBigInt(actualizado)) } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2002' && e.meta?.target?.includes('cedula')) { + return res.status(400).json({ message: 'Ya existe un cliente con esa cédula.' }) + } + if (e.code === 'P2025') { + return res.status(404).json({ message: 'Empleado no encontrado para actualizar.' }) + } + } + console.error(e) - if (e.code === 'P2002' && e.meta?.target?.includes('cedula')) - return res.status(400).json({ message: 'Ya existe un cliente con esa cédula.' }) - if (e.code === 'P2025') - return res.status(404).json({ message: 'Empleado no encontrado para actualizar.' }) res.status(500).json({ message: 'Error al actualizar empleado.' }) } }) @@ -116,9 +124,13 @@ router.delete('/:id', async (req, res) => { await prisma.cliente.delete({ where: { id } }) res.status(204).send() } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2025') { + return res.status(404).json({ message: 'Empleado no encontrado para eliminar.' }) + } + } + console.error(e) - if (e.code === 'P2025') - return res.status(404).json({ message: 'Empleado no encontrado para eliminar.' }) res.status(500).json({ message: 'Error al eliminar empleado.' }) } }) diff --git a/api/routes/planillas/planillas.js b/api/routes/planillas/planillas.js index b4fe58d..08facd6 100644 --- a/api/routes/planillas/planillas.js +++ b/api/routes/planillas/planillas.js @@ -1,6 +1,6 @@ import express from 'express'; const router = express.Router(); -import { PrismaClient } from '../../prisma/generated/client/index.js'; +import { PrismaClient, Prisma } from '../../prisma/generated/client/index.js'; const prisma = new PrismaClient(); // GET all planillas @@ -8,8 +8,8 @@ router.get('/', async (req, res) => { try { const planillas = await prisma.planilla.findMany(); res.json(planillas); - } catch (error) { - console.error(error); + } catch (e) { + console.error(e); res.status(500).json({ message: 'Error al obtener planillas.' }); } }); @@ -26,8 +26,8 @@ router.get('/:id', async (req, res) => { } else { res.status(404).json({ message: 'Planilla no encontrada.' }); } - } catch (error) { - console.error(error); + } catch (e) { + console.error(e); res.status(500).json({ message: 'Error al obtener planilla.' }); } }); @@ -42,37 +42,38 @@ router.post('/', async (req, res) => { total, estado, fecha_anulado, - creador_id, // Should ideally be from authenticated user + creador_id, anulador_id, } = req.body; - try { - // Basic validation - if (!empleado_id || !fecha_desde || !fecha_hasta || !titulo) { - return res.status(400).json({ message: 'Los campos empleado_id, fecha_desde, fecha_hasta y titulo son obligatorios.' }); - } + if (!empleado_id || !fecha_desde || !fecha_hasta || !titulo) { + return res.status(400).json({ + message: 'Los campos empleado_id, fecha_desde, fecha_hasta y titulo son obligatorios.', + }); + } + try { 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 + total: total ? parseFloat(total) : null, + estado: estado || 'pagado', 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')) { + } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2003' && e.meta?.field_name?.includes('empleado_id')) { return res.status(400).json({ message: 'El empleado_id proporcionado no existe.' }); } } + console.error(e); res.status(500).json({ message: 'Error al crear planilla.' }); } }); @@ -101,23 +102,22 @@ router.put('/:id', async (req, res) => { 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({ message: 'Planilla no encontrada para actualizar.' }); - } - if (error.code === 'P2003') { // Foreign key constraint failed - if (error.meta?.field_name?.includes('empleado_id')) { + } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2025') { + return res.status(404).json({ message: 'Planilla no encontrada para actualizar.' }); + } + if (e.code === 'P2003' && e.meta?.field_name?.includes('empleado_id')) { return res.status(400).json({ message: 'El empleado_id proporcionado no existe.' }); } } + console.error(e); res.status(500).json({ message: 'Error al actualizar planilla.' }); } }); @@ -129,12 +129,14 @@ router.delete('/:id', async (req, res) => { 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({ message: 'Planilla no encontrada para eliminar.' }); + res.status(204).send(); + } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2025') { + return res.status(404).json({ message: 'Planilla no encontrada para eliminar.' }); + } } + console.error(e); res.status(500).json({ message: 'Error al eliminar planilla.' }); } }); diff --git a/api/routes/tareas/tareas.js b/api/routes/tareas/tareas.js index 451ad78..77a05e5 100644 --- a/api/routes/tareas/tareas.js +++ b/api/routes/tareas/tareas.js @@ -1,6 +1,6 @@ import express from 'express'; const router = express.Router(); -import { PrismaClient } from '../../prisma/generated/client/index.js'; +import { PrismaClient, Prisma } from '../../prisma/generated/client/index.js'; const prisma = new PrismaClient(); // GET all tareas @@ -8,9 +8,9 @@ router.get('/', async (req, res) => { try { const tareas = await prisma.tareaRealizada.findMany(); res.json(tareas); - } catch (error) { - console.error(error); - res.status(500).json({ message: 'Error al obtener tareas.' }); + } catch (e) { + console.error(e); + res.status(500).json({ message: 'Error al obtener tareas.' }); } }); @@ -26,8 +26,8 @@ router.get('/:id', async (req, res) => { } else { res.status(404).json({ message: 'Tarea no encontrada.' }); } - } catch (error) { - console.error(error); + } catch (e) { + console.error(e); res.status(500).json({ message: 'Error al obtener tarea.' }); } }); @@ -44,42 +44,45 @@ router.post('/', async (req, res) => { fecha, tipo, fecha_anulado, - creador_id, // Should ideally be from authenticated user + creador_id, anulador_id, } = req.body; - try { - // Basic validation - if (!empleado_id || !titulo || !fecha) { - return res.status(400).json({ message: 'Los campos empleado_id, titulo y fecha son obligatorios.' }); - } + if (!empleado_id || !titulo || !fecha) { + return res.status(400).json({ + message: 'Los campos empleado_id, titulo y fecha son obligatorios.', + }); + } + try { const nuevaTarea = await prisma.tareaRealizada.create({ data: { empleado_id: parseInt(empleado_id), planilla_id: planilla_id ? parseInt(planilla_id) : null, titulo, precio: precio ? parseFloat(precio) : null, - estado: estado || 'pendiente', // Default to 'pendiente' if not provided + estado: estado || 'pendiente', observacion, fecha: new Date(fecha), - tipo: tipo || '', // Default to empty string if not provided + tipo: tipo || '', fecha_anulado: fecha_anulado ? new Date(fecha_anulado) : null, - creador_id, + creador_id, anulador_id, }, }); res.status(201).json(nuevaTarea); - } 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({ message: 'El empleado_id proporcionado no existe.' }); - } - if (error.meta?.field_name?.includes('planilla_id')) { - return res.status(400).json({ message: 'El planilla_id proporcionado no existe.' }); + } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2003') { + if (e.meta?.field_name?.includes('empleado_id')) { + return res.status(400).json({ message: 'El empleado_id proporcionado no existe.' }); + } + if (e.meta?.field_name?.includes('planilla_id')) { + return res.status(400).json({ message: 'El planilla_id proporcionado no existe.' }); + } } } + console.error(e); res.status(500).json({ message: 'Error al crear tarea.' }); } }); @@ -112,26 +115,27 @@ router.put('/:id', async (req, res) => { if (tipo !== undefined) updateData.tipo = tipo; 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 tareaActualizada = await prisma.tareaRealizada.update({ where: { id: parseInt(id) }, data: updateData, }); res.json(tareaActualizada); - } catch (error) { - console.error(error); - if (error.code === 'P2025') { // Record to update not found - return res.status(404).json({ message: 'Tarea 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.' }); + } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2025') { + return res.status(404).json({ message: 'Tarea no encontrada para actualizar.' }); } - if (error.meta?.field_name?.includes('planilla_id')) { - return res.status(400).json({ message: 'El planilla_id proporcionado no existe.' }); + if (e.code === 'P2003') { + if (e.meta?.field_name?.includes('empleado_id')) { + return res.status(400).json({ message: 'El empleado_id proporcionado no existe.' }); + } + if (e.meta?.field_name?.includes('planilla_id')) { + return res.status(400).json({ message: 'El planilla_id proporcionado no existe.' }); + } } } + console.error(e); res.status(500).json({ message: 'Error al actualizar tarea.' }); } }); @@ -143,12 +147,14 @@ router.delete('/:id', async (req, res) => { await prisma.tareaRealizada.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: 'Tarea no encontrada para eliminar.' }); + res.status(204).send(); + } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2025') { + return res.status(404).json({ message: 'Tarea no encontrada para eliminar.' }); + } } + console.error(e); res.status(500).json({ message: 'Error al eliminar tarea.' }); } });