Example #1
0
 public static function create(ShipmentItemStoreCollection $collection, BasketItem $basketItem)
 {
     $fields = array('BASKET_ID' => $basketItem->getId());
     $shipmentItemStore = new static($fields);
     $shipmentItemStore->setCollection($collection);
     $shipmentItemStore->basketItem = $basketItem;
     return $shipmentItemStore;
 }
Example #2
0
 /**
  * @param BasketItem $basketItem
  * @return static
  * @throws \Bitrix\Main\ArgumentException
  */
 public static function load(BasketItem $basketItem)
 {
     $basketPropertyCollection = new static();
     $basketPropertyCollection->basketItem = $basketItem;
     if ($basketItem->getId() <= 0) {
         return $basketPropertyCollection;
     }
     $res = Internals\BasketPropertyTable::getList(array('order' => array("SORT" => "ASC", "ID" => "ASC"), 'filter' => array("BASKET_ID" => $basketItem->getId())));
     while ($property = $res->fetch()) {
         $basketPropertyItem = BasketPropertyItem::create($basketPropertyCollection);
         $basketPropertyItem->initFields($property);
         $basketPropertyCollection->addItem($basketPropertyItem);
     }
     return $basketPropertyCollection;
 }
Example #3
0
 /**
  * @internal
  * @param BasketItem $basketItem
  * @param $moduleId
  * @param $productId
  * @param array $properties
  *
  * @return BasketItem|bool
  */
 public static function getExistsItemInBundle(BasketItem $basketItem, $moduleId, $productId, array $properties = array())
 {
     if (!$basketItem->isBundleParent()) {
         return null;
     }
     if (($bundleList = $basketItem->getBundleCollection()) && count($bundleList) > 0) {
         /** @var BasketItem $bundleBasketItem */
         foreach ($basketItem->getBundleCollection() as $bundleBasketItem) {
             if ($bundleBasketItem->getField('PRODUCT_ID') != $productId || $bundleBasketItem->getField('MODULE') != $moduleId) {
                 continue;
             }
             if (!empty($properties) && is_array($properties)) {
                 /** @var BasketPropertiesCollection $basketPropertyCollection */
                 $basketPropertyCollection = $bundleBasketItem->getPropertyCollection();
                 if ($basketPropertyCollection->isPropertyAlreadyExists($properties)) {
                     return $bundleBasketItem;
                 }
             } else {
                 return $bundleBasketItem;
             }
         }
     }
     return null;
 }
Example #4
0
 public function adapt(array $row)
 {
     if (!empty($row["~DIMENSIONS"]) && is_array($row["~DIMENSIONS"])) {
         $row["~DIMENSIONS"] = serialize($row["~DIMENSIONS"]);
     }
     if (!empty($row["DIMENSIONS"]) && is_array($row["DIMENSIONS"])) {
         $row["DIMENSIONS"] = serialize($row["DIMENSIONS"]);
     }
     if (!empty($row["QUANTITY"])) {
         $row["QUANTITY"] = Sale\BasketItem::formatQuantity($row['QUANTITY']);
     }
     if (!empty($row["~QUANTITY"])) {
         $row["~QUANTITY"] = Sale\BasketItem::formatQuantity($row['~QUANTITY']);
     }
     return $row;
 }
Example #5
0
 /**
  * @param $action
  * @param BasketItem $basketItem
  * @param null $name
  * @param null $oldValue
  * @param null $value
  */
 public function onBasketModify($action, BasketItem $basketItem, $name = null, $oldValue = null, $value = null)
 {
     switch ($action) {
         case "UPDATE":
             if ($name == "QUANTITY") {
                 /** @var ShipmentItemCollection $collection */
                 $collection = $this->getCollection();
                 $shipment = $collection->getShipment();
                 if ($shipment->isShipped() != "Y") {
                     return true;
                 }
                 if ($basketItem->getBasketCode() != $this->getBasketCode()) {
                     return true;
                 }
                 $quantity = $value - $oldValue;
                 if ($quantity != 0) {
                     $result = Provider::tryReserveShipmentItem($this);
                 }
                 if (!empty($result) && is_array($result)) {
                     $this->setField('RESERVED_QUANTITY', $result['QUANTITY']);
                     if ($quantity > 0) {
                         if ($this->getQuantity() != $this->getReservedQuantity()) {
                             /** @var ShipmentItemCollection $shipmentItemCollection */
                             $shipmentItemCollection = $this->getCollection();
                             /** @var Shipment $shipment */
                             $shipment = $shipmentItemCollection->getShipment();
                             $shipment->setMark();
                         }
                     }
                 }
             }
             //change quantity
             break;
         case "DELETE":
             // unreserve
             break;
     }
 }
