using CMSMicroservice.Protobuf.Protos.Commission; namespace FrontOffice.BFF.Application.CommissionCQ.Queries.GetMyCommissionPayouts; public class GetMyCommissionPayoutsQueryHandler : IRequestHandler { private readonly IApplicationContractContext _context; private readonly ICurrentUserService _currentUserService; public GetMyCommissionPayoutsQueryHandler( IApplicationContractContext context, ICurrentUserService currentUserService) { _context = context; _currentUserService = currentUserService; } public async Task Handle(GetMyCommissionPayoutsQuery request, CancellationToken cancellationToken) { var userId = _currentUserService.UserId ?? throw new UnauthorizedAccessException("User not authenticated"); // Fixed: Use PageIndex (0-based) not PageNumber (1-based), and WeekNumber is string var cmsRequest = new GetUserCommissionPayoutsRequest { UserId = userId, // long? type in proto - just assign directly PageIndex = Math.Max(0, request.PageNumber - 1), // Convert 1-based to 0-based PageSize = request.PageSize }; // WeekNumber is string type in proto - assign directly if (request.WeekDefinitionId!=null) cmsRequest.WeekDefinitionId = request.WeekDefinitionId; if (request.Status.HasValue) cmsRequest.Status = request.Status.Value; // int? type in proto var response = await _context.Commission.GetUserCommissionPayoutsAsync(cmsRequest, cancellationToken: cancellationToken); var payouts = response.Models.Select(p => new CommissionPayoutDto { Id = p.Id, WeekDefinitionId = p.WeekDefinitionId, WeekDisplayName = p.WeekDisplayName, BalancesEarned = (int)p.BalancesEarned, TotalAmount = p.TotalAmount, AmountFormatted = FormatCurrency(p.TotalAmount), Status = MapStatus(p.Status), StatusBadgeColor = GetStatusColor(p.Status), CalculatedDate = p.Created?.ToDateTime() ?? DateTime.UtcNow, DatePersian = FormatPersianDate(p.Created?.ToDateTime()) }).ToList(); return new GetMyCommissionPayoutsResponseDto { Payouts = payouts, TotalCount = (int)response.MetaData.TotalCount, PageNumber = request.PageNumber, PageSize = request.PageSize }; } private static string MapStatus(int status) { return status switch { 0 => "Pending", 1 => "Calculated", 2 => "Paid", 3 => "Withdrawn", _ => "Unknown" }; } private static string GetStatusColor(int status) { return status switch { 0 => "warning", 1 => "info", 2 => "success", 3 => "success", _ => "default" }; } private static string FormatCurrency(long amount) { return $"{amount:N0} تومان"; } private static string FormatPersianDate(DateTime? date) { if (!date.HasValue) return string.Empty; // TODO: استفاده از PersianCalendar return date.Value.ToString("yyyy/MM/dd"); } }