public async Task <CompleteOrderWithCreditCardCommandResult> Handle(CompleteOrderWithCreditCardCommand request, CancellationToken cancellationToken)
        {
            var addProductsToBasketResponse = await _basketService.AddProductsToBasketAsync(new AddProductsToBasketRequestDto
            {
                BasketItems = request.BasketItems.Select(basketItem => new BasketItemDto
                {
                    Sku         = basketItem.Sku,
                    Quantity    = basketItem.Quantity,
                    RelatedItem = basketItem.RelatedItem != null ? new BasketItemDto
                    {
                        Sku      = basketItem.RelatedItem.Sku,
                        Quantity = basketItem.RelatedItem.Quantity
                    } : null
                })
            }, cancellationToken);

            if (addProductsToBasketResponse?.Basket == null)
            {
                return new CompleteOrderWithCreditCardCommandResult
                       {
                           ValidationState = ValidationState.UnProcessable,
                           Messages        = new List <MessageContract>
                           {
                               new MessageContract
                               {
                                   Code = CompleteOrderWithCreditCardApplicationErrorCodes.ECOWCC001,
                                   Type = MessageType.Error
                               }
                           }
                       }
            }
            ;
            if (!addProductsToBasketResponse.Basket.Items.Any())
            {
                return new CompleteOrderWithCreditCardCommandResult
                       {
                           ValidationState = ValidationState.UnProcessable,
                           Messages        = new List <MessageContract>
                           {
                               new MessageContract
                               {
                                   Code = CompleteOrderWithCreditCardApplicationErrorCodes.ECOWCC002,
                                   Type = MessageType.Error
                               }
                           }
                       }
            }
            ;
            if (addProductsToBasketResponse.Basket.Price != request.Amount)
            {
                return(new CompleteOrderWithCreditCardCommandResult
                {
                    ValidationState = ValidationState.NotAcceptable,
                    Messages = new List <MessageContract>
                    {
                        new MessageContract
                        {
                            Code = CompleteOrderWithCreditCardApplicationErrorCodes.ECOWCC003,
                            Type = MessageType.Error
                        }
                    }
                });
            }

            var payment = Payment.Load(new PaymentDomainDto
            {
                Amount = request.Amount
            });

            payment.SetPaymentOptionAsCreditCard(new CreditCardPaymentOptionDomainDto
            {
                ContactType = (CreditCardContactType)request.CreditCardContactType
            });
            var createOrderResponse = await _orderService.CreateOrderAsync(new CreateOrderRequest
            {
                Basket  = addProductsToBasketResponse.Basket,
                Payment = payment
            }, cancellationToken);

            if (createOrderResponse.Order == null)
            {
                return new CompleteOrderWithCreditCardCommandResult
                       {
                           ValidationState = ValidationState.PreconditionFailed,
                           Messages        = new List <MessageContract>
                           {
                               new MessageContract
                               {
                                   Code = CompleteOrderWithCreditCardApplicationErrorCodes.ECOWCC004,
                                   Type = MessageType.Error
                               }
                           }
                       }
            }
            ;
            return(new CompleteOrderWithCreditCardCommandResult
            {
                Order = new OrderWithCreditCardContract
                {
                    Amount = createOrderResponse.Order.Payment.Amount,
                    ContactType =
                        (CreditCardContactTypeContract)((CreditCardPaymentOption)createOrderResponse.Order
                                                        .Payment.PaymentOption).ContactType,
                    OrderItems =
                        _mapper.Map <IEnumerable <BasketItem>, IEnumerable <OrderItemContract> >(createOrderResponse
                                                                                                 .Order.Basket.Items)
                }
            });
        }
    }
}