Files
IT-Nexus/backend/src/models/OffboardingProtocol.js

239 lines
7.6 KiB
JavaScript

const { getDatabase } = require('../config/database');
class OffboardingProtocol {
/**
* Get all offboarding protocols with related information
*/
static getAll() {
const db = getDatabase();
const stmt = db.prepare(`
SELECT
op.*,
e.username as employee_username,
e.first_name as employee_first_name,
e.last_name as employee_last_name,
e.email as employee_email,
r.name as employee_role_name,
cu.username as created_by_username,
uu.username as updated_by_username
FROM offboarding_protocols op
INNER JOIN users e ON op.employee_user_id = e.id
INNER JOIN roles r ON e.role_id = r.id
LEFT JOIN users cu ON op.created_by_user_id = cu.id
LEFT JOIN users uu ON op.updated_by_user_id = uu.id
ORDER BY op.created_at DESC
`);
return stmt.all();
}
/**
* Get offboarding protocol by ID
*/
static getById(id) {
const db = getDatabase();
const stmt = db.prepare(`
SELECT
op.*,
e.username as employee_username,
e.first_name as employee_first_name,
e.last_name as employee_last_name,
e.email as employee_email,
e.department as employee_department,
r.name as employee_role_name,
cu.username as created_by_username,
uu.username as updated_by_username,
(SELECT d.id FROM onboarding_departments d
WHERE LOWER(d.name) LIKE LOWER('%' || COALESCE(e.department,'') || '%')
AND COALESCE(e.department,'') != ''
ORDER BY d.id LIMIT 1) as employee_department_id
FROM offboarding_protocols op
INNER JOIN users e ON op.employee_user_id = e.id
INNER JOIN roles r ON e.role_id = r.id
LEFT JOIN users cu ON op.created_by_user_id = cu.id
LEFT JOIN users uu ON op.updated_by_user_id = uu.id
WHERE op.id = ?
`);
return stmt.get(id);
}
/**
* Get offboarding protocols by status
*/
static getByStatus(status) {
const db = getDatabase();
const stmt = db.prepare(`
SELECT
op.*,
e.username as employee_username,
e.first_name as employee_first_name,
e.last_name as employee_last_name,
e.email as employee_email,
cu.username as created_by_username
FROM offboarding_protocols op
INNER JOIN users e ON op.employee_user_id = e.id
LEFT JOIN users cu ON op.created_by_user_id = cu.id
WHERE op.status = ?
ORDER BY op.created_at DESC
`);
return stmt.all(status);
}
/**
* Get offboarding protocols for an employee
*/
static getByEmployee(employeeUserId) {
const db = getDatabase();
const stmt = db.prepare(`
SELECT
op.*,
cu.username as created_by_username
FROM offboarding_protocols op
LEFT JOIN users cu ON op.created_by_user_id = cu.id
WHERE op.employee_user_id = ?
ORDER BY op.created_at DESC
`);
return stmt.all(employeeUserId);
}
/**
* Create a new offboarding protocol
*/
static create(protocolData) {
const db = getDatabase();
const stmt = db.prepare(`
INSERT INTO offboarding_protocols (
employee_user_id,
status,
exit_date,
checklist_data,
notes,
created_by_user_id
) VALUES (?, ?, ?, ?, ?, ?)
`);
const result = stmt.run(
protocolData.employee_user_id,
protocolData.status,
protocolData.exit_date,
protocolData.checklist_data || null,
protocolData.notes || null,
protocolData.created_by_user_id
);
return this.getById(result.lastInsertRowid);
}
/**
* Update offboarding protocol
*/
static update(id, protocolData, updatedByUserId) {
const db = getDatabase();
const fields = [];
const values = [];
if (protocolData.status !== undefined) {
fields.push('status = ?');
values.push(protocolData.status);
}
if (protocolData.exit_date !== undefined) {
fields.push('exit_date = ?');
values.push(protocolData.exit_date);
}
if (protocolData.completion_date !== undefined) {
fields.push('completion_date = ?');
values.push(protocolData.completion_date);
}
if (protocolData.checklist_data !== undefined) {
fields.push('checklist_data = ?');
values.push(protocolData.checklist_data);
}
if (protocolData.notes !== undefined) {
fields.push('notes = ?');
values.push(protocolData.notes);
}
if (protocolData.pdf_file_path !== undefined) {
fields.push('pdf_file_path = ?');
values.push(protocolData.pdf_file_path);
}
fields.push('updated_by_user_id = ?');
fields.push('updated_at = CURRENT_TIMESTAMP');
values.push(updatedByUserId, id);
const stmt = db.prepare(`
UPDATE offboarding_protocols
SET ${fields.join(', ')}
WHERE id = ?
`);
stmt.run(...values);
return this.getById(id);
}
/**
* Update checklist data
*/
static updateChecklist(id, checklistData, updatedByUserId) {
const db = getDatabase();
const stmt = db.prepare(`
UPDATE offboarding_protocols
SET checklist_data = ?,
updated_by_user_id = ?,
updated_at = CURRENT_TIMESTAMP
WHERE id = ?
`);
stmt.run(checklistData, updatedByUserId, id);
return this.getById(id);
}
/**
* Update PDF file path
*/
static updatePdfPath(id, pdfFilePath, updatedByUserId) {
const db = getDatabase();
const stmt = db.prepare(`
UPDATE offboarding_protocols
SET pdf_file_path = ?,
updated_by_user_id = ?,
updated_at = CURRENT_TIMESTAMP
WHERE id = ?
`);
stmt.run(pdfFilePath, updatedByUserId, id);
return this.getById(id);
}
/**
* Delete offboarding protocol
*/
static delete(id) {
const db = getDatabase();
const stmt = db.prepare('DELETE FROM offboarding_protocols WHERE id = ?');
const result = stmt.run(id);
return result.changes > 0;
}
/**
* Get statistics
*/
static getStatistics() {
const db = getDatabase();
const totalStmt = db.prepare('SELECT COUNT(*) as total FROM offboarding_protocols');
const pendingStmt = db.prepare("SELECT COUNT(*) as pending FROM offboarding_protocols WHERE status = 'pending'");
const inProgressStmt = db.prepare("SELECT COUNT(*) as in_progress FROM offboarding_protocols WHERE status = 'in_progress'");
const completedStmt = db.prepare("SELECT COUNT(*) as completed FROM offboarding_protocols WHERE status = 'completed'");
return {
total: totalStmt.get().total,
pending: pendingStmt.get().pending,
in_progress: inProgressStmt.get().in_progress,
completed: completedStmt.get().completed
};
}
}
module.exports = OffboardingProtocol;