f0f48118e7
- 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.
65 lines
2.8 KiB
C#
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 = "استرداد با موفقیت انجام شد"
|
|
};
|
|
}
|
|
}
|