diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d32abf0..48f08e15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 2015-11-09 v.1.1.3 +* Добавлено логгирование в файл для приходящей из црм и уходящей в црм информации +* Изменен механизм добавления товара в заказ +* Возможность добавить товар в заказ, который есть в црм, но нет на сайте +* Изменил логику выбора товаров для выгрузки в xml +* Появилась возможность перевести History на триггер +* Исправлены ошибки + ## 2015-05-18 v.1.1.2 * Добавлена возможность изменять файлы основных классов(ICMLLoader и ICrmOrderActions) и экспорт каталога без потери обновлений * Исправлены мелкие ошибки diff --git a/intaro.intarocrm/classes/general/ICMLLoader.php b/intaro.intarocrm/classes/general/ICMLLoader.php index 4116d52a..52b6aed6 100644 --- a/intaro.intarocrm/classes/general/ICMLLoader.php +++ b/intaro.intarocrm/classes/general/ICMLLoader.php @@ -54,9 +54,10 @@ else{ public function Load() { global $USER; - if(!isset($_SESSION["SESS_AUTH"]["USER_ID"]) || !$_SESSION["SESS_AUTH"]["USER_ID"]) + if(!isset($_SESSION["SESS_AUTH"]["USER_ID"]) || !$_SESSION["SESS_AUTH"]["USER_ID"]){ $USER = new CUser; - + } + $this->isLogged = true; $defaultSite = CSite::GetList($by="def", $order="desc", Array())->Fetch(); @@ -282,8 +283,7 @@ else{ // Set filter $filter = array( - "IBLOCK_ID" => $id, - "INCLUDE_SUBSECTIONS" => "Y", + "IBLOCK_ID" => $id ); $order = array("id"); $arNavStatParams = Array( @@ -294,7 +294,18 @@ else{ // Cycle page to page do { // Get products on this page - $dbResProducts = CIBlockElement::GetList($order, $filter, false, $arNavStatParams, $arSelect); + $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); $pictures = array(); $products = array(); @@ -366,14 +377,15 @@ else{ $resPropertiesProduct[$key] = ""; if ($propProduct != "") { - - if (isset($product["PROPERTY_" . $propProduct . "_NAME"])) + if (isset($product["PROPERTY_" . $propProduct . "_NAME"])){ $resPropertiesProduct[$key] = $product["PROPERTY_" . $propProduct . "_NAME"]; - elseif (isset($product["PROPERTY_" . $propProduct . "_VALUE"])) + } + elseif (isset($product["PROPERTY_" . $propProduct . "_VALUE"])){ $resPropertiesProduct[$key] = $product["PROPERTY_" . $propProduct . "_VALUE"]; - elseif (isset($product[$propProduct])) + } + 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]]; @@ -391,7 +403,6 @@ else{ ); } if (count($categories) == 0) { - $catId = $this->mainSection + $id; $categories[$catId] = $allCategories[$catId]; } @@ -401,8 +412,6 @@ else{ if (!empty($iblockOffer['IBLOCK_ID'])) { foreach ($product['offers'] as $offer) { - - $offer['PRODUCT_ID'] = $product["ID"]; $offer['DETAIL_PAGE_URL'] = $product["DETAIL_PAGE_URL"]; $offer['PICTURE'] = $product["PICTURE"]; @@ -413,29 +422,28 @@ else{ $offer['QUANTITY'] = $offer["CATALOG_QUANTITY"]; // Get properties of product - foreach ($this->propertiesSKU[$id] as $key => $propSKU) { - if ($propSKU != "") { - - if (isset ($offer["PROPERTY_" . $propSKU . "_NAME"])) + if (isset ($offer["PROPERTY_" . $propSKU . "_NAME"])){ $offer['_PROP_' . $key] = $offer["PROPERTY_" . $propSKU . "_NAME"]; - elseif (isset($offer["PROPERTY_" . $propSKU . "_VALUE"])) + } + elseif (isset($offer["PROPERTY_" . $propSKU . "_VALUE"])){ $offer['_PROP_' . $key] = $offer["PROPERTY_" . $propSKU . "_VALUE"]; - elseif (isset($offer[$propSKU])) + } + 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]]; } } - } foreach ($resPropertiesProduct as $key => $propProduct) { - if ($this->propertiesProduct[$id][$key] != "" && !isset($offer[$key])) + if ($this->propertiesProduct[$id][$key] != "" && !isset($offer[$key])){ $offer['_PROP_' . $key] = $propProduct; + } } $stringOffers .= $this->BuildOffer($offer, $categories, $iblock, $allCategories); @@ -463,16 +471,17 @@ else{ } unset($products); - if ($this->isLogged) + 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 = ""; } - $arNavStatParams['iNumPage'] = $dbResProducts->NavPageNomer + 1; + $arNavStatParams['iNumPage'] = $dbResProductsIds->NavPageNomer + 1; } - while ($dbResProducts->NavPageNomer < $dbResProducts->NavPageCount); + while ($dbResProductsIds->NavPageNomer < $dbResProductsIds->NavPageCount); } } @@ -484,9 +493,10 @@ else{ "productId=\"" . $this->PrepareValue($arOffer["PRODUCT_ID"]) . "\" ". "quantity=\"" . $this->PrepareValue(DoubleVal($arOffer['QUANTITY'])) . "\">\n"; - if ($arOffer['PRODUCT_ACTIVE'] == "N") + if ($arOffer['PRODUCT_ACTIVE'] == "N"){ $offer .= "" . $this->PrepareValue($arOffer['PRODUCT_ACTIVE']) . "\n"; - + } + $keys = array_keys($categories); if (strpos($arOffer['DETAIL_PAGE_URL'], "#SECTION_PATH#") !== false) { if (count($categories) != 0) { @@ -514,9 +524,10 @@ else{ if ($arOffer['PURCHASE_PRICE'] && $this->loadPurchasePrice) { $offer .= "" . $this->PrepareValue($arOffer['PURCHASE_PRICE']) . "\n"; } - foreach ($categories as $category) + foreach ($categories as $category){ $offer .= "" . $category['ID'] . "\n"; - + } + $offer .= "" . $this->PrepareValue($arOffer["NAME"]) . "\n"; $offer .= "" . $this->PrepareValue($arOffer["EXTERNAL_ID"]) . "\n"; @@ -524,18 +535,22 @@ else{ foreach ($this->propertiesProduct[$iblock['IBLOCK_DB']['ID']] as $key => $propProduct) { if ($propProduct != "" && $arOffer['_PROP_' . $key] != null) { - if ($key === "manufacturer") + if ($key === "manufacturer"){ $offer .= "" . $this->PrepareValue($arOffer['_PROP_' . $key]) . "\n"; - else + } + else{ $offer .= '" . $this->PrepareValue($arOffer['_PROP_' . $key]) . "\n"; + } } } foreach ($this->propertiesSKU[$iblock['IBLOCK_DB']['ID']] as $key => $propProduct) { if ($propProduct != "" && $arOffer['_PROP_' . $key] != null) { - if ($key === "manufacturer") + if ($key === "manufacturer"){ $offer .= "" . $this->PrepareValue($arOffer['_PROP_' . $key]) . "\n"; - else + } + else{ $offer .= '" . $this->PrepareValue($arOffer['_PROP_' . $key]) . "\n"; + } } } diff --git a/intaro.intarocrm/classes/general/ICrmOrderActions.php b/intaro.intarocrm/classes/general/ICrmOrderActions.php index 51ae8e1b..b40f915f 100644 --- a/intaro.intarocrm/classes/general/ICrmOrderActions.php +++ b/intaro.intarocrm/classes/general/ICrmOrderActions.php @@ -22,7 +22,8 @@ else{ protected static $CRM_CONTRAGENT_TYPE = 'contragent_type'; protected static $CRM_ORDER_FAILED_IDS = 'order_failed_ids'; protected static $CRM_ORDER_HISTORY_DATE = 'order_history_date'; - + protected static $CRM_CATALOG_BASE_PRICE = 'catalog_base_price'; + const CANCEL_PROPERTY_CODE = 'INTAROCRM_IS_CANCELED'; /** @@ -168,7 +169,7 @@ else{ } $normalizer = new RestNormalizer(); - $normalizer->setValidation(__DIR__ . '/config/retailcrm.json'); + $normalizer->setValidation($_SERVER["DOCUMENT_ROOT"].'/bitrix/modules/intaro.intarocrm/classes/general/config/retailcrm.json'); $customer = array(); @@ -309,7 +310,11 @@ else{ array_key_exists($arFields['LID'], $arParams['optionsSitesList'])) { $site = $arParams['optionsSitesList'][$arFields['LID']]; } - + + $log = new Logger(); + $log->write($customer, 'customer'); + $log->write($order, 'order'); + if($send) { if (!self::apiMethod($api, 'customerEdit', __METHOD__, $customer, $site)) { return false; @@ -403,7 +408,10 @@ else{ } $orderHistory = isset($orderHistory['orders']) ? $orderHistory['orders'] : array(); - + + $log = new Logger(); + $log->write($orderHistory, 'history'); + $dateFinish = $api->getGeneratedAt(); if (is_null($dateFinish) || $dateFinish == false) { $dateFinish = new \DateTime(); @@ -442,7 +450,7 @@ else{ $registerNewUser = true; - if (!isset($order['customer']['email'])) { + if (!isset($order['customer']['email']) || $order['customer']['email'] == '') { $login = $order['customer']['email'] = uniqid('user_' . time()) . '@crm.com'; } else { $dbUser = CUser::GetList(($by = 'ID'), ($sort = 'ASC'), array('=EMAIL' => $order['email'])); @@ -621,95 +629,234 @@ else{ foreach($order['items'] as $item) { if(isset($item['deleted']) && $item['deleted']) { if ($p = CSaleBasket::GetList(array(), array('ORDER_ID' => $order['externalId'], 'PRODUCT_ID' => $item['id']))->Fetch()) { - CSaleBasket::Delete($p['ID']); + if(!CSaleBasket::Delete($p['ID'])){ + self::eventLog('ICrmOrderActions::orderHistory', 'CSaleBasket::Delete', 'Error element delete'); + } } + else{ + $prp = CSaleBasket::GetPropsList(array(), array("ORDER_ID" => $order['externalId'], "CODE" => 'ID', "VALUE" => $item['id']))->Fetch(); + if(!CSaleBasket::Delete($prp['BASKET_ID'])){ + self::eventLog('ICrmOrderActions::orderHistory', 'CSaleBasket::Delete', 'Error castom element delete'); + } + } + continue; } - + if (isset($item['offer']) === false && isset($item['offer']['externalId']) === false) { continue; } + + $res = CIBlockElement::GetByID($item['offer']['externalId'])->Fetch(); - $p = CSaleBasket::GetList(array(),array('ORDER_ID' => $order['externalId'], 'PRODUCT_ID' => $item['offer']['externalId']))->Fetch(); + if($res){ + $p = CSaleBasket::GetList(array(),array('ORDER_ID' => $order['externalId'], 'PRODUCT_ID' => $item['offer']['externalId']))->Fetch(); - if ($p == false) { - $p = CIBlockElement::GetByID($item['offer']['externalId'])->Fetch(); - $iblock = CIBlock::GetByID($p['IBLOCK_ID'])->Fetch(); - $p['CATALOG_XML_ID'] = $iblock['XML_ID']; - $p['PRODUCT_XML_ID'] = $p['XML_ID']; - unset($p['XML_ID']); - } elseif ($propResult = CSaleBasket::GetPropsList(array(''),array('BASKET_ID' => $p['ID']))) { - while ($r = $propResult->Fetch()) { - $p['PROPS'][] = $r; + if ($p == false) { + $p = CIBlockElement::GetByID($item['offer']['externalId'])->GetNext(); + $iblock = CIBlock::GetByID($p['IBLOCK_ID'])->Fetch(); + $p['CATALOG_XML_ID'] = $iblock['XML_ID']; + $p['PRODUCT_XML_ID'] = $p['XML_ID']; + unset($p['XML_ID']); + } elseif ($propResult = CSaleBasket::GetPropsList(array(''),array('BASKET_ID' => $p['ID']))) { + while ($r = $propResult->Fetch()) { + unset($r['ID']); + unset($r['BASKET_ID']); + $p['PROPS'][] = $r; + } } - } + + $arProduct = array(); - $arProduct = array(); + if (isset($item['created']) && $item['created'] == true) { + $productPrice = GetCatalogProductPrice($item['offer']['externalId'], COption::GetOptionString(self::$MODULE_ID, self::$CRM_CATALOG_BASE_PRICE, 0)); + $arProduct = array( + 'FUSER_ID' => $userId, + 'ORDER_ID' => $order['externalId'], + 'QUANTITY' => $item['quantity'], + 'CURRENCY' => $productPrice['CURRENCY'], + 'LID' => $LID, + 'PRODUCT_ID' => $item['offer']['externalId'], + 'PRODUCT_PRICE_ID' => $p['PRODUCT_PRICE_ID'], + 'WEIGHT' => $p['WEIGHT'], + 'DELAY' => $p['DELAY'], + 'CAN_BUY' => $p['CAN_BUY'], + 'MODULE' => $p['MODULE'], + 'NOTES' => $item['comment'] ?: $p['NOTES'], + 'PRODUCT_PROVIDER_CLASS' => $p['PRODUCT_PROVIDER_CLASS'], + 'DETAIL_PAGE_URL' => $p['DETAIL_PAGE_URL'], + 'CATALOG_XML_ID' => $p['CATALOG_XML_ID'], + 'PRODUCT_XML_ID' => $p['PRODUCT_XML_ID'], + 'CUSTOM_PRICE' => 'Y' + ); + } + + if (isset($item['isCanceled']) == false) { + if (isset($item['initialPrice']) && $item['initialPrice']) { + $arProduct['PRICE'] = (double) $item['initialPrice']; + } + if (isset($item['discount'])) { + $arProduct['DISCOUNT_PRICE'] = $item['discount']; + } + if (isset($item['discountPercent'])) { + $arProduct['DISCOUNT_VALUE'] = $item['discountPercent']; + $newPrice = round($arProduct['PRICE'] / 100 * (100 - $arProduct['DISCOUNT_VALUE']), 2); + $arProduct['DISCOUNT_PRICE'] = $arProduct['DISCOUNT_PRICE'] + $arProduct['PRICE'] - $newPrice; + } + if(isset($item['discount']) || isset($item['discountPercent'])) { + $arProduct['PRICE'] -= $arProduct['DISCOUNT_PRICE']; + } + if (isset($item['offer']['name']) && $item['offer']['name']) { + $arProduct['NAME'] = self::fromJSON($item['offer']['name']); + } + $arProduct = self::updateCancelProp($arProduct, 0); + } elseif (isset($item['isCanceled'])) { + $arProduct['PRICE'] = 0; + $arProduct = self::updateCancelProp($arProduct, 1); + } - if (isset($item['created']) && $item['created'] == true) { - $productPrice = GetCatalogProductPrice($item['offer']['externalId'], 1); - $arProduct = array( - 'FUSER_ID' => $userId, - 'ORDER_ID' => $order['externalId'], - 'QUANTITY' => $item['quantity'], - 'CURRENCY' => $productPrice['CURRENCY'], - 'LID' => $LID, - 'PRODUCT_ID' => $item['offer']['externalId'], - 'PRODUCT_PRICE_ID' => $p['PRODUCT_PRICE_ID'], - 'WEIGHT' => $p['WEIGHT'], - 'DELAY' => $p['DELAY'], - 'CAN_BUY' => $p['CAN_BUY'], - 'MODULE' => $p['MODULE'], - 'NOTES' => $item['comment'] ?: $p['NOTES'], - 'PRODUCT_PROVIDER_CLASS' => $p['PRODUCT_PROVIDER_CLASS'], - 'DETAIL_PAGE_URL' => $p['DETAIL_PAGE_URL'], - 'CATALOG_XML_ID' => $p['CATALOG_XML_ID'], - 'PRODUCT_XML_ID' => $p['PRODUCT_XML_ID'], - 'CUSTOM_PRICE' => 'Y' - ); - } + if (isset($item['created']) && $item['created'] == true) { + if(!Add2BasketByProductID($item['offer']['externalId'], $item['quantity'], $arProduct, $p['PROPS'])){ + self::eventLog('ICrmOrderActions::orderHistory', 'Add2BasketByProductID', 'Error element add'); + } + + continue; + } - if (isset($item['isCanceled']) == false) { - if (isset($item['initialPrice']) && $item['initialPrice']) { - $arProduct['PRICE'] = (double) $item['initialPrice']; + if (count($p['PROPS']) > 0) { + $arProduct['PROPS'] = $p['PROPS']; } - if (isset($item['discount'])) { - $arProduct['DISCOUNT_PRICE'] = $item['discount']; - } - if (isset($item['discountPercent'])) { - $arProduct['DISCOUNT_VALUE'] = $item['discountPercent']; - $newPrice = round($arProduct['PRICE'] / 100 * (100 - $arProduct['DISCOUNT_VALUE']), 2); - $arProduct['DISCOUNT_PRICE'] = $arProduct['DISCOUNT_PRICE'] + $arProduct['PRICE'] - $newPrice; - } - if(isset($item['discount']) || isset($item['discountPercent'])) { - $arProduct['PRICE'] -= $arProduct['DISCOUNT_PRICE']; + if (isset($item['quantity']) && $item['quantity']) { + $arProduct['QUANTITY'] = $item['quantity']; } if (isset($item['offer']['name']) && $item['offer']['name']) { $arProduct['NAME'] = self::fromJSON($item['offer']['name']); } - $arProduct = self::updateCancelProp($arProduct, 0); - } elseif (isset($item['isCanceled'])) { - $arProduct['PRICE'] = 0; - $arProduct = self::updateCancelProp($arProduct, 1); - } - if (isset($item['created']) && $item['created'] == true) { - CSaleBasket::Add($arProduct); - continue; + if(!CSaleBasket::Update($p['ID'], $arProduct)){ + self::eventLog('ICrmOrderActions::orderHistory', 'CSaleBasket::Update', 'Error element update'); + } + CSaleBasket::DeleteAll($userId); } + else{ + $arProduct = array(); + + if (isset($item['created']) && $item['created'] == true) { + $arProduct = array( + 'FUSER_ID' => $userId, + 'ORDER_ID' => $order['externalId'], + 'LID' => $LID, + 'NOTES' => $item['comment'], + ); + } + + if (isset($item['isCanceled']) == false) { + if (isset($item['initialPrice']) && $item['initialPrice']) { + $arProduct['PRICE'] = (double) $item['initialPrice']; + } + if (isset($item['discount'])) { + $arProduct['DISCOUNT_PRICE'] = $item['discount']; + } + if (isset($item['discountPercent'])) { + $arProduct['DISCOUNT_VALUE'] = $item['discountPercent']; + $newPrice = round($arProduct['PRICE'] / 100 * (100 - $arProduct['DISCOUNT_VALUE']), 2); + $arProduct['DISCOUNT_PRICE'] = $arProduct['DISCOUNT_PRICE'] + $arProduct['PRICE'] - $newPrice; + } + if(isset($item['discount']) || isset($item['discountPercent'])) { + $arProduct['PRICE'] -= $arProduct['DISCOUNT_PRICE']; + } + if (isset($item['offer']['name']) && $item['offer']['name']) { + $arProduct['NAME'] = self::fromJSON($item['offer']['name']); + } + $arProduct = self::updateCancelProp($arProduct, 0); + } elseif (isset($item['isCanceled'])) { + $arProduct['PRICE'] = 0; + $arProduct = self::updateCancelProp($arProduct, 1); + } + + if (isset($item['quantity']) && $item['quantity']) { + $arProduct['QUANTITY'] = $item['quantity']; + } + if (isset($item['offer']['name']) && $item['offer']['name']) { + $arProduct['NAME'] = self::fromJSON($item['offer']['name']); + } + + if (isset($item['created']) && $item['created'] == true) { + $iBlocks = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_CATALOG_IBLOCKS, 0)); + $iBlock = array_shift($iBlocks); + + $newSection = new CIBlockSection; + $newSectionFields = Array( + "ACTIVE" => 'N', + "IBLOCK_ID" => $iBlock, + "NAME" => 'RetailCRM', + "CODE" => 'RetailCRM', + ); + $resSection = $newSection->Add($newSectionFields); + if(!$resSection){ + self::eventLog('ICrmOrderActions::orderHistory', 'CIBlockSection::Add', 'Error castom section add'); + + continue; + } - if (count($p['PROPS']) > 0) { - $arProduct['PROPS'] = $p['PROPS']; - } - if (isset($item['quantity']) && $item['quantity']) { - $arProduct['QUANTITY'] = $item['quantity']; - } - if (isset($item['offer']['name']) && $item['offer']['name']) { - $arProduct['NAME'] = self::fromJSON($item['offer']['name']); - } + $arLoadProductArray = Array( + "IBLOCK_SECTION_ID" => $resSection, + "IBLOCK_ID" => $iBlock, + "NAME" => $item['offer']['name'] ? $item['offer']['name'] : 'RetailCrmElement', + "CODE" => 'RetailCrmElement', + "ACTIVE" => 'Y' + ); + $el = new CIBlockElement; + $PRODUCT_ID = $el->Add($arLoadProductArray, false, false, true); + if(!$PRODUCT_ID){ + self::eventLog('ICrmOrderActions::orderHistory', 'CIBlockElement::Add', 'Error castom element add'); + + continue; + } - CSaleBasket::Update($p['ID'], $arProduct); - CSaleBasket::DeleteAll($userId); + if(!CCatalogProduct::Add(array("ID" => $PRODUCT_ID))){ + self::eventLog('ICrmOrderActions::orderHistory', 'CCatalogProduct::Add', 'Error product add'); + + continue; + } + + $arFields = Array( + "PRODUCT_ID" => $PRODUCT_ID, + "CATALOG_GROUP_ID" => COption::GetOptionString(self::$MODULE_ID, self::$CRM_CATALOG_BASE_PRICE, 0), + "PRICE" => $item['initialPrice'] ? $item['initialPrice'] : 1, + "CURRENCY" => CCurrency::GetBaseCurrency(), + ); + if(!CPrice::Add($arFields)){ + self::eventLog('ICrmOrderActions::orderHistory', 'CPrice::Add', 'Error price add'); + + continue; + } + + $Params = array( + array( + 'NAME' => 'id', + 'CODE' => 'ID', + 'VALUE' => $item['offer']['externalId'] + ) + ); + if(!Add2BasketByProductID($PRODUCT_ID, $item['quantity'], $arProduct, $Params)){ + self::eventLog('ICrmOrderActions::orderHistory', 'Add2BasketByProductID', 'Error add to basket'); + + continue; + } + + if(!CIBlockSection::Delete($resSection)){ + self::eventLog('ICrmOrderActions::orderHistory', 'CIBlockSection::Delete', 'Error delete section'); + + continue; + } + + continue; + } + + $prp = CSaleBasket::GetPropsList(array(), array("ORDER_ID" => $order['externalId'], "CODE" => 'ID', "VALUE" => $item['offer']['externalId']))->Fetch(); + CSaleBasket::Update($prp['BASKET_ID'], $arProduct); + } } if (isset($order['delivery']) === false || isset($order['delivery']['cost']) === false) { diff --git a/intaro.intarocrm/classes/general/Logger.php b/intaro.intarocrm/classes/general/Logger.php new file mode 100644 index 00000000..422d3d35 --- /dev/null +++ b/intaro.intarocrm/classes/general/Logger.php @@ -0,0 +1,68 @@ +logPath = $logPath; + $this->files = $files; + } + + public function write($dump, $file = 'info') + { + $file = $_SERVER["DOCUMENT_ROOT"] . $this->logPath . '/' . $file . '.log'; + + // message prefix with current time + $data['TIME'] = date('Y-m-d H:i:s'); + $data['DATA'] = $dump; + + //write log + $f = fopen($file, "a+"); + fwrite($f, print_r($data,true)); + fclose($f); + + // if filesize more than 5 Mb rotate it + if (filesize($file) > 5242880) { + $this->rotate($file); + } + } + + private function rotate($file) + { + $path = pathinfo($file); + $rotate = implode('', array( + $path['dirname'], + '/', + $path['filename'], + date('YmdHis'), + '.', + $path['extension'] + )); + + copy($file, $rotate); + $this->clean($file); + + $files = glob($path['dirname'] . '/' . "*" . $path['filename'] . ".log"); + + if (0 === $this->files) { + return; + } + + if (count($files) > $this->files) { + natsort($files); + foreach (array_slice($files, $this->files) as $log) { + if (is_writable($log)) { + unlink($log); + } + } + } + } + + private function clean($file) + { + file_put_contents($file, ''); + } + +} diff --git a/intaro.intarocrm/classes/general/RestNormalizer.php b/intaro.intarocrm/classes/general/RestNormalizer.php index 31bd5370..731970da 100644 --- a/intaro.intarocrm/classes/general/RestNormalizer.php +++ b/intaro.intarocrm/classes/general/RestNormalizer.php @@ -172,7 +172,7 @@ class RestNormalizer $formatted[ $code ] = $this->formatting($value, true); } - if ($formatted[ $code ] === null || $formatted[ $code ] == '' || count($formatted[ $code ]) < 1) { + if ($formatted[ $code ] === null || $formatted[ $code ] === '' || count($formatted[ $code ]) < 1) { if ($this->clear === true) { unset($formatted[ $code ]); } diff --git a/intaro.intarocrm/classes/general/config/retailcrm.json b/intaro.intarocrm/classes/general/config/retailcrm.json index 43155083..0ec120bb 100644 --- a/intaro.intarocrm/classes/general/config/retailcrm.json +++ b/intaro.intarocrm/classes/general/config/retailcrm.json @@ -272,6 +272,9 @@ "managerId": { "type": "int" }, + "deliveryTime": { + "type": "string" + }, "paymentType": { "type": "string" }, @@ -293,7 +296,7 @@ "quantity": { "type": "double", "default": 1, - "min": 1, + "min": 0, "decimals": 1 }, "properties": { diff --git a/intaro.intarocrm/classes/general/events/ICrmOrderEvent.php b/intaro.intarocrm/classes/general/events/ICrmOrderEvent.php index 3fc2b04f..fde12b02 100644 --- a/intaro.intarocrm/classes/general/events/ICrmOrderEvent.php +++ b/intaro.intarocrm/classes/general/events/ICrmOrderEvent.php @@ -250,7 +250,10 @@ class ICrmOrderEvent { 'managerComment' => $arOrder['COMMENTS'] ); } - + + $log = new Logger(); + $log->write($order, 'order'); + try { $api->orderEdit($order); } catch (\RetailCrm\Exception\CurlException $e) { @@ -307,7 +310,8 @@ class ICrmOrderEvent { 'paymentStatus' => $optionsPayment[$payed] ); - $api->orderEdit($order); + $log = new Logger(); + $log->write($order, 'order'); try { $api->orderEdit($order); diff --git a/intaro.intarocrm/classes/general/history/.htaccess b/intaro.intarocrm/classes/general/history/.htaccess new file mode 100644 index 00000000..945908c9 --- /dev/null +++ b/intaro.intarocrm/classes/general/history/.htaccess @@ -0,0 +1,2 @@ +Satisfy Any +Allow from all \ No newline at end of file diff --git a/intaro.intarocrm/classes/general/history/history.php b/intaro.intarocrm/classes/general/history/history.php new file mode 100644 index 00000000..978e60ef --- /dev/null +++ b/intaro.intarocrm/classes/general/history/history.php @@ -0,0 +1,435 @@ + 0){ + require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'); + + if (!CModule::IncludeModule("iblock")) { + ICrmOrderActions::eventLog('ICrmOrderActions::orderHistory', 'iblock', 'module not found'); + return false; + } + if (!CModule::IncludeModule("sale")) { + ICrmOrderActions::eventLog('ICrmOrderActions::orderHistory', 'sale', 'module not found'); + return false; + } + if (!CModule::IncludeModule("catalog")) { + ICrmOrderActions::eventLog('ICrmOrderActions::orderHistory', 'catalog', 'module not found'); + return false; + } + if (!CModule::IncludeModule("intaro.intarocrm")) { + ICrmOrderActions::eventLog('ICrmOrderActions::orderHistory', 'intaro.intarocrm', 'module not found'); + return false; + } + + global $USER; + if (is_object($USER) == false) { + $USER = new RetailUser; + } + + $api_host = COption::GetOptionString(ICrmOrderActions::$MODULE_ID, ICrmOrderActions::$CRM_API_HOST_OPTION, 0); + $api_key = COption::GetOptionString(ICrmOrderActions::$MODULE_ID, ICrmOrderActions::$CRM_API_KEY_OPTION, 0); + + $optionsOrderTypes = array_flip(unserialize(COption::GetOptionString(ICrmOrderActions::$MODULE_ID, ICrmOrderActions::$CRM_ORDER_TYPES_ARR, 0))); + $optionsDelivTypes = array_flip(unserialize(COption::GetOptionString(ICrmOrderActions::$MODULE_ID, ICrmOrderActions::$CRM_DELIVERY_TYPES_ARR, 0))); + $optionsPayTypes = array_flip(unserialize(COption::GetOptionString(ICrmOrderActions::$MODULE_ID, ICrmOrderActions::$CRM_PAYMENT_TYPES, 0))); + $optionsPayStatuses = array_flip(unserialize(COption::GetOptionString(ICrmOrderActions::$MODULE_ID, ICrmOrderActions::$CRM_PAYMENT_STATUSES, 0))); // --statuses + $optionsPayment = array_flip(unserialize(COption::GetOptionString(ICrmOrderActions::$MODULE_ID, ICrmOrderActions::$CRM_PAYMENT, 0))); + $optionsOrderProps = unserialize(COption::GetOptionString(ICrmOrderActions::$MODULE_ID, ICrmOrderActions::$CRM_ORDER_PROPS, 0)); + $optionsLegalDetails = unserialize(COption::GetOptionString(ICrmOrderActions::$MODULE_ID, ICrmOrderActions::$CRM_LEGAL_DETAILS, 0)); + $optionsContragentType = unserialize(COption::GetOptionString(ICrmOrderActions::$MODULE_ID, ICrmOrderActions::$CRM_CONTRAGENT_TYPE, 0)); + $optionsSitesList = unserialize(COption::GetOptionString(ICrmOrderActions::$MODULE_ID, ICrmOrderActions::$CRM_SITES_LIST, 0)); + $optionsCustomFields = unserialize(COption::GetOptionString(ICrmOrderActions::$MODULE_ID, ICrmOrderActions::$CRM_CUSTOM_FIELDS, 0)); + + foreach ($optionsOrderProps as $code => $value) { + if (isset($optionsLegalDetails[$code])) { + $optionsOrderProps[$code] = array_merge($optionsOrderProps[$code], $optionsLegalDetails[$code]); + } + if (isset($optionsCustomFields[$code])) { + $optionsOrderProps[$code] = array_merge($optionsOrderProps[$code], $optionsCustomFields[$code]); + } + $optionsOrderProps[$code]['location'] = 'LOCATION'; + if (array_search('CITY', $optionsOrderProps[$code]) == false) { + $optionsOrderProps[$code]['city'] = 'CITY'; + } + if (array_search('ZIP', $optionsOrderProps[$code]) == false) { + $optionsOrderProps[$code]['index'] = 'ZIP'; + } + } + + $api = new RetailCrm\RestApi($api_host, $api_key); + + $order = $api->orderGet($idOrderCRM, $by = 'id'); + + $log = new Logger(); + $log->write($order, 'order'); + + $defaultOrderType = 1; + $dbOrderTypesList = CSalePersonType::GetList(array(), array("ACTIVE" => "Y")); + if ($arOrderTypesList = $dbOrderTypesList->Fetch()) { + $defaultOrderType = $arOrderTypesList['ID']; + } + + $GLOBALS['INTARO_CRM_FROM_HISTORY'] = true; + + if (function_exists('intarocrm_order_pre_persist')) { + $order = intarocrm_order_pre_persist($order); + } + + if (!isset($order['externalId'])) { + // custom orderType function + if (function_exists('intarocrm_set_order_type')) { + $orderType = intarocrm_set_order_type($order); + if ($orderType) { + $optionsOrderTypes[$order['orderType']] = $orderType; + } else { + $optionsOrderTypes[$order['orderType']] = $defaultOrderType; + } + } + + // we dont need new orders without any customers (can check only for externalId) + if (!isset($order['customer']['externalId'])) { + if (!isset($order['customer']['id'])) { + die(); + } + + $registerNewUser = true; + + if (!isset($order['customer']['email']) && $order['customer']['email'] != '') { + $login = $order['customer']['email'] = uniqid('user_' . time()) . '@crm.com'; + } else { + $dbUser = CUser::GetList(($by = 'ID'), ($sort = 'ASC'), array('=EMAIL' => $order['email'])); + switch ($dbUser->SelectedRowsCount()) { + case 0: + $login = $order['customer']['email']; + break; + case 1: + $arUser = $dbUser->Fetch(); + $registeredUserID = $arUser['ID']; + $registerNewUser = false; + break; + default: + $login = uniqid('user_' . time()) . '@crm.com'; + break; + } + } + + if ($registerNewUser === true) { + $userPassword = uniqid(); + + $newUser = new CUser; + $arFields = array( + "NAME" => ICrmOrderActions::fromJSON($order['customer']['firstName']), + "LAST_NAME" => ICrmOrderActions::fromJSON($order['customer']['lastName']), + "EMAIL" => $order['customer']['email'], + "LOGIN" => $login, + "LID" => "ru", + "ACTIVE" => "Y", + "PASSWORD" => $userPassword, + "CONFIRM_PASSWORD" => $userPassword + ); + $registeredUserID = $newUser->Add($arFields); + if ($registeredUserID === false) { + ICrmOrderActions::eventLog('ICrmOrderActions::orderHistory', 'CUser::Register', 'Error register user'); + die(); + } + + try { + $api->customerFixExternalIds(array(array('id' => $order['customer']['id'], 'externalId' => $registeredUserID))); + } catch (\IntaroCrm\Exception\CurlException $e) { + ICrmOrderActions::eventLog( + 'ICrmOrderActions::orderHistory', 'RetailCrm\RestApi::customerFixExternalIds::CurlException', + $e->getCode() . ': ' . $e->getMessage() + ); + + die(); + } + } + + $order['customer']['externalId'] = $registeredUserID; + } + + // new order + $newOrderFields = array( + 'LID' => CSite::GetDefSite(), + 'PERSON_TYPE_ID' => isset($optionsOrderTypes[$order['orderType']]) ? $optionsOrderTypes[$order['orderType']] : $defaultOrderType, + 'PAYED' => 'N', + 'CANCELED' => 'N', + 'STATUS_ID' => 'N', + 'PRICE' => 0, + 'CURRENCY' => CCurrency::GetBaseCurrency(), + 'USER_ID' => $order['customer']['externalId'], + 'PAY_SYSTEM_ID' => 0, + 'PRICE_DELIVERY' => 0, + 'DELIVERY_ID' => 0, + 'DISCOUNT_VALUE' => 0, + 'USER_DESCRIPTION' => '' + ); + + if(count($optionsSitesList) > 1 && $lid = array_search($order['site'], $optionsSitesList)){ + $newOrderFields['LID'] = $lid; + } + + $externalId = CSaleOrder::Add($newOrderFields); + + if (!isset($order['externalId'])) { + try { + $api->orderFixExternalIds(array(array('id' => $order['id'], 'externalId' => $externalId))); + } catch (\IntaroCrm\Exception\CurlException $e) { + ICrmOrderActions::eventLog( + 'ICrmOrderActions::orderHistory', 'RetailCrm\RestApi::orderFixExternalIds::CurlException', + $e->getCode() . ': ' . $e->getMessage() + ); + + die(); + } + } + $order['externalId'] = $externalId; + } + + if (isset($order['externalId']) && $order['externalId']) { + + // custom orderType function + if (function_exists('intarocrm_set_order_type')) { + $orderType = intarocrm_set_order_type($order); + if ($orderType) { + $optionsOrderTypes[$order['orderType']] = $orderType; + } else { + $optionsOrderTypes[$order['orderType']] = $defaultOrderType; + } + } + + $arFields = CSaleOrder::GetById($order['externalId']); + + // incorrect order + if ($arFields === false || empty($arFields)) { + die(); + } + + $LID = $arFields['LID']; + $userId = $arFields['USER_ID']; + + if(isset($order['customer']['externalId']) && !is_null($order['customer']['externalId'])) { + $userId = $order['customer']['externalId']; + } + + $rsOrderProps = CSaleOrderPropsValue::GetList(array(), array('ORDER_ID' => $arFields['ID'])); + $arUpdateProps = array(); + while ($ar = $rsOrderProps->Fetch()) { + $prop = CSaleOrderProps::GetByID($ar['ORDER_PROPS_ID']); + $arUpdateProps[ $ar['CODE'] ] = array('ID' => $ar['ID'], 'TYPE' => $prop['TYPE'], 'VALUE' => $ar['VALUE']); + } + + $order['fio'] = trim( + implode( + ' ', + array( + isset($order['lastName']) ? $order['lastName'] : '', + isset($order['firstName']) ? $order['firstName'] : '', + isset($order['patronymic']) ? $order['patronymic'] : '', + ) + ) + ); + + if (isset($order['delivery']['address']['city'])) { + $order['location'] = $order['delivery']['address']['city']; + } + + if (isset($order['orderType']) && isset($optionsOrderTypes[ $order['orderType'] ])) { + if (isset($optionsOrderProps[$arFields['PERSON_TYPE_ID']])) { + foreach ($optionsOrderProps[$arFields['PERSON_TYPE_ID']] as $code => $value) { + if (in_array($code, array_keys($order)) === false && isset($optionsOrderProps[$optionsOrderTypes[$order['orderType']]][$code])) { + $order[ $code ] = $arUpdateProps[$optionsOrderProps[$arFields['PERSON_TYPE_ID']][$code]]['VALUE']; + } + } + } + + //update ordertype + CSaleOrder::Update($order['externalId'], array('PERSON_TYPE_ID' => $optionsOrderTypes[ $order['orderType'] ])); + + $arProp = CSaleOrderProps::GetList(array(), array('PERSON_TYPE_ID' => $optionsOrderTypes[ $order['orderType'] ])); + $typeParam = array(); + while ($ar = $arProp->Fetch()) { + $typeParam[ $ar['CODE'] ] = $ar['CODE']; + } + foreach (array_diff_key($arUpdateProps, $typeParam) as $code => $param) { + if (isset($arUpdateProps[$code])) { + CSaleOrderPropsValue::Delete($param['ID']); + } + } + $arFields['PERSON_TYPE_ID'] = $optionsOrderTypes[ $order['orderType'] ]; + } + + array_walk_recursive( + ICrmOrderActions::clearArr($order), + 'ICrmOrderActions::recursiveUpdate', + array( + 'update' => $arUpdateProps, + 'type' => $arFields['PERSON_TYPE_ID'], + 'options' => $optionsOrderProps, + 'orderId' => $order['externalId'] + ) + ); + + //выбираем товары по текущему заказу с сайта + $bItms = array(); + $p = CSaleBasket::GetList(array(), array('ORDER_ID' => $order['externalId'])); + while($bItm = $p->Fetch()){ + $bItms[$bItm['PRODUCT_ID']] = $bItm; + } + + //перебираем хистори + $CrmItms = array(); + foreach($order['items'] as $item) { + $CrmItms[] = $item['id']; + //если такой товар есть + if(in_array($item['offer']['externalId'], $bItms)){ + if ((int) $item['quantity'] != (int) $bItms[$item['offer']['externalId']]['QUANTITY']) { + $arProduct['QUANTITY'] = $item['quantity']; + $g = CSaleBasket::Update($bItms[$item['offer']['externalId']]['ID'], $arProduct); + //резерв + $ar_res = CCatalogProduct::GetByID($item['offer']['externalId']); + $arFields = array( + 'QUANTITY' => (int)$ar_res['QUANTITY'] + (int)$bItms[$item['offer']['externalId']]['QUANTITY'] - (int) $item['quantity'], + 'QUANTITY_RESERVED' => (int)$ar_res['QUANTITY_RESERVED'] - (int)$bItms[$item['offer']['externalId']]['QUANTITY'] + (int) $item['quantity'], + ); + $d = CCatalogProduct::Update($item['offer']['externalId'], $arFields); + } + }//если нет, добавляем + else{ + $p = CIBlockElement::GetByID($item['offer']['externalId'])->Fetch(); + $iblock = CIBlock::GetByID($p['IBLOCK_ID'])->Fetch(); + $p['CATALOG_XML_ID'] = $iblock['XML_ID']; + $p['PRODUCT_XML_ID'] = $p['XML_ID']; + $arProduct = array( + 'FUSER_ID' => $userId, + 'ORDER_ID' => $order['externalId'], + 'QUANTITY' => $item['quantity'], + 'CURRENCY' => CCurrency::GetBaseCurrency(), + 'LID' => $LID, + 'PRODUCT_ID' => $item['offer']['externalId'], + 'PRODUCT_PRICE_ID' => $p['PRODUCT_PRICE_ID'], + 'WEIGHT' => $p['WEIGHT'], + 'DELAY' => $p['DELAY'], + 'CAN_BUY' => $p['CAN_BUY'], + 'MODULE' => $p['MODULE'], + 'NOTES' => $item['comment'] ?: $p['NOTES'], + 'PRODUCT_PROVIDER_CLASS' => $p['PRODUCT_PROVIDER_CLASS'], + 'DETAIL_PAGE_URL' => $p['DETAIL_PAGE_URL'], + 'CATALOG_XML_ID' => $p['CATALOG_XML_ID'], + 'PRODUCT_XML_ID' => $p['PRODUCT_XML_ID'], + 'CUSTOM_PRICE' => 'Y' + ); + if (isset($item['initialPrice']) && $item['initialPrice']) { + $arProduct['PRICE'] = (double) $item['initialPrice']; + } + if (isset($item['discount'])) { + $arProduct['DISCOUNT_PRICE'] = $item['discount']; + } + if (isset($item['discountPercent'])) { + $arProduct['DISCOUNT_VALUE'] = $item['discountPercent']; + $newPrice = round($arProduct['PRICE'] / 100 * (100 - $arProduct['DISCOUNT_VALUE']), 2); + $arProduct['DISCOUNT_PRICE'] = $arProduct['DISCOUNT_PRICE'] + $arProduct['PRICE'] - $newPrice; + } + if(isset($item['discount']) || isset($item['discountPercent'])) { + $arProduct['PRICE'] -= $arProduct['DISCOUNT_PRICE']; + } + if (isset($item['offer']['name']) && $item['offer']['name']) { + $arProduct['NAME'] = ICrmOrderActions::fromJSON($item['offer']['name']); + } + + $op = CSaleBasket::Add($arProduct); + //резерв + $ar_res = CCatalogProduct::GetByID($item['offer']['externalId']); + $arFields = array( + 'QUANTITY' => (int)$ar_res['QUANTITY'] - (int)$item['quantity'], + 'QUANTITY_RESERVED' => (int)$ar_res['QUANTITY_RESERVED'] + (int)$item['quantity'], + ); + $d = CCatalogProduct::Update($item['offer']['externalId'], $arFields); + } + } + //удаляем лишние товары + foreach($bItms as $bItm){ + if(!in_array($bItm['PRODUCT_ID'], $CrmItms)){ + CSaleBasket::Delete($bItm['ID']); + //удаляем товары из резерва + $ar_res = CCatalogProduct::GetByID($bItm['PRODUCT_ID']); + $arFields = array( + 'QUANTITY' => (int)$ar_res['QUANTITY'] + (int)$bItm['QUANTITY'], + 'QUANTITY_RESERVED' => (int)$ar_res['QUANTITY_RESERVED'] - (int)$bItm['QUANTITY'], + ); + $d = CCatalogProduct::Update($bItm['PRODUCT_ID'], $arFields); + } + } + + if (isset($order['delivery']) === false || isset($order['delivery']['cost']) === false) { + $order['delivery']['cost'] = $arFields['PRICE_DELIVERY']; + } + + if (isset($order['summ']) === false || $order['summ'] <= 0) { + $order['summ'] = $arFields['PRICE'] - $arFields['PRICE_DELIVERY']; + } + + $wasCanaceled = $arFields['CANCELED'] == 'Y' ? true : false; + + if (isset($optionsDelivTypes[$order['delivery']['code']])) { + $resultDeliveryTypeId = $optionsDelivTypes[$order['delivery']['code']]; + } else { + $resultDeliveryTypeId = isset($order['delivery']['service']) && isset($order['delivery']['service']['code']) ? + reset(explode(":", $arFields['DELIVERY_ID'], 1)) : + $arFields['DELIVERY_ID']; + } + + if(isset($order['delivery']['service']) && isset($order['delivery']['service']['code'])) { + $deliveryHandler = reset(CSaleDeliveryHandler::GetBySID($resultDeliveryTypeId)->arResult); + if (count($deliveryHandler) > 0 && array_key_exists($order['delivery']['service']['code'], $deliveryHandler['PROFILES'])) { + $resultDeliveryTypeId = $resultDeliveryTypeId . ':' . $order['delivery']['service']['code']; + } + } + + // orderUpdate + $arFields = ICrmOrderActions::clearArr(array( + 'PRICE_DELIVERY' => $order['delivery']['cost'], + 'PRICE' => $order['summ'] + (double) $order['delivery']['cost'], + 'DATE_MARKED' => $order['markDatetime'], + 'USER_ID' => $userId, + 'PAY_SYSTEM_ID' => $optionsPayTypes[$order['paymentType']], + 'DELIVERY_ID' => $resultDeliveryTypeId, + 'STATUS_ID' => $optionsPayStatuses[$order['status']], + 'REASON_CANCELED' => ICrmOrderActions::fromJSON($order['statusComment']), + 'USER_DESCRIPTION' => ICrmOrderActions::fromJSON($order['customerComment']), + 'COMMENTS' => ICrmOrderActions::fromJSON($order['managerComment']) + )); + + if (isset($order['discount'])) { + $arFields['DISCOUNT_VALUE'] = $order['discount']; + $arFields['PRICE'] -= $order['discount']; + } + + if(!empty($arFields)) { + CSaleOrder::Update($order['externalId'], $arFields); + } + + if(isset($order['status']) && $order['status']) { + if(isset($optionsPayStatuses[$order['status']]) && $optionsPayStatuses[$order['status']]) { + // set STATUS_ID + CSaleOrder::StatusOrder($order['externalId'], $optionsPayStatuses[$order['status']]); + + if($wasCanaceled && $optionsPayStatuses[ $order['status'] ] != 'YY') { + CSaleOrder::CancelOrder($order['externalId'], "N", $order['statusComment']); + } elseif ($optionsPayStatuses[ $order['status'] ] == 'YY') { + CSaleOrder::CancelOrder($order['externalId'], "Y", $order['statusComment']); + } + } + } + + // set PAYED + if(isset($order['paymentStatus']) && $order['paymentStatus'] && $optionsPayment[$order['paymentStatus']]) { + CSaleOrder::PayOrder($order['externalId'], $optionsPayment[$order['paymentStatus']]); + } + + if(function_exists('intarocrm_order_post_persist')) { + intarocrm_order_post_persist($order); + } + } + $GLOBALS['INTARO_CRM_FROM_HISTORY'] = false; +} +?> \ No newline at end of file diff --git a/intaro.intarocrm/export/export_setup.php b/intaro.intarocrm/export/export_setup.php index 968b8ca1..bc74d92b 100644 --- a/intaro.intarocrm/export/export_setup.php +++ b/intaro.intarocrm/export/export_setup.php @@ -136,7 +136,7 @@ else{ $iblockFieldsName = Array( - "weight" => Array("code" => "catalog_size" , "name" => GetMessage("SELECT_WEIGHT_PROPERTY_NAME"), 'unit' => 'mass'), + "weight" => Array("code" => "catalog_weight" , "name" => GetMessage("SELECT_WEIGHT_PROPERTY_NAME"), 'unit' => 'mass'), "length" => Array("code" => "catalog_length" , "name" => GetMessage("SELECT_LENGTH_PROPERTY_NAME"), 'unit' => 'length'), "width" => Array("code" => "catalog_width" , "name" => GetMessage("SELECT_WIDTH_PROPERTY_NAME"), 'unit' => 'length'), "height" => Array("code" => "catalog_height" , "name" => GetMessage("SELECT_HEIGHT_PROPERTY_NAME"), 'unit' => 'length'), @@ -696,6 +696,7 @@ else{ elseif ($STEP==2) { COption::SetOptionString($MODULE_ID, $CRM_CATALOG_BASE_PRICE . '_' . $_REQUEST['PROFILE_ID'], htmlspecialchars(trim($_POST['price-types']))); + COption::SetOptionString($MODULE_ID, 'catalog_base_iblocks', serialize($IBLOCK_EXPORT)); $FINITE = true; } } diff --git a/intaro.intarocrm/include.php b/intaro.intarocrm/include.php index 8d2ce2c0..e1352414 100644 --- a/intaro.intarocrm/include.php +++ b/intaro.intarocrm/include.php @@ -3,6 +3,7 @@ CModule::AddAutoloadClasses( 'intaro.intarocrm', // module name array ( 'RestNormalizer' => 'classes/general/RestNormalizer.php', + 'Logger' => 'classes/general/Logger.php', 'RetailCrm\RestApi' => 'classes/general/RestApi.php', 'RetailCrm\Response\ApiResponse' => 'classes/general/Response/ApiResponse.php', 'ICrmOrderActions' => 'classes/general/ICrmOrderActions.php', diff --git a/intaro.intarocrm/install/index.php b/intaro.intarocrm/install/index.php index 64df00a7..4ceff690 100644 --- a/intaro.intarocrm/install/index.php +++ b/intaro.intarocrm/install/index.php @@ -40,6 +40,7 @@ class intaro_intarocrm extends CModule { var $CRM_ORDER_FAILED_IDS = 'order_failed_ids'; var $CRM_ORDER_HISTORY_DATE = 'order_history_date'; var $CRM_CATALOG_BASE_PRICE = 'catalog_base_price'; + var $CRM_CATALOG_IBLOCKS = 'catalog_base_iblocks'; var $INSTALL_PATH; function intaro_intarocrm() { @@ -188,7 +189,7 @@ class intaro_intarocrm extends CModule { $this->INTARO_CRM_API = new RetailCrm\RestApi($api_host, $api_key); //api key ok and sites list try { - $arResult['sitesList'] = $this->INTARO_CRM_API->sitesList()->sites; + $arResult['sitesList'] = $APPLICATION->ConvertCharsetArray($this->INTARO_CRM_API->sitesList()->sites, 'utf-8', SITE_CHARSET); } catch (\RetailCrm\Exception\CurlException $e) { ICrmOrderActions::eventLog( 'intaro.crm/install/index.php', 'RetailCrm\RestApi::sitesList', @@ -376,7 +377,7 @@ class intaro_intarocrm extends CModule { $paymentStatusesArr['YY'] = htmlspecialchars(trim($_POST['payment-status-YY'])); if ($arPaymentStatusesList = $dbPaymentStatusesList->Fetch()) { do { - $arResult['bitrixPaymentStatusesList'][] = $arPaymentStatusesList; + $arResult['bitrixPaymentStatusesList'][$arPaymentStatusesList['ID']] = $arPaymentStatusesList; $paymentStatusesArr[$arPaymentStatusesList['ID']] = htmlspecialchars(trim($_POST['payment-status-' . $arPaymentStatusesList['ID']])); } while ($arPaymentStatusesList = $dbPaymentStatusesList->Fetch()); } @@ -686,7 +687,7 @@ class intaro_intarocrm extends CModule { if ($arPaymentStatusesList = $dbPaymentStatusesList->Fetch()) { do { - $arResult['bitrixPaymentStatusesList'][] = $arPaymentStatusesList; + $arResult['bitrixPaymentStatusesList'][$arPaymentStatusesList['ID']] = $arPaymentStatusesList; } while ($arPaymentStatusesList = $dbPaymentStatusesList->Fetch()); } @@ -1165,6 +1166,7 @@ class intaro_intarocrm extends CModule { RegisterModuleDependences("sale", "OnSaleReserveOrder", $this->MODULE_ID, "ICrmOrderEvent", "onSaleReserveOrder"); COption::SetOptionString($this->MODULE_ID, $this->CRM_CATALOG_BASE_PRICE, htmlspecialchars(trim($_POST['price-types']))); + COption::SetOptionString($this->MODULE_ID, $this->CRM_CATALOG_IBLOCKS, $iblocks); $this->CopyFiles(); if (isset($_POST['LOAD_NOW'])) { @@ -1343,6 +1345,7 @@ class intaro_intarocrm extends CModule { COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_FAILED_IDS); COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_HISTORY_DATE); COption::RemoveOption($this->MODULE_ID, $this->CRM_CATALOG_BASE_PRICE); + COption::RemoveOption($this->MODULE_ID, $this->CRM_CATALOG_IBLOCKS); UnRegisterModuleDependences("sale", "OnSalePayOrder", $this->MODULE_ID, "ICrmOrderEvent", "onSalePayOrder"); UnRegisterModuleDependences("sale", "OnSaleCancelOrder", $this->MODULE_ID, "ICrmOrderEvent", "onSaleCancelOrder"); diff --git a/intaro.intarocrm/install/step11.php b/intaro.intarocrm/install/step11.php index af6bfb5e..70a02ae3 100644 --- a/intaro.intarocrm/install/step11.php +++ b/intaro.intarocrm/install/step11.php @@ -34,6 +34,7 @@ + @@ -689,6 +694,7 @@ if (isset($_POST['Update']) && ($_POST['Update'] == 'Y')) { + BeginNextTab(); ?> @@ -928,6 +934,7 @@ if (isset($_POST['Update']) && ($_POST['Update'] == 'Y')) { + Buttons(); ?> @@ -1093,7 +1100,7 @@ if (isset($_POST['Update']) && ($_POST['Update'] == 'Y')) {
- +