in src/service/ProgressCalculationService.ts [142:163]
function calculateProgress(startDate: Date, endDate: Date, subtasks: number[]): [storyProgress: number, status: Styles] {
const today = new Date();
const totalDays = dateDiff(startDate, endDate);
const remainingDays = dateDiff(today, endDate) > 0 ? dateDiff(today, endDate) : 0;
const totalSubtasks = subtasks.length;
const completedSubtasks = subtasks.filter((t) => t === 100).length;
const subtaskProgress = totalSubtasks > 0 ? completedSubtasks / totalSubtasks : 0;
const timelineProgress = totalDays > 0 ? (remainingDays / totalDays) : 0;
let status: ItemStatus;
if (subtaskProgress === 0) {
status = ItemStatus.NOT_STARTED;
}
if (subtaskProgress >= (1 - timelineProgress * 1.25)) {
status = ItemStatus.ON_TRACK;
} else if ((subtaskProgress >= (1 - timelineProgress * 1.5)) && (subtaskProgress < (1 - timelineProgress * 1.25))) {
status = ItemStatus.AT_RISK;
} else {
status = ItemStatus.OFF_TRACK;
} return [parseInt((subtaskProgress * 100).toFixed(2)), { ...statusStyles[status], name: status }];
}