Example #6
0
 /**
  * @internal
  * @return array|bool
  */
 public function getListOfFormatText()
 {
     $list = array();
     /** @var BasketItem $basketItem */
     foreach ($this->collection as $basketItem) {
         if ($basketItem->isBundleChild()) {
             continue;
         }
         $basketItemData = $basketItem->getField("NAME");
         /** @var \Bitrix\Sale\BasketPropertiesCollection $basketPropertyCollection */
         if ($basketPropertyCollection = $basketItem->getPropertyCollection()) {
             $basketItemDataProperty = "";
             /** @var \Bitrix\Sale\BasketPropertyItem $basketPropertyItem */
             foreach ($basketPropertyCollection as $basketPropertyItem) {
                 if ($basketPropertyItem->getField('CODE') == "PRODUCT.XML_ID" || $basketPropertyItem->getField('CODE') == "CATALOG.XML_ID") {
                     continue;
                 }
                 if (strval(trim($basketPropertyItem->getField('VALUE'))) == "") {
                     continue;
                 }
                 $basketItemDataProperty .= (!empty($basketItemDataProperty) ? "; " : "") . trim($basketPropertyItem->getField('NAME')) . ": " . trim($basketPropertyItem->getField('VALUE'));
             }
             if (!empty($basketItemDataProperty)) {
                 $basketItemData .= " [" . $basketItemDataProperty . "]";
             }
         }
         $measure = strval($basketItem->getField("MEASURE_NAME")) != '' ? $basketItem->getField("MEASURE_NAME") : Loc::getMessage("SOA_SHT");
         $list[$basketItem->getBasketCode()] = $basketItemData . " - " . BasketItem::formatQuantity($basketItem->getQuantity()) . " " . $measure . ": " . SaleFormatCurrency($basketItem->getPrice(), $basketItem->getCurrency());
     }
     return !empty($list) ? $list : false;
 }
 /**
  * @internal
  * @param Sale\BasketItem $basketItem
  *
  * @return array
  * @throws Main\ObjectNotFoundException
  */
 public static function convertBasketItemToArray(Sale\BasketItem $basketItem)
 {
     $fields = $basketItem->getFieldValues();
     /** @var Sale\Basket $basket */
     if (!($basket = $basketItem->getCollection())) {
         throw new Main\ObjectNotFoundException('Entity "Basket" not found');
     }
     if (empty($fields['LID'])) {
         $fields['LID'] = $basket->getSiteId();
     }
     if (empty($fields['LID'])) {
         if ($order = $basket->getOrder()) {
             $fields['LID'] = $order->getField('LID');
         }
         //$order->getField('LID')
     }
     if (empty($fields['FUSER_ID'])) {
         $fields['FUSER_ID'] = $basket->getFUserId(true);
     }
     /** @var Sale\BasketPropertiesCollection $basketPropertyCollection */
     if ($basketPropertyCollection = $basketItem->getPropertyCollection()) {
         /** @var Sale\BasketPropertyItem $basketPropertyItem */
         foreach ($basketPropertyCollection as $basketPropertyItem) {
             $propValues = $basketPropertyItem->getFieldValues();
             $propData = array("NAME" => $propValues['NAME'], "CODE" => $propValues['CODE'], "VALUE" => $propValues['VALUE'], "SORT" => $propValues['SORT']);
             if (isset($propValues['ID']) && intval($propValues['ID']) > 0) {
                 $propData['ID'] = $propValues['ID'];
             }
             $fields['PROPS'][] = $propData;
         }
     }
     return $fields;
 }
Example #8
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;
 }
