import { DayOfWeek, type DeskRule, type DeskRuleCondition, type DetailedAttendanceHour } from '../types/desk.ts' const dayOfWeekByIndex = [ DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Saturday, ] as const export function normalizeDeskRuleConditions( rule: Pick, ): Array { if (rule.conditions) { return rule.conditions } if (rule.property && rule.relation && rule.values) { return [ { property: rule.property, relation: rule.relation, values: rule.values, }, ] } return [] } export function getDayOfWeek(value: Date): DayOfWeek { return dayOfWeekByIndex[value.getDay()] } export function matchesAttendanceHourQueue(attendanceHour: DetailedAttendanceHour, queueIdOrName: string): boolean { return ( attendanceHour.attendanceHour.isMain || attendanceHour.queues.some((queue) => queue.id === queueIdOrName || queue.description === queueIdOrName) ) } export function isOnAttendanceTime(attendanceHour: DetailedAttendanceHour, value: Date): boolean { const isInsideOffTime = attendanceHour.attendanceHourOffItems.some((offItem) => { const startDate = new Date(offItem.startDate) const endDate = new Date(offItem.endDate) return value.getTime() >= startDate.getTime() && value.getTime() <= endDate.getTime() }) if (isInsideOffTime) { return false } const todaySchedule = attendanceHour.attendanceHourScheduleItems.find( (schedule) => schedule.dayOfWeek === getDayOfWeek(value), ) if (!todaySchedule) { return false } const startTime = applyTime(value, todaySchedule.startTime) const endTime = applyTime(value, todaySchedule.endTime) return value.getTime() >= startTime.getTime() && value.getTime() <= endTime.getTime() } function applyTime(value: Date, time: string): Date { const [hours, minutes] = time.split(':') const date = new Date(value) date.setHours(Number(hours)) date.setMinutes(Number(minutes)) date.setSeconds(0) date.setMilliseconds(0) return date }