/** * @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(); /** @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; }
/** * @param BasketItem $item * @param array $productData * @return \Bitrix\Sale\Result * @throws SystemException */ public static function fillBasketItem(BasketItem &$item, array $productData, Order $order, Basket $basket, $needDataUpdate = false) { $basketCode = $item->getBasketCode(); if (isset($productData["PRODUCT_PROVIDER_CLASS"]) && strlen($productData["PRODUCT_PROVIDER_CLASS"]) > 0) { $item->setField("PRODUCT_PROVIDER_CLASS", trim($productData["PRODUCT_PROVIDER_CLASS"])); } $item->setField("QUANTITY", $productData["QUANTITY"]); $product = array(); $data = array(); /* Get actual info from provider * cases: * 1) add new product to basket; * 2) saving operation; */ if (!self::$isTrustProductFormData || $needDataUpdate) { $data = Provider::getProductData($basket, array("PRICE"), $item); if (isset($data[$basketCode])) { $product = $data[$basketCode]; if (isset($product['DISCOUNT_PRICE'])) { $product['DISCOUNT_PRICE'] = roundEx($product['DISCOUNT_PRICE'], SALE_VALUE_PRECISION); } if (isset($product['BASE_PRICE'])) { $product['PRICE'] = $product['BASE_PRICE'] - $product['DISCOUNT_PRICE']; } $discount = $order->getDiscount(); if ($discount !== null) { if (isset($data[$basketCode]['BASE_PRICE']) && isset($data[$basketCode]['CURRENCY'])) { $discount->setBasketItemBasePrice($basketCode, $data[$basketCode]['BASE_PRICE'], $data[$basketCode]['CURRENCY']); } if (!empty($data[$basketCode]['DISCOUNT_LIST'])) { $discount->setBasketItemDiscounts($basketCode, $data[$basketCode]['DISCOUNT_LIST']); } } } } /* * Let's extract cached provider product data from field * cases: * 1) all activity through ajax */ if (empty($data[$basketCode]) && !empty($productData["PROVIDER_DATA"])) { $data[$basketCode] = unserialize($productData["PROVIDER_DATA"]); } if (!empty($productData["SET_ITEMS_DATA"])) { $productData["SET_ITEMS"] = unserialize($productData["SET_ITEMS_DATA"]); } if (is_array($data[$basketCode]) && !empty($data[$basketCode])) { self::setProviderTrustData($item, $order, $data[$basketCode]); } if (!self::$isTrustProductFormData) { if (isset($productData["MODULE"]) && $productData["MODULE"] == "catalog") { $data = OrderBasket::getProductDetails($item->getProductId(), $productData["QUANTITY"], $order->getUserId(), $order->getSiteId()); $product = array_merge($product, $data); } unset($productData["CURRENCY"]); } $product = array_merge($product, $productData); if (isset($product["OFFER_ID"]) || intval($product["OFFER_ID"]) >= 0) { $product["PRODUCT_ID"] = $product["OFFER_ID"]; } $product = array_intersect_key($product, array_flip($item::getAvailableFields())); if (isset($product["MEASURE_CODE"]) && strlen($product["MEASURE_CODE"]) > 0) { $measures = OrderBasket::getCatalogMeasures(); if (isset($measures[$product["MEASURE_CODE"]]) && strlen($measures[$product["MEASURE_CODE"]]) > 0) { $product["MEASURE_NAME"] = $measures[$product["MEASURE_CODE"]]; } } if (!isset($product["CURRENCY"]) || strlen($product["CURRENCY"]) <= 0) { $product["CURRENCY"] = $order->getCurrency(); } if ($productData["IS_SET_PARENT"] == "Y") { $product["TYPE"] = BasketItem::TYPE_SET; } OrderEdit::setProductDetails($productData["OFFER_ID"], $order->getUserId(), $order->getSiteId(), array_merge($product, $productData)); $result = self::setBasketItemFields($item, $product); return $result; }
} $order->getDiscount()->calculate(); } } else { $order = \Bitrix\Sale\Order::create($siteId); $order->setPersonTypeId(Blocks\OrderBuyer::getDefaultPersonType($siteId)); } if (strlen($siteName) > 0) { $APPLICATION->SetTitle(str_replace("##SITE##", $siteName, Loc::getMessage("SALE_OK_TITLE_SITE"))); } else { $APPLICATION->SetTitle(Loc::getMessage("SALE_OK_TITLE_NO_SITE")); } CUtil::InitJSCore(); \Bitrix\Main\Page\Asset::getInstance()->addJs("/bitrix/js/sale/admin/order_edit.js"); require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_after.php"; Blocks\OrderBasket::getCatalogMeasures(); // context menu $aMenu = array(); $aMenu[] = array("ICON" => "btn_list", "TEXT" => Loc::getMessage("SALE_OK_LIST"), "TITLE" => Loc::getMessage("SALE_OK_LIST_TITLE"), "LINK" => "/bitrix/admin/sale_order.php?lang=" . LANGUAGE_ID . GetFilterParams("filter_")); $context = new CAdminContextMenu($aMenu); $context->Show(); if (!$result->isSuccess() && !$needFieldsRestore) { $errorMessage = ""; foreach ($result->getErrors() as $error) { $errorMessage .= $error->getMessage() . "<br>\n"; } CAdminMessage::ShowMessage($errorMessage); } //prepare blocks order $defaultBlocksOrder = array("basket", "buyer", "financeinfo", "delivery", "payment", "relprops", "additional", "statusorder"); $formId = "sale_order_create";
/** * @param \Bitrix\Sale\ShipmentItemCollection $shipmentItemCollection * @return array * @throws \Bitrix\Main\LoaderException */ public function getProductsInfo($shipmentItemCollection) { /** @var \Bitrix\Sale\Shipment $shipment */ $shipment = $shipmentItemCollection->getShipment(); $systemShipmentItemCollection = null; $result = array("ITEMS" => array()); /** @var \Bitrix\Sale\ShipmentItemCollection $shipmentItemCollection */ $isSystemShipment = $shipment->isSystem(); if (!$isSystemShipment) { $systemShipment = $shipment->getCollection()->getSystemShipment(); $systemShipmentItemCollection = $systemShipment->getShipmentItemCollection(); } $items = array(); /** @var \Bitrix\Sale\ShipmentItem $item */ foreach ($shipmentItemCollection as $item) { $params = array(); $basketItem = $item->getBasketItem(); if (!$basketItem) { continue; } if ($systemShipmentItemCollection) { /** @var \Bitrix\Sale\ShipmentItemCollection $systemShipmentItemCollection */ $systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode()); } $productId = $basketItem->getProductId(); if ($basketItem->getField("MODULE") == "catalog") { $params = self::getProductDetails($productId, $item->getQuantity(), $this->order->getUserId(), $this->order->getSiteId(), $this->visibleColumns); } elseif (strval($basketItem->getField("MEASURE_CODE")) != '' && \Bitrix\Main\Loader::includeModule("catalog")) { $measures = OrderBasket::getCatalogMeasures(); if (isset($measures[$basketItem->getField("MEASURE_CODE")]) && strlen($measures[$basketItem->getField("MEASURE_CODE")]) > 0) { $params["MEASURE_TEXT"] = $measures[$basketItem->getField("MEASURE_CODE")]; } if (strval($params["MEASURE_TEXT"]) == '') { $defaultMeasure = static::getDefaultMeasures(); $params["MEASURE_TEXT"] = $defaultMeasure["SYMBOL_RUS"] != '' ? $defaultMeasure["SYMBOL_RUS"] : $defaultMeasure["SYMBOL_INTL"]; } } if ($basketItem->isBundleParent()) { $params["BASE_ELEMENTS_QUANTITY"] = $basketItem->getBundleBaseQuantity(); } $params["BASKET_ID"] = $basketItem->getId(); $params["PRODUCT_PROVIDER_CLASS"] = $basketItem->getProvider(); $params["NAME"] = $basketItem->getField("NAME"); $params["MODULE"] = $basketItem->getField("MODULE"); $itemStoreCollection = $item->getShipmentItemStoreCollection(); /** @var \Bitrix\Sale\ShipmentItemStore $barcode */ $params['BARCODE_INFO'] = array(); foreach ($itemStoreCollection as $barcode) { $storeId = $barcode->getStoreId(); if (!isset($params['BARCODE_INFO'][$storeId])) { $params['BARCODE_INFO'][$storeId] = array(); } $params['BARCODE_INFO'][$storeId][] = array('ID' => $barcode->getId(), 'BARCODE' => $barcode->getField('BARCODE'), 'QUANTITY' => $barcode->getQuantity()); } $params['ORDER_DELIVERY_BASKET_ID'] = $item->getId(); $systemItemQuantity = $systemShipmentItem ? $systemShipmentItem->getQuantity() : 0; $params["QUANTITY"] = floatval($item->getQuantity() + $systemItemQuantity); $params["AMOUNT"] = floatval($item->getQuantity()); $params["PRICE"] = $basketItem->getPrice(); $params["CURRENCY"] = $basketItem->getCurrency(); $params["PRODUCT_PROVIDER_CLASS"] = $basketItem->getProvider(); $params["PROPS"] = array(); /** @var \Bitrix\Sale\BasketPropertyItem $property */ foreach ($basketItem->getPropertyCollection() as $property) { $params["PROPS"][] = array("VALUE" => $property->getField("VALUE"), "NAME" => $property->getField("NAME"), "CODE" => $property->getField("CODE"), "SORT" => $property->getField("SORT")); } if (\Bitrix\Main\Loader::includeModule("catalog")) { $productInfo = \CCatalogSku::GetProductInfo($productId); $params["OFFERS_IBLOCK_ID"] = $productInfo["OFFER_IBLOCK_ID"]; $params["IBLOCK_ID"] = $productInfo["IBLOCK_ID"]; $params["PRODUCT_ID"] = $productInfo["ID"]; } if ($basketItem->isBundleChild()) { $params["PARENT_BASKET_ID"] = $basketItem->getParentBasketItem()->getId(); } $items[$params['BASKET_ID']] = $params; } foreach ($items as $basketId => $item) { $parentBasketId = $item['PARENT_BASKET_ID']; if ($parentBasketId > 0) { $parent =& $items[$parentBasketId]; if (!$parent) { continue; } foreach ($parent['SET_ITEMS'] as &$setItem) { if ($item['OFFER_ID'] == $setItem['OFFER_ID']) { $setItem['PRODUCT_ID'] = $item['PRODUCT_ID']; $setItem["BASKET_ID"] = $item['BASKET_ID']; $setItem["ORDER_DELIVERY_BASKET_ID"] = $item['ORDER_DELIVERY_BASKET_ID']; $setItem['BARCODE_INFO'] = $item['BARCODE_INFO']; $setItem["AMOUNT"] = floatval($item['AMOUNT']); $setItem["QUANTITY"] = $item["QUANTITY"]; $setItem["PARENT_BASKET_ID"] = $item['PARENT_BASKET_ID']; } } unset($setItem); unset($items[$basketId]); } } $result['ITEMS'] = $items; return $result; }