Files
CMS/src/CMSMicroservice.Application/CommissionCQ/Queries/GetCommissionPayoutHistory/GetCommissionPayoutHistoryQueryHandler.cs
T
masoodafar-web 487d1ceb15 feat: Add CommissionCQ - Phase 5 Application Layer
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
2025-11-29 04:32:17 +03:30

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
};
}
}