From 582da511c67ebdd198de92797cc2c7b52d5a3537 Mon Sep 17 00:00:00 2001 From: mahan Date: Thu, 1 Jan 2026 19:25:28 +0330 Subject: [PATCH] feat: add progress percentage calculation to task sections --- .../Projects/DTOs/ProjectHierarchyDtos.cs | 1 + .../Extensions/ProjectMappingExtensions.cs | 2 ++ .../ProjectAgg/Entities/TaskSection.cs | 21 +++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/DTOs/ProjectHierarchyDtos.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/DTOs/ProjectHierarchyDtos.cs index 3cbc8cec..4a3d9294 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/DTOs/ProjectHierarchyDtos.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/DTOs/ProjectHierarchyDtos.cs @@ -89,6 +89,7 @@ public class ProjectSectionDto public TimeSpan FinalEstimatedHours { get; set; } public TimeSpan TotalTimeSpent { get; set; } + public double ProgressPercentage { get; set; } public bool IsCompleted { get; set; } public bool IsInProgress { get; set; } diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Extensions/ProjectMappingExtensions.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Extensions/ProjectMappingExtensions.cs index 67ce006e..2c689cad 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Extensions/ProjectMappingExtensions.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Extensions/ProjectMappingExtensions.cs @@ -166,6 +166,7 @@ public static class ProjectMappingExtensions CreationDate = section.CreationDate, FinalEstimatedHours = section.FinalEstimatedHours, TotalTimeSpent = section.GetTotalTimeSpent(), + ProgressPercentage = section.GetProgressPercentage(), IsCompleted = section.IsCompleted(), IsInProgress = section.IsInProgress(), Activities = section.Activities.Select(a => a.ToDto()).ToList(), @@ -188,6 +189,7 @@ public static class ProjectMappingExtensions CreationDate = section.CreationDate, FinalEstimatedHours = section.FinalEstimatedHours, TotalTimeSpent = section.GetTotalTimeSpent(), + ProgressPercentage = section.GetProgressPercentage(), IsCompleted = section.IsCompleted(), IsInProgress = section.IsInProgress() // No activities or additional times for summary diff --git a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/TaskSection.cs b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/TaskSection.cs index 7209dd00..e506d173 100644 --- a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/TaskSection.cs +++ b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/TaskSection.cs @@ -157,6 +157,27 @@ public class TaskSection : EntityBase return TimeSpan.FromTicks(_activities.Sum(a => a.GetTimeSpent().Ticks)); } + /// + /// محاسبه درصد پیشرفت بر اساس زمان مصرف شده به تایم برآورد شده + /// اگر وضعیت Completed باشد، همیشه 100 درصد برمی‌گرداند + /// + public double GetProgressPercentage() + { + // اگر تسک کامل شده، همیشه 100 درصد + if (Status == TaskSectionStatus.Completed) + return 100.0; + + // اگر تایم برآورد شده صفر است، درصد صفر است + if (FinalEstimatedHours.TotalHours <= 0) + return 0.0; + + var timeSpent = GetTotalTimeSpent(); + var percentage = (timeSpent.TotalHours / FinalEstimatedHours.TotalHours) * 100.0; + + // محدود کردن درصد به 100 (در صورتی که زمان مصرف شده بیشتر از تخمین باشد) + return Math.Min(percentage, 100.0); + } + public bool IsCompleted() { return Status == TaskSectionStatus.Completed;