/**
  * @param Cart $cart
  * @param Customer $customer
  * @param CartValuesTransformer $cartValuesTransformer
  * @param CartItemValuesTransformer $cartItemValuesTransformer
  * @param array $params
  * @return Order
  */
 public function fromCart(Cart $cart, Customer $customer, CartValuesTransformer $cartValuesTransformer, CartItemValuesTransformer $cartItemValuesTransformer, $params)
 {
     if (isset($params['shippingaddressId']) && $params['shippingaddressId'] > 0) {
         $shippingAddress = $customer->getAddressFromAddressId($params['shippingaddressId']);
     } else {
         $data = ['address1' => $params['shippingaddress1'], 'address2' => $params['shippingaddress2'], 'address3' => $params['shippingaddress3'], 'city' => $params['shippingcity'], 'state' => $params['shippingstate'], 'postcode' => $params['shippingpostcode'], 'countryId' => $params['shippingcountryId']];
         $shippingAddress = new Address($data);
     }
     if (isset($params['billingAddressSameAsShipping']) && $params['billingAddressSameAsShipping']) {
         $billingAddress = $shippingAddress;
     } else {
         if (isset($params['billingaddressId']) && $params['billingaddressId'] > 0) {
             $billingAddress = $customer->getAddressFromAddressId($params['billingaddressId']);
         } else {
             $data = ['address1' => $params['billingaddress1'], 'address2' => $params['billingaddress2'], 'address3' => $params['billingaddress3'], 'city' => $params['billingcity'], 'state' => $params['billingstate'], 'postcode' => $params['billingpostcode'], 'countryId' => $params['billingcountryId']];
             $billingAddress = new Address($data);
         }
     }
     if (isset($params['billingAddressSameAsShipping'])) {
         $data['billing_address_same_as_shipping'] = true;
     }
     $items = [];
     foreach ($cart->getItems() as $item) {
         /* @var $item CartItem */
         $sku = $item->getSku();
         $cartItemValues = $item->getValues($cartItemValuesTransformer);
         $items[] = new OrderItem(NULL, $item->getVariationId(), $item->getTaxRate(), $cartItemValues['totalBeforeTax'], $item->getQuantity(), $item->getProductName(), $sku, 0, 0);
     }
     // add order item for shipping
     $cartValues = $cart->getValues($cartValuesTransformer);
     if ($cartValues['shipping'] > 0) {
         $items[] = new OrderItem(NULL, NULL, $cart->getDefaultTaxRate(), $cartValues['shipping'] - $cartValues['shippingTax'], 1, $cart->getShippingType(), 'SHIPPING', 1, 0);
     }
     $order = new Order($customer, $billingAddress, $shippingAddress, $items, $cart->getShippingType());
     return $order;
 }