43 lines
1.3 KiB
TypeScript
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);
|
|
}
|