Example #9
0
 /**
  * @param Sale\BasketItem $basketItem
  * @param $quantity
  */
 public function set(Sale\BasketItem $basketItem, $quantity)
 {
     $this->quantities[$basketItem->getBasketCode()] = $quantity;
     $this->items[$basketItem->getBasketCode()] = $basketItem;
 }
Example #10
0
 protected static function setBasketItemFields(\Bitrix\Sale\BasketItem &$item, array $fields = array())
 {
     $result = $item->setFields($fields);
     if (!$result->isSuccess()) {
         foreach ($result->getErrors() as $error) {
             if ($error->getCode() == "CATALOG_QUANTITY_NOT_ENOGH") {
                 if ((string) Option::get('catalog', 'allow_negative_amount') != 'Y') {
                     $data = $result->getData();
                     $res = $item->setField("QUANTITY", $data["AVAILABLE_QUANTITY"]);
                     if (!$res->isSuccess()) {
                         $result->addErrors($res->getErrors());
                     }
                 }
             }
         }
     }
     return $result;
 }
 /**
  * @param $quantity
  *
  * @return float
  * @throws \Bitrix\Main\ArgumentNullException
  */
 public static function formatQuantity($quantity)
 {
     $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N');
     if ($isOrderConverted == "Y") {
         return \Bitrix\Sale\BasketItem::formatQuantity($quantity);
     }
     return roundEx($quantity, SALE_VALUE_PRECISION);
 }
