/**
  * @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;
 }
Exemple #2
0
 /**
  * @param array $filter
  * @return Basket|static
  */
 protected function loadFromDb(array $filter)
 {
     $order = $this->getOrder();
     if ($order instanceof OrderBase) {
         $this->setOrder($order);
     }
     $select = array("ID", "LID", "MODULE", "PRODUCT_ID", "QUANTITY", "WEIGHT", "DELAY", "CAN_BUY", "PRICE", "CUSTOM_PRICE", "BASE_PRICE", 'PRODUCT_PRICE_ID', "CURRENCY", 'BARCODE_MULTI', "RESERVED", "RESERVE_QUANTITY", "NAME", "CATALOG_XML_ID", "VAT_RATE", "NOTES", "DISCOUNT_PRICE", "PRODUCT_PROVIDER_CLASS", "CALLBACK_FUNC", "ORDER_CALLBACK_FUNC", "PAY_CALLBACK_FUNC", "CANCEL_CALLBACK_FUNC", "DIMENSIONS", "TYPE", "SET_PARENT_ID", "DETAIL_PAGE_URL", "FUSER_ID", 'MEASURE_CODE', 'MEASURE_NAME', 'ORDER_ID', 'DATE_INSERT', 'DATE_UPDATE', 'PRODUCT_XML_ID', 'SUBSCRIBE', 'RECOMMENDATION', 'VAT_INCLUDED');
     $basketItemList = array();
     $first = true;
     $res = static::getList(array("filter" => $filter, "select" => $select, "order" => array('ID' => 'ASC')));
     while ($basket = $res->fetch()) {
         $basketItem = BasketItem::create($this, $basket['MODULE'], $basket['PRODUCT_ID']);
         $basketItem->initFields($basket);
         if ($basketItem->isBundleChild()) {
             $basketItemList[$basketItem->getId()] = $basketItem;
         } else {
             $basketItem->setCollection($this);
             $this->addItem($basketItem);
         }
         if ($first) {
             //				$this->setFUserId($basketItem->getFUserId());
             $this->setSiteId($basketItem->getField('LID'));
             $first = false;
         }
     }
     if (!empty($basketItemList)) {
         $this->setChildBundleCollection($basketItemList);
     }
     return $this;
 }
Exemple #3
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;
 }
 /**
  * @param array $oldOrder
  * @return Shipment
  * @internal
  */
 public static function convertOrderOldToNew(array $oldOrder)
 {
     $siteId = isset($oldOrder["SITE_ID"]) ? $oldOrder["SITE_ID"] : SITE_ID;
     $newOrder = \Bitrix\Sale\Order::create($siteId, null, $oldOrder["CURRENCY"]);
     $isStartField = $newOrder->isStartField();
     if (!empty($oldOrder["PERSON_TYPE_ID"]) && intval($oldOrder["PERSON_TYPE_ID"]) > 0) {
         $personTypeId = $oldOrder["PERSON_TYPE_ID"];
     } else {
         $dbPersonType = \CSalePersonType::GetList(array("SORT" => "ASC", "NAME" => "ASC"), array("ACTIVE" => "Y", "LID" => $siteId));
         if ($arPersonType = $dbPersonType->GetNext()) {
             $personTypeId = $arPersonType["ID"];
         } else {
             $personTypeId = 1;
         }
     }
     $newOrder->setPersonTypeId($personTypeId);
     $newOrder->setFieldNoDemand("PRICE", $oldOrder["PRICE"]);
     $basket = \Bitrix\Sale\Basket::create($siteId);
     $settableFields = array_flip(\Bitrix\Sale\BasketItemBase::getSettableFields());
     if (!empty($oldOrder["ITEMS"]) && is_array($oldOrder["ITEMS"])) {
         foreach ($oldOrder["ITEMS"] as $oldBasketItem) {
             $basketId = null;
             if (!empty($oldBasketItem['ID']) && intval($oldBasketItem['ID']) > 0) {
                 $basketId = $oldBasketItem['ID'];
             }
             $newBasketItem = \Bitrix\Sale\BasketItem::create($basket, $oldBasketItem['MODULE'], $oldBasketItem['PRODUCT_ID']);
             $oldBasketItem = array_intersect_key($oldBasketItem, $settableFields);
             $newBasketItem->setFieldsNoDemand($oldBasketItem);
             if ($basketId > 0) {
                 $newBasketItem->setFieldNoDemand('ID', $basketId);
             }
             if ($newBasketItem->isBundleChild()) {
                 continue;
             }
             $basket->addItem($newBasketItem);
         }
     }
     $props = $newOrder->getPropertyCollection();
     if (!empty($oldOrder['PROPERTIES']) && is_array($oldOrder['PROPERTIES'])) {
         $r = $props->setValuesFromPost($oldOrder, $_FILES);
     }
     $newOrder->setBasket($basket);
     if ($loc = $props->getDeliveryLocation()) {
         $loc->setValue($oldOrder["LOCATION_TO"]);
     }
     if ($loc = $props->getDeliveryLocationZip()) {
         $loc->setValue($oldOrder["LOCATION_ZIP"]);
     }
     /** @var \Bitrix\Sale\ShipmentCollection $shipmentCollection */
     $shipmentCollection = $newOrder->getShipmentCollection();
     $shipment = $shipmentCollection->createItem();
     $shipment->setField("CURRENCY", $oldOrder["CURRENCY"]);
     $shipmentItemCollection = $shipment->getShipmentItemCollection();
     foreach ($newOrder->getBasket() as $item) {
         $shipmentItem = $shipmentItemCollection->createItem($item);
         $shipmentItem->setQuantity($item->getQuantity());
         if (strlen($shipmentItem->getField("DIMENSIONS"))) {
             $shipmentItem->setField("DIMENSIONS", unserialize($shipmentItem->getField("DIMENSIONS")));
         }
     }
     if (isset($arOrder["DELIVERY_EXTRA_SERVICES"])) {
         $shipment->setExtraServices($arOrder["DELIVERY_EXTRA_SERVICES"]);
     }
     return $shipment;
 }