47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
import type {
|
|
StaffAttendanceRecordViewModel,
|
|
StaffAttendanceRollup,
|
|
} from '@/business/staff-attendance/types';
|
|
|
|
export function countStaffAttendanceStatus(
|
|
records: readonly StaffAttendanceRecordViewModel[],
|
|
status: StaffAttendanceRecordViewModel['status'],
|
|
): number {
|
|
return records.filter((record) => record.status === status).length;
|
|
}
|
|
|
|
export function staffAttendanceRate(records: readonly StaffAttendanceRecordViewModel[]): number {
|
|
if (records.length === 0) {
|
|
return 0;
|
|
}
|
|
|
|
const presentOrLate = countStaffAttendanceStatus(records, 'present') + countStaffAttendanceStatus(records, 'late');
|
|
return Math.round((presentOrLate / records.length) * 100);
|
|
}
|
|
|
|
export function recentStaffAttendanceRecords(
|
|
records: readonly StaffAttendanceRecordViewModel[],
|
|
limit: number,
|
|
): readonly StaffAttendanceRecordViewModel[] {
|
|
return records.slice(0, limit);
|
|
}
|
|
|
|
export function buildStaffAttendanceRollups(
|
|
records: readonly StaffAttendanceRecordViewModel[],
|
|
): readonly StaffAttendanceRollup[] {
|
|
const staffNames = Array.from(new Set(records.map((record) => record.userName)));
|
|
|
|
return staffNames.map((name) => {
|
|
const staffRecords = records.filter((record) => record.userName === name);
|
|
const absent = countStaffAttendanceStatus(staffRecords, 'absent');
|
|
|
|
return {
|
|
name,
|
|
present: countStaffAttendanceStatus(staffRecords, 'present'),
|
|
late: countStaffAttendanceStatus(staffRecords, 'late'),
|
|
absent,
|
|
trend: absent > 2 ? 'down' : 'up',
|
|
};
|
|
});
|
|
}
|