feat: Add ClearCart command and response, implement CancelOrder command with validation, and enhance DeliveryStatus and User models

This commit is contained in:
masoodafar-web
2025-12-02 03:30:36 +03:30
parent 25fc73ae28
commit 78606cc5cc
100 changed files with 12925 additions and 8137 deletions

View File

@@ -1,21 +1,30 @@
using Microsoft.Extensions.Logging;
namespace CMSMicroservice.Application.CommissionCQ.Commands.ProcessWithdrawal;
public class ProcessWithdrawalCommandHandler : IRequestHandler<ProcessWithdrawalCommand, Unit>
{
private readonly IApplicationDbContext _context;
private readonly ICurrentUserService _currentUser;
private readonly IPaymentGatewayService _paymentGateway;
private readonly ILogger<ProcessWithdrawalCommandHandler> _logger;
public ProcessWithdrawalCommandHandler(
IApplicationDbContext context,
ICurrentUserService currentUser)
ICurrentUserService currentUser,
IPaymentGatewayService paymentGateway,
ILogger<ProcessWithdrawalCommandHandler> logger)
{
_context = context;
_currentUser = currentUser;
_paymentGateway = paymentGateway;
_logger = logger;
}
public async Task<Unit> Handle(ProcessWithdrawalCommand request, CancellationToken cancellationToken)
{
var payout = await _context.UserCommissionPayouts
.Include(x => x.User)
.FirstOrDefaultAsync(x => x.Id == request.PayoutId, cancellationToken);
if (payout == null)
@@ -35,12 +44,9 @@ public class ProcessWithdrawalCommandHandler : IRequestHandler<ProcessWithdrawal
if (request.IsApproved)
{
// تایید برداشت
payout.Status = CommissionPayoutStatus.Withdrawn;
payout.WithdrawnAt = now;
// اگر روش برداشت Diamond بود، باید مبلغ به کیف پول تخفیف اضافه شود
if (payout.WithdrawalMethod == WithdrawalMethod.Diamond)
{
// روش Diamond: شارژ کیف پول تخفیف
var wallet = await _context.UserWallets
.FirstOrDefaultAsync(x => x.UserId == payout.UserId, cancellationToken);
@@ -49,6 +55,61 @@ public class ProcessWithdrawalCommandHandler : IRequestHandler<ProcessWithdrawal
wallet.DiscountBalance += payout.TotalAmount;
_context.UserWallets.Update(wallet);
}
payout.Status = CommissionPayoutStatus.Withdrawn;
payout.WithdrawnAt = now;
}
else if (payout.WithdrawalMethod == WithdrawalMethod.Cash)
{
// روش انتقال بانکی: فراخوانی Payment Gateway
try
{
_logger.LogInformation("Processing bank transfer for Payout {PayoutId}, User {UserId}, Amount {Amount}",
payout.Id, payout.UserId, payout.TotalAmount);
var payoutRequest = new PayoutRequest
{
Amount = payout.TotalAmount,
UserId = payout.UserId,
Iban = payout.IbanNumber ?? throw new InvalidOperationException("شماره شبا یافت نشد"),
AccountHolderName = $"{payout.User.FirstName} {payout.User.LastName}",
Description = $"برداشت کمیسیون هفته {payout.WeekNumber}",
InternalRefId = $"PAYOUT-{payout.Id}"
};
var payoutResult = await _paymentGateway.ProcessPayoutAsync(payoutRequest, cancellationToken);
if (payoutResult.IsSuccess)
{
payout.Status = CommissionPayoutStatus.Withdrawn;
payout.WithdrawnAt = now;
payout.BankReferenceId = payoutResult.BankRefId;
payout.BankTrackingCode = payoutResult.TrackingCode;
_logger.LogInformation("Bank transfer successful: Payout {PayoutId}, BankRef {BankRef}",
payout.Id, payoutResult.BankRefId);
}
else
{
// خطا در واریز
payout.Status = CommissionPayoutStatus.PaymentFailed;
payout.PaymentFailureReason = payoutResult.Message;
_logger.LogError("Bank transfer failed: Payout {PayoutId}, Reason: {Reason}",
payout.Id, payoutResult.Message);
throw new InvalidOperationException($"خطا در واریز: {payoutResult.Message}");
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception during bank transfer for Payout {PayoutId}", payout.Id);
payout.Status = CommissionPayoutStatus.PaymentFailed;
payout.PaymentFailureReason = ex.Message;
throw;
}
}
_context.UserCommissionPayouts.Update(payout);
@@ -63,9 +124,9 @@ public class ProcessWithdrawalCommandHandler : IRequestHandler<ProcessWithdrawal
AmountBefore = payout.TotalAmount,
AmountAfter = payout.TotalAmount,
OldStatus = oldStatus,
NewStatus = CommissionPayoutStatus.Withdrawn,
NewStatus = payout.Status,
Action = CommissionPayoutAction.Withdrawn,
PerformedBy = "Admin", // TODO: باید از Current User گرفته شود
PerformedBy = _currentUser.UserId ?? "Admin",
Reason = $"تایید برداشت به روش {payout.WithdrawalMethod}"
};
@@ -92,7 +153,7 @@ public class ProcessWithdrawalCommandHandler : IRequestHandler<ProcessWithdrawal
OldStatus = oldStatus,
NewStatus = CommissionPayoutStatus.Paid,
Action = CommissionPayoutAction.Cancelled,
PerformedBy = "Admin", // TODO: باید از Current User گرفته شود
PerformedBy = _currentUser.UserId ?? "Admin",
Reason = request.Reason ?? "درخواست برداشت رد شد"
};