Example #12
0
 $fieldValue .= "</div>";
 if (strlen($arItem["NAME"]) > 0) {
     $fieldName .= "<nobr>";
     if (strlen($arItem["DETAIL_PAGE_URL"]) > 0) {
         $fieldName .= '<a href="' . $url . '">';
     }
     $fieldName .= htmlspecialcharsbx($arItem["NAME"]);
     if (strlen($arItem["DETAIL_PAGE_URL"]) > 0) {
         $fieldName .= "</a>";
     }
     $fieldName .= "</nobr>";
 } else {
     $fieldName .= "<br />";
 }
 if (strlen($arItem["QUANTITY"]) > 0) {
     $fieldQuantity .= htmlspecialcharsbx(Sale\BasketItem::formatQuantity($arItem["QUANTITY"])) . " " . $measure;
 } else {
     $fieldQuantity .= "<br />";
 }
 if (strlen($arItem["PRODUCT_ID"]) > 0) {
     $fieldProductID .= htmlspecialcharsbx($arItem["PRODUCT_ID"]);
 } else {
     $fieldProductID .= "<br />";
 }
 if (strlen($arItem["PRICE"]) > 0) {
     $fieldPrice .= "<nobr>" . htmlspecialcharsex(SaleFormatCurrency($arItem["PRICE"], $arItem["CURRENCY"])) . "</nobr>";
 } else {
     $fieldPrice .= "<br />";
 }
 if (strlen($arItem["WEIGHT"]) > 0) {
     if ((double) $WEIGHT_KOEF[$arOrder["LID"]] > 0) {
 /**
  * @param BasketItem $basketItem
  * @return bool
  * @throws Main\ObjectNotFoundException
  */
 protected function isExistsBasketItem(BasketItem $basketItem)
 {
     /** @var ShipmentItem $shipmentItem */
     foreach ($this->collection as $shipmentItem) {
         if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode()) {
             return true;
         }
     }
     return false;
 }
Example #14
0
 /**
  * @param array $discounts
  * @return array|null
  * @throws Main\LoaderException
  */
 public function prepareData(array $inParams = array())
 {
     if ($this->data === null) {
         $result = array("ITEMS" => array(), "WEIGHT" => 0);
         $basket = $this->order->getBasket();
         if (empty($inParams["DISCOUNTS"])) {
             $inParams["DISCOUNTS"] = OrderEdit::getDiscountsApplyResult($this->order, true);
         }
         $basketDiscount = 0;
         $basketPrice = 0;
         $basketPriceBase = 0;
         if (!$basket) {
             $result["WEIGHT_FOR_HUMAN"] = roundEx(floatval(0), SALE_WEIGHT_PRECISION);
             $this->data = $result;
             return $result;
         }
         $result["WEIGHT"] = $basket->getWeight();
         $result["WEIGHT_FOR_HUMAN"] = roundEx(floatval($result["WEIGHT"] / $this->weightKoef), SALE_WEIGHT_PRECISION);
         $items = $basket->getBasketItems();
         /** @var \Bitrix\Sale\BasketItem $item */
         if (self::$catalogIncluded === null) {
             self::$catalogIncluded = Main\Loader::includeModule('catalog');
         }
         foreach ($items as $item) {
             $productId = $item->getProductId();
             $params = array();
             if ($item->getField("MODULE") == "catalog") {
                 $params = static::getProductDetails($productId, $item->getQuantity(), $this->order->getUserId(), $this->order->getSiteId(), $this->visibleColumns);
             } elseif (strval($item->getField("MEASURE_CODE")) != '' && self::$catalogIncluded) {
                 $measures = OrderBasket::getCatalogMeasures();
                 if (isset($measures[$item->getField("MEASURE_CODE")]) && strlen($measures[$item->getField("MEASURE_CODE")]) > 0) {
                     $params["MEASURE_TEXT"] = $measures[$item->getField("MEASURE_CODE")];
                 }
                 if (strval($params["MEASURE_TEXT"]) == '') {
                     $defaultMeasure = static::getDefaultMeasures();
                     $params["MEASURE_TEXT"] = $defaultMeasure["SYMBOL_RUS"] != '' ? $defaultMeasure["SYMBOL_RUS"] : $defaultMeasure["SYMBOL_INTL"];
                 }
             }
             if (!isset($params["OFFER_ID"])) {
                 $params["OFFER_ID"] = $productId;
             }
             $params["BASKET_CODE"] = $basketCode = $item->getBasketCode();
             $params["PRODUCT_PROVIDER_CLASS"] = $item->getProvider();
             $id = $params["PRODUCT_ID"];
             $params = array_merge($params, $item->getFieldValues(), array("PRODUCT_ID" => $id));
             $params["PROPS"] = array();
             $params["QUANTITY"] = Sale\BasketItem::formatQuantity($params["QUANTITY"]);
             /** @var \Bitrix\Sale\BasketPropertyItem $property */
             foreach ($item->getPropertyCollection() as $property) {
                 $params["PROPS"][] = array("VALUE" => $property->getField("VALUE"), "NAME" => $property->getField("NAME"), "CODE" => $property->getField("CODE"), "SORT" => $property->getField("SORT"));
             }
             if (isset($inParams["DISCOUNTS"]["RESULT"]["BASKET"][$basketCode]) && is_array($inParams["DISCOUNTS"]["RESULT"]["BASKET"][$basketCode])) {
                 foreach ($inParams["DISCOUNTS"]["RESULT"]["BASKET"][$basketCode] as $discount) {
                     $params["DISCOUNTS"][$discount["DISCOUNT_ID"]] = $discount;
                 }
             }
             if (isset($inParams["DISCOUNTS"]["PRICES"]["BASKET"][$basketCode])) {
                 $params["PRICE_BASE"] = roundEx($inParams["DISCOUNTS"]["PRICES"]["BASKET"][$basketCode]["BASE_PRICE"], SALE_VALUE_PRECISION);
                 $params["PRICE"] = roundEx($inParams["DISCOUNTS"]["PRICES"]["BASKET"][$basketCode]["PRICE"], SALE_VALUE_PRECISION);
                 $basketPriceBase += $params["PRICE_BASE"] * $params["QUANTITY"];
                 $basketPrice += $params["PRICE"] * $params["QUANTITY"];
                 if (!$item->isCustomPrice()) {
                     $basketDiscount += $inParams["DISCOUNTS"]["PRICES"]["BASKET"][$basketCode]["DISCOUNT"] * $params["QUANTITY"];
                 }
             } else {
                 // TODO: for old orders
             }
             $params["CUSTOM_PRICE"] = $item->isCustomPrice() ? "Y" : "N";
             //Let's cache provider product data into form field
             if (Provider::isExistsTrustData($this->order->getSiteId(), 'sale', $item->getProductId())) {
                 $providerData = Provider::getTrustData($this->order->getSiteId(), 'sale', $item->getProductId());
                 if (is_array($providerData) && !empty($providerData)) {
                     $params["PROVIDER_DATA"] = serialize($providerData);
                 }
             }
             if (is_array($params["SET_ITEMS"]) && !empty($params["SET_ITEMS"])) {
                 $params["SET_ITEMS_DATA"] = serialize($params["SET_ITEMS"]);
             }
             $result["ITEMS"][$basketCode] = $params;
         }
         $result["BASKET_PRICE_BASE"] = roundEx($basketPriceBase, SALE_VALUE_PRECISION);
         $result["BASKET_PRICE"] = roundEx($basketPrice, SALE_VALUE_PRECISION);
         $result["DISCOUNT_VALUE"] = roundEx($basketDiscount, SALE_VALUE_PRECISION);
         $result["ITEMS_ORDER"] = array_keys($result["ITEMS"]);
         if (!isset($inParams["SKIP_SKU_INFO"]) || $inParams["SKIP_SKU_INFO"] != true) {
             $result = static::getOffersSkuParams($result);
         }
         $this->data = $result;
     }
     return $this->data;
 }
Example #15
0
 protected static function getProductPoolQuantityByBasketItem(\Bitrix\Sale\BasketItem $basketItem)
 {
     /** @var \Bitrix\Sale\Basket $basket */
     if (!($basket = $basketItem->getCollection())) {
         return false;
     }
     /** @var \Bitrix\Sale\Order $order */
     if (!($order = $basket->getOrder())) {
         return false;
     }
     return \Bitrix\Sale\Provider::getReservationPoolItem($order->getInternalId(), $basketItem);
 }
Example #16
0
 /**
  * @param BasketItem $basketItem
  * @return float|int
  * @throws Main\ObjectNotFoundException
  */
 public function getBasketItemQuantity(BasketItem $basketItem)
 {
     $allQuantity = 0;
     /** @var ShipmentItemCollection $shipmntItemCollection */
     if (!($shipmentItemCollection = $this->getShipmentItemCollection())) {
         throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
     }
     /** @var ShipmentItem $shipmentItem */
     foreach ($shipmentItemCollection as $shipmentItem) {
         if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode()) {
             $allQuantity += $shipmentItem->getQuantity();
         }
     }
     return $allQuantity;
 }
 /**
  * @param BasketItem $basketItem
  *
  * @return Result
  * @throws Main\ArgumentOutOfRangeException
  * @throws Main\ObjectNotFoundException
  * @throws \ErrorException
  */
 public function deleteByBasketItem(BasketItem $basketItem)
 {
     $result = new Result();
     $systemShipmentItem = null;
     /** @var Shipment $shipment */
     if (!($shipment = $this->getShipment())) {
         throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
     }
     /** @var ShipmentItem $shipmentItem */
     foreach ($this->collection as $shipmentItem) {
         if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode()) {
             if ($shipment->isSystem()) {
                 $systemShipmentItem = $shipmentItem;
                 continue;
             }
             $r = $shipmentItem->delete();
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
             }
         }
     }
     if ($systemShipmentItem !== null) {
         if ($systemShipmentItem->getReservedQuantity() > 0) {
             /** @var Result $r */
             $r = $systemShipmentItem->tryUnreserve();
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
             }
         }
         if ($result->isSuccess()) {
             $shipmentItem->setFieldNoDemand('QUANTITY', 0);
         }
     }
     return $result;
 }
