export type DevPlanTaskStatus = 'TODO' | 'DEVELOPED' | 'RELEASED'; export type DevPlanVersionStatus = 'PENDING' | 'IN_PROGRESS' | 'TESTING' | 'RELEASED'; export function computeDurationMinutes( devStartedAt: Date | null | undefined, devCompletedAt: Date | null | undefined, ): number | null { if (!devStartedAt || !devCompletedAt) return null; const ms = devCompletedAt.getTime() - devStartedAt.getTime(); if (ms < 0) return null; return Math.round(ms / 60000); } export function versionStatusTimestamps( prev: DevPlanVersionStatus, next: DevPlanVersionStatus, current: { devStartedAt?: Date | null; devCompletedAt?: Date | null; releasedAt?: Date | null; }, ): { devStartedAt?: Date | null; devCompletedAt?: Date | null; releasedAt?: Date | null; durationMinutes?: number | null; } { const patch: { devStartedAt?: Date | null; devCompletedAt?: Date | null; releasedAt?: Date | null; durationMinutes?: number | null; } = {}; const now = new Date(); if (next === 'IN_PROGRESS' && !current.devStartedAt) { patch.devStartedAt = now; } if (next === 'TESTING' && !current.devCompletedAt) { patch.devCompletedAt = now; } if (next === 'RELEASED' && !current.releasedAt) { patch.releasedAt = now; } const started = patch.devStartedAt ?? current.devStartedAt ?? null; const completed = patch.devCompletedAt ?? current.devCompletedAt ?? null; const duration = computeDurationMinutes(started, completed); if (duration != null) patch.durationMinutes = duration; void prev; return patch; } export function taskCompletedAtOnStatus( prev: DevPlanTaskStatus, next: DevPlanTaskStatus, currentCompletedAt?: Date | null, ): Date | null | undefined { if (next === 'RELEASED' && !currentCompletedAt) return new Date(); void prev; return undefined; }