コード例 #1
0
 /**
  * @param Sale\Basket $basket
  * @param array $requestBasketItems
  *
  * @return Sale\Result
  * @throws Main\ArgumentNullException
  * @throws Main\ArgumentTypeException
  * @throws Main\ObjectException
  * @throws Main\ObjectNotFoundException
  */
 protected function parseBasketItems(Sale\Basket $basket, array $requestBasketItems)
 {
     $result = new Sale\Result();
     $basketCodeList = array();
     $basketItemList = array();
     $basketParentList = array();
     $basketChildList = array();
     $basketChanged = false;
     $publicMode = DiscountCompatibility::usedByClient();
     foreach ($requestBasketItems as $basketIndex => $basketItemData) {
         if (isset($basketItemData['SET_PARENT_ID']) && strval($basketItemData['SET_PARENT_ID']) != '') {
             $parentId = intval($basketItemData['SET_PARENT_ID']);
             if ($basketItemData['TYPE'] != Sale\Basket::TYPE_SET && !array_key_exists($parentId, $basketParentList)) {
                 $basketChildList[intval($basketItemData['SET_PARENT_ID'])] = $basketItemData['SET_PARENT_ID'];
             }
         }
     }
     $orderCompatibility = $this->getOrderCompatibility();
     /** @var Sale\Order $order */
     $order = $orderCompatibility->getOrder();
     $basketItemsIndexList = array();
     foreach ($basket as $basketItem) {
         $basketItemsIndexList[$basketItem->getId()] = true;
     }
     foreach ($requestBasketItems as $basketIndex => $basketItemData) {
         $basketItem = null;
         if (isset($basketItemData['ID']) && intval($basketItemData['ID']) > 0) {
             /** @var Sale\BasketItem $basketItem */
             if ($basketItem = $basket->getItemById($basketItemData['ID'])) {
                 if (isset($basketItemsIndexList[$basketItem->getId()])) {
                     unset($basketItemsIndexList[$basketItem->getId()]);
                 }
             }
         }
         if (!$basketItem) {
             /** @var Sale\BasketItem $basketItem */
             $basketItem = Sale\BasketItem::create($basket, $basketItemData['MODULE'], $basketItemData['PRODUCT_ID']);
             $basketChanged = true;
         }
         $itemDuplicate = isset($basketItemData['DUPLICATE']) && $basketItemData['DUPLICATE'] == "Y";
         $basketFields = static::clearFields($basketItemData);
         //			$basketFields['BASKET_CODE'] = $basketItem->getBasketCode();
         if ($order->getId() > 0) {
             /** @var Sale\ShipmentCollection $shipmentCollection */
             if ($shipmentCollection = $order->getShipmentCollection()) {
                 if (count($shipmentCollection) == 2 && (isset($basketItemData['QUANTITY']) && floatval($basketItemData['QUANTITY']) <= $basketItem->getQuantity())) {
                     /** @var Sale\Shipment $shipment */
                     foreach ($shipmentCollection as $shipment) {
                         if ($shipment->isSystem()) {
                             continue;
                         }
                         $basketQuantity = $shipment->getBasketItemQuantity($basketItem);
                         if ($basketQuantity <= floatval($basketItemData['QUANTITY'])) {
                             continue;
                         }
                         /** @var Sale\ShipmentItemCollection $shipmentItemCollection */
                         if ($shipmentItemCollection = $shipment->getShipmentItemCollection()) {
                             /** @var Sale\ShipmentItem $shipmentItem */
                             if (!($shipmentItem = $shipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode()))) {
                                 continue;
                             }
                             $shipmentItem->setQuantity(floatval($basketItemData['QUANTITY']));
                         }
                     }
                 }
             }
         }
         $isBasketItemCanBeAdded = true;
         if ($publicMode) {
             if (\CSaleBasketHelper::isSetParent($basketItemData)) {
                 $parentId = (int) $basketItemData['ID'];
                 $parentCode = $basketItemData['ID'];
             } else {
                 $parentId = (int) $basketItemData['SET_PARENT_ID'];
                 $parentCode = $basketItemData['SET_PARENT_ID'];
             }
         } else {
             $parentId = (int) $basketItemData['SET_PARENT_ID'];
             $parentCode = $basketItemData['SET_PARENT_ID'];
         }
         if ($parentId > 0) {
             if ($basketItem->isBundleParent()) {
                 $basketParentList[$parentCode] = $basketItem->getBasketCode();
             } else {
                 $isBasketItemCanBeAdded = false;
                 $basketItemList[$parentCode][$basketIndex] = $basketItem;
             }
         }
         if ($isBasketItemCanBeAdded) {
             $propList = array();
             /** @var Sale\BasketPropertiesCollection $propertyCollection */
             if ($propertyCollection = $basketItem->getPropertyCollection()) {
                 $propList = $propertyCollection->getPropertyValues();
             }
             /** @var null|Sale\BasketItem $foundedBasketItem */
             $foundedBasketItem = null;
             if ($basketItem->getId() > 0 && ($foundedBasketItem = $basket->getItemById($basketItem->getId()))) {
                 $basketCodeList[$publicMode ? $foundedBasketItem->getId() : $basketIndex] = $foundedBasketItem->getBasketCode();
             } else {
                 if (!$itemDuplicate && ($foundedBasketItem = $basket->getExistsItem($basketItem->getField('MODULE'), $basketItem->getProductId(), $propList))) {
                     $basketCodeList[$publicMode ? $foundedBasketItem->getId() : $basketIndex] = $foundedBasketItem->getBasketCode();
                 }
             }
             if ($foundedBasketItem === null) {
                 $basket->addItem($basketItem);
                 $basketCodeList[$publicMode ? $basketItem->getId() : $basketIndex] = $basketItem->getBasketCode();
                 $basketChanged = true;
             }
         }
         /** @var Sale\Result $r */
         $r = $basketItem->setFields($basketFields);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         }
     }
     if (!empty($basketChildList)) {
         foreach ($basketItemList as $parentBasketCode => $childBasketItemList) {
             $parentCode = null;
             if (!empty($basketParentList[$parentBasketCode])) {
                 $parentCode = $basketParentList[$parentBasketCode];
             }
             if (strval($parentCode) == '') {
                 continue;
             }
             /** @var Sale\BasketItem $parentBasketItem */
             if (!($parentBasketItem = $basket->getItemByBasketCode($parentCode))) {
                 throw new Main\ObjectNotFoundException('Entity parent "BasketItem" not found');
             }
             if (!empty($childBasketItemList) && is_array($childBasketItemList)) {
                 /** @var Sale\BasketItem $childBasketItem */
                 foreach ($childBasketItemList as $indexChildBasketItem => $childBasketItem) {
                     $basketCodeIndex = $publicMode ? $childBasketItem->getId() : $indexChildBasketItem;
                     $childBasketCode = $childBasketItem->getBasketCode();
                     $propList = array();
                     /** @var Sale\BasketPropertiesCollection $propertyCollection */
                     if ($propertyCollection = $childBasketItem->getPropertyCollection()) {
                         $propList = $propertyCollection->getPropertyValues();
                     }
                     /** @var Sale\BasketItem $foundedBasketItem */
                     if ($foundedBasketItem = Sale\Basket::getExistsItemInBundle($parentBasketItem, $childBasketItem->getField('MODULE'), $childBasketItem->getProductId(), $propList)) {
                         $childBasketCode = $foundedBasketItem->getBasketCode();
                         unset($childBasketItemList[$indexChildBasketItem]);
                         $basketCodeIndex = $publicMode ? $foundedBasketItem->getId() : $indexChildBasketItem;
                     }
                     if (strval($childBasketCode) != '') {
                         $basketCodeList[$basketCodeIndex] = $childBasketCode;
                     }
                 }
                 if (!empty($childBasketItemList)) {
                     $basket->setChildBundleCollection($childBasketItemList, $parentBasketItem);
                 }
             }
         }
     }
     if (!empty($basketItemsIndexList) && is_array($basketItemsIndexList)) {
         foreach ($basketItemsIndexList as $basketIndexId => $basketIndexValue) {
             if ($foundedBasketItem = $basket->getItemById($basketIndexId)) {
                 $foundedBasketItem->delete();
                 $basketChanged = true;
             }
         }
     }
     $result->setData(array('BASKET' => $basket, 'BASKET_CODE_LIST' => $basketCodeList, 'BASKET_CHANGED' => $basketChanged));
     return $result;
 }
