Exemplo n.º 1
0
 /**
  * Get products data
  *
  * @return array
  */
 public function getProductsData()
 {
     $productsData = [];
     $provider = new Provider();
     foreach ($this->_brands as $brandId => $brand) {
         $categoryUrl = $provider->getCategoryUrl(self::STORE_URL, $brandId, self::ALL_CATEGORY_PRODUCTS);
         if ($categoryUrl) {
             $productUrls[$categoryUrl] = $provider->getProductUrls($this->_addStoreUrl($categoryUrl));
             foreach ($productUrls[$categoryUrl] as $index => $productUrl) {
                 $productData = $provider->getProductData($this->_addStoreUrl($productUrl));
                 $productsData[$productUrl] = $this->_addBrandToProductData($productData, $brand);
             }
         }
     }
     return $productsData;
 }
Exemplo n.º 2
0
 /**
  * @return bool
  */
 protected function loadBundleChildElements()
 {
     $bundleChildList = Provider::getSetItems($this);
     if (empty($bundleChildList)) {
         return null;
     }
     /** @var Basket $baseBasketCollection */
     $baseBasketCollection = $this->getCollection();
     /** @var Order $order */
     $order = $baseBasketCollection->getOrder();
     /** @var Basket $bundleCollection */
     $bundleCollection = BasketBundleCollection::create($baseBasketCollection->getSiteId());
     if ($order !== null) {
         $bundleCollection->setOrder($order);
     }
     foreach ($bundleChildList as $bundleBasketListDat) {
         foreach ($bundleBasketListDat["ITEMS"] as $bundleDat) {
             $bundleFields = static::clearBundleItemFields($bundleDat);
             $bundleFields['CURRENCY'] = $this->getCurrency();
             if ($this->getId() > 0) {
                 $bundleFields['SET_PARENT_ID'] = $this->getId();
             }
             /** @var BasketItem $basketItem */
             $bundleBasketItem = BasketItem::create($bundleCollection, $bundleFields['MODULE'], $bundleFields['PRODUCT_ID']);
             if (!empty($bundleDat["PROPS"]) && is_array($bundleDat["PROPS"])) {
                 /** @var BasketPropertiesCollection $property */
                 $property = $bundleBasketItem->getPropertyCollection();
                 $property->setProperty($bundleDat["PROPS"]);
             }
             $bundleFields['QUANTITY'] = $bundleFields['QUANTITY'] * $this->getQuantity();
             $bundleBasketItem->setFieldsNoDemand($bundleFields);
             $bundleBasketItem->parentBasketItem = $this;
             $bundleBasketItem->parentId = $this->getBasketCode();
             $bundleCollection->addItem($bundleBasketItem);
         }
     }
     if ($productList = Provider::getProductData($bundleCollection, array('QUANTITY', 'PRICE'))) {
         foreach ($productList as $productBasketCode => $productDat) {
             if ($bundleBasketItem = $bundleCollection->getItemByBasketCode($productBasketCode)) {
                 unset($productDat['DISCOUNT_LIST']);
                 $bundleBasketItem->setFieldsNoDemand($productDat);
             }
         }
     }
     $this->bundleCollection = $bundleCollection;
     return $bundleCollection;
 }
Exemplo n.º 3
0
 /**
  * @param array $select
  * @param BasketItem $refreshItem
  * @return Result
  * @throws Main\ArgumentNullException
  * @throws Main\NotSupportedException
  * @throws Main\ObjectNotFoundException
  */
 public function refreshData($select = array(), BasketItem $refreshItem = null)
 {
     $result = new Result();
     $isStartField = $this->isStartField();
     $discount = null;
     /** @var Order $order */
     if ($order = $this->getOrder()) {
         $discount = $order->getDiscount();
     }
     $settableFields = array_fill_keys(BasketItem::getSettableFields(), true);
     $data = Provider::getProductData($this, $select, $refreshItem);
     foreach ($data as $key => $value) {
         //$item = $this->getItemByBasketCode($key);
         if (!($item = $this->getItemByBasketCode($key))) {
             continue;
         }
         if (isset($value['DELETE']) && $value['DELETE']) {
             $item->delete();
             if ($discount !== null) {
                 $discount->clearBasketItemData($key);
             }
             continue;
         }
         $basePrice = false;
         $currency = false;
         $discountList = false;
         $value1 = array();
         $roundFields = static::getRoundFields();
         foreach ($value as $k => $v) {
             //TODO: create method for save data in discount
             if ($k == 'BASE_PRICE') {
                 $basePrice = true;
             }
             if ($k == 'CURRENCY') {
                 $currency = true;
             }
             if ($k == 'DISCOUNT_LIST' && !empty($v)) {
                 $discountList = true;
             }
             //TODO END
             if (isset($settableFields[$k])) {
                 if ($item) {
                     if ($k == "PRICE" && $item->isCustomPrice()) {
                         $v = $item->getPrice();
                     }
                     if (in_array($k, $roundFields)) {
                         $v = roundEx($v, SALE_VALUE_PRECISION);
                     }
                 }
                 $value1[$k] = $v;
             }
         }
         if (!$item->isCustomPrice()) {
             $value1['PRICE'] = $value1['BASE_PRICE'] - $value1['DISCOUNT_PRICE'];
         }
         if (!$item) {
             $item = $this->createItem($value['MODULE_ID'], $value['PRODUCT_ID']);
         }
         if (!$item) {
             continue;
         }
         if ($discount !== null) {
             if ($basePrice && $currency) {
                 $discount->setBasketItemBasePrice($key, $value['BASE_PRICE'], $value['CURRENCY']);
             }
             if ($discountList) {
                 $discount->setBasketItemDiscounts($key, $value['DISCOUNT_LIST']);
             }
         }
         /** @var Result $r */
         $r = $item->setFields($value1);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         }
     }
     /** @var Order $order */
     if ($order = $this->getOrder()) {
         $r = $order->refreshData(array('PRICE', 'PRICE_DELIVERY'));
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         }
     }
     if ($isStartField) {
         $hasMeaningfulFields = $this->hasMeaningfulField();
         /** @var Result $r */
         $r = $this->doFinalAction($hasMeaningfulFields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         }
     }
     return $result;
 }
