Beispiel #1
0
 /**
  * Processes items defined in an order and creates item entities.
  *
  * @param array $data
  * @param Order $order
  * @param string $locale
  * @param int $userId
  *
  * @throws Exception\OrderException
  *
  * @return bool
  */
 private function processItems(array $data, Order $order, $locale, $userId = null)
 {
     $result = true;
     $lastProcessedProductItem = null;
     try {
         if ($this->checkIfSet('items', $data)) {
             // items has to be an array
             if (!is_array($data['items'])) {
                 throw new MissingOrderAttributeException('items array');
             }
             $items = $data['items'];
             $get = function ($item) {
                 return $item->getId();
             };
             $delete = function ($item) use($order) {
                 $this->removeItem($item->getEntity(), $order->getEntity());
             };
             $update = function ($item, $matchedEntry) use($locale, $userId, $order, &$lastProcessedProductItem) {
                 $item = $item->getEntity();
                 $itemEntity = $this->updateItem($item, $matchedEntry, $locale, $userId, $order->getEntity(), $lastProcessedProductItem);
                 if ($item->getType() === BaseItem::TYPE_PRODUCT) {
                     $lastProcessedProductItem = $item;
                 }
                 return $itemEntity ? true : false;
             };
             $add = function ($itemData) use($locale, $userId, $order, &$lastProcessedProductItem) {
                 $item = $this->addItem($itemData, $locale, $userId, $order->getEntity(), $lastProcessedProductItem);
                 if ($item->getType() === BaseItem::TYPE_PRODUCT) {
                     $lastProcessedProductItem = $item->getEntity();
                 }
                 return $item;
             };
             $result = $this->processSubEntities($order->getItems(), $items, $get, $add, $update, $delete);
         }
     } catch (\Exception $e) {
         throw new OrderException('Error while creating items: ' . $e->getMessage());
     }
     return $result;
 }