diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/GetProjectsList/GetProjectListDto.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/GetProjectsList/GetProjectListDto.cs index 74a58946..7066148e 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/GetProjectsList/GetProjectListDto.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/GetProjectsList/GetProjectListDto.cs @@ -11,6 +11,8 @@ public record GetProjectListDto public bool HasFront { get; set; } public bool HasBackend { get; set; } public bool HasDesign { get; set; } + public int TotalHours { get; set; } + public int Minutes { get; set; } } diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/GetProjectsList/GetProjectsListQueryHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/GetProjectsList/GetProjectsListQueryHandler.cs index 1815c2bc..e79b7fe4 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/GetProjectsList/GetProjectsListQueryHandler.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/GetProjectsList/GetProjectsListQueryHandler.cs @@ -53,17 +53,19 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler p.CreationDate) .ToListAsync(cancellationToken); var result = new List(); - + foreach (var project in projects) { - var percentage = await CalculateProjectPercentage(project, cancellationToken); + var (percentage, totalTime) = await CalculateProjectPercentage(project, cancellationToken); result.Add(new GetProjectListDto { Id = project.Id, Name = project.Name, Level = ProjectHierarchyLevel.Project, ParentId = null, - Percentage = percentage + Percentage = percentage, + TotalHours = (int)totalTime.TotalHours, + Minutes = totalTime.Minutes, }); } @@ -86,14 +88,16 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler CalculateProjectPercentage(Project project, CancellationToken cancellationToken) + private async Task<(int Percentage, TimeSpan TotalTime)> CalculateProjectPercentage(Project project, CancellationToken cancellationToken) { // گرفتن تمام فازهای پروژه var phases = await _context.ProjectPhases @@ -219,20 +225,24 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler(); + var totalTime = TimeSpan.Zero; + foreach (var phase in phases) { - var phasePercentage = await CalculatePhasePercentage(phase, cancellationToken); + var (phasePercentage, phaseTime) = await CalculatePhasePercentage(phase, cancellationToken); phasePercentages.Add(phasePercentage); + totalTime += phaseTime; } - return phasePercentages.Any() ? (int)phasePercentages.Average() : 0; + var averagePercentage = phasePercentages.Any() ? (int)phasePercentages.Average() : 0; + return (averagePercentage, totalTime); } - private async Task CalculatePhasePercentage(ProjectPhase phase, CancellationToken cancellationToken) + private async Task<(int Percentage, TimeSpan TotalTime)> CalculatePhasePercentage(ProjectPhase phase, CancellationToken cancellationToken) { // گرفتن تمام تسک‌های فاز var tasks = await _context.ProjectTasks @@ -240,20 +250,24 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler(); + var totalTime = TimeSpan.Zero; + foreach (var task in tasks) { - var taskPercentage = await CalculateTaskPercentage(task, cancellationToken); + var (taskPercentage, taskTime) = await CalculateTaskPercentage(task, cancellationToken); taskPercentages.Add(taskPercentage); + totalTime += taskTime; } - return taskPercentages.Any() ? (int)taskPercentages.Average() : 0; + var averagePercentage = taskPercentages.Any() ? (int)taskPercentages.Average() : 0; + return (averagePercentage, totalTime); } - private async Task CalculateTaskPercentage(ProjectTask task, CancellationToken cancellationToken) + private async Task<(int Percentage, TimeSpan TotalTime)> CalculateTaskPercentage(ProjectTask task, CancellationToken cancellationToken) { // گرفتن تمام سکشن‌های تسک با activities var sections = await _context.TaskSections @@ -262,33 +276,39 @@ public class GetProjectsListQueryHandler : IBaseQueryHandler(); + var totalTime = TimeSpan.Zero; + foreach (var section in sections) { - var sectionPercentage = CalculateSectionPercentage(section); + var (sectionPercentage, sectionTime) = CalculateSectionPercentage(section); sectionPercentages.Add(sectionPercentage); + totalTime += sectionTime; } - return sectionPercentages.Any() ? (int)sectionPercentages.Average() : 0; + var averagePercentage = sectionPercentages.Any() ? (int)sectionPercentages.Average() : 0; + return (averagePercentage, totalTime); } - private static int CalculateSectionPercentage(TaskSection section) + private static (int Percentage, TimeSpan TotalTime) CalculateSectionPercentage(TaskSection section) { // محاسبه کل زمان تخمین زده شده (اولیه + اضافی) var totalEstimatedHours = section.FinalEstimatedHours.TotalHours; - if (totalEstimatedHours <= 0) - return 0; - // محاسبه کل زمان صرف شده از activities - var totalSpentHours = section.Activities.Sum(a => a.GetTimeSpent().TotalHours); + var totalSpentTime = TimeSpan.FromHours(section.Activities.Sum(a => a.GetTimeSpent().TotalHours)); + + if (totalEstimatedHours <= 0) + return (0, section.FinalEstimatedHours); + + var totalSpentHours = totalSpentTime.TotalHours; // محاسبه درصد (حداکثر 100%) var percentage = (totalSpentHours / totalEstimatedHours) * 100; - return Math.Min((int)Math.Round(percentage), 100); + return (Math.Min((int)Math.Round(percentage), 100), section.FinalEstimatedHours); } } diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectSetTimeDetails/ProjectSetTimeDetailsQueryHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectSetTimeDetails/ProjectSetTimeDetailsQueryHandler.cs index f57dd1c3..79271ee4 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectSetTimeDetails/ProjectSetTimeDetailsQueryHandler.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectSetTimeDetails/ProjectSetTimeDetailsQueryHandler.cs @@ -71,6 +71,8 @@ public class ProjectSetTimeDetailsQueryHandler InitialDescription = ts.InitialDescription ?? "", InitialHours = (int)ts.InitialEstimatedHours.TotalHours, InitialMinutes = ts.InitialEstimatedHours.Minutes, + UserId = ts.OriginalAssignedUserId, + SkillId = ts.SkillId, }; }).OrderBy(x=>x.SkillId).ToList(), task.Id,