phx-react
Version:
PHX REACT
119 lines • 6.83 kB
JavaScript
import { queryAttendanceCode, queryShiftAndExplanationConfig } from '../../../query/explannation';
import { LIST_DAY_OF_WEEK } from '../../../utils/constants';
import { PHXClientQueryV3 } from '../GRPC/PHXGrpcClientV3';
import PHXFuncGetLoggedInfo from '../getLoginInfo';
// Tính số giờ làm việc thực tế
function getDurationTime(timeCheckin, // "07:30:00"
timeCheckout, // "17:30:00"
lunchBreakStart, // "12:00:00"
lunchBreakEnd) {
if (!timeCheckin || !timeCheckout)
return 0;
const baseDate = new Date(); // mốc ngày bất kỳ (hôm nay)
baseDate.setHours(0, 0, 0, 0);
const parseTimeToDate = (timeStr) => {
const [h, m, s] = timeStr.split(':').map(Number);
const d = new Date(baseDate);
d.setHours(h, m, s || 0, 0);
return d;
};
const start = parseTimeToDate(timeCheckin);
const end = parseTimeToDate(timeCheckout);
let totalMinutes = Math.floor((end.getTime() - start.getTime()) / (1000 * 60));
if (lunchBreakStart && lunchBreakEnd) {
const breakStart = parseTimeToDate(lunchBreakStart);
const breakEnd = parseTimeToDate(lunchBreakEnd);
// Tính phần giao giữa thời gian làm việc và nghỉ trưa
const overlapStart = new Date(Math.max(start.getTime(), breakStart.getTime()));
const overlapEnd = new Date(Math.min(end.getTime(), breakEnd.getTime()));
const breakDurationMinutes = Math.max(0, (overlapEnd.getTime() - overlapStart.getTime()) / (1000 * 60));
totalMinutes -= breakDurationMinutes;
}
// Làm tròn số phút
const totalMinuteCeils = Math.ceil(totalMinutes);
const totalHours = totalMinuteCeils / 60;
return totalHours;
}
export default async function PHXAllowExplanation({ request_code, work_date, start_at, end_at, attendance_code_id, }) {
var _a, _b, _c, _d, _e, _f, _g, _h;
try {
const isCheckValidateTimeInput = Boolean(attendance_code_id && start_at && end_at);
const userInfo = PHXFuncGetLoggedInfo();
// Id của người tạo đơn
const userLoginId = userInfo === null || userInfo === void 0 ? void 0 : userInfo.id;
const school_id = userInfo === null || userInfo === void 0 ? void 0 : userInfo.school_id;
// Lấy ra các ngày làm việc trong tuần và config giới hạn tạo đơn giải trình
const { data = {} } = await PHXClientQueryV3({
query: queryShiftAndExplanationConfig,
variables: { school_id, user_id: userLoginId },
});
const isHasData = ((_a = data.hrm_checkin_hrm_checkin_shift_config) === null || _a === void 0 ? void 0 : _a.length) > 0 &&
((_b = data.hrm_checkin_explanation_config) === null || _b === void 0 ? void 0 : _b.length) > 0 &&
((_c = data.users) === null || _c === void 0 ? void 0 : _c.length) > 0;
// Không có data sẽ trả về false luôn
if (!isHasData)
return false;
const { hrm_checkin_explanation_config = [], hrm_checkin_hrm_checkin_shift_config = [], users = [] } = data;
// Lấy ra danh sách các ngày đi làm theo phòng ban
const staffDepartmentData = ((_d = users[0]) === null || _d === void 0 ? void 0 : _d.department_users) || [];
const staffDepartmentId = ((_e = staffDepartmentData[0]) === null || _e === void 0 ? void 0 : _e.department_id) || 0;
// Số ngày giới hạn giải trình (sau bao nhiêu ngày)
const limitTimeCreate = (_f = hrm_checkin_explanation_config.find((item) => { var _a; return ((_a = item.approval_type) === null || _a === void 0 ? void 0 : _a.code) === request_code || item.request_type_id === null; })) === null || _f === void 0 ? void 0 : _f.limit_time_create;
// Tìm xem checkin config của phòng ban đó xem đi làm những ngày nào
const dataShiftConfig = hrm_checkin_hrm_checkin_shift_config.find((configData) => configData.department_id === staffDepartmentId || configData.department_id === null) || {};
// Nếu check validate input date ta sẽ xử lý ở đây
if (isCheckValidateTimeInput) {
// Lấy số giờ làm việc quy định của mã muốn giải trình
const { data: codeData = {} } = await PHXClientQueryV3({
query: queryAttendanceCode,
variables: { id: attendance_code_id },
});
const workTimeExplanation = Number(((_h = (_g = codeData.hrm_checkin_attendance_code) === null || _g === void 0 ? void 0 : _g[0]) === null || _h === void 0 ? void 0 : _h.work_time) || 0);
// Nếu ngày giải trình k có workTime auto return true
if (!workTimeExplanation)
return true;
// Lấy số giờ nhập trừ đi nghỉ trưa nếu có
const { break_start, break_end, allow_break_time } = dataShiftConfig;
// Kiểm tra xem có giờ nghỉ trưa hay không
const isHasBreakTime = Boolean(allow_break_time && break_start && break_end);
const totalWorkingReal = isHasBreakTime
? getDurationTime(start_at, end_at, break_start, break_end)
: getDurationTime(start_at, end_at);
return totalWorkingReal >= workTimeExplanation;
}
else {
// nếu không giới hạn thời gian tạo đơn return true luôn
if (!limitTimeCreate)
return true;
const { applicable_days = [] } = dataShiftConfig;
// helper: convert "2025-08-25" -> Date (00:00)
const parseDate = (dateStr) => {
const [y, m, d] = dateStr.split('-').map(Number);
return new Date(y, m - 1, d);
};
const getDayName = (date) => LIST_DAY_OF_WEEK[date.getDay()];
const workDate = parseDate(work_date);
const today = new Date();
const currentDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
// nếu work_date > hôm nay thì không hợp lệ
if (workDate > currentDate)
return false;
let workingDaysPassed = 0;
const d = new Date(workDate);
// duyệt từ ngày sau workDate tới currentDate
while (d < currentDate) {
d.setDate(d.getDate() + 1);
if (applicable_days.includes(getDayName(d))) {
workingDaysPassed++;
}
}
// chỉ hợp lệ nếu số ngày làm việc đã qua <= limit_time_create
return workingDaysPassed <= Number(limitTimeCreate);
}
}
catch (error) {
console.log(error, 'error');
return false;
}
}
//# sourceMappingURL=checkAllowExplanation.js.map