diff --git a/CHANGELOG.md b/CHANGELOG.md
index 113add5f..764cd1b2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 2020-07-24 v.5.4.1
+* Оптимизирован генератор каталога
+* Передача статуса оплаты и статуса отгрузки заказа в Битрикс
+* Предупреждение в случае обнаружения несовместимых настроек
+* Запрещенные для редактирования поля в заказах с интеграционной доставкой более не передаются при редактировании заказа из Битрикс
+
## 2020-07-14 v.5.4.0
* Добавлена поддержка функционала смены клиента
diff --git a/intaro.retailcrm/classes/general/icml/RetailCrmICML.php b/intaro.retailcrm/classes/general/icml/RetailCrmICML.php
index 719d22ef..adc0d841 100644
--- a/intaro.retailcrm/classes/general/icml/RetailCrmICML.php
+++ b/intaro.retailcrm/classes/general/icml/RetailCrmICML.php
@@ -271,119 +271,28 @@ class RetailCrmICML
protected function BuildOffers(&$allCategories)
{
- $basePriceId = COption::GetOptionString(
- $this->MODULE_ID,
- $this->CRM_CATALOG_BASE_PRICE . '_' . $this->profileID,
- 0
- );
-
- if (!$basePriceId) {
- $dbPriceType = CCatalogGroup::GetList(
- array(),
- array('BASE' => 'Y'),
- false,
- false,
- array('ID')
- );
-
- $result = $dbPriceType->GetNext();
- $basePriceId = $result['ID'];
- }
+ $basePriceId = $this->getBasePriceId();
foreach ($this->iblocks as $key => $id) {
$this->setSiteAddress($id);
- $barcodes = array();
-
- $dbBarCode = CCatalogStoreBarCode::getList(
- array(),
- array("IBLOCK_ID" => $id),
- false,
- false,
- array('PRODUCT_ID', 'BARCODE')
- );
-
- while ($arBarCode = $dbBarCode->GetNext()) {
- if (!empty($arBarCode)) {
- $barcodes[$arBarCode['PRODUCT_ID']] = $arBarCode['BARCODE'];
- }
- }
-
- $highloadblockSkuProps = array();
- $highloadblockProductProps = array();
- $productProps = CIBlockproperty::GetList(array(), array("IBLOCK_ID" => $id));
-
- while ($arrProductProps = $productProps->Fetch()) {
-
- if ($arrProductProps["USER_TYPE"] == 'directory') {
- $highloadblockProductProps[$arrProductProps['CODE']] = $arrProductProps;
- }
- }
+ $barcodes = $this->getProductBarcodesByIblock($id);
// Get Info by infoblocks
- $iblock['IBLOCK_DB'] = CIBlock::GetByID($id)->Fetch();
+ $iblockData = CIBlock::GetByID($id)->Fetch();
$iblockOffer = CCatalogSKU::GetInfoByProductIBlock($id);
- $skuProps = CIBlockproperty::GetList(array(), array("IBLOCK_ID" => $iblockOffer['IBLOCK_ID']));
- while ($arrSkuProps = $skuProps->Fetch()) {
- if ($arrSkuProps["USER_TYPE"] == 'directory') {
- $highloadblockSkuProps[$arrSkuProps['CODE']] = $arrSkuProps;
- }
- }
+ $highloadblockSkuProps = $this->getAvailableHighloadOfferSkuProps($iblockOffer['IBLOCK_ID']);
+ $highloadblockProductProps = $this->getAvailableHighloadProductProps($id);
- $arSelect = array(
- "ID",
- "LID",
- "IBLOCK_ID",
- "IBLOCK_SECTION_ID",
- "ACTIVE",
- "NAME",
- "DETAIL_PICTURE",
- "PREVIEW_PICTURE",
- "DETAIL_PAGE_URL",
- "CATALOG_GROUP_" . $basePriceId
- );
- // Set selected properties
- foreach ($this->propertiesProduct[$id] as $key => $propProduct) {
- if ($this->propertiesProduct[$id][$key] != "") {
- $arSelect[] = "PROPERTY_" . $propProduct;
- $arSelect[] = "PROPERTY_" . $propProduct . ".NAME";
- }
- }
-
- if ($this->productPictures && isset($this->productPictures[$id])) {
- $arSelect[] = "PROPERTY_" . $this->productPictures[$id]['picture'];
- $arSelect[] = "PROPERTY_" . $this->productPictures[$id]['picture'] . ".NAME";
- }
-
- $arSelectOffer = array(
- 'ID',
- "NAME",
- "DETAIL_PAGE_URL",
- "DETAIL_PICTURE",
- "PREVIEW_PICTURE",
- 'PROPERTY_' . $iblockOffer['SKU_PROPERTY_ID'],
- "CATALOG_GROUP_" . $basePriceId
- );
-
- // Set selected properties
- foreach ($this->propertiesSKU[$id] as $key => $propSKU) {
- if ($this->propertiesSKU[$id][$key] != "") {
- $arSelectOffer[] = "PROPERTY_" . $propSKU;
- $arSelectOffer[] = "PROPERTY_" . $propSKU . ".NAME";
- }
- }
-
- if ($this->skuPictures && isset($this->skuPictures[$id])) {
- $arSelectOffer[] = "PROPERTY_" . $this->skuPictures[$id]['picture'];
- $arSelectOffer[] = "PROPERTY_" . $this->skuPictures[$id]['picture'] . ".NAME";
- }
+ $arSelect = $this->buildProductQuery($id);
+ $arSelectOffer = $this->buildOfferQuery($id, $iblockOffer['SKU_PROPERTY_ID']);
// Set filter
+ $order = array("id");
$filter = array(
"IBLOCK_ID" => $id,
"ACTIVE" => 'Y',
);
- $order = array("id");
$arNavStatParams = array(
"iNumPage" => 1,
"nPageSize" => $this->pageSize,
@@ -394,194 +303,38 @@ class RetailCrmICML
// Get products on this page
$elems = array();
$dbResProductsIds = CIBlockElement::GetList($order, $filter, false, $arNavStatParams, array('ID'));
+
while ($obIds = $dbResProductsIds->Fetch()) {
$elems[] = $obIds['ID'];
}
- $arfilter = array(
- "IBLOCK_ID" => $id,
- "ID" => $elems
- );
- $dbResProducts = CIBlockElement::GetList($order, $arfilter, false, false, $arSelect);
-
- $products = array();
-
- while ($product = $dbResProducts->GetNext()) {
- // Compile products to array
- $products[$product['ID']] = $product;
- $products[$product['ID']]['offers'] = array();
-
- }
-
- unset($product);
-
- if (!empty($iblockOffer['IBLOCK_ID'])) {
- $arFilterOffer = array(
- 'IBLOCK_ID' => $iblockOffer['IBLOCK_ID'],
- 'PROPERTY_' . $iblockOffer['SKU_PROPERTY_ID'] => array_keys($products),
+ foreach ($elems as $elemId) {
+ $arFilter = array(
+ "IBLOCK_ID" => $id,
+ "ID" => array($elemId)
);
- // Get all offers for products on this page
- $dbResOffers = CIBlockElement::GetList(
- array(),
- $arFilterOffer,
- false,
- array('nTopCount' => $this->pageSize * $this->offerPageSize),
- $arSelectOffer
+ $this->ProcessProductOffers(
+ $arSelect,
+ $arSelectOffer,
+ $allCategories,
+ $basePriceId,
+ $id,
+ $iblockData,
+ $iblockOffer,
+ $barcodes,
+ $highloadblockProductProps,
+ $highloadblockSkuProps,
+ $order,
+ $arFilter
);
-
- while ($offer = $dbResOffers->GetNext()) {
- // Link offers to products
- $products[$offer['PROPERTY_' . $iblockOffer['SKU_PROPERTY_ID'] . '_VALUE']]['offers'][$offer['ID']] = $offer;
- }
- unset($offer, $dbResOffers);
}
- $stringOffers = "";
- foreach ($products as $product) {
- if (CFile::GetPath($product["DETAIL_PICTURE"])) {
- $product['PICTURE'] = $this->protocol . $this->serverName . CFile::GetPath($product["DETAIL_PICTURE"]);
- } elseif (CFile::GetPath($product["PREVIEW_PICTURE"])){
- $product['PICTURE'] = $this->protocol . $this->serverName . CFile::GetPath($product["PREVIEW_PICTURE"]);
- } elseif (
- $this->productPictures
- && isset($this->productPictures[$id])
- && CFile::GetPath($product["PROPERTY_" . $this->productPictures[$id]['picture'] . "_VALUE"])
- ) {
- $picture = CFile::GetPath($product["PROPERTY_" . $this->productPictures[$id]['picture'] . "_VALUE"]);
- $product['PICTURE'] = $this->protocol . $this->serverName . $picture;
- }
-
- // Get properties of product
- $resPropertiesProduct = Array();
- foreach ($this->propertiesProduct[$id] as $key => $propProduct) {
- $resPropertiesProduct[$key] = "";
-
- if ($propProduct != "") {
- if (isset($product["PROPERTY_" . $propProduct . "_NAME"])) {
- $resPropertiesProduct[$key] = $product["PROPERTY_" . $propProduct . "_NAME"];
- } elseif (isset($product["PROPERTY_" . $propProduct . "_VALUE"])) {
- $resPropertiesProduct[$key] = $product["PROPERTY_" . $propProduct . "_VALUE"];
- } elseif (isset($product[$propProduct])) {
- $resPropertiesProduct[$key] = $product[$propProduct];
- }
-
- if (array_key_exists($key, $this->propertiesUnitProduct[$id])) {
- $resPropertiesProduct[$key] *= $this->measurement[$this->propertiesUnitProduct[$id][$key]];
- $resPropertiesProduct[$key . "_UNIT"] = $this->measurementLink[$this->propertiesUnitProduct[$id][$key]];
- }
-
- if (isset($highloadblockProductProps[$propProduct])) {
- $propVal = $this->getHBprop($highloadblockProductProps[$propProduct], $product["PROPERTY_" . $propProduct . "_VALUE"]);
- $tableName = $highloadblockProductProps[$propProduct]['USER_TYPE_SETTINGS']['TABLE_NAME'];
- $field = $this->highloadblockProductProperties[$tableName][$id][$key];
-
- $resPropertiesProduct[$key] = $propVal[$field];
- }
- }
- }
-
- // Get categories of product
- $categories = array();
- $dbResCategories = CIBlockElement::GetElementGroups($product['ID'], true);
- while ($arResCategory = $dbResCategories->Fetch()) {
- $categories[$arResCategory["ID"]] = array(
- 'ID' => $arResCategory["ID"],
- 'NAME' => $arResCategory["NAME"],
- );
- }
- if (count($categories) == 0) {
- $catId = $this->mainSection + $id;
- $categories[$catId] = $allCategories[$catId];
- }
-
- $existOffer = false;
- if (!empty($iblockOffer['IBLOCK_ID'])) {
- foreach ($product['offers'] as $offer) {
- $offer['BARCODE'] = isset($barcodes[$offer['ID']]) ? $barcodes[$offer['ID']] : '';
- $offer['PRODUCT_ID'] = $product["ID"];
- $offer['DETAIL_PAGE_URL'] = $product["DETAIL_PAGE_URL"];
-
- if (CFile::GetPath($offer["DETAIL_PICTURE"])) {
- $offer['PICTURE'] = $this->protocol . $this->serverName . CFile::GetPath($offer["DETAIL_PICTURE"]);
- } elseif (CFile::GetPath($offer["PREVIEW_PICTURE"])){
- $offer['PICTURE'] = $this->protocol . $this->serverName . CFile::GetPath($offer["PREVIEW_PICTURE"]);
- } elseif (
- $this->skuPictures
- && isset($this->skuPictures[$id])
- && CFile::GetPath($offer["PROPERTY_" . $this->skuPictures[$id]['picture'] . "_VALUE"])
- ) {
- $picture = CFile::GetPath($offer["PROPERTY_" . $this->skuPictures[$id]['picture'] . "_VALUE"]);
- $offer['PICTURE'] = $this->protocol . $this->serverName . $picture;
- } else {
- $offer['PICTURE'] = $product['PICTURE'];
- }
-
- $offer['PRODUCT_NAME'] = $product["NAME"];
- $offer['PRODUCT_ACTIVE'] = $product["ACTIVE"];
- $offer['PRICE'] = $offer['CATALOG_PRICE_' . $basePriceId];
- $offer['PURCHASE_PRICE'] = $offer['CATALOG_PURCHASING_PRICE'];
- $offer['QUANTITY'] = $offer["CATALOG_QUANTITY"];
-
- // Get properties of product
- foreach ($this->propertiesSKU[$id] as $key => $propSKU) {
- if ($propSKU != "") {
- if (isset ($offer["PROPERTY_" . $propSKU . "_NAME"])) {
- $offer['_PROP_' . $key] = $offer["PROPERTY_" . $propSKU . "_NAME"];
- } elseif (isset($offer["PROPERTY_" . $propSKU . "_VALUE"])) {
- $offer['_PROP_' . $key] = $offer["PROPERTY_" . $propSKU . "_VALUE"];
- } elseif (isset($offer[$propSKU])) {
- $offer['_PROP_' . $key] = $offer[$propSKU];
- }
- if (array_key_exists($key, $this->propertiesUnitSKU[$id])) {
- $offer['_PROP_' . $key] *= $this->measurement[$this->propertiesUnitSKU[$id][$key]];
- $offer['_PROP_' . $key . "_UNIT"] = $this->measurementLink[$this->propertiesUnitSKU[$id][$key]];
- }
- if (isset($highloadblockSkuProps[$propSKU])) {
- $propVal = $this->getHBprop($highloadblockSkuProps[$propSKU], $offer["PROPERTY_" . $propSKU . "_VALUE"]);
- $tableName = $highloadblockSkuProps[$propSKU]['USER_TYPE_SETTINGS']['TABLE_NAME'];
- $field = $this->highloadblockSkuProperties[$tableName][$id][$key];
- $offer['_PROP_' . $key] = $propVal[$field];
- }
- }
- }
-
- foreach ($resPropertiesProduct as $key => $propProduct) {
- if ($this->propertiesProduct[$id][$key] != "" && !isset($offer[$key])) {
- $offer['_PROP_' . $key] = $propProduct;
- }
- }
-
- $stringOffers .= $this->BuildOffer($offer, $categories, $iblock, $allCategories);
- $existOffer = true;
- }
- }
- if (!$existOffer) {
- $offer['BARCODE'] = isset($barcodes[$product["ID"]]) ? $barcodes[$product["ID"]] : '';
- $product['PRODUCT_ID'] = $product["ID"];
- $product['PRODUCT_NAME'] = $product["NAME"];
- $product['PRODUCT_ACTIVE'] = $product["ACTIVE"];
- $product['PRICE'] = $product['CATALOG_PRICE_' . $basePriceId];
- $product['PURCHASE_PRICE'] = $product['CATALOG_PURCHASING_PRICE'];
- $product['QUANTITY'] = $product["CATALOG_QUANTITY"];
-
- foreach ($resPropertiesProduct as $key => $propProduct) {
- if ($this->propertiesProduct[$id][$key] != "" || $this->propertiesProduct[$id][str_replace("_UNIT", "", $key)] != "") {
- $product['_PROP_' . $key] = $propProduct;
- }
- }
-
- $stringOffers .= $this->BuildOffer($product, $categories, $iblock, $allCategories);
- }
- }
- unset($products);
-
if ($this->isLogged) {
- $this->WriteLog(($this->pageSize * $arNavStatParams['iNumPage']) . " product(s) has been loaded from " . $id . " IB (memory usage: " . memory_get_usage() . ")");
- }
- if ($stringOffers != "") {
- $this->WriteOffers($stringOffers);
- $stringOffers = "";
+ $this->WriteLog(
+ count($elems)
+ . " product(s) has been loaded from " . $id . " IB (memory usage: " . memory_get_usage() . ")"
+ );
}
$arNavStatParams['iNumPage'] = $dbResProductsIds->NavPageNomer + 1;
@@ -589,6 +342,190 @@ class RetailCrmICML
}
}
+ /**
+ * Process offers for a single product
+ *
+ * @param array $arSelect Properties to select for order
+ * @param array $arSelectOffer Properties to select for offer
+ * @param array $allCategories Categories to pick data from
+ * @param string $basePriceId Base price ID
+ * @param string $iblockId iblock id
+ * @param array $iblock iblock data
+ * @param array $iblockOffer offer iblock
+ * @param array $barcodes Catalog barcodes
+ * @param array $highloadblockProductProps Product props
+ * @param array $highloadblockSkuProps SKU props
+ * @param array $order Order data
+ * @param array $arFilter filter
+ */
+ protected function ProcessProductOffers(
+ $arSelect,
+ $arSelectOffer,
+ $allCategories,
+ $basePriceId,
+ $iblockId,
+ $iblock,
+ $iblockOffer,
+ $barcodes,
+ $highloadblockProductProps,
+ $highloadblockSkuProps,
+ $order,
+ $arFilter
+ ) {
+ $dbResProducts = CIBlockElement::GetList($order, $arFilter, false, false, $arSelect);
+
+ $products = array();
+
+ while ($product = $dbResProducts->GetNext()) {
+ // Compile products to array
+ $products[$product['ID']] = $product;
+ $products[$product['ID']]['offers'] = array();
+
+ }
+
+ unset($product);
+
+ if (!empty($iblockOffer['IBLOCK_ID'])) {
+ $arFilterOffer = array(
+ 'IBLOCK_ID' => $iblockOffer['IBLOCK_ID'],
+ 'PROPERTY_' . $iblockOffer['SKU_PROPERTY_ID'] => array_keys($products),
+ );
+
+ // Get all offers for products on this page
+ $dbResOffers = CIBlockElement::GetList(
+ array(),
+ $arFilterOffer,
+ false,
+ array('nTopCount' => $this->pageSize * $this->offerPageSize),
+ $arSelectOffer
+ );
+
+ while ($offer = $dbResOffers->GetNext()) {
+ // Link offers to products
+ $products[$offer['PROPERTY_' . $iblockOffer['SKU_PROPERTY_ID'] . '_VALUE']]['offers'][$offer['ID']] = $offer;
+ }
+
+ unset($offer, $dbResOffers);
+ }
+
+ foreach ($products as $product) {
+ $product['PICTURE'] = $this->getProductPicture($iblockId, $product);
+ $resPropertiesProduct = $this->getProductProperties($iblockId, $highloadblockProductProps, $product);
+ $categories = $this->getProductCategories($allCategories, $iblockId, $product['ID']);
+
+ $existOffer = false;
+ if (!empty($iblockOffer['IBLOCK_ID'])) {
+ foreach ($product['offers'] as $offer) {
+ $offer['BARCODE'] = isset($barcodes[$offer['ID']]) ? $barcodes[$offer['ID']] : '';
+ $offer['PRODUCT_ID'] = $product["ID"];
+ $offer['DETAIL_PAGE_URL'] = $product["DETAIL_PAGE_URL"];
+
+ if (CFile::GetPath($offer["DETAIL_PICTURE"])) {
+ $offer['PICTURE'] = $this->protocol . $this->serverName . CFile::GetPath($offer["DETAIL_PICTURE"]);
+ } elseif (CFile::GetPath($offer["PREVIEW_PICTURE"])){
+ $offer['PICTURE'] = $this->protocol . $this->serverName . CFile::GetPath($offer["PREVIEW_PICTURE"]);
+ } elseif (
+ $this->skuPictures
+ && isset($this->skuPictures[$iblockId])
+ && CFile::GetPath($offer["PROPERTY_" . $this->skuPictures[$iblockId]['picture'] . "_VALUE"])
+ ) {
+ $picture = CFile::GetPath($offer["PROPERTY_" . $this->skuPictures[$iblockId]['picture'] . "_VALUE"]);
+ $offer['PICTURE'] = $this->protocol . $this->serverName . $picture;
+ } else {
+ $offer['PICTURE'] = $product['PICTURE'];
+ }
+
+ $offer['PRODUCT_NAME'] = $product["NAME"];
+ $offer['PRODUCT_ACTIVE'] = $product["ACTIVE"];
+ $offer['PRICE'] = $offer['CATALOG_PRICE_' . $basePriceId];
+ $offer['PURCHASE_PRICE'] = $offer['CATALOG_PURCHASING_PRICE'];
+ $offer['QUANTITY'] = $offer["CATALOG_QUANTITY"];
+
+ // Get properties of product
+ foreach ($this->propertiesSKU[$iblockId] as $key => $propSKU) {
+ if ($propSKU != "") {
+ if (isset ($offer["PROPERTY_" . $propSKU . "_NAME"])) {
+ $offer['_PROP_' . $key] = $offer["PROPERTY_" . $propSKU . "_NAME"];
+ } elseif (isset($offer["PROPERTY_" . $propSKU . "_VALUE"])) {
+ $offer['_PROP_' . $key] = $offer["PROPERTY_" . $propSKU . "_VALUE"];
+ } elseif (isset($offer[$propSKU])) {
+ $offer['_PROP_' . $key] = $offer[$propSKU];
+ }
+ if (array_key_exists($key, $this->propertiesUnitSKU[$iblockId])) {
+ $offer['_PROP_' . $key] *= $this->measurement[$this->propertiesUnitSKU[$iblockId][$key]];
+ $offer['_PROP_' . $key . "_UNIT"] = $this->measurementLink[$this->propertiesUnitSKU[$iblockId][$key]];
+ }
+ if (isset($highloadblockSkuProps[$propSKU])) {
+ $propVal = $this->getHBprop($highloadblockSkuProps[$propSKU], $offer["PROPERTY_" . $propSKU . "_VALUE"]);
+ $tableName = $highloadblockSkuProps[$propSKU]['USER_TYPE_SETTINGS']['TABLE_NAME'];
+ $field = $this->highloadblockSkuProperties[$tableName][$iblockId][$key];
+ $offer['_PROP_' . $key] = $propVal[$field];
+ }
+ }
+ }
+
+ foreach ($resPropertiesProduct as $key => $propProduct) {
+ if ($this->propertiesProduct[$iblockId][$key] != "" && !isset($offer[$key])) {
+ $offer['_PROP_' . $key] = $propProduct;
+ }
+ }
+
+ $this->PutOffer($offer, $categories, $iblock, $allCategories);
+ $existOffer = true;
+ }
+ }
+
+ if (!$existOffer) {
+ $offer['BARCODE'] = isset($barcodes[$product["ID"]]) ? $barcodes[$product["ID"]] : '';
+ $product['PRODUCT_ID'] = $product["ID"];
+ $product['PRODUCT_NAME'] = $product["NAME"];
+ $product['PRODUCT_ACTIVE'] = $product["ACTIVE"];
+ $product['PRICE'] = $product['CATALOG_PRICE_' . $basePriceId];
+ $product['PURCHASE_PRICE'] = $product['CATALOG_PURCHASING_PRICE'];
+ $product['QUANTITY'] = $product["CATALOG_QUANTITY"];
+
+ foreach ($resPropertiesProduct as $key => $propProduct) {
+ if ($this->propertiesProduct[$iblockId][$key] != "" || $this->propertiesProduct[$iblockId][str_replace("_UNIT", "", $key)] != "") {
+ $product['_PROP_' . $key] = $propProduct;
+ }
+ }
+
+ $this->PutOffer($product, $categories, $iblock, $allCategories);
+ }
+ }
+
+ unset($products);
+ }
+
+ protected function getProductPicture($iblockId, array $product)
+ {
+ $picture = '';
+
+ if (CFile::GetPath($product["DETAIL_PICTURE"])) {
+ $picture = $this->protocol . $this->serverName . CFile::GetPath($product["DETAIL_PICTURE"]);
+ } elseif (CFile::GetPath($product["PREVIEW_PICTURE"])){
+ $picture= $this->protocol . $this->serverName . CFile::GetPath($product["PREVIEW_PICTURE"]);
+ } elseif (
+ $this->productPictures
+ && isset($this->productPictures[$iblockId])
+ && CFile::GetPath($product["PROPERTY_" . $this->productPictures[$iblockId]['picture'] . "_VALUE"])
+ ) {
+ $file = CFile::GetPath($product["PROPERTY_" . $this->productPictures[$iblockId]['picture'] . "_VALUE"]);
+ $picture = $this->protocol . $this->serverName . $file;
+ }
+
+ return $picture;
+ }
+
+ protected function PutOffer($arOffer, $categories, $iblock, &$allCategories)
+ {
+ $offerData = $this->BuildOffer($arOffer, $categories, $iblock, $allCategories);
+
+ if ($offerData !== "") {
+ $this->WriteOffers($offerData);
+ }
+ }
+
protected function BuildOffer($arOffer, $categories, $iblock, &$allCategories)
{
$offer = "";
@@ -645,7 +582,7 @@ class RetailCrmICML
$offer .= "" . $this->PrepareValue($arOffer["EXTERNAL_ID"]) . "\n";
$offer .= "" . $this->PrepareValue($arOffer["PRODUCT_NAME"]) . "\n";
- foreach ($this->propertiesProduct[$iblock['IBLOCK_DB']['ID']] as $key => $propProduct) {
+ foreach ($this->propertiesProduct[$iblock['ID']] as $key => $propProduct) {
if ($propProduct != "" && $arOffer['_PROP_' . $key] != null) {
if ($key === "manufacturer") {
$offer .= "" . $this->PrepareValue($arOffer['_PROP_' . $key]) . "\n";
@@ -660,7 +597,7 @@ class RetailCrmICML
}
}
}
- foreach ($this->propertiesSKU[$iblock['IBLOCK_DB']['ID']] as $key => $propProduct) {
+ foreach ($this->propertiesSKU[$iblock['ID']] as $key => $propProduct) {
if ($propProduct != "" && $arOffer['_PROP_' . $key] != null) {
if ($key === "manufacturer") {
$offer .= "" . $this->PrepareValue($arOffer['_PROP_' . $key]) . "\n";
@@ -729,6 +666,220 @@ class RetailCrmICML
return array();
}
+ /**
+ * Returns products IDs with barcodes by infoblock id
+ *
+ * @param int $iblockId
+ *
+ * @return array
+ */
+ private function getProductBarcodesByIblock($iblockId)
+ {
+ $barcodes = array();
+ $dbBarCode = CCatalogStoreBarCode::getList(
+ array(),
+ array("IBLOCK_ID" => $iblockId),
+ false,
+ false,
+ array('PRODUCT_ID', 'BARCODE')
+ );
+
+ while ($arBarCode = $dbBarCode->GetNext()) {
+ if (!empty($arBarCode)) {
+ $barcodes[$arBarCode['PRODUCT_ID']] = $arBarCode['BARCODE'];
+ }
+ }
+
+ return $barcodes;
+ }
+
+ /**
+ * Returns necessary product properties
+ *
+ * @param int $iblockId
+ * @param array $highloadblockProductProps
+ * @param array $product
+ *
+ * @return array
+ */
+ private function getProductProperties($iblockId, $highloadblockProductProps, $product)
+ {
+ // Get properties of product
+ $resPropertiesProduct = array();
+
+ foreach ($this->propertiesProduct[$iblockId] as $key => $propProduct) {
+ $resPropertiesProduct[$key] = "";
+
+ if ($propProduct != "") {
+ if (isset($product["PROPERTY_" . $propProduct . "_NAME"])) {
+ $resPropertiesProduct[$key] = $product["PROPERTY_" . $propProduct . "_NAME"];
+ } elseif (isset($product["PROPERTY_" . $propProduct . "_VALUE"])) {
+ $resPropertiesProduct[$key] = $product["PROPERTY_" . $propProduct . "_VALUE"];
+ } elseif (isset($product[$propProduct])) {
+ $resPropertiesProduct[$key] = $product[$propProduct];
+ }
+
+ if (array_key_exists($key, $this->propertiesUnitProduct[$iblockId])) {
+ $resPropertiesProduct[$key] *= $this->measurement[$this->propertiesUnitProduct[$iblockId][$key]];
+ $resPropertiesProduct[$key . "_UNIT"] = $this->measurementLink[$this->propertiesUnitProduct[$iblockId][$key]];
+ }
+
+ if (isset($highloadblockProductProps[$propProduct])) {
+ $propVal = $this->getHBprop($highloadblockProductProps[$propProduct], $product["PROPERTY_" . $propProduct . "_VALUE"]);
+ $tableName = $highloadblockProductProps[$propProduct]['USER_TYPE_SETTINGS']['TABLE_NAME'];
+ $field = $this->highloadblockProductProperties[$tableName][$iblockId][$key];
+
+ $resPropertiesProduct[$key] = $propVal[$field];
+ }
+ }
+ }
+
+ return $resPropertiesProduct;
+ }
+
+ /**
+ * @param array $allCategories
+ * @param int $iblockId
+ * @param string $productId
+ *
+ * @return array
+ */
+ private function getProductCategories(&$allCategories, $iblockId, $productId)
+ {
+ $categories = array();
+ $dbResCategories = CIBlockElement::GetElementGroups($productId, true);
+
+ while ($arResCategory = $dbResCategories->Fetch()) {
+ $categories[$arResCategory["ID"]] = array(
+ 'ID' => $arResCategory["ID"],
+ 'NAME' => $arResCategory["NAME"],
+ );
+ }
+
+ if (count($categories) == 0) {
+ $catId = $this->mainSection + $iblockId;
+ $categories[$catId] = $allCategories[$catId];
+ }
+
+ return $categories;
+ }
+
+ private function buildProductQuery($iblockId)
+ {
+ $arSelect = array(
+ "ID",
+ "LID",
+ "IBLOCK_ID",
+ "IBLOCK_SECTION_ID",
+ "ACTIVE",
+ "NAME",
+ "DETAIL_PICTURE",
+ "PREVIEW_PICTURE",
+ "DETAIL_PAGE_URL",
+ "CATALOG_GROUP_" . $this->getBasePriceId()
+ );
+
+ // Set selected properties
+ foreach ($this->propertiesProduct[$iblockId] as $key => $propProduct) {
+ if ($this->propertiesProduct[$iblockId][$key] != "") {
+ $arSelect[] = "PROPERTY_" . $propProduct;
+ $arSelect[] = "PROPERTY_" . $propProduct . ".NAME";
+ }
+ }
+
+ if ($this->productPictures && isset($this->productPictures[$iblockId])) {
+ $arSelect[] = "PROPERTY_" . $this->productPictures[$iblockId]['picture'];
+ $arSelect[] = "PROPERTY_" . $this->productPictures[$iblockId]['picture'] . ".NAME";
+ }
+
+ return $arSelect;
+ }
+
+ private function buildOfferQuery($iblockId, $skuPropertyId)
+ {
+ $arSelectOffer = array(
+ 'ID',
+ "NAME",
+ "DETAIL_PAGE_URL",
+ "DETAIL_PICTURE",
+ "PREVIEW_PICTURE",
+ 'PROPERTY_' . $skuPropertyId,
+ "CATALOG_GROUP_" . $this->getBasePriceId()
+ );
+
+ // Set selected properties
+ foreach ($this->propertiesSKU[$iblockId] as $key => $propSKU) {
+ if ($this->propertiesSKU[$iblockId][$key] != "") {
+ $arSelectOffer[] = "PROPERTY_" . $propSKU;
+ $arSelectOffer[] = "PROPERTY_" . $propSKU . ".NAME";
+ }
+ }
+
+ if ($this->skuPictures && isset($this->skuPictures[$iblockId])) {
+ $arSelectOffer[] = "PROPERTY_" . $this->skuPictures[$iblockId]['picture'];
+ $arSelectOffer[] = "PROPERTY_" . $this->skuPictures[$iblockId]['picture'] . ".NAME";
+ }
+
+ return $arSelectOffer;
+ }
+
+ private function getAvailableHighloadProductProps($iblockId)
+ {
+ $highloadblockProductProps = array();
+ $productProps = CIBlockproperty::GetList(array(), array("IBLOCK_ID" => $iblockId));
+
+ while ($arrProductProps = $productProps->Fetch()) {
+ if ($arrProductProps["USER_TYPE"] == 'directory') {
+ $highloadblockProductProps[$arrProductProps['CODE']] = $arrProductProps;
+ }
+ }
+
+ return $highloadblockProductProps;
+ }
+
+ private function getAvailableHighloadOfferSkuProps($iblockId)
+ {
+ $highloadblockSkuProps = array();
+ $skuProps = CIBlockproperty::GetList(array(), array("IBLOCK_ID" => $iblockId));
+
+ while ($arrSkuProps = $skuProps->Fetch()) {
+ if ($arrSkuProps["USER_TYPE"] == 'directory') {
+ $highloadblockSkuProps[$arrSkuProps['CODE']] = $arrSkuProps;
+ }
+ }
+
+ return $highloadblockSkuProps;
+ }
+
+ /**
+ * Returns base price id
+ *
+ * @return string
+ */
+ private function getBasePriceId()
+ {
+ $basePriceId = COption::GetOptionString(
+ $this->MODULE_ID,
+ $this->CRM_CATALOG_BASE_PRICE . '_' . $this->profileID,
+ 0
+ );
+
+ if (!$basePriceId) {
+ $dbPriceType = CCatalogGroup::GetList(
+ array(),
+ array('BASE' => 'Y'),
+ false,
+ false,
+ array('ID')
+ );
+
+ $result = $dbPriceType->GetNext();
+ $basePriceId = $result['ID'];
+ }
+
+ return $basePriceId;
+ }
+
private function getLocalizedIBlockProps()
{
return array(
diff --git a/intaro.retailcrm/description.ru b/intaro.retailcrm/description.ru
index 699a38b7..c48a54ba 100644
--- a/intaro.retailcrm/description.ru
+++ b/intaro.retailcrm/description.ru
@@ -1 +1,4 @@
-- Добавлена поддержка функционала смены клиентов
+- Оптимизирован генератор каталога
+- Передача статуса оплаты и статуса отгрузки заказа в Битрикс
+- Предупреждение в случае обнаружения несовместимых настроек
+- Запрещенные для редактирования поля в заказах с интеграционной доставкой более не передаются при редактировании заказа из Битрикс
diff --git a/intaro.retailcrm/install/version.php b/intaro.retailcrm/install/version.php
index 93466def..82534326 100644
--- a/intaro.retailcrm/install/version.php
+++ b/intaro.retailcrm/install/version.php
@@ -1,5 +1,5 @@
$arModuleVersion = array(
- "VERSION" => "5.4.0",
- "VERSION_DATE" => "2020-07-14 13:00:00"
+ "VERSION" => "5.4.1",
+ "VERSION_DATE" => "2020-07-24 11:00:00"
);