Files
CMS/src/CMSMicroservice.Application/ManualPaymentCQ/Queries/GetAllManualPayments/GetAllManualPaymentsQueryHandler.cs
T
masoodafar-web 61b7e4f8f2
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 8m29s
F2-F7: نوتیفیکیشن‌ها+نام‌پکیج، ستون پکیج در CSV، مقادیر داینامیک کیف‌پول جادویی، ولیدیتور SystemConstants
F2: اضافه شدن packageName به SmsTemplates، IUserNotificationService، UserNotificationService
    - DayaLoan، ClubActivated، CommissionDeposited حالا نام پکیج را نشان می‌دهند
F4: اضافه شدن ستون پکیج به CSV خروجی‌ها
    - commission.proto: package_name در WithdrawalRequestModel
    - manualpayment.proto: package_name در ManualPaymentModel
    - کوئری‌هندلرها UserPackagePurchases لوکاپ اضافه شد
F6: مقادیر داینامیک کیف‌پول جادویی از پکیج
    - userwallet.proto: magic_multiplier + magic_max_credit
    - UserWalletService: پاپیولیت فیلدهای جدید + فالبک به SystemConstants
F7: ولیدیتورها از SystemConstants استفاده می‌کنند
    - WalletMaxSafeAmount (10B ریال) به عنوان حصار ایمنی
    - MagicWalletMinCharge، DiscountWalletMinCharge ثابت‌های مرکزی
    - سقف واقعی per-package در هندلرها اعمال می‌شود
Proto: v0.0.189
2026-02-27 08:47:46 +03:30

137 lines
4.6 KiB
C#

using CMSMicroservice.Application.Common.Interfaces;
using CMSMicroservice.Application.Common.Models;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
namespace CMSMicroservice.Application.ManualPaymentCQ.Queries.GetAllManualPayments;
public class GetAllManualPaymentsQueryHandler
: IRequestHandler<GetAllManualPaymentsQuery, GetAllManualPaymentsResponseDto>
{
private readonly IApplicationDbContext _context;
private readonly ILogger<GetAllManualPaymentsQueryHandler> _logger;
public GetAllManualPaymentsQueryHandler(
IApplicationDbContext context,
ILogger<GetAllManualPaymentsQueryHandler> logger)
{
_context = context;
_logger = logger;
}
public async Task<GetAllManualPaymentsResponseDto> Handle(
GetAllManualPaymentsQuery request,
CancellationToken cancellationToken)
{
_logger.LogInformation(
"Getting manual payments. Page: {Page}, PageSize: {PageSize}",
request.PageNumber,
request.PageSize
);
// ساخت Query با فیلترها
var query = _context.ManualPayments
.Include(m => m.User)
.AsQueryable();
// فیلتر UserId
if (request.UserId.HasValue)
{
query = query.Where(m => m.UserId == request.UserId.Value);
}
// فیلتر Status
if (request.Status.HasValue)
{
query = query.Where(m => m.Status == request.Status.Value);
}
// فیلتر Type
if (request.Type.HasValue)
{
query = query.Where(m => m.Type == request.Type.Value);
}
// فیلتر RequestedBy
if (request.RequestedBy.HasValue)
{
query = query.Where(m => m.RequestedBy == request.RequestedBy.Value);
}
// شمارش کل
var totalCount = await query.CountAsync(cancellationToken);
// مرتب‌سازی
query = request.OrderByDescending
? query.OrderByDescending(m => m.Created)
: query.OrderBy(m => m.Created);
// Pagination
var skip = (request.PageNumber - 1) * request.PageSize;
// دریافت PackageName از آخرین خرید پکیج کاربر
var userPackageNames = await _context.UserPackagePurchases
.Include(p => p.Package)
.GroupBy(p => p.UserId)
.Select(g => new { UserId = g.Key, PackageName = g.OrderByDescending(x => x.PurchasedAt).First().Package.Title })
.ToDictionaryAsync(x => x.UserId, x => x.PackageName, cancellationToken);
var data = await query
.Skip(skip)
.Take(request.PageSize)
.Select(m => new ManualPaymentDto
{
Id = m.Id,
UserId = m.UserId,
UserFullName = m.User.FirstName + " " + m.User.LastName,
UserMobile = m.User.Mobile ?? "",
Amount = m.Amount,
Type = m.Type,
TypeDisplay = m.Type.ToString(),
Description = m.Description,
ReferenceNumber = m.ReferenceNumber,
Status = m.Status,
StatusDisplay = m.Status.ToString(),
RequestedBy = m.RequestedBy,
RequestedByName = "", // باید از جدول User گرفته شود
ApprovedBy = m.ApprovedBy,
ApprovedByName = null,
ApprovedAt = m.ApprovedAt,
RejectionReason = m.RejectionReason,
TransactionId = m.TransactionId,
Created = m.Created
})
.ToListAsync(cancellationToken);
// تکمیل PackageName
foreach (var item in data)
{
if (userPackageNames.TryGetValue(item.UserId, out var pkgName))
item.PackageName = pkgName;
}
var metaData = new MetaData
{
TotalCount = totalCount,
PageSize = request.PageSize,
CurrentPage = request.PageNumber,
TotalPage = (int)Math.Ceiling(totalCount / (double)request.PageSize),
HasNext = request.PageNumber < (int)Math.Ceiling(totalCount / (double)request.PageSize),
HasPrevious = request.PageNumber > 1
};
_logger.LogInformation(
"Retrieved {Count} manual payments. Total: {Total}",
data.Count,
totalCount
);
return new GetAllManualPaymentsResponseDto
{
MetaData = metaData,
Models = data
};
}
}