From 2a844d275daa6801520f99a5168524893f49ffb7 Mon Sep 17 00:00:00 2001 From: josedario87 Date: Fri, 30 May 2025 10:51:21 -0600 Subject: [PATCH] actualizada API empleados, conectando UI con API --- api/routes/empleados/empleados.js | 222 ++++++++--------- ui/src/components/empleados/cardEmpleado.vue | 4 +- ui/src/stores/useEmpleados.js | 6 +- ui/src/views/empleados/EmpleadoForm.vue | 246 +++++++++---------- 4 files changed, 232 insertions(+), 246 deletions(-) diff --git a/api/routes/empleados/empleados.js b/api/routes/empleados/empleados.js index b69673f..026de21 100644 --- a/api/routes/empleados/empleados.js +++ b/api/routes/empleados/empleados.js @@ -1,142 +1,126 @@ -import express from 'express'; -const router = express.Router(); -import { PrismaClient } from '../../prisma/generated/client/index.js'; -const prisma = new PrismaClient(); +import express from 'express' +import { PrismaClient } from '../../prisma/generated/client/index.js' -// GET all empleados -router.get('/', async (req, res) => { +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))) + +// ───── GET todos los empleados ───── +router.get('/', async (_req, res) => { try { - const empleados = await prisma.cliente.findMany({ - where: { empleado: true }, - }); - res.json(empleados); - } catch (error) { - console.error(error); // Log the error for debugging - res.status(500).json({ error: 'Error al obtener empleados.' }); + const empleados = await prisma.cliente.findMany({ where: { empleado: true } }) + res.json(fixBigInt(empleados)) + } catch (e) { + console.error(e) + res.status(500).json({ error: 'Error al obtener empleados.' }) } -}); +}) -// GET empleado by ID +// ───── GET empleado por ID ───── router.get('/:id', async (req, res) => { - const { id } = req.params; + const id = BigInt(req.params.id) try { - const empleado = await prisma.cliente.findFirst({ - where: { - id: parseInt(id), - empleado: true - }, - }); - if (empleado) { - res.json(empleado); - } else { - res.status(404).json({ error: 'Empleado no encontrado.' }); - } - } catch (error) { - console.error(error); // Log the error for debugging - res.status(500).json({ error: 'Error al obtener empleado.' }); + const empleado = await prisma.cliente.findFirst({ where: { id, empleado: true } }) + if (!empleado) return res.status(404).json({ error: 'Empleado no encontrado.' }) + res.json(fixBigInt(empleado)) + } catch (e) { + console.error(e) + res.status(500).json({ error: 'Error al obtener empleado.' }) } -}); +}) -// POST create new empleado +// ───── POST crear empleado ───── router.post('/', async (req, res) => { - const { nombre, apellido, dni, telefono, direccion, email } = req.body; - try { - const nuevoEmpleado = await prisma.cliente.create({ - data: { - nombre, - apellido, - dni, - telefono, - direccion, - email, - empleado: true, // Ensure empleado is set to true - }, - }); - res.status(201).json(nuevoEmpleado); - } catch (error) { - console.error(error); // Log the error for debugging - if (error.code === 'P2002' && error.meta?.target?.includes('dni')) { - return res.status(400).json({ error: 'Ya existe un cliente con este DNI.' }); - } - if (error.code === 'P2002' && error.meta?.target?.includes('email')) { - return res.status(400).json({ error: 'Ya existe un cliente con este Email.' }); - } - res.status(500).json({ error: 'Error al crear empleado.' }); - } -}); + const { + name, + cedula, + telefono, + ubicacion = '.', + grupo_estudio, + avatar_url, + idciat, + } = req.body -// PUT update empleado by ID + try { + const nuevo = await prisma.cliente.create({ + data: { + name, + cedula: BigInt(cedula), + telefono, + ubicacion, + grupo_estudio, + avatar_url, + idciat, + empleado: true, + }, + }) + res.status(201).json(fixBigInt(nuevo)) + } catch (e) { + console.error(e) + if (e.code === 'P2002' && e.meta?.target?.includes('cedula')) + return res.status(400).json({ error: 'Ya existe un cliente con esa cédula.' }) + res.status(500).json({ error: 'Error al crear empleado.' }) + } +}) + +// ───── PUT actualizar empleado ───── router.put('/:id', async (req, res) => { - const { id } = req.params; - const { nombre, apellido, dni, telefono, direccion, email } = req.body; + const id = BigInt(req.params.id) + const { + name, + cedula, + telefono, + ubicacion, + grupo_estudio, + avatar_url, + idciat, + } = req.body + try { - // First, check if the employee exists and is an employee - const existingEmpleado = await prisma.cliente.findFirst({ - where: { - id: parseInt(id), - empleado: true, - }, - }); + const existe = await prisma.cliente.findFirst({ where: { id, empleado: true } }) + if (!existe) return res.status(404).json({ error: 'Empleado no encontrado.' }) - if (!existingEmpleado) { - return res.status(404).json({ error: 'Empleado no encontrado.' }); - } - - const empleadoActualizado = await prisma.cliente.update({ - where: { id: parseInt(id) }, + const actualizado = await prisma.cliente.update({ + where: { id }, data: { - nombre, - apellido, - dni, + name, + cedula: cedula !== undefined ? BigInt(cedula) : undefined, telefono, - direccion, - email, - // empleado: true, // Keep it as an employee, or allow changing this? For now, keep as true. + ubicacion, + grupo_estudio, + avatar_url, + idciat, }, - }); - res.json(empleadoActualizado); - } catch (error) { - console.error(error); // Log the error for debugging - if (error.code === 'P2002' && error.meta?.target?.includes('dni')) { - return res.status(400).json({ error: 'Ya existe un cliente con este DNI.' }); - } - if (error.code === 'P2002' && error.meta?.target?.includes('email')) { - return res.status(400).json({ error: 'Ya existe un cliente con este Email.' }); - } - if (error.code === 'P2025') { // Record to update not found - return res.status(404).json({ error: 'Empleado no encontrado para actualizar.' }); - } - res.status(500).json({ error: 'Error al actualizar empleado.' }); + }) + res.json(fixBigInt(actualizado)) + } catch (e) { + console.error(e) + if (e.code === 'P2002' && e.meta?.target?.includes('cedula')) + return res.status(400).json({ error: 'Ya existe un cliente con esa cédula.' }) + if (e.code === 'P2025') + return res.status(404).json({ error: 'Empleado no encontrado para actualizar.' }) + res.status(500).json({ error: 'Error al actualizar empleado.' }) } -}); +}) -// DELETE empleado by ID +// ───── DELETE eliminar empleado ───── router.delete('/:id', async (req, res) => { - const { id } = req.params; + const id = BigInt(req.params.id) try { - // First, check if the employee exists and is an employee - const existingEmpleado = await prisma.cliente.findFirst({ - where: { - id: parseInt(id), - empleado: true, - }, - }); + const existe = await prisma.cliente.findFirst({ where: { id, empleado: true } }) + if (!existe) return res.status(404).json({ error: 'Empleado no encontrado.' }) - if (!existingEmpleado) { - return res.status(404).json({ error: 'Empleado no encontrado para eliminar.' }); - } - - await prisma.cliente.delete({ - where: { id: parseInt(id) }, - }); - res.status(204).send(); // No content - } catch (error) { - console.error(error); // Log the error for debugging - if (error.code === 'P2025') { // Record to delete not found - return res.status(404).json({ error: 'Empleado no encontrado para eliminar.' }); - } - res.status(500).json({ error: 'Error al eliminar empleado.' }); + await prisma.cliente.delete({ where: { id } }) + res.status(204).send() + } catch (e) { + console.error(e) + if (e.code === 'P2025') + return res.status(404).json({ error: 'Empleado no encontrado para eliminar.' }) + res.status(500).json({ error: 'Error al eliminar empleado.' }) } -}); +}) -export default router; +export default router diff --git a/ui/src/components/empleados/cardEmpleado.vue b/ui/src/components/empleados/cardEmpleado.vue index b3dd5ec..92ad6cb 100644 --- a/ui/src/components/empleados/cardEmpleado.vue +++ b/ui/src/components/empleados/cardEmpleado.vue @@ -20,9 +20,9 @@ {{ employee.ubicacion }} -
+
- ID CIAT: {{ employee.idciat }} + ID CIAT: {{ employee.cedula }}
diff --git a/ui/src/stores/useEmpleados.js b/ui/src/stores/useEmpleados.js index d4ee599..0bbb3b3 100644 --- a/ui/src/stores/useEmpleados.js +++ b/ui/src/stores/useEmpleados.js @@ -47,8 +47,9 @@ export const useEmpleadosStore = defineStore('empleados', { async createEmpleado (empleadoData) { try { - await apiClient.post('/api/empleados', empleadoData); + const {data} = await apiClient.post('/api/empleados/', empleadoData); await this.fetchEmpleados(); + return data } catch (err) { console.error('Error creando empleado:', err); throw err; // para que el form muestre feedback @@ -57,9 +58,10 @@ export const useEmpleadosStore = defineStore('empleados', { async updateEmpleado (id, empleadoData) { try { - await apiClient.put(`/api/empleados/${id}`, empleadoData); + const {data} = await apiClient.put(`/api/empleados/${id}`, empleadoData); await this.fetchEmpleados(); this.clearCurrentEmpleado(); + return data } catch (err) { console.error(`Error actualizando empleado ${id}:`, err); throw err; diff --git a/ui/src/views/empleados/EmpleadoForm.vue b/ui/src/views/empleados/EmpleadoForm.vue index 5782ec9..5fdabc1 100644 --- a/ui/src/views/empleados/EmpleadoForm.vue +++ b/ui/src/views/empleados/EmpleadoForm.vue @@ -3,100 +3,140 @@

{{ isEditMode ? 'Editar Empleado' : 'Crear Empleado' }}

+
+
- +
+
- +
+
- +
+
- +
+
- +
+
- +
+
- +
+
@@ -108,7 +148,10 @@