import { DEFAULT_PAGE_SIZE, buildPaginatedResult, ok, type PaginationInput, type ReadonlyDB, } from "@tailor-platform/erp-kit/core"; import type { DB } from "../generated/kysely-tailordb"; type CompanyHolidayOrderByField = "holidayDate"; export interface ListCompanyHolidaysInput extends PaginationInput { /** Restricts results to a single HolidayCalendar. */ calendarId?: string; /** Restricts results to entries whose holidayDate falls within this calendar year. */ year?: number; /** Restricts results to entries whose holidayDate is on or after this date. */ startDate?: Date; /** Restricts results to entries whose holidayDate is on or before this date. */ endDate?: Date; } /** * Function: listCompanyHolidays * Description: Returns a paginated list of holiday-calendar entries, * optionally filtered by date range or year. Omitting a filter returns the * full calendar, paginated. Supports calendar browsing and admin review of * registered holidays. */ export async function run(db: ReadonlyDB, input: ListCompanyHolidaysInput) { const limit = input.limit ?? DEFAULT_PAGE_SIZE; const offset = input.offset ?? 0; const orderBy = input.orderBy ?? "id"; const orderDirection = input.orderDirection ?? "asc"; let query = db.selectFrom("CompanyHoliday").selectAll(); if (input.calendarId !== undefined) { query = query.where("calendarId", "=", input.calendarId); } if (input.year !== undefined) { const startOfYear = new Date(Date.UTC(input.year, 0, 1)); const startOfNextYear = new Date(Date.UTC(input.year + 1, 0, 1)); query = query .where("holidayDate", ">=", startOfYear) .where("holidayDate", "<", startOfNextYear); } if (input.startDate !== undefined) { query = query.where("holidayDate", ">=", input.startDate); } if (input.endDate !== undefined) { query = query.where("holidayDate", "<=", input.endDate); } const companyHolidays = await query .orderBy(orderBy, orderDirection) .limit(limit + 1) .offset(offset) .execute(); return ok(buildPaginatedResult(companyHolidays, limit)); }