UNPKG

phx-react

Version:

PHX REACT

119 lines 6.83 kB
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