487d1ceb15
Added 5 Commands and 4 Queries for commission calculation and payout system: Commands: - CalculateWeeklyBalances: Recursive binary tree traversal for leg balances - CalculateWeeklyCommissionPool: Calculate ValuePerBalance from total pool - ProcessUserPayouts: Distribute commission to users, create payout records - RequestWithdrawal: User requests cash/diamond withdrawal - ProcessWithdrawal: Admin approves/rejects withdrawal Queries: - GetWeeklyCommissionPool: Retrieve pool details - GetUserCommissionPayouts: List payouts with filters (status, week, user) - GetCommissionPayoutHistory: Complete audit trail - GetUserWeeklyBalances: Show leg balances and contributions Total: 35 files, ~1,100 lines of code Binary tree algorithm, state machine, withdrawal system implemented
64 lines
2.1 KiB
C#
64 lines
2.1 KiB
C#
namespace CMSMicroservice.Application.CommissionCQ.Queries.GetCommissionPayoutHistory;
|
|
|
|
public class GetCommissionPayoutHistoryQueryHandler : IRequestHandler<GetCommissionPayoutHistoryQuery, GetCommissionPayoutHistoryResponseDto>
|
|
{
|
|
private readonly IApplicationDbContext _context;
|
|
|
|
public GetCommissionPayoutHistoryQueryHandler(IApplicationDbContext context)
|
|
{
|
|
_context = context;
|
|
}
|
|
|
|
public async Task<GetCommissionPayoutHistoryResponseDto> Handle(GetCommissionPayoutHistoryQuery request, CancellationToken cancellationToken)
|
|
{
|
|
var query = _context.CommissionPayoutHistories
|
|
.AsNoTracking()
|
|
.AsQueryable();
|
|
|
|
// فیلترها
|
|
if (request.PayoutId.HasValue)
|
|
{
|
|
query = query.Where(x => x.UserCommissionPayoutId == request.PayoutId.Value);
|
|
}
|
|
|
|
if (request.UserId.HasValue)
|
|
{
|
|
query = query.Where(x => x.UserId == request.UserId.Value);
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(request.WeekNumber))
|
|
{
|
|
query = query.Where(x => x.WeekNumber == request.WeekNumber);
|
|
}
|
|
|
|
query = query.ApplyOrder(sortBy: request.SortBy ?? "-Created");
|
|
|
|
var meta = await query.GetMetaData(request.PaginationState, cancellationToken);
|
|
|
|
var models = await query
|
|
.PaginatedListAsync(paginationState: request.PaginationState)
|
|
.Select(x => new GetCommissionPayoutHistoryResponseModel
|
|
{
|
|
Id = x.Id,
|
|
UserCommissionPayoutId = x.UserCommissionPayoutId,
|
|
UserId = x.UserId,
|
|
WeekNumber = x.WeekNumber,
|
|
AmountBefore = x.AmountBefore,
|
|
AmountAfter = x.AmountAfter,
|
|
OldStatus = x.OldStatus,
|
|
NewStatus = x.NewStatus,
|
|
Action = x.Action,
|
|
PerformedBy = x.PerformedBy,
|
|
Reason = x.Reason,
|
|
Created = x.Created
|
|
})
|
|
.ToListAsync(cancellationToken);
|
|
|
|
return new GetCommissionPayoutHistoryResponseDto
|
|
{
|
|
MetaData = meta,
|
|
Models = models
|
|
};
|
|
}
|
|
}
|