Example #18
0
 /**
  * Modify basket.
  *
  * @param string $action				Action.
  * @param BasketItem $basketItem		Basket item.
  * @param null|string $name				Field name.
  * @param null|string|int|float $oldValue		Old value.
  * @param null|string|int|float $value			New value.
  * @return Result
  * @throws Main\NotImplementedException
  * @throws Main\NotSupportedException
  * @throws Main\ObjectNotFoundException
  */
 public function onBasketModify($action, BasketItem $basketItem, $name = null, $oldValue = null, $value = null)
 {
     if ($action != EventActions::UPDATE) {
         return new Result();
     }
     if ($name == "QUANTITY") {
         if ($value < 0) {
             $result = new Result();
             $result->addError(new ResultError(Loc::getMessage('SALE_ORDER_BASKET_WRONG_QUANTITY', array('#PRODUCT_NAME#' => $basketItem->getField('NAME'))), 'SALE_ORDER_BASKET_WRONG_QUANTITY'));
             return $result;
         }
         /** @var ShipmentCollection $shipmentCollection */
         if (!($shipmentCollection = $this->getShipmentCollection())) {
             throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
         }
         $result = $shipmentCollection->onBasketModify($action, $basketItem, $name, $oldValue, $value);
         if (!$result->isSuccess()) {
             return $result;
         }
         if ($value == 0) {
             /** @var Result $r */
             $r = $this->refreshVat();
             if (!$r->isSuccess()) {
                 return $r;
             }
             if ($tax = $this->getTax()) {
                 $tax->refreshData();
             }
         }
         if ($basketItem->isBundleChild()) {
             return $result;
         }
         /** @var Result $result */
         $result = $this->setField("PRICE", $this->getBasket()->getPrice() + $this->getShipmentCollection()->getPriceDelivery());
         if ($this->getId() == 0 && !$this->isMathActionOnly()) {
             $shipmentCollection->refreshData();
         }
         return $result;
     } elseif ($name == "PRICE") {
         /** @var Result $result */
         $result = $this->setField("PRICE", $this->getBasket()->getPrice() + $this->getShipmentCollection()->getPriceDelivery());
         /** @var ShipmentCollection $shipmentCollection */
         if (!($shipmentCollection = $this->getShipmentCollection())) {
             throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
         }
         if ($this->getId() == 0 && !$this->isMathActionOnly()) {
             $shipmentCollection->refreshData();
         }
         return $result;
     } elseif ($name == "CURRENCY") {
         if ($value != $this->getField("CURRENCY")) {
             throw new Main\NotSupportedException("CURRENCY");
         }
     } elseif ($name == "DIMENSIONS") {
         /** @var ShipmentCollection $shipmentCollection */
         if (!($shipmentCollection = $this->getShipmentCollection())) {
             throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
         }
         return $shipmentCollection->onBasketModify($action, $basketItem, $name, $oldValue, $value);
     }
     return new Result();
 }
