98 lines
3.8 KiB
TypeScript
98 lines
3.8 KiB
TypeScript
import { toDateTime } from "@app/shared/utils/time";
|
|
import pool from "../db";
|
|
import { LOARequest, LOAType } from '@app/shared/types/loa'
|
|
|
|
export async function getLoaTypes(): Promise<LOAType[]> {
|
|
return await pool.query('SELECT * FROM leave_of_absences_types;');
|
|
}
|
|
|
|
export async function getAllLOA(page = 1, pageSize = 20): Promise<LOARequest[]> {
|
|
const offset = (page - 1) * pageSize;
|
|
|
|
const sql = `
|
|
SELECT loa.*, members.name, t.name AS type_name
|
|
FROM leave_of_absences AS loa
|
|
LEFT JOIN members ON loa.member_id = members.id
|
|
LEFT JOIN leave_of_absences_types AS t ON loa.type_id = t.id
|
|
ORDER BY
|
|
CASE
|
|
WHEN loa.closed IS NULL
|
|
AND NOW() > COALESCE(loa.extended_till, loa.end_date) THEN 1
|
|
WHEN loa.closed IS NULL
|
|
AND NOW() BETWEEN loa.start_date AND COALESCE(loa.extended_till, loa.end_date) THEN 2
|
|
WHEN loa.closed IS NULL AND NOW() < loa.start_date THEN 3
|
|
WHEN loa.closed IS NOT NULL THEN 4
|
|
END,
|
|
loa.start_date DESC
|
|
LIMIT ? OFFSET ?;
|
|
`;
|
|
|
|
let res: LOARequest[] = await pool.query(sql, [pageSize, offset]) as LOARequest[];
|
|
return res;
|
|
}
|
|
|
|
export async function getUserLOA(userId: number): Promise<LOARequest[]> {
|
|
const result: LOARequest[] = await pool.query(`
|
|
SELECT loa.*, members.name, t.name AS type_name
|
|
FROM leave_of_absences AS loa
|
|
LEFT JOIN members ON loa.member_id = members.id
|
|
LEFT JOIN leave_of_absences_types AS t ON loa.type_id = t.id
|
|
WHERE member_id = ?
|
|
ORDER BY
|
|
CASE
|
|
WHEN loa.closed IS NULL
|
|
AND NOW() > COALESCE(loa.extended_till, loa.end_date) THEN 1
|
|
WHEN loa.closed IS NULL
|
|
AND NOW() BETWEEN loa.start_date AND COALESCE(loa.extended_till, loa.end_date) THEN 2
|
|
WHEN loa.closed IS NULL AND NOW() < loa.start_date THEN 3
|
|
WHEN loa.closed IS NOT NULL THEN 4
|
|
END,
|
|
loa.start_date DESC
|
|
`, [userId])
|
|
return result;
|
|
}
|
|
|
|
export async function getUserActiveLOA(userId: number): Promise<LOARequest[]> {
|
|
const sql = `SELECT *
|
|
FROM leave_of_absences
|
|
WHERE member_id = ?
|
|
AND closed IS NULL
|
|
AND UTC_TIMESTAMP() BETWEEN start_date AND end_date;`
|
|
const LOAData = await pool.query(sql, [userId]);
|
|
return LOAData;
|
|
}
|
|
|
|
export async function createNewLOA(data: LOARequest) {
|
|
const sql = `INSERT INTO leave_of_absences
|
|
(member_id, filed_date, start_date, end_date, type_id, reason)
|
|
VALUES (?, ?, ?, ?, ?, ?)`;
|
|
await pool.query(sql, [data.member_id, toDateTime(data.filed_date), toDateTime(data.start_date), toDateTime(data.end_date), data.type_id, data.reason])
|
|
return;
|
|
}
|
|
|
|
export async function closeLOA(id: number, closer: number) {
|
|
const sql = `UPDATE leave_of_absences
|
|
SET closed = 1,
|
|
closed_by = ?
|
|
WHERE leave_of_absences.id = ?`;
|
|
let out = await pool.query(sql, [closer, id]);
|
|
console.log(out);
|
|
return out;
|
|
}
|
|
|
|
export async function getLOAbyID(id: number): Promise<LOARequest> {
|
|
let res = await pool.query(`SELECT * FROM leave_of_absences WHERE id = ?`, [id]);
|
|
console.log(res);
|
|
if (res.length != 1)
|
|
throw new Error(`LOA with id ${id} not found`);
|
|
return res[0];
|
|
}
|
|
|
|
export async function setLOAExtension(id: number, extendTo: Date) {
|
|
let res = await pool.query(`UPDATE leave_of_absences
|
|
SET extended_till = ?
|
|
WHERE leave_of_absences.id = ? `, [toDateTime(extendTo), id]);
|
|
if (res.affectedRows != 1)
|
|
throw new Error(`Could not extend LOA`);
|
|
return res[0];
|
|
} |