feat(herramientas): agregar soporte de fotografias y evidencias para herramientas, kits y asignaciones de custodia

This commit is contained in:
2026-11-01 03:11:33 -05:00
parent c07162c375
commit b361e4a9b4
11 changed files with 379 additions and 42 deletions
+44 -7
View File
@@ -8,6 +8,7 @@ const Ticket = require('../models/Ticket');
const Herramienta = require('../models/Herramienta');
const HerramientaSet = require('../models/HerramientaSet');
const HerramientaAsignacion = require('../models/HerramientaAsignacion');
const { guardarFoto } = require('../config/uploader');
router.get('/dashboard', isCompanyAdmin, async (req, res) => {
try {
@@ -192,6 +193,11 @@ router.post('/herramientas/create', isCompanyAdmin, async (req, res) => {
return res.redirect('/admin/herramientas');
}
try {
let foto_url = null;
if (req.files && req.files.foto) {
foto_url = await guardarFoto(req.files.foto, 'herramienta');
}
await Herramienta.create({
company_id: req.session.user.company_id,
nombre,
@@ -202,7 +208,8 @@ router.post('/herramientas/create', isCompanyAdmin, async (req, res) => {
modelo: modelo || null,
estado: estado || 'operativo',
ubicacion_bodega: ubicacion_bodega || null,
notas: notas || null
notas: notas || null,
foto_url
});
req.flash('success_msg', `Herramienta "${nombre}" registrada correctamente`);
res.redirect('/admin/herramientas#tab-herramientas');
@@ -217,7 +224,7 @@ router.post('/herramientas/create', isCompanyAdmin, async (req, res) => {
router.post('/herramientas/edit/:id', isCompanyAdmin, async (req, res) => {
const { nombre, codigo, numero_serie, categoria, marca, modelo, estado, ubicacion_bodega, notas } = req.body;
try {
await Herramienta.update(req.params.id, req.session.user.company_id, {
const updateData = {
nombre,
codigo,
numero_serie,
@@ -227,7 +234,13 @@ router.post('/herramientas/edit/:id', isCompanyAdmin, async (req, res) => {
estado,
ubicacion_bodega,
notas
});
};
if (req.files && req.files.foto) {
updateData.foto_url = await guardarFoto(req.files.foto, 'herramienta');
}
await Herramienta.update(req.params.id, req.session.user.company_id, updateData);
req.flash('success_msg', 'Herramienta actualizada exitosamente');
res.redirect('/admin/herramientas#tab-herramientas');
} catch (error) {
@@ -265,12 +278,18 @@ router.post('/herramientas/sets/create', isCompanyAdmin, async (req, res) => {
items = [herramientas_ids];
}
let foto_url = null;
if (req.files && req.files.foto) {
foto_url = await guardarFoto(req.files.foto, 'kit');
}
await HerramientaSet.create({
company_id: req.session.user.company_id,
nombre,
codigo: codigo || null,
descripcion: descripcion || null,
categoria: categoria || 'general'
categoria: categoria || 'general',
foto_url
}, items);
req.flash('success_msg', `Kit de herramientas "${nombre}" creado con ${items.length} instrumentos.`);
@@ -291,13 +310,19 @@ router.post('/herramientas/sets/edit/:id', isCompanyAdmin, async (req, res) => {
items = Array.isArray(herramientas_ids) ? herramientas_ids : (herramientas_ids ? [herramientas_ids] : []);
}
await HerramientaSet.update(req.params.id, req.session.user.company_id, {
const updateData = {
nombre,
codigo,
descripcion,
categoria,
is_active: is_active === '1' || is_active === 1 ? 1 : 0
}, items);
};
if (req.files && req.files.foto) {
updateData.foto_url = await guardarFoto(req.files.foto, 'kit');
}
await HerramientaSet.update(req.params.id, req.session.user.company_id, updateData, items);
req.flash('success_msg', 'Set / Kit actualizado exitosamente');
res.redirect('/admin/herramientas#tab-sets');
@@ -329,6 +354,11 @@ router.post('/herramientas/asignar', isCompanyAdmin, async (req, res) => {
return res.redirect('/admin/herramientas');
}
try {
let foto_entrega_url = null;
if (req.files && req.files.foto_entrega) {
foto_entrega_url = await guardarFoto(req.files.foto_entrega, 'entrega');
}
await HerramientaAsignacion.create({
company_id: req.session.user.company_id,
tecnico_id: parseInt(tecnico_id),
@@ -336,6 +366,7 @@ router.post('/herramientas/asignar', isCompanyAdmin, async (req, res) => {
herramienta_id: herramienta_id ? parseInt(herramienta_id) : null,
tipo_asignacion: tipo_asignacion || 'dotacion_fija',
observaciones_entrega: observaciones_entrega || 'Asignación administrativa de equipamiento',
foto_entrega_url,
asignado_por: req.session.user.id
});
req.flash('success_msg', 'Equipamiento asignado al técnico exitosamente');
@@ -351,9 +382,15 @@ router.post('/herramientas/asignar', isCompanyAdmin, async (req, res) => {
router.post('/herramientas/devolver/:id', isCompanyAdmin, async (req, res) => {
const { observaciones_devolucion, estado } = req.body;
try {
let foto_devolucion_url = null;
if (req.files && req.files.foto_devolucion) {
foto_devolucion_url = await guardarFoto(req.files.foto_devolucion, 'devolucion');
}
await HerramientaAsignacion.devolver(req.params.id, req.session.user.company_id, {
observaciones_devolucion: observaciones_devolucion || 'Devuelto conforme a bodega',
estado: estado || 'devuelto'
estado: estado || 'devuelto',
foto_devolucion_url
});
req.flash('success_msg', 'Devolución de herramientas registrada correctamente');
res.redirect('/admin/herramientas#tab-asignaciones');