Files
help_desk/models/HerramientaSet.js
T

110 lines
3.5 KiB
JavaScript

const db = require('../config/db');
class HerramientaSet {
static async findAll(companyId) {
const [sets] = await db.query(
`SELECT hs.*,
COUNT(hsi.id) as total_herramientas,
COALESCE(SUM(hsi.cantidad), 0) as total_items
FROM herramientas_sets hs
LEFT JOIN herramientas_set_items hsi ON hs.id = hsi.set_id
WHERE hs.company_id = ?
GROUP BY hs.id
ORDER BY hs.id DESC`,
[companyId]
);
for (const s of sets) {
s.herramientas = await this.getItems(s.id);
}
return sets;
}
static async findById(id, companyId) {
const [rows] = await db.query(
'SELECT * FROM herramientas_sets WHERE id = ? AND company_id = ?',
[id, companyId]
);
if (!rows[0]) return null;
const set = rows[0];
set.herramientas = await this.getItems(set.id);
return set;
}
static async getItems(setId) {
const [items] = await db.query(
`SELECT h.*, hsi.cantidad
FROM herramientas_set_items hsi
INNER JOIN herramientas h ON hsi.herramienta_id = h.id
WHERE hsi.set_id = ?
ORDER BY h.nombre ASC`,
[setId]
);
return items;
}
static async create(data, itemIds = []) {
const {
company_id,
nombre,
codigo = null,
descripcion = null,
categoria = 'general',
foto_url = null,
is_active = 1
} = data;
const [res] = await db.query(
`INSERT INTO herramientas_sets (company_id, nombre, codigo, descripcion, categoria, foto_url, is_active)
VALUES (?, ?, ?, ?, ?, ?, ?)`,
[company_id, nombre, codigo, descripcion, categoria, foto_url, is_active]
);
const setId = res.insertId;
if (Array.isArray(itemIds) && itemIds.length > 0) {
const values = itemIds.map(hId => [setId, parseInt(hId), 1]);
await db.query(
'INSERT INTO herramientas_set_items (set_id, herramienta_id, cantidad) VALUES ?',
[values]
);
}
return setId;
}
static async update(id, companyId, data, itemIds = null) {
const fields = [];
const values = [];
const allowed = ['nombre', 'codigo', 'descripcion', 'categoria', 'foto_url', 'is_active'];
for (const [key, val] of Object.entries(data)) {
if (allowed.includes(key)) {
fields.push(`${key} = ?`);
values.push(val);
}
}
if (fields.length > 0) {
values.push(id, companyId);
await db.query(`UPDATE herramientas_sets SET ${fields.join(', ')} WHERE id = ? AND company_id = ?`, values);
}
if (Array.isArray(itemIds)) {
await db.query('DELETE FROM herramientas_set_items WHERE set_id = ?', [id]);
if (itemIds.length > 0) {
const valuesItems = itemIds.map(hId => [id, parseInt(hId), 1]);
await db.query(
'INSERT INTO herramientas_set_items (set_id, herramienta_id, cantidad) VALUES ?',
[valuesItems]
);
}
}
}
static async delete(id, companyId) {
await db.query('DELETE FROM herramientas_sets WHERE id = ? AND company_id = ?', [id, companyId]);
}
}
module.exports = HerramientaSet;