namespace Netina.Core.EntityServices.OrderBagHandlers; public class SubmitOrderPaymentCommandHandler : IRequestHandler { private readonly IMediator _mediator; private readonly IRepositoryWrapper _repositoryWrapper; private readonly IPaymentService _paymentService; private readonly ISmsService _smsService; public SubmitOrderPaymentCommandHandler(IMediator mediator, IRepositoryWrapper repositoryWrapper, IPaymentService paymentService,ISmsService smsService) { _mediator = mediator; _repositoryWrapper = repositoryWrapper; _paymentService = paymentService; _smsService = smsService; } public async Task Handle(SubmitOrderPaymentCommand request, CancellationToken cancellationToken) { await _mediator.Send(new CalculateOrderCommand(request.OrderId, true), cancellationToken); var order = await _repositoryWrapper.SetRepository() .TableNoTracking .Where(o => o.Id == request.OrderId) .FirstOrDefaultAsync(cancellationToken); if (order == null) throw new AppException("Order not found", ApiResultStatusCode.NotFound); var response = new SubmitOrderPaymentResponseDto(); if (request.PaymentMethod == OrderPaymentMethod.OnlinePayment) { if (request.HasPaid) { response.NeedToPayOnline = false; order.SetOrderPayment(request.PaymentMethod); _repositoryWrapper.SetRepository().Update(order); await _repositoryWrapper.SaveChangesAsync(cancellationToken); } else { response.NeedToPayOnline = true; var orderSDto = await _repositoryWrapper.SetRepository() .TableNoTracking .Where(o => o.Id == request.OrderId) .Select(OrderMapper.ProjectToSDto) .FirstOrDefaultAsync(cancellationToken); if (orderSDto == null) throw new AppException("Order not found", ApiResultStatusCode.NotFound); response.PaymentUrl = await _paymentService.GetPaymentLinkAsync(orderSDto.TotalPrice, orderSDto.FactorCode, orderSDto.Id, orderSDto.CustomerId, orderSDto.CustomerPhoneNumber, orderSDto.CustomerFullName, cancellationToken); } } else if (request.PaymentMethod == OrderPaymentMethod.PayOnDoor) { response.NeedToPayOnline = false; order.SetOrderPayment(request.PaymentMethod); _repositoryWrapper.SetRepository().Update(order); await _repositoryWrapper.SaveChangesAsync(cancellationToken); await _mediator.Send(new CreateOrUpdatePaymentCommand(null,order.FactorCode, order.TotalPrice, $"پرداخت نقدی سفارش {order.FactorCode}", string.Empty, string.Empty, string.Empty, PaymentType.PayOnDoor, PaymentStatus.Paid, order.Id , order.CustomerId), cancellationToken); } else if (request.PaymentMethod == OrderPaymentMethod.CardTransfer) { response.NeedToPayOnline = false; order.SetOrderPayment(request.PaymentMethod); _repositoryWrapper.SetRepository().Update(order); await _repositoryWrapper.SaveChangesAsync(cancellationToken); await _mediator.Send(new CreateOrUpdatePaymentCommand(null,order.FactorCode, order.TotalPrice, $"پرداخت نقدی سفارش {order.FactorCode}", string.Empty, string.Empty, string.Empty, PaymentType.CardTransfer, PaymentStatus.Paid, order.Id , order.CustomerId), cancellationToken); } return response; } }