using System.Globalization; using GozareshgirProgramManager.Application._Common.Interfaces; using GozareshgirProgramManager.Application._Common.Models; using GozareshgirProgramManager.Domain._Common; using Microsoft.EntityFrameworkCore; namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.ProjectBoardDetail; public record ProjectBoardDetailQuery(Guid SectionId) : IBaseQuery; public record ProjectBoardDetailResponse(List Users, string TotalTimeMinute,string RemainingTimeMinute ); public record ProjectBoardDetailUserResponse { public List Histories { get; init; } public string UserFullName { get; init; } public string SpentTimeMinute { get; init; } public long UserId { get; init; } } public record ProjectBoardDetailUserHistoryResponse { public string Date { get; init; } public string startTime { get; init; } public string EndTime { get; init; } public string TotalTimeMinute { get; init; } } public class ProjectBoardDetailQueryHandler : IBaseQueryHandler { private readonly IProgramManagerDbContext _programManagerDbContext; public ProjectBoardDetailQueryHandler(IProgramManagerDbContext programManagerDbContext) { _programManagerDbContext = programManagerDbContext; } public async Task> Handle(ProjectBoardDetailQuery request, CancellationToken cancellationToken) { var section = await _programManagerDbContext.TaskSections .Include(x => x.Activities) .Include(x=>x.AdditionalTimes) .FirstOrDefaultAsync(x => x.Id == request.SectionId, cancellationToken: cancellationToken); if (section == null) return OperationResult.NotFound("بخش مورد نظر یافت نشد"); var userIds = section.Activities.Select(x => x.UserId).Distinct().ToList(); var usersDict = await _programManagerDbContext.Users .Where(x => userIds.Contains(x.Id)) .ToDictionaryAsync(x => x.Id, x => x.FullName, cancellationToken); var totalActivityTimeSpan = section.Activities .Select(x => x.GetTimeSpent()) .Aggregate(TimeSpan.Zero, (sum, next) => sum.Add(next)); var finalTime = section.FinalEstimatedHours; var remainingTimeSpan = finalTime >= totalActivityTimeSpan ? TimeSpan.FromTicks(finalTime.Ticks - totalActivityTimeSpan.Ticks) : TimeSpan.Zero; var users = section.Activities.GroupBy(x => x.UserId).Select(x => { return new ProjectBoardDetailUserResponse() { UserId = x.Key, UserFullName = usersDict[x.Key], SpentTimeMinute = ((int)TimeSpan.FromTicks(x.Sum(h=>h.GetTimeSpent().Ticks)).TotalMinutes).ToString(CultureInfo.InvariantCulture), Histories = x.Select(h => new ProjectBoardDetailUserHistoryResponse() { Date = h.StartDate.ToFarsi(), startTime = h.StartDate.ToString("HH:mm"), EndTime = h.EndDate?.ToString("HH:mm") ?? "-", TotalTimeMinute = h.GetTimeSpent().TotalMinutes.ToString("F0",CultureInfo.InvariantCulture) }).ToList() }; }).ToList(); var response = new ProjectBoardDetailResponse(users, $"{(int)finalTime.TotalMinutes}", $"{(int)remainingTimeSpan.TotalMinutes:D2}"); return OperationResult.Success(response); } }