Files
dyolink/backend/src/common/lab-case-due-date.ts

43 lines
1.3 KiB
TypeScript

import { LabTaskStatus } from '@prisma/client';
/** Parse YYYY-MM-DD (or ISO) into UTC midnight for that calendar day. */
export function parseDueDateInput(value?: string | null): Date | null {
if (value === undefined || value === null || value === '') {
return null;
}
const trimmed = value.trim();
if (!trimmed) return null;
const dateOnly = /^\d{4}-\d{2}-\d{2}$/.test(trimmed);
const parsed = dateOnly ? new Date(`${trimmed}T00:00:00.000Z`) : new Date(trimmed);
if (Number.isNaN(parsed.getTime())) {
throw new Error('Invalid due date');
}
if (dateOnly) {
return parsed;
}
const normalized = new Date(parsed);
normalized.setUTCHours(0, 0, 0, 0);
return normalized;
}
export function startOfUtcDay(date = new Date()): Date {
const d = new Date(date);
d.setUTCHours(0, 0, 0, 0);
return d;
}
export function isLabCaseOverdue(
dueDate: Date | null | undefined,
tasks: Array<{ status: LabTaskStatus }>,
): boolean {
if (!dueDate) return false;
const hasInProgress = tasks.some((task) => task.status === LabTaskStatus.IN_PROGRESS);
if (!hasInProgress) return false;
return dueDate < startOfUtcDay();
}
export function isLabCaseFullyCompleted(tasks: Array<{ status: LabTaskStatus }>): boolean {
return tasks.length > 0 && tasks.every((task) => task.status === LabTaskStatus.COMPLETED);
}