Example #19
0
 public static function checkAvailableProductQuantity(BasketItem $basketItem, $deltaQuantity)
 {
     global $APPLICATION;
     $result = new Result();
     $resultProductData = array();
     $orderId = null;
     $userId = null;
     $siteId = null;
     /** @var Basket $basket */
     $basket = $basketItem->getCollection();
     if (($order = $basket->getOrder()) !== null) {
         $userId = $order->getUserId();
         $siteId = $order->getSiteId();
     }
     if ($userId === null || $siteId === null) {
         static $usersIds = array();
         if (empty($usersIds[$basket->getFUserId()])) {
             $usersIds[$basket->getFUserId()] = \CSaleUser::GetUserID($basket->getFUserId());
         }
         $userId = $usersIds[$basket->getFUserId()];
         $siteId = $basket->getSiteId();
     }
     if ($provider = $basketItem->getProvider()) {
         if ($provider instanceof Provider) {
             throw new NotSupportedException('provider not supported');
             //					$result = $provider::getProductData($siteId, $userId, $currency, $providerBasketItemList, $select);
         } elseif ($provider && array_key_exists("IBXSaleProductProvider", class_implements($provider))) {
             $needQuantity = $basketItem->getQuantity();
             if ($order && $order->getId() > 0) {
                 $needQuantity = $deltaQuantity;
             }
             $data = array("PRODUCT_ID" => $basketItem->getProductId(), "QUANTITY" => $needQuantity, "USER_ID" => $userId, "SITE_ID" => $siteId, "BASKET_ID" => $basketItem->getId(), "CHECK_QUANTITY" => "Y", 'CHECK_PRICE' => 'N', 'CHECK_COUPONS' => 'N', "SELECT_QUANTITY_TRACE" => "Y");
             // TODO: !
             if ($deltaQuantity <= 0) {
                 $result->setData(array('AVAILABLE_QUANTITY' => $deltaQuantity));
                 return $result;
             }
             $APPLICATION->ResetException();
             $resultProductData = $provider::GetProductData($data);
             if ($ex = $APPLICATION->GetException()) {
                 $result->addError(new ResultError($ex->GetString(), $ex->GetID()));
             }
         } else {
             $APPLICATION->ResetException();
             $resultProductData = \CSaleBasket::ExecuteCallbackFunction($basketItem->getField('CALLBACK_FUNC'), $basketItem->getField('MODULE'), $basketItem->getProductId(), $basketItem->getQuantity());
             if ($ex = $APPLICATION->GetException()) {
                 $result->addError(new ResultError($ex->GetString(), $ex->GetID()));
             }
         }
     } else {
         $availableQuantity = $basketItem->getQuantity();
         if ($deltaQuantity <= 0) {
             $availableQuantity = $deltaQuantity;
         }
         $result->setData(array('AVAILABLE_QUANTITY' => $availableQuantity));
         return $result;
     }
     $fields = array();
     if (array_key_exists('QUANTITY', $resultProductData)) {
         $fields['AVAILABLE_QUANTITY'] = $resultProductData['QUANTITY'];
     }
     if (array_key_exists('QUANTITY_TRACE', $resultProductData)) {
         $fields['QUANTITY_TRACE'] = $resultProductData['QUANTITY_TRACE'] == "Y";
     }
     if (!empty($fields)) {
         $result->setData($fields);
     }
     return $result;
 }
