const db = require("../config/db"); const Notification = require("../utils/notification.js"); class HistoryEntranceService { getHistoryEntrance(entrance_id) { return new Promise((res, rej) => { let sql = ` SELECT * FROM entrance_history WHERE entrance_history.entrance_id = '${entrance_id}' ORDER BY entrance_history.date_start `; db.all(sql, (err, rows) => { if (err) { console.error(err.message); return res(false); } else { let data = rows.map((row) => { return { "id": Number(row.id), "entrance_id": Number(row.entrance_id), "name": row.name, "group_id": Number(row.group_id), "sheep_id": Number(row.sheep_id), "working": Number(row.working) == 0 ? false : true, "date": { "start": Number(row.date_start), "end": row.date_end ? Number(row.date_end) : null } } }) return res(data); } }); }); } createHistoryEntrance(entrance_id, data) { return new Promise((res, rej) => { let sql = 'INSERT INTO entrance_history(entrance_id, name, date_start, group_id, sheep_id, working) VALUES (?, ?, ?, ?, ?, ?)'; db.run(sql, [ entrance_id, data.name, Math.floor(new Date(Date.now()).getTime()), Number(data.group_id), Number(data.sheep_id), 1 ], function (err) { if (err) { console.error(err.message); return res(false); } else if (this.changes === 0) { return res(false); } else { if (Number(data.sheep_id) > 0) { Notification.sendSheep({ sheep_id: Number(data.sheep_id), title: "Нова територія", body: "Вам призначено нову територію" }); } else if (Number(data.sheep_id) == 0 && Number(data.group_id) > 0) { Notification.sendGroup({ group_id: Number(data.group_id), title: "Нова територія", body: "Призначено нову групову територію" }); } res({ "create": "ok", "id": this.lastID }); } }); }); } updateHistoryEntrance(entrance_history_id) { return new Promise((res, rej) => { const endTime = Date.now(); // 🕒 Час завершення const entranceHistoryId = Number(entrance_history_id); // 🔧 Оновлюємо запис в entrance_history db.run( `UPDATE entrance_history SET date_end = ?, working = 0 WHERE id = ?`, [endTime, entranceHistoryId], function (err) { if (err || this.changes === 0) { console.error("❌ Помилка оновлення entrance_history:", err?.message); return res(false); } // 🏢 Отримуємо entrance_id db.get( `SELECT entrance_id FROM entrance_history WHERE id = ?`, [entranceHistoryId], (err, entrance) => { if (err || !entrance) { console.error("❌ Помилка отримання під’їзду:", err?.message); return res(false); } // 🧱 Отримуємо квартири db.all( `SELECT * FROM apartments WHERE entrance_id = ? ORDER BY id`, [entrance.entrance_id], (err, apartments) => { if (err) { console.error("❌ Помилка отримання квартир:", err.message); return res(false); } if (!apartments.length) { return res({ update: "ok", id: entranceHistoryId, inserted: 0 }); } const toUpdate = apartments.filter(a => ![2, 6, 0, null].includes(a.status)); // 📝 Готуємо вставку в історію const stmtInsert = db.prepare(` INSERT INTO apartments_history (sheep_id, apartments_id, status, description, created_at) VALUES (?, ?, ?, ?, ?) `); const stmtUpdate = db.prepare(` UPDATE apartments SET status = NULL, description = NULL, sheep_id = NULL, updated_at = ? WHERE id = ? `); let completed = 0; let inserted = 0; if (!toUpdate.length) { stmtInsert.finalize(); stmtUpdate.finalize(); return res({ update: "ok", id: entranceHistoryId, inserted: 0 }); } for (const apt of toUpdate) { // 🔄 Оновлюємо квартиру stmtUpdate.run([endTime, apt.id]); // 🪵 Вставляємо в історію stmtInsert.run( [apt.sheep_id, apt.id, apt.status, apt.description, endTime], (err) => { if (!err) inserted++; completed++; if (completed === toUpdate.length) { stmtInsert.finalize(); stmtUpdate.finalize(); return res({ update: "ok", id: entranceHistoryId, inserted, }); } } ); } } ); } ); } ); }); // return new Promise((res, rej) => { // console.log(Number(entrance_id)); // let sql = 'UPDATE entrance_history SET date_end = ?, working = ? WHERE id = ?'; // db.run(sql, [ // Math.floor(new Date(Date.now()).getTime()), // 0, // Number(entrance_id) // ], function(err) { // if (err) { // console.error(err.message); // return res(false); // } else if (this.changes === 0) { // return res(false); // } else { // res({ "update": "ok", "id": entrance_id }); // } // }); // }); } deleteHistoryEntrance(entrance_id) { return new Promise((res, rej) => { db.run('DELETE FROM entrance_history WHERE id = ?', [Number(entrance_id)], function (err) { if (err) { console.error(err.message); return res(false); } else if (this.changes === 0) { return res(false); } else { res({ "delete": "ok", "id": entrance_id }); } }); }); } } module.exports = new HistoryEntranceService();