public IHttpActionResult PaymentCallback([FromBody] PaymentCallbackDto callback, int orderGroupId)
        {
            if (!string.IsNullOrWhiteSpace(callback?.PaymentOrder?.Id?.ToString()))
            {
                var purchaseOrder = _checkoutService.GetOrCreatePurchaseOrder(orderGroupId, callback.PaymentOrder.Id.OriginalString);
                if (purchaseOrder == null)
                {
                    return(new StatusCodeResult(HttpStatusCode.NotFound, this));
                }

                var purchaseOrderContainsPaymentTransaction = purchaseOrder.Forms.SelectMany(x => x.Payments)
                                                              .Any(p => p.ProviderTransactionID == callback.Transaction.Number.ToString());

                if (!purchaseOrderContainsPaymentTransaction)
                {
                    var paymentOrder = _swedbankPayCheckoutService.GetPaymentOrder(purchaseOrder, PaymentOrderExpand.All);
                    var transaction  = paymentOrder.PaymentOrderResponse.CurrentPayment.Payment.Transactions.TransactionList
                                       .FirstOrDefault(x => x.Number == callback.Transaction.Number.ToString());

                    var swedbankPayCheckoutPaymentMethodDto = _paymentManager.GetPaymentMethodBySystemName(Constants.SwedbankPayCheckoutSystemKeyword, paymentOrder.PaymentOrderResponse.Language.TwoLetterISOLanguageName);
                    var paymentMethod = swedbankPayCheckoutPaymentMethodDto?.PaymentMethod?.FirstOrDefault();
                    if (paymentMethod != null && transaction != null)
                    {
                        if (paymentOrder.PaymentOrderResponse.CurrentPayment.Payment.Instrument == PaymentInstrument.Invoice &&
                            transaction.Type == TransactionType.Authorization)
                        {
                            //Already added a authorization transaction for Invoice when creating payment.
                            return(Ok());
                        }

                        var payment = purchaseOrder.CreatePayment(_orderGroupFactory);
                        payment.PaymentType           = PaymentType.Other;
                        payment.PaymentMethodId       = paymentMethod.PaymentMethodId;
                        payment.PaymentMethodName     = Constants.SwedbankPayCheckoutSystemKeyword;
                        payment.TransactionType       = transaction.Type.ConvertToEpiTransactionType().ToString();
                        payment.ProviderTransactionID = transaction.Number;
                        payment.Amount = transaction.Amount.Value / (decimal)100;
                        payment.Status = PaymentStatus.Processed.ToString();
                        purchaseOrder.AddPayment(payment);
                        _orderRepository.Save(purchaseOrder);
                    }
                }

                return(Ok());
            }

            return(new StatusCodeResult(HttpStatusCode.Accepted, this));
        }
        public override IPayment CreatePayment(decimal amount, IOrderGroup orderGroup)
        {
            var paymentOrder    = _swedbankPayCheckoutService.GetPaymentOrder(orderGroup, PaymentOrderExpand.All);
            var currentPayment  = paymentOrder.PaymentOrderResponse.CurrentPayment.Payment;
            var transaction     = currentPayment?.Transactions?.TransactionList?.FirstOrDefault();
            var transactionType = transaction?.Type.ConvertToEpiTransactionType() ?? TransactionType.Authorization;

            var payment = orderGroup.CreatePayment(_orderGroupFactory);

            payment.PaymentType           = PaymentType.Other;
            payment.PaymentMethodId       = PaymentMethodId;
            payment.PaymentMethodName     = Constants.SwedbankPayCheckoutSystemKeyword;
            payment.ProviderTransactionID = transaction?.Number;
            payment.Amount = amount;
            var isSwishPayment = currentPayment?.Instrument.Equals(PaymentInstrument.Swish) ?? false;

            payment.Status = isSwishPayment ? PaymentStatus.Processed.ToString() : PaymentStatus.Pending.ToString();

            payment.TransactionType = transactionType.ToString();

            return(payment);
        }
        public IPurchaseOrder GetOrCreatePurchaseOrder(int orderGroupId, string swedbankPayOrderId)
        {
            // Check if the order has been created already
            var purchaseOrder = _swedbankPayCheckoutService.GetPurchaseOrderBySwedbankPayOrderId(swedbankPayOrderId);

            if (purchaseOrder != null)
            {
                return(purchaseOrder);
            }

            // Check if we still have a cart and can create an order
            var cart = _orderRepository.Load <ICart>(orderGroupId);
            var cartSwedbankPayId = cart?.Properties[Constants.SwedbankPayOrderIdField]?.ToString();

            if (cartSwedbankPayId == null || !cartSwedbankPayId.Equals(swedbankPayOrderId))
            {
                return(null);
            }

            var order = _swedbankPayCheckoutService.GetPaymentOrder(cart, PaymentOrderExpand.All);

            var paymentResponse = order.PaymentOrderResponse.CurrentPayment;
            var transaction     = paymentResponse.Payment.Transactions?.TransactionList?.FirstOrDefault(x =>
                                                                                                        x.State.Equals(State.Completed) &&
                                                                                                        x.Type.Equals(SwedbankPay.Sdk.TransactionType.Authorization) ||
                                                                                                        x.Type.Equals(SwedbankPay.Sdk.TransactionType.Sale));

            if (transaction != null)
            {
                var finalPurchaseOrderCheck = _swedbankPayCheckoutService.GetPurchaseOrderBySwedbankPayOrderId(swedbankPayOrderId);
                purchaseOrder = finalPurchaseOrderCheck ?? CreatePurchaseOrderForSwedbankPay(cart);

                return(purchaseOrder);
            }

            // Won't create order, SwedbankPay checkout not complete
            return(null);
        }