Example #20
0
 /**
  * Perform reading main data from database, no cache is used for it
  * @throws Main\SystemException
  * @return void
  */
 protected function obtainDataOrder()
 {
     global $USER;
     $select = array('ID', 'LID', 'PERSON_TYPE_ID', 'PAYED', 'DATE_PAYED', 'EMP_PAYED_ID', 'CANCELED', 'DATE_CANCELED', 'EMP_CANCELED_ID', 'REASON_CANCELED', 'MARKED', 'DATE_MARKED', 'EMP_MARKED_ID', 'REASON_MARKED', 'STATUS_ID', 'DATE_STATUS', 'EMP_STATUS_ID', 'PRICE_DELIVERY', 'PRICE', 'CURRENCY', 'DISCOUNT_VALUE', 'USER_ID', 'DATE_INSERT', 'DATE_INSERT_FORMAT', 'DATE_UPDATE', 'USER_DESCRIPTION', 'ADDITIONAL_INFO', 'COMMENTS', 'TAX_VALUE', 'STAT_GID', 'RECURRING_ID', 'RECOUNT_FLAG', 'ORDER_TOPIC', 'ACCOUNT_NUMBER', 'XML_ID');
     $sort = array("ID" => "ASC");
     $filter = array("USER_ID" => $USER->GetID(), "ACCOUNT_NUMBER" => $this->requestData["ID"]);
     $arOrder = false;
     if ($this->options['USE_ACCOUNT_NUMBER']) {
         $res = \Bitrix\Sale\OrderTable::getList(array('filter' => $filter, 'select' => $select));
         if ($arOrder = $res->fetch()) {
             $this->requestData["ID"] = $arOrder["ID"];
         }
     }
     if (!$arOrder) {
         $filter = array("USER_ID" => $USER->GetID(), "ID" => $this->requestData["ID"]);
         $res = \Bitrix\Sale\OrderTable::getList(array('filter' => $filter, 'select' => $select));
         $arOrder = $res->fetch();
     }
     if (empty($arOrder)) {
         throw new Main\SystemException(str_replace("#ID#", $this->requestData["ID"], Localization\Loc::getMessage("SPOD_NO_ORDER")), self::E_ORDER_NOT_FOUND);
     }
     $arOShipment = array();
     $dbShipment = \Bitrix\Sale\Internals\ShipmentTable::getList(array('select' => array('DELIVERY_NAME', 'DEDUCTED', 'DATE_DEDUCTED', 'EMP_DEDUCTED_ID', 'REASON_UNDO_DEDUCTED', 'SYSTEM', 'ID', 'DELIVERY_ID', 'TRACKING_NUMBER', 'TRACKING_STATUS', 'TRACKING_DESCRIPTION', 'ALLOW_DELIVERY', 'DATE_ALLOW_DELIVERY', 'EMP_ALLOW_DELIVERY_ID', 'RESERVED', 'DELIVERY_DOC_NUM', 'DELIVERY_DOC_DATE'), 'filter' => array('ORDER_ID' => $arOrder['ID'])));
     while ($arShipment = $dbShipment->fetch()) {
         if ($arShipment['SYSTEM'] == 'Y') {
             continue;
         }
         $dbShipmentItem = \Bitrix\Sale\Internals\ShipmentItemTable::getList(array('select' => array('BASKET_ID', 'QUANTITY'), 'filter' => array('ORDER_DELIVERY_ID' => $arShipment['ID'])));
         $shipmentItems = array();
         while ($shipmentItem = $dbShipmentItem->fetch()) {
             $shipmentItem['QUANTITY'] = \Bitrix\Sale\BasketItem::formatQuantity($shipmentItem['QUANTITY']);
             $shipmentItems[$shipmentItem['BASKET_ID']] = $shipmentItem;
         }
         $arShipment['ITEMS'] = $shipmentItems;
         $arShipment['TRACKING_STATUS'] = \Bitrix\Sale\Delivery\Tracking\Manager::getStatusName($arShipment['TRACKING_STATUS']);
         $arOShipment[] = $arShipment;
     }
     $arOrder['SHIPMENT'] = $arOShipment;
     // for compatibility
     if (!empty($this->compatibilityShipmentFields) && is_array($this->compatibilityShipmentFields)) {
         foreach ($this->compatibilityShipmentFields as $shipmentField) {
             if (isset($arOShipment[0][$shipmentField])) {
                 $setFieldValue = $arOShipment[0][$shipmentField];
                 if ($setFieldValue instanceof Main\Type\Date || $setFieldValue instanceof Main\Type\DateTime) {
                     $setFieldValue = $setFieldValue->toString();
                 }
                 $arOrder[$shipmentField] = $setFieldValue;
             }
         }
     }
     //		$arOrder['DELIVERY_ID'] = $arOShipment[0]['DELIVERY_ID'];
     //		$arOrder['TRACKING_NUMBER'] = $arOShipment[0]['TRACKING_NUMBER'];
     $dbPayment = \Bitrix\Sale\Internals\PaymentTable::getList(array('select' => array('PAY_SYSTEM_NAME', 'PAID', 'ID', 'DATE_PAID', 'PAY_SYSTEM_ID', 'SUM', 'PAY_VOUCHER_NUM', 'PAY_VOUCHER_DATE', 'PS_STATUS', 'PS_STATUS_CODE', 'PS_STATUS_DESCRIPTION', 'PS_STATUS_MESSAGE', 'PS_SUM', 'PS_CURRENCY', 'PS_RESPONSE_DATE', 'DATE_PAY_BEFORE', 'DATE_BILL'), 'filter' => array('ORDER_ID' => $arOrder['ID'])));
     $arOPayment = array();
     while ($arPayment = $dbPayment->fetch()) {
         $arPayment['PAY_SYSTEM_NAME'] = htmlspecialcharsbx($arPayment['PAY_SYSTEM_NAME']);
         $arOPayment[] = $arPayment;
     }
     $arOrder['PAYMENT'] = $arOPayment;
     // for compatibility
     //		$arOrder['PAY_SYSTEM_ID'] = $arOPayment[0]['PAY_SYSTEM_ID'];
     //		$arOrder['PAY_VOUCHER_NUM'] = $arOPayment[0]['PAY_VOUCHER_NUM'];
     if (!empty($this->compatibilityPaymentFields) && is_array($this->compatibilityPaymentFields)) {
         foreach ($this->compatibilityPaymentFields as $paymentName => $paymentField) {
             $findPaymentField = $paymentField;
             if (intval($paymentName) !== $paymentName) {
                 $findPaymentField = $paymentName;
             }
             if (isset($arOPayment[0][$findPaymentField])) {
                 $setFieldValue = $arOPayment[0][$findPaymentField];
                 if ($setFieldValue instanceof Main\Type\Date || $setFieldValue instanceof Main\Type\DateTime) {
                     $setFieldValue = $setFieldValue->toString();
                 }
                 $arOrder[$paymentField] = $setFieldValue;
             }
         }
     }
     $this->dbResult = $arOrder;
 }
Example #21
0
 /**
  * @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;
 }