293 lines
9.5 KiB
JavaScript
293 lines
9.5 KiB
JavaScript
const { getDatabase } = require('../config/database');
|
|
|
|
class OnboardingProtocol {
|
|
/**
|
|
* Get all onboarding 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_sys_first_name,
|
|
e.last_name as employee_sys_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 onboarding_protocols op
|
|
LEFT JOIN users e ON op.employee_user_id = e.id
|
|
LEFT 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 onboarding 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_sys_first_name,
|
|
e.last_name as employee_sys_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 onboarding_protocols op
|
|
LEFT JOIN users e ON op.employee_user_id = e.id
|
|
LEFT 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 onboarding 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 onboarding_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 onboarding protocols for an employee
|
|
*/
|
|
static getByEmployee(employeeUserId) {
|
|
const db = getDatabase();
|
|
const stmt = db.prepare(`
|
|
SELECT
|
|
op.*,
|
|
cu.username as created_by_username
|
|
FROM onboarding_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 onboarding protocol
|
|
*/
|
|
static create(protocolData) {
|
|
const db = getDatabase();
|
|
const stmt = db.prepare(`
|
|
INSERT INTO onboarding_protocols (
|
|
employee_user_id,
|
|
emp_first_name,
|
|
emp_last_name,
|
|
emp_private_email,
|
|
emp_phone,
|
|
emp_address,
|
|
department,
|
|
position,
|
|
work_location,
|
|
hours_model,
|
|
vacation_model,
|
|
dept_contacts,
|
|
status,
|
|
start_date,
|
|
checklist_data,
|
|
notes,
|
|
created_by_user_id
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
`);
|
|
|
|
const result = stmt.run(
|
|
protocolData.employee_user_id || null,
|
|
protocolData.emp_first_name || null,
|
|
protocolData.emp_last_name || null,
|
|
protocolData.emp_private_email || null,
|
|
protocolData.emp_phone || null,
|
|
protocolData.emp_address || null,
|
|
protocolData.department || null,
|
|
protocolData.position || null,
|
|
protocolData.work_location || null,
|
|
protocolData.hours_model || null,
|
|
protocolData.vacation_model || null,
|
|
protocolData.dept_contacts || null,
|
|
protocolData.status,
|
|
protocolData.start_date,
|
|
protocolData.checklist_data || null,
|
|
protocolData.notes || null,
|
|
protocolData.created_by_user_id
|
|
);
|
|
|
|
return this.getById(result.lastInsertRowid);
|
|
}
|
|
|
|
/**
|
|
* Update onboarding protocol
|
|
*/
|
|
static update(id, protocolData, updatedByUserId) {
|
|
const db = getDatabase();
|
|
|
|
const fields = [];
|
|
const values = [];
|
|
|
|
const personalFields = ['emp_first_name', 'emp_last_name', 'emp_private_email', 'emp_phone',
|
|
'emp_address', 'department', 'position', 'work_location', 'hours_model', 'vacation_model',
|
|
'dept_contacts', 'employee_user_id'];
|
|
for (const f of personalFields) {
|
|
if (protocolData[f] !== undefined) {
|
|
fields.push(`${f} = ?`);
|
|
values.push(protocolData[f]);
|
|
}
|
|
}
|
|
|
|
if (protocolData.status !== undefined) {
|
|
fields.push('status = ?');
|
|
values.push(protocolData.status);
|
|
}
|
|
if (protocolData.start_date !== undefined) {
|
|
fields.push('start_date = ?');
|
|
values.push(protocolData.start_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 onboarding_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 onboarding_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 onboarding_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 onboarding protocol
|
|
*/
|
|
static delete(id) {
|
|
const db = getDatabase();
|
|
const stmt = db.prepare('DELETE FROM onboarding_protocols WHERE id = ?');
|
|
const result = stmt.run(id);
|
|
return result.changes > 0;
|
|
}
|
|
|
|
/**
|
|
* Set confirm token for employee confirmation email
|
|
*/
|
|
static setConfirmToken(id, token) {
|
|
const db = getDatabase();
|
|
db.prepare('UPDATE onboarding_protocols SET confirm_token = ? WHERE id = ?').run(token, id);
|
|
}
|
|
|
|
/**
|
|
* Get protocol by confirm token (public, no auth)
|
|
*/
|
|
static getByConfirmToken(token) {
|
|
const db = getDatabase();
|
|
return db.prepare('SELECT * FROM onboarding_protocols WHERE confirm_token = ?').get(token);
|
|
}
|
|
|
|
/**
|
|
* Mark employee confirmation
|
|
*/
|
|
static confirmByToken(token) {
|
|
const db = getDatabase();
|
|
const result = db.prepare(
|
|
`UPDATE onboarding_protocols SET employee_confirmed_at = CURRENT_TIMESTAMP, status = 'completed', confirm_token = NULL WHERE confirm_token = ?`
|
|
).run(token);
|
|
return result.changes > 0;
|
|
}
|
|
|
|
/**
|
|
* Get statistics
|
|
*/
|
|
static getStatistics() {
|
|
const db = getDatabase();
|
|
|
|
const totalStmt = db.prepare('SELECT COUNT(*) as total FROM onboarding_protocols');
|
|
const pendingStmt = db.prepare("SELECT COUNT(*) as pending FROM onboarding_protocols WHERE status = 'pending'");
|
|
const inProgressStmt = db.prepare("SELECT COUNT(*) as in_progress FROM onboarding_protocols WHERE status = 'in_progress'");
|
|
const completedStmt = db.prepare("SELECT COUNT(*) as completed FROM onboarding_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 = OnboardingProtocol;
|