73 lines
2.8 KiB
C#
73 lines
2.8 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 = 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 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");
|
|
}
|
|
}
|