const db = require('../config/db'); const crypto = require('crypto'); class HerramientaAsignacion { static async findAll(companyId, filtros = {}) { let sql = ` SELECT tha.*, u.nombre as tecnico_nombre, u.email as tecnico_email, hs.nombre as set_nombre, hs.codigo as set_codigo, hs.foto_url as set_foto_url, h.nombre as herramienta_nombre, h.codigo as herramienta_codigo, h.foto_url as herramienta_foto_url, tv.titulo as visita_titulo, tv.ticket_id, t.asunto as ticket_asunto, adm.nombre as asignado_por_nombre FROM tecnico_herramientas_asignaciones tha INNER JOIN users u ON tha.tecnico_id = u.id LEFT JOIN herramientas_sets hs ON tha.set_id = hs.id LEFT JOIN herramientas h ON tha.herramienta_id = h.id LEFT JOIN ticket_visitas tv ON tha.ticket_visita_id = tv.id LEFT JOIN tickets t ON tv.ticket_id = t.id LEFT JOIN users adm ON tha.asignado_por = adm.id WHERE tha.company_id = ? `; const params = [companyId]; if (filtros.tecnico_id) { sql += ' AND tha.tecnico_id = ?'; params.push(filtros.tecnico_id); } if (filtros.estado) { sql += ' AND tha.estado = ?'; params.push(filtros.estado); } if (filtros.tipo_asignacion) { sql += ' AND tha.tipo_asignacion = ?'; params.push(filtros.tipo_asignacion); } sql += ' ORDER BY tha.id DESC'; const [rows] = await db.query(sql, params); return rows; } static async findByTecnico(companyId, tecnicoId) { return await this.findAll(companyId, { tecnico_id: tecnicoId }); } static async findById(id, companyId) { const [rows] = await db.query( `SELECT tha.*, u.nombre as tecnico_nombre, u.email as tecnico_email, hs.nombre as set_nombre, hs.codigo as set_codigo, hs.foto_url as set_foto_url, h.nombre as herramienta_nombre, h.codigo as herramienta_codigo, h.foto_url as herramienta_foto_url FROM tecnico_herramientas_asignaciones tha INNER JOIN users u ON tha.tecnico_id = u.id LEFT JOIN herramientas_sets hs ON tha.set_id = hs.id LEFT JOIN herramientas h ON tha.herramienta_id = h.id WHERE tha.id = ? AND tha.company_id = ?`, [id, companyId] ); return rows[0] || null; } static async findByToken(token) { if (!token) return null; const [rows] = await db.query( `SELECT tha.*, u.nombre as tecnico_nombre, u.email as tecnico_email, c.name as company_name, hs.nombre as set_nombre, hs.codigo as set_codigo, hs.foto_url as set_foto_url, h.nombre as herramienta_nombre, h.codigo as herramienta_codigo, h.foto_url as herramienta_foto_url, tv.titulo as visita_titulo, tv.ticket_id, t.asunto as ticket_asunto, adm.nombre as asignado_por_nombre FROM tecnico_herramientas_asignaciones tha INNER JOIN users u ON tha.tecnico_id = u.id INNER JOIN companies c ON tha.company_id = c.id LEFT JOIN herramientas_sets hs ON tha.set_id = hs.id LEFT JOIN herramientas h ON tha.herramienta_id = h.id LEFT JOIN ticket_visitas tv ON tha.ticket_visita_id = tv.id LEFT JOIN tickets t ON tv.ticket_id = t.id LEFT JOIN users adm ON tha.asignado_por = adm.id WHERE tha.qr_token = ?`, [token] ); if (!rows[0]) return null; const asig = rows[0]; if (asig.set_id) { const HerramientaSet = require('./HerramientaSet'); asig.herramientas = await HerramientaSet.getItems(asig.set_id); } else if (asig.herramienta_id) { const Herramienta = require('./Herramienta'); const tool = await Herramienta.findById(asig.herramienta_id, asig.company_id); asig.herramientas = tool ? [tool] : []; } else { asig.herramientas = []; } return asig; } static async create(data) { const { company_id, tecnico_id, set_id = null, herramienta_id = null, ticket_visita_id = null, tipo_asignacion = 'dotacion_fija', fecha_asignacion = new Date(), observaciones_entrega = null, foto_entrega_url = null, qr_token = null, asignado_por = null } = data; const finalQrToken = qr_token || crypto.randomBytes(12).toString('hex'); const [res] = await db.query( `INSERT INTO tecnico_herramientas_asignaciones (company_id, tecnico_id, set_id, herramienta_id, ticket_visita_id, tipo_asignacion, qr_token, fecha_asignacion, estado, observaciones_entrega, foto_entrega_url, asignado_por) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'asignado', ?, ?, ?)`, [company_id, tecnico_id, set_id, herramienta_id, ticket_visita_id, tipo_asignacion, finalQrToken, fecha_asignacion, observaciones_entrega, foto_entrega_url, asignado_por] ); return res.insertId; } static async devolver(id, companyId, { observaciones_devolucion = null, estado = 'devuelto', foto_devolucion_url = null }) { let sql = `UPDATE tecnico_herramientas_asignaciones SET estado = ?, fecha_devolucion = NOW(), observaciones_devolucion = ?`; const params = [estado, observaciones_devolucion]; if (foto_devolucion_url) { sql += ', foto_devolucion_url = ?'; params.push(foto_devolucion_url); } sql += ' WHERE id = ? AND company_id = ?'; params.push(id, companyId); await db.query(sql, params); } static async delete(id, companyId) { await db.query('DELETE FROM tecnico_herramientas_asignaciones WHERE id = ? AND company_id = ?', [id, companyId]); } } module.exports = HerramientaAsignacion;