import { buildPaginatedResult, DEFAULT_PAGE_SIZE, err, ok, type PaginationInput, type ReadonlyDB, } from "@tailor-platform/erp-kit/core"; import type { DB } from "../generated/kysely-tailordb"; import { InvalidQueryParamsError } from "../lib/errors.generated"; export interface ListPunchesByOccurredDateInput extends PaginationInput { occurredDate: Date; } /** * Function: listPunchesByOccurredDate * Description: Lists all TimeClockEvents on a given occurred date, raw and * pre-day-breaker, paginated. Filters by the calendar date portion of * occurredAt, not by any derived workDate — no day-breaker logic is applied * at this layer. Includes events across all Assignments and sources. */ export async function run(db: ReadonlyDB, input: ListPunchesByOccurredDateInput) { if (!input.occurredDate || Number.isNaN(input.occurredDate.getTime())) { return err(new InvalidQueryParamsError("occurredDate")); } const startOfDay = new Date( Date.UTC( input.occurredDate.getUTCFullYear(), input.occurredDate.getUTCMonth(), input.occurredDate.getUTCDate(), ), ); const startOfNextDay = new Date(startOfDay.getTime() + 24 * 60 * 60 * 1000); const limit = input.limit ?? DEFAULT_PAGE_SIZE; const offset = input.offset ?? 0; const orderBy = input.orderBy ?? "id"; const orderDirection = input.orderDirection ?? "asc"; const punches = await db .selectFrom("TimeClockEvent") .selectAll() .where("occurredAt", ">=", startOfDay) .where("occurredAt", "<", startOfNextDay) .orderBy(orderBy, orderDirection) .limit(limit + 1) .offset(offset) .execute(); return ok(buildPaginatedResult(punches, limit)); }