Adds Express.js routes and Prisma-based handlers for common database operations (Create, Read, Update, Delete) for the following modules: - Empleados (subset of Cliente model) - Asistencias - Tareas (TareaRealizada model) - Planillas Each module's routes are separated into their own files within `api/routes/`. The new routes are registered in `api/server.js`. Basic error handling, including try-catch blocks and checks for common Prisma errors (e.g., P2025 for record not found, P2003 for foreign key violations), has been implemented in each endpoint.
143 lines
4.4 KiB
JavaScript
143 lines
4.4 KiB
JavaScript
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;
|