Files
FrontOffice.BFF/src/FrontOffice.BFF.Application/CommissionCQ/Queries/GetMyCommissionPayouts/GetMyCommissionPayoutsQueryHandler.cs
T

98 lines
3.3 KiB
C#

using CMSMicroservice.Protobuf.Protos.Commission;
namespace FrontOffice.BFF.Application.CommissionCQ.Queries.GetMyCommissionPayouts;
public class GetMyCommissionPayoutsQueryHandler : IRequestHandler<GetMyCommissionPayoutsQuery, GetMyCommissionPayoutsResponseDto>
{
private readonly IApplicationContractContext _context;
private readonly ICurrentUserService _currentUserService;
public GetMyCommissionPayoutsQueryHandler(
IApplicationContractContext context,
ICurrentUserService currentUserService)
{
_context = context;
_currentUserService = currentUserService;
}
public async Task<GetMyCommissionPayoutsResponseDto> 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");
}
}