コード例 #2
0
 /**
  * @internal
  *
  * @param Sale\Basket $basket
  * @param array $requestFields
  *
  * @return bool
  */
 public function resetOrderPrice(Sale\Basket $basket, array $requestFields)
 {
     if (empty($requestFields['BASKET_ITEMS'])) {
         return false;
     }
     $resetPrice = false;
     $resetPriceDelivery = false;
     /** @var Sale\Order $order */
     $order = $this->getOrder();
     if ($order->getId() == 0) {
         $order->resetData(array('PRICE_DELIVERY'));
         $resetPriceDelivery = true;
     }
     foreach ($requestFields['BASKET_ITEMS'] as $basketData) {
         if (!isset($basketData['ID']) || intval($basketData['ID']) <= 0) {
             continue;
         }
         /** @var Sale\BasketItem $basketItem */
         if (!($basketItem = $basket->getItemById($basketData['ID']))) {
             continue;
         }
         if ($resetPriceDelivery === false) {
             if ($order->getId() == 0 || isset($basketData['PRICE']) && floatval($basketData['PRICE']) != $basketItem->getPrice()) {
                 $order->resetData(array('PRICE'));
                 $resetPrice = true;
             }
         }
         //			if ($resetPriceDelivery === false)
         //			{
         //				if ($order->getId() == 0 || isset($basketData['QUANTITY'])
         //					&& floatval($basketData['QUANTITY']) != $basketItem->getQuantity())
         //				{
         //					$order->resetData(array('PRICE_DELIVERY'));
         //					$resetPriceDelivery = true;
         //				}
         //			}
         if ($resetPriceDelivery && $resetPrice) {
             return true;
         }
     }
     //
     return false;
 }