Exemplo n.º 1
0
 /**
  * apply discount.
  * @internal
  * @param array $data			Order data.
  * @return Result
  */
 public function applyDiscount(array $data)
 {
     if (!empty($data['BASKET_ITEMS']) && is_array($data['BASKET_ITEMS'])) {
         /** @var Basket $basket */
         $basket = $this->getBasket();
         foreach ($data['BASKET_ITEMS'] as $basketCode => $basketItemData) {
             /** @var BasketItem $basketItem */
             if ($basketItem = $basket->getItemByBasketCode($basketCode)) {
                 if (!$basketItem->isCustomPrice()) {
                     if (isset($basketItemData['PRICE']) && isset($basketItemData['DISCOUNT_PRICE'])) {
                         $basketItemData['PRICE'] = (double) $basketItemData['PRICE'];
                         if ($basketItemData['PRICE'] >= 0 && $basketItem->getPrice() != $basketItemData['PRICE']) {
                             $basketItemData['PRICE'] = PriceMaths::roundPrecision($basketItemData['PRICE']);
                             $basketItemData['DISCOUNT_PRICE'] = PriceMaths::roundPrecision($basketItemData['DISCOUNT_PRICE']);
                             $basketItem->setField('PRICE', $basketItemData['PRICE']);
                             $basketItem->setField('DISCOUNT_PRICE', $basketItemData['DISCOUNT_PRICE']);
                         }
                     }
                 }
             }
             unset($basketItem);
         }
         unset($basketCode, $basketItemData);
     }
     if (isset($data['SHIPMENT']) && intval($data['SHIPMENT']) > 0 && isset($data['PRICE_DELIVERY']) && floatval($data['PRICE_DELIVERY']) >= 0) {
         /** @var ShipmentCollection $shipmentCollection */
         if ($shipmentCollection = $this->getShipmentCollection()) {
             /** @var Shipment $shipment */
             if ($shipment = $shipmentCollection->getItemByShipmentCode($data['SHIPMENT'])) {
                 if (floatval($data['PRICE_DELIVERY']) >= 0 && !$shipment->isCustomPrice()) {
                     $data['PRICE_DELIVERY'] = PriceMaths::roundPrecision(floatval($data['PRICE_DELIVERY']));
                     $shipment->setField('PRICE_DELIVERY', $data['PRICE_DELIVERY']);
                 }
             }
         }
     }
     if (isset($data['DISCOUNT_PRICE']) && floatval($data['DISCOUNT_PRICE']) >= 0) {
         $data['DISCOUNT_PRICE'] = PriceMaths::roundPrecision(floatval($data['DISCOUNT_PRICE']));
         $this->setField('DISCOUNT_PRICE', $data['DISCOUNT_PRICE']);
     }
     return new Result();
 }
Exemplo n.º 2
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;
 }