Files
CMS/src/CMSMicroservice.Application/TransactionsCQ/Commands/RefundTransaction/RefundTransactionCommandHandler.cs
T
masoodafar-web f0f48118e7 Add validators and services for Product Galleries and Product Tags
- Implemented Create, Delete, Get, and Update validators for Product Galleries.
- Added Create, Delete, Get, and Update validators for Product Tags.
- Created service classes for handling Discount Categories, Discount Orders, Discount Products, Discount Shopping Cart, Product Categories, Product Galleries, and Product Tags.
- Each service class integrates with CQRS for command and query handling.
- Established mapping profiles for Product Galleries.
2025-12-04 02:40:49 +03:30

65 lines
2.8 KiB
C#

using CMSMicroservice.Domain.Events;
using CMSMicroservice.Domain.Enums;
namespace CMSMicroservice.Application.TransactionsCQ.Commands.RefundTransaction;
public class RefundTransactionCommandHandler : IRequestHandler<RefundTransactionCommand, RefundTransactionResponseDto>
{
private readonly IApplicationDbContext _context;
public RefundTransactionCommandHandler(IApplicationDbContext context)
{
_context = context;
}
public async Task<RefundTransactionResponseDto> Handle(RefundTransactionCommand request, CancellationToken cancellationToken)
{
// پیدا کردن تراکنش اصلی
var originalTransaction = await _context.Transactions
.FirstOrDefaultAsync(t => t.Id == request.TransactionId, cancellationToken);
if (originalTransaction == null)
{
throw new NotFoundException(nameof(Transaction), request.TransactionId);
}
// چک کردن که تراکنش Success باشد
if (originalTransaction.PaymentStatus != PaymentStatus.Success)
{
throw new InvalidOperationException($"فقط تراکنش‌های موفق قابل استرداد هستند. وضعیت فعلی: {originalTransaction.PaymentStatus}");
}
// محاسبه مبلغ استرداد
var refundAmount = request.RefundAmount ?? originalTransaction.Amount;
if (refundAmount > originalTransaction.Amount)
{
throw new InvalidOperationException("مبلغ استرداد نمی‌تواند بیشتر از مبلغ اصلی باشد");
}
// ایجاد تراکنش استرداد جدید
var refundTransaction = new Transaction
{
Amount = -refundAmount, // مبلغ منفی برای استرداد
Description = $"استرداد تراکنش {request.TransactionId}: {request.RefundReason}",
PaymentStatus = PaymentStatus.Success,
PaymentDate = DateTime.UtcNow,
RefId = $"REFUND-{originalTransaction.RefId}",
Type = TransactionType.Buy // یا می‌تونیم یک نوع جدید برای Refund تعریف کنیم
};
await _context.Transactions.AddAsync(refundTransaction, cancellationToken);
refundTransaction.AddDomainEvent(new RefundTransactionEvent(refundTransaction, originalTransaction));
await _context.SaveChangesAsync(cancellationToken);
return new RefundTransactionResponseDto
{
OriginalTransactionId = originalTransaction.Id,
RefundTransactionId = refundTransaction.Id,
RefundAmount = refundAmount,
Message = "استرداد با موفقیت انجام شد"
};
}
}