feat: multi-module iteration
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user