Files
planilla/api/routes/planillas/planillas.js
google-labs-jules[bot] a394c25245 feat: Implement CRUD API endpoints for core modules
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.
2025-05-30 06:45:54 +00:00

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;