namespace NetinaShop.Core.EntityServices.OrderBagHandlers; public class SubmitOrderPaymentCommandHandler : IRequestHandler { private readonly IMediator _mediator; private readonly IRepositoryWrapper _repositoryWrapper; private readonly IPaymentService _paymentService; public SubmitOrderPaymentCommandHandler(IMediator mediator, IRepositoryWrapper repositoryWrapper, IPaymentService paymentService) { _mediator = mediator; _repositoryWrapper = repositoryWrapper; _paymentService = paymentService; } public async Task Handle(SubmitOrderPaymentCommand request, CancellationToken cancellationToken) { await _mediator.Send(new CalculateOrderCommand(request.OrderId, true), cancellationToken); 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); var order = orderSDto.AdaptToOrder(); var response = new SubmitOrderPaymentResponseDto(); if (request.PaymentMethod == OrderPaymentMethod.OnlinePayment) { if (request.HasPaid) { response.NeedToPayOnline = false; order.SetSubmitOrder(request.PaymentMethod); } else { response.NeedToPayOnline = true; response.PaymentUrl = await _paymentService.GetPaymentLinkAsync(orderSDto.TotalPrice, orderSDto.FactorCode, orderSDto.Id, orderSDto.UserId, orderSDto.UserPhoneNumber, orderSDto.UserFullName, cancellationToken); } } else if (request.PaymentMethod == OrderPaymentMethod.PayOnDoor) { response.NeedToPayOnline = false; order.SetSubmitOrder(request.PaymentMethod); _repositoryWrapper.SetRepository().Update(order); await _repositoryWrapper.SaveChangesAsync(cancellationToken); await _mediator.Send(new CreatePaymentCommand(order.FactorCode, order.TotalPrice, $"پرداخت نقدی سفارش {order.FactorCode}", string.Empty, string.Empty, string.Empty, PaymentType.PayOnDoor, PaymentStatus.Paid, order.Id , order.UserId), cancellationToken); } else if (request.PaymentMethod == OrderPaymentMethod.CardTransfer) { response.NeedToPayOnline = false; order.SetSubmitOrder(request.PaymentMethod); _repositoryWrapper.SetRepository().Update(order); await _repositoryWrapper.SaveChangesAsync(cancellationToken); await _mediator.Send(new CreatePaymentCommand(order.FactorCode, order.TotalPrice, $"پرداخت نقدی سفارش {order.FactorCode}", string.Empty, string.Empty, string.Empty, PaymentType.CardTransfer, PaymentStatus.Paid, order.Id , order.UserId), cancellationToken); } return response; } }