addressProvider = $addressProvider; $this->customerProvider = $customerProvider; $this->orderLinesProvider = $orderLinesProvider; $this->carrierProvider = $carrierProvider; $this->historyProvider = $historyProvider; $this->cartProvider = $cartProvider; } /** * @param EmpikOrderWrapper $order * @throws OrderProcessException * @throws \PrestaShopDatabaseException * @throws \PrestaShopException */ public function fulfill(EmpikOrderWrapper $order) { $data = $order->getData(); $this->validate($data); // add customer $prestaShopCustomer = $this->customerProvider->provide($data); $order->setCustomer($prestaShopCustomer); // add addresses $billingAddress = isset($data['customer']['billing_address']) ? $data['customer']['billing_address'] : null; $shippingAddress = isset($data['customer']['shipping_address']) ? $data['customer']['shipping_address'] : null; $additionalFields = isset($data['order_additional_fields']) ? $data['order_additional_fields'] : []; $prestaShopShippingAddress = $this->addressProvider->provide( $shippingAddress, $order->getCustomer() ); $order->setShippingAddress($prestaShopShippingAddress); $prestaShopBillingAddress = $this->addressProvider->provide( $billingAddress, $order->getCustomer(), $additionalFields ); $order->setBillingAddress($prestaShopBillingAddress); // add cart $cart = $this->cartProvider->provide($data); $order->setCart($cart); // add order lines $orderLines = $this->orderLinesProvider->provide($data); $order->setOrderDetails($orderLines); // add carrier $carrier = $this->carrierProvider->provide($data); $order->setCarrier($carrier); // add order status $history = $this->historyProvider->provide($data); $order->setOrderHistory($history); $order->add(); } /** * @param array $data * @throws OrderProcessException */ protected function validate($data) { if ( ( empty($data['customer']['shipping_address']) && empty($data['customer']['billing_address']) ) || empty($data['order_id']) || empty($data['order_lines']) || empty($data['order_state']) || empty($data['total_price']) ) { throw new OrderProcessException(sprintf('Invalid order data for order: %s', $data['order_id'])); } } }