Exemplo n.º 4
0
 /**
  * @param array $select
  * @param BasketItem $refreshItem
  * @return Result
  * @throws Main\ArgumentNullException
  * @throws Main\NotSupportedException
  * @throws Main\ObjectNotFoundException
  */
 public function refreshData($select = array(), BasketItem $refreshItem = null)
 {
     $result = new Result();
     $isStartField = $this->isStartField();
     $discount = null;
     /** @var Order $order */
     if ($order = $this->getOrder()) {
         $discount = $order->getDiscount();
     }
     $settableFields = array_fill_keys(BasketItem::getSettableFields(), true);
     $data = Provider::getProductData($this, $select, $refreshItem);
     foreach ($data as $key => $value) {
         /** @var null|BasketItem $item */
         $item = null;
         //$item = $this->getItemByBasketCode($key);
         //			if(!($item = $this->getItemByBasketCode($key)))
         //			{
         //				continue;
         //			}
         $item = $this->getItemByBasketCode($key);
         if (isset($value['DELETE']) && $value['DELETE']) {
             if ($item) {
                 $item->delete();
                 if ($discount !== null) {
                     $discount->clearBasketItemData($key);
                 }
             }
             continue;
         }
         $value1 = array();
         $roundFields = static::getRoundFields();
         foreach ($value as $k => $v) {
             if (isset($settableFields[$k])) {
                 if ($item) {
                     if ($k == "PRICE" && $item->isCustomPrice()) {
                         $v = $item->getPrice();
                     }
                     if (in_array($k, $roundFields)) {
                         $v = PriceMaths::roundPrecision($v);
                     }
                 }
                 $value1[$k] = $v;
             }
         }
         if (!$item) {
             $item = $this->createItem($value['MODULE_ID'], $value['PRODUCT_ID']);
         }
         if (!$item) {
             continue;
         }
         if (!$item->isCustomPrice() && array_key_exists('DISCOUNT_PRICE', $value1) && array_key_exists('BASE_PRICE', $value1)) {
             $value1['PRICE'] = $value1['BASE_PRICE'] - $value1['DISCOUNT_PRICE'];
         }
         if ($discount instanceof Discount) {
             $discount->setBasketItemData($key, $value);
         }
         $isBundleParent = (bool) ($item && $item->isBundleParent());
         /** @var Result $r */
         $r = $item->setFields($value1);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         }
         if (($isBundleParent || $item->isBundleParent()) && array_key_exists('BUNDLE_ITEMS', $value)) {
             /** @var BasketBundleCollection $bundleCollection */
             if ($bundleCollection = $item->getBundleCollection()) {
                 $bundleIndexList = array();
                 /** @var BasketItem $bundleBasketItem */
                 foreach ($bundleCollection as $bundleBasketItem) {
                     $bundleIndexList[$bundleBasketItem->getBasketCode()] = true;
                 }
                 /** @var array $bundleBasketItemData */
                 foreach ($value['BUNDLE_ITEMS'] as $bundleBasketItemData) {
                     if (empty($bundleBasketItemData['MODULE']) || empty($bundleBasketItemData['PRODUCT_ID'])) {
                         continue;
                     }
                     /** @var BasketItem $bundleBasketItem */
                     if ($bundleBasketItem = $bundleCollection->getExistsItem($bundleBasketItemData['MODULE'], $bundleBasketItemData['PRODUCT_ID'], !empty($bundleBasketItemData['PROPS']) && is_array($bundleBasketItemData['PROPS']) ? $bundleBasketItemData['PROPS'] : array())) {
                         if (isset($bundleIndexList[$bundleBasketItem->getBasketCode()])) {
                             unset($bundleIndexList[$bundleBasketItem->getBasketCode()]);
                         }
                     } else {
                         /** @var BasketItem $bundleBasketItem */
                         $bundleBasketItem = BasketItem::create($bundleCollection, $bundleBasketItemData['MODULE'], $bundleBasketItemData['PRODUCT_ID']);
                     }
                     if (!$bundleBasketItem) {
                         continue;
                     }
                     $fields = array_intersect_key($bundleBasketItemData, $settableFields);
                     $r = $bundleBasketItem->setFields($fields);
                     if (!$r->isSuccess()) {
                         $result->addErrors($r->getErrors());
                     }
                 }
                 if (!empty($bundleIndexList) && is_array($bundleIndexList)) {
                     foreach ($bundleIndexList as $bundleBasketItemCode => $bundleItemValue) {
                         /** @var BasketItem $bundleBasketItem */
                         if ($bundleBasketItem = $bundleCollection->getItemByBasketCode($bundleBasketItemCode)) {
                             $bundleBasketItem->delete();
                         }
                     }
                 }
             }
         }
     }
     /** @var Order $order */
     if ($order = $this->getOrder()) {
         $r = $order->refreshData(array('PRICE', 'PRICE_DELIVERY'));
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         }
     }
     if ($isStartField) {
         $hasMeaningfulFields = $this->hasMeaningfulField();
         /** @var Result $r */
         $r = $this->doFinalAction($hasMeaningfulFields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         }
     }
     return $result;
 }