import { DayExpensesDto, WeekDto, DetailedShifts, TimesheetPeriodDto } from "./dtos/timesheet-period.dto"; import { ExpenseRow, ExpensesAmount, ShiftRow } from "./timesheet.types"; import { addDays, shortDate, toNum, upper } from "./timesheet.helpers"; import { Prisma } from "@prisma/client"; //mappers export const mapShiftRow = (shift: { date: Date; start_time: Date; end_time: Date; comment?: string | null; is_approved: boolean; is_remote: boolean; bank_code: { type: string }; }): ShiftRow => ({ date: shift.date, start_time: shift.start_time, end_time: shift.end_time, comment: shift.comment ?? '', is_approved: shift.is_approved, is_remote: shift.is_remote, type: upper(shift.bank_code.type), }); export const mapExpenseRow = (expense: { date: Date; amount: Prisma.Decimal | number | null; mileage: Prisma.Decimal | number | null; comment?: string | null; is_approved: boolean; supervisor_comment?: string|null; bank_code: { type: string }, }): ExpenseRow => ({ date: expense.date, amount: toNum(expense.amount), mileage: toNum(expense.mileage), comment: expense.comment ?? '', is_approved: expense.is_approved, supervisor_comment: expense.supervisor_comment ?? '', type: upper(expense.bank_code.type), }); // Factories export function makeEmptyDayExpenses(): DayExpensesDto { return { expenses: [], total_expense: -1, total_mileage: -1, }; } export function makeEmptyWeek(week_start: Date): WeekDto { const make_empty_shifts = (offset: number): DetailedShifts => ({ shifts: [], regular_hours: 0, evening_hours: 0, emergency_hours: 0, overtime_hours: 0, comment: '', short_date: shortDate(addDays(week_start, offset)), break_durations: 0, }); return { is_approved: true, shifts: { sun: make_empty_shifts(0), mon: make_empty_shifts(1), tue: make_empty_shifts(2), wed: make_empty_shifts(3), thu: make_empty_shifts(4), fri: make_empty_shifts(5), sat: make_empty_shifts(6), }, expenses: { sun: makeEmptyDayExpenses(), mon: makeEmptyDayExpenses(), tue: makeEmptyDayExpenses(), wed: makeEmptyDayExpenses(), thu: makeEmptyDayExpenses(), fri: makeEmptyDayExpenses(), sat: makeEmptyDayExpenses(), }, }; } export function makeEmptyPeriod(): TimesheetPeriodDto { return { weeks: [makeEmptyWeek(new Date()), makeEmptyWeek(new Date())], employee_full_name: '' }; } export const makeAmounts = (): ExpensesAmount => ({ expense: 0, mileage: 0, });