// import { NotFoundException } from "@nestjs/common"; // export function overlaps( // a_start_ms: number, // a_end_ms: number, // b_start_ms: number, // b_end_ms: number, // ): boolean { // return a_start_ms < b_end_ms && b_start_ms < a_end_ms; // } // export function resolveBankCodeByType(type: string): Promise { // const bank = this.prisma.bankCodes.findFirst({ // where: { type }, // select: { id: true }, // }); // if (!bank) { // throw new NotFoundException({ error_code: 'SHIFT_TYPE_UNKNOWN', message: `unknown shift type: ${type}` }); // } // return bank.id; // } // export function normalizeShiftPayload(payload: { // date: string, // start_time: string, // end_time: string, // type: string, // is_remote: boolean, // is_approved: boolean, // comment?: string | null, // }) { // //normalize shift's infos // const date = payload.date?.trim(); // const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(date ?? ''); // if (!m) throw new Error(`Invalid date format (expected YYYY-MM-DD): "${payload.date}"`); // const year = Number(m[1]), mo = Number(m[2]), d = Number(m[3]); // const asLocalDateOn = (input: string): Date => { // // HH:mm ? // const hm = /^(\d{2}):(\d{2})$/.exec((input ?? '').trim()); // if (hm) return new Date(year, mo - 1, d, Number(hm[1]), Number(hm[2]), 0, 0); // const iso = new Date(input); // if (isNaN(iso.getTime())) throw new Error(`Invalid time: "${input}"`); // return new Date(year, mo - 1, d, iso.getHours(), iso.getMinutes(), iso.getSeconds(), iso.getMilliseconds()); // }; // const start_time = asLocalDateOn(payload.start_time); // const end_time = asLocalDateOn(payload.end_time); // const type = (payload.type || '').trim().toUpperCase(); // const is_remote = payload.is_remote; // const is_approved = payload.is_approved; // //normalize comment // const trimmed = typeof payload.comment === 'string' ? payload.comment.trim() : null; // const comment = trimmed && trimmed.length > 0 ? trimmed : null; // return { date, start_time, end_time, type, is_remote, is_approved, comment }; // }