/** * @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; }
/** * @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; }
/** * @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; }