diff --git a/intaro.intarocrm/classes/general/ICMLLoader.php b/intaro.intarocrm/classes/general/ICMLLoader.php index 080c8b89..af3ea5ac 100644 --- a/intaro.intarocrm/classes/general/ICMLLoader.php +++ b/intaro.intarocrm/classes/general/ICMLLoader.php @@ -1,14 +1,17 @@ iblocks) < count($this->articleProperties)) return false; @@ -26,11 +29,11 @@ class ICMLLoader { $this->PrepareFile(); $this->PreWriteCatalog(); - + $categories = $this->GetCategories(); - + $this->WriteCategories($categories); - + $this->PreWriteOffers(); $this->BuildOffers($categories); $this->PostWriteOffers(); @@ -39,7 +42,7 @@ class ICMLLoader { $this->CloseFile(); return true; - + } protected function PrepareSettings() @@ -63,7 +66,7 @@ class ICMLLoader { $newText = str_replace("&", "&", $newText); return $newText; } - + protected function PrepareFile() { $fullFilename = $_SERVER["DOCUMENT_ROOT"] . $this->filename; @@ -74,7 +77,7 @@ class ICMLLoader { else return true; } - + protected function PreWriteCatalog() { @fwrite($this->fp, "PrepareValue(Date("Y-m-d H:i:s")) . "\">\n @@ -84,7 +87,7 @@ class ICMLLoader { ); } - + protected function WriteCategories($categories) { $stringCategories = ""; @@ -99,33 +102,33 @@ class ICMLLoader { { @fwrite($this->fp, "\n"); } - + protected function PostWriteOffers() { @fwrite($this->fp, "\n"); } - + protected function WriteOffers($offers) { @fwrite($this->fp, $offers); } - + protected function PostWriteCatalog() { @fwrite($this->fp, "\n \n"); } - + protected function CloseFile() { @fclose($this->fp); } - - + + protected function GetCategories() { $categories = array(); - foreach ($this->iblocks as $id) + foreach ($this->iblocks as $id) { $filter = Array( "IBLOCK_ID" => $id, @@ -144,18 +147,18 @@ class ICMLLoader { if (!$hasCategories) { $iblock = CIBlock::GetByID($id)->Fetch(); - + $arRes = Array(); $arRes['ID'] = $this->mainSection + $id; $arRes['IBLOCK_SECTION_ID'] = 0; - $arRes['NAME'] = "Основной раздел каталога " . $iblock['NAME']; + $arRes['NAME'] = sprintf(GetMessage('ROOT_CATEGORY_FOR_CATALOG'), $iblock['NAME']); $categories[$arRes['ID']] = $arRes; } } return $categories; } - + protected function BuildCategory($arCategory) { return " @@ -166,12 +169,12 @@ class ICMLLoader { . ">" . $this->PrepareValue($arCategory["NAME"]) . "\n"; - + } - + protected function BuildOffers(&$allCategories) { - foreach ($this->iblocks as $key => $id) + foreach ($this->iblocks as $key => $id) { $iblock['IBLOCK_DB'] = CIBlock::GetByID($id)->Fetch(); $iblockOffer = CCatalogSKU::GetInfoByProductIBlock($id); @@ -208,7 +211,7 @@ class ICMLLoader { $dbResProducts = CIBlockElement::GetList(array(), $filter, false, false, $arSelect); $stringOffers = ""; while ($product = $dbResProducts->GetNextElement()) { - + $product = $product->GetFields(); // Get properties of product @@ -237,12 +240,12 @@ class ICMLLoader { ); } if (count($categories) == 0) { - + $catId = $this->mainSection + $id; $categories[$catId] = $allCategories[$catId]; } - + $existOffer = false; if (!empty($iblockOffer['IBLOCK_ID'])) { @@ -303,7 +306,7 @@ class ICMLLoader { } } if (!$existOffer) { - + $offer = CCatalogProduct::GetByID($product['ID']); $product['QUANTITY'] = $offer["QUANTITY"]; @@ -320,15 +323,15 @@ class ICMLLoader { $stringOffers .= $this->BuildOffer($product, $categories, $iblock); } - + $count++; if ($count == 1000) { $this->WriteOffers($stringOffers); $stringOffers = ""; } - + } - + if ($stringOffers != "") { $this->WriteOffers($stringOffers); $stringOffers = ""; @@ -336,15 +339,15 @@ class ICMLLoader { } } - - + + protected function BuildOffer($arOffer, $categories, $iblock) { $offer = ""; $offer .= "PrepareValue($arOffer["ID"]) . "\" ". "productId=\"" . $this->PrepareValue($arOffer["PRODUCT_ID"]) . "\" ". "quantity=\"" . $this->PrepareValue(DoubleVal($arOffer['QUANTITY'])) . "\">\n"; - + $offer .= "http://" . $this->PrepareValue($iblock['IBLOCK_DB']['SERVER_NAME']) . $this->PrepareValue($arOffer['DETAIL_PAGE_URL']) . "\n"; $offer .= "" . $this->PrepareValue($arOffer['PRICE']) . "\n"; @@ -386,5 +389,5 @@ class ICMLLoader { $offer.= "\n"; return $offer; } - + } \ No newline at end of file diff --git a/intaro.intarocrm/classes/general/ICrmOrderActions.php b/intaro.intarocrm/classes/general/ICrmOrderActions.php index 9ec6299f..07d36601 100755 --- a/intaro.intarocrm/classes/general/ICrmOrderActions.php +++ b/intaro.intarocrm/classes/general/ICrmOrderActions.php @@ -13,12 +13,14 @@ class ICrmOrderActions protected static $CRM_ORDER_LAST_ID = 'order_last_id'; protected static $CRM_ORDER_SITES = 'sites_ids'; protected static $CRM_ORDER_PROPS = 'order_props'; + protected static $CRM_ORDER_FAILED_IDS = 'order_failed_ids'; /** * Mass order uploading, without repeating; always returns true, but writes error log + * @param $failed -- flag to export failed orders * @return boolean */ - public static function uploadOrders($pSize = 50) { + public static function uploadOrders($pSize = 50, $failed = false) { //COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_LAST_ID, 0); // -- for test @@ -42,11 +44,16 @@ class ICrmOrderActions $resOrders = array(); $resCustomers = array(); - + $lastUpOrderId = COption::GetOptionString(self::$MODULE_ID, self::$CRM_ORDER_LAST_ID, 0); $lastOrderId = 0; + $failedIds = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_ORDER_FAILED_IDS, 0)); + if (!$failedIds) + $failedIds = array(); + $dbOrder = CSaleOrder::GetList(array("ID" => "ASC"), array('>ID' => $lastUpOrderId)); + $dbFailedOrder = CSaleOrder::GetList(array("ID" => "ASC"), array('ID' => $failedIds)); $api_host = COption::GetOptionString(self::$MODULE_ID, self::$CRM_API_HOST_OPTION, 0); $api_key = COption::GetOptionString(self::$MODULE_ID, self::$CRM_API_KEY_OPTION, 0); @@ -63,50 +70,80 @@ class ICrmOrderActions $api = new IntaroCrm\RestApi($api_host, $api_key); $arParams = array( - 'optionsOrderTypes' => $optionsOrderTypes, - 'optionsDelivTypes' => $optionsDelivTypes, - 'optionsPayTypes' => $optionsPayTypes, + 'optionsOrderTypes' => $optionsOrderTypes, + 'optionsDelivTypes' => $optionsDelivTypes, + 'optionsPayTypes' => $optionsPayTypes, 'optionsPayStatuses' => $optionsPayStatuses, - 'optionsPayment' => $optionsPayment, - 'optionSites' => $optionsSites, - 'optionsOrderProps' => $optionsOrderProps + 'optionsPayment' => $optionsPayment, + 'optionSites' => $optionsSites, + 'optionsOrderProps' => $optionsOrderProps ); - //packmode - - $orderCount = 0; + if (!$failed) { - while ($arOrder = $dbOrder->GetNext()) { // here orders by id asc - - if(is_array($optionsSites)) - if(!empty($optionsSites)) - if(!in_array($arOrder['LID'], $optionsSites)) - continue; - - $result = self::orderCreate($arOrder, $api, $arParams); + //packmode - if (!$result['order'] || !$result['customer']) - continue; - - $orderCount++; - - $resOrders[] = $result['order']; - $resCustomers[] = $result['customer']; + $orderCount = 0; - $lastOrderId = $arOrder['ID']; + while ($arOrder = $dbOrder->GetNext()) { // here orders by id asc + if (is_array($optionsSites)) + if (!empty($optionsSites)) + if (!in_array($arOrder['LID'], $optionsSites)) + continue; - if($orderCount >= $pSize) { - $customers = $api->customerUpload($resCustomers); - - // error pushing customers - if ($api->getStatusCode() != 201) { - //handle err - //self::eventLog('ICrmOrderActions::uploadOrders', 'IntaroCrm\RestApi::customerUpload', $api->getLastError()); - - if($api->getStatusCode() != 460) // some orders were sent - return false; // in pack mode return errors + $result = self::orderCreate($arOrder, $api, $arParams); + + if (!$result['order'] || !$result['customer']) + continue; + + $orderCount++; + + $resOrders[] = $result['order']; + $resCustomers[] = $result['customer']; + + $lastOrderId = $arOrder['ID']; + + if ($orderCount >= $pSize) { + $customers = $api->customerUpload($resCustomers); + + // error pushing customers + if ($api->getStatusCode() != 201) { + //handle err + //self::eventLog('ICrmOrderActions::uploadOrders', 'IntaroCrm\RestApi::customerUpload', $api->getLastError()); + + if ($api->getStatusCode() != 460) // some orders were sent + return false; // in pack mode return errors + } + + $orders = $api->orderUpload($resOrders); + + // error pushing orders + if ($api->getStatusCode() != 201) { + //handle err + self::eventLog('ICrmOrderActions::uploadOrders', 'IntaroCrm\RestApi::orderUpload', $api->getLastError()); + + if ($api->getStatusCode() != 460) // some orders were sent + return false; // in pack mode return errors + } + + if ($lastOrderId) + COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_LAST_ID, $lastOrderId); + + return true; // end of pack } - + } + if (!empty($resOrders)) { + $customers = $api->customerUpload($resCustomers); + + // error pushing customers + if ($api->getStatusCode() != 201) { + //handle err + //self::eventLog('ICrmOrderActions::uploadOrders', 'IntaroCrm\RestApi::customerUpload', $api->getLastError()); + + if ($api->getStatusCode() != 460) // some orders were sent + return false; // in pack mode return errors + } + $orders = $api->orderUpload($resOrders); // error pushing orders @@ -114,42 +151,98 @@ class ICrmOrderActions //handle err self::eventLog('ICrmOrderActions::uploadOrders', 'IntaroCrm\RestApi::orderUpload', $api->getLastError()); - if($api->getStatusCode() != 460) // some orders were sent + if ($api->getStatusCode() != 460) // some orders were sent return false; // in pack mode return errors } - - if($lastOrderId) - COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_LAST_ID, $lastOrderId); + } - return true; // end of pack + if ($lastOrderId) + COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_LAST_ID, $lastOrderId); + + } else { + + // failed orders upload + $orderCount = 0; + $recOrders = array(); + + while ($arOrder = $dbFailedOrder->GetNext()) { // here orders by id asc + if (is_array($optionsSites)) + if (!empty($optionsSites)) + if (!in_array($arOrder['LID'], $optionsSites)) + continue; + + $result = self::orderCreate($arOrder, $api, $arParams); + + if (!$result['order'] || !$result['customer']) + continue; + + $orderCount++; + + $resOrders[] = $result['order']; + $resCustomers[] = $result['customer']; + + $recOrders[] = $arOrder['ID']; + + if ($orderCount >= $pSize) { + $customers = $api->customerUpload($resCustomers); + + // error pushing customers + if ($api->getStatusCode() != 201) { + //handle err + //self::eventLog('ICrmOrderActions::uploadOrders', 'IntaroCrm\RestApi::customerUpload', $api->getLastError()); + + if ($api->getStatusCode() != 460) // some orders were sent + return false; // in pack mode return errors + } + + $orders = $api->orderUpload($resOrders); + + // error pushing orders + if ($api->getStatusCode() != 201) { + //handle err + self::eventLog('ICrmOrderActions::uploadOrders', 'IntaroCrm\RestApi::orderUpload', $api->getLastError()); + + if ($api->getStatusCode() != 460) // some orders were sent + return false; // in pack mode return errors + } + + if (!empty($recOrders)) { + $failedIds = array_merge(array_diff($failedIds, $recOrders)); // clear success ids + COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_FAILED_IDS, serialize($failedIds)); + } + + return true; // end of pack + } + } + if (!empty($resOrders)) { + $customers = $api->customerUpload($resCustomers); + + // error pushing customers + if ($api->getStatusCode() != 201) { + //handle err + //self::eventLog('ICrmOrderActions::uploadOrders', 'IntaroCrm\RestApi::customerUpload', $api->getLastError()); + + if ($api->getStatusCode() != 460) // some orders were sent + return false; // in pack mode return errors + } + + $orders = $api->orderUpload($resOrders); + + // error pushing orders + if ($api->getStatusCode() != 201) { + //handle err + self::eventLog('ICrmOrderActions::uploadOrders', 'IntaroCrm\RestApi::orderUpload', $api->getLastError()); + + if ($api->getStatusCode() != 460) // some orders were sent + return false; // in pack mode return errors + } + } + + if (!empty($recOrders)) { + $failedIds = array_merge(array_diff($failedIds, $recOrders)); // clear success ids + COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_FAILED_IDS, serialize($failedIds)); } } - if (!empty($resOrders)) { - $customers = $api->customerUpload($resCustomers); - - // error pushing customers - if ($api->getStatusCode() != 201) { - //handle err - //self::eventLog('ICrmOrderActions::uploadOrders', 'IntaroCrm\RestApi::customerUpload', $api->getLastError()); - - if ($api->getStatusCode() != 460) // some orders were sent - return false; // in pack mode return errors - } - - $orders = $api->orderUpload($resOrders); - - // error pushing orders - if ($api->getStatusCode() != 201) { - //handle err - self::eventLog('ICrmOrderActions::uploadOrders', 'IntaroCrm\RestApi::orderUpload', $api->getLastError()); - - if ($api->getStatusCode() != 460) // some orders were sent - return false; // in pack mode return errors - } - } - - if($lastOrderId) - COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_LAST_ID, $lastOrderId); return true; //all ok! } @@ -200,7 +293,7 @@ class ICrmOrderActions $api = new IntaroCrm\RestApi($api_host, $api_key); $orderHistory = $api->orderHistory(); - + // pushing existing orders foreach ($orderHistory as $order) { @@ -249,7 +342,9 @@ class ICrmOrderActions if(isset($order['customer']) && $order['customer']) $userId = $order['customer']; $LID = $arFields['LID']; + $rsOrderProps = CSaleOrderPropsValue::GetList(array(), array('ORDER_ID' => $arFields['ID'])); + while ($ar = $rsOrderProps->Fetch()) { if (isset($order['deliveryAddress']) && $order['deliveryAddress']) { switch ($ar['CODE']) { @@ -403,22 +498,26 @@ class ICrmOrderActions CSaleBasket::Update($p['ID'], $arProduct); }*/ - + // orderUpdate $arFields = self::clearArr(array( - 'PRICE_DELIVERY' => $order['deliveryCost'], - 'PRICE' => $order['summ'], - 'DATE_MARKED' => $order['markDatetime'], - 'USER_ID' => $userId, //$order['customer'] - 'PAY_SYSTEM_ID' => $optionsPayTypes[$order['paymentType']], - 'PAYED' => $optionsPayment[$order['paymentStatus']], - 'PERSON_TYPE_ID' => $optionsOrderTypes[$order['orderType']], - 'DELIVERY_ID' => $optionsDelivTypes[$order['deliveryType']], - 'STATUS_ID' => $optionsPayStatuses[$order['status']] + 'PRICE_DELIVERY' => $order['deliveryCost'], + 'PRICE' => $order['summ'], + 'DATE_MARKED' => $order['markDatetime'], + 'USER_ID' => $userId, //$order['customer'] + 'PAY_SYSTEM_ID' => $optionsPayTypes[$order['paymentType']], + 'PAYED' => $optionsPayment[$order['paymentStatus']], + //'PERSON_TYPE_ID' => $optionsOrderTypes[$order['orderType']], + 'DELIVERY_ID' => $optionsDelivTypes[$order['deliveryType']], + 'STATUS_ID' => $optionsPayStatuses[$order['status']], + 'REASON_CANCELED' => $order['statusComment'], + 'USER_DESCRIPTION' => $order['customerComment'], + 'COMMENTS' => $order['managerComment'] )); + + $GLOBALS['INTARO_CRM_FROM_HISTORY'] = true; CSaleOrder::Update($order['externalId'], $arFields); - } } @@ -450,6 +549,10 @@ class ICrmOrderActions public static function uploadOrdersAgent() { self::uploadOrders(); + $failedIds = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_ORDER_FAILED_IDS, 0)); + if(is_array($failedIds) && !empty($failedIds)) + self::uploadOrders(50, true); // upload failed orders + return 'ICrmOrderActions::uploadOrdersAgent();'; } @@ -548,46 +651,46 @@ class ICrmOrderActions $rsOrderProps = CSaleOrderPropsValue::GetList(array(), array('ORDER_ID' => $arFields['ID'])); while ($ar = $rsOrderProps->Fetch()) { switch ($ar['CODE']) { - case $arParams['optionsOrderProps']['index']: $resOrderDeliveryAddress['index'] = self::toJSON($ar['VALUE']); + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['index']: $resOrderDeliveryAddress['index'] = self::toJSON($ar['VALUE']); break; case 'CITY': $resOrderDeliveryAddress['city'] = self::toJSON($ar['VALUE']); break; - case $arParams['optionsOrderProps']['text']: $resOrderDeliveryAddress['text'] = self::toJSON($ar['VALUE']); + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['text']: $resOrderDeliveryAddress['text'] = self::toJSON($ar['VALUE']); break; case 'LOCATION': if(!isset($resOrderDeliveryAddress['city']) && !$resOrderDeliveryAddress['city']) { $resOrderDeliveryAddress['city'] = CSaleLocation::GetByID($ar['VALUE']); $resOrderDeliveryAddress['city'] = self::toJSON($resOrderDeliveryAddress['city']['CITY_NAME_LANG']); } break; - case $arParams['optionsOrderProps']['fio']: $contactNameArr = self::explodeFIO($ar['VALUE']); + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['fio']: $contactNameArr = self::explodeFIO($ar['VALUE']); break; - case $arParams['optionsOrderProps']['phone']: $resOrder['phone'] = $ar['VALUE']; + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['phone']: $resOrder['phone'] = $ar['VALUE']; break; - case $arParams['optionsOrderProps']['email']: $resOrder['email'] = $ar['VALUE']; + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['email']: $resOrder['email'] = $ar['VALUE']; break; } - if (count($arParams['optionsOrderProps'] > 5)) { + if (count($arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']] > 5)) { switch ($ar['CODE']) { - /*case $arParams['optionsOrderProps']['country']: $resOrderDeliveryAddress['country'] = self::toJSON($ar['VALUE']); + /*case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['country']: $resOrderDeliveryAddress['country'] = self::toJSON($ar['VALUE']); break; - case $arParams['optionsOrderProps']['region']: $resOrderDeliveryAddress['region'] = self::toJSON($ar['VALUE']); + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['region']: $resOrderDeliveryAddress['region'] = self::toJSON($ar['VALUE']); break; - case $arParams['optionsOrderProps']['city']: $resOrderDeliveryAddress['city'] = self::toJSON($ar['VALUE']); + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['city']: $resOrderDeliveryAddress['city'] = self::toJSON($ar['VALUE']); break; */ - case $arParams['optionsOrderProps']['street']: $resOrderDeliveryAddress['street'] = self::toJSON($ar['VALUE']); + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['street']: $resOrderDeliveryAddress['street'] = self::toJSON($ar['VALUE']); break; - case $arParams['optionsOrderProps']['building']: $resOrderDeliveryAddress['building'] = self::toJSON($ar['VALUE']); + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['building']: $resOrderDeliveryAddress['building'] = self::toJSON($ar['VALUE']); break; - case $arParams['optionsOrderProps']['flat']: $resOrderDeliveryAddress['flat'] = self::toJSON($ar['VALUE']); + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['flat']: $resOrderDeliveryAddress['flat'] = self::toJSON($ar['VALUE']); break; - case $arParams['optionsOrderProps']['inercomcode']: $resOrderDeliveryAddress['intercomcode'] = self::toJSON($ar['VALUE']); + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['inercomcode']: $resOrderDeliveryAddress['intercomcode'] = self::toJSON($ar['VALUE']); break; - case $arParams['optionsOrderProps']['floor']: $resOrderDeliveryAddress['floor'] = self::toJSON($ar['VALUE']); + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['floor']: $resOrderDeliveryAddress['floor'] = self::toJSON($ar['VALUE']); break; - case $arParams['optionsOrderProps']['block']: $resOrderDeliveryAddress['block'] = self::toJSON($ar['VALUE']); + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['block']: $resOrderDeliveryAddress['block'] = self::toJSON($ar['VALUE']); break; - case $arParams['optionsOrderProps']['house']: $resOrderDeliveryAddress['house'] = self::toJSON($ar['VALUE']); + case $arParams['optionsOrderProps'][$arFields['PERSON_TYPE_ID']]['house']: $resOrderDeliveryAddress['house'] = self::toJSON($ar['VALUE']); break; } } @@ -624,6 +727,7 @@ class ICrmOrderActions $createdAt = $createdAt->format('Y-m-d H:i:s'); $resOrder = array( + 'number' => $arFields['ACCOUNT_NUMBER'], 'phone' => $resOrder['phone'], 'email' => $resOrder['email'], 'deliveryCost' => $arFields['PRICE_DELIVERY'], @@ -636,7 +740,9 @@ class ICrmOrderActions 'orderType' => $arParams['optionsOrderTypes'][$arFields['PERSON_TYPE_ID']], 'deliveryType' => $arParams['optionsDelivTypes'][$resultDeliveryTypeId], 'status' => $arParams['optionsPayStatuses'][$arFields['STATUS_ID']], - 'statusComment' => $arFields['USER_DESCRIPTION'], + 'statusComment' => $arFields['REASON_CANCELED'], + 'customerComment' => $arFields['USER_DESCRIPTION'], + 'managerComment' => $arFields['COMMENTS'], 'createdAt' => $createdAt, 'deliveryAddress' => $resOrderDeliveryAddress, 'items' => $items @@ -657,8 +763,6 @@ class ICrmOrderActions } $resOrder = self::clearArr($resOrder); - - self::eventLog('ICrmOrderActions::orderHistory', 'iblock', json_encode($resOrder)); if($send) return $api->orderEdit($resOrder); @@ -749,4 +853,19 @@ class ICrmOrderActions )); } } + + public static function getLocationCityId($cityName) { + if(!$cityName) + return; + + $dbLocation = CSaleLocation::GetList( + array( + "SORT" => "ASC", + "CITY_NAME_LANG" => "ASC" + ), + array("LID" => "ru", "CITY_NAME" => $cityName), false, false, array()); + + if($location = $dbLocation->Fetch()) + return $location['ID']; + } } \ No newline at end of file diff --git a/intaro.intarocrm/classes/general/events/ICrmOrderEvent.php b/intaro.intarocrm/classes/general/events/ICrmOrderEvent.php index 7b7e8178..cead90e0 100644 --- a/intaro.intarocrm/classes/general/events/ICrmOrderEvent.php +++ b/intaro.intarocrm/classes/general/events/ICrmOrderEvent.php @@ -13,15 +13,37 @@ class ICrmOrderEvent { protected static $CRM_PAYMENT_STATUSES = 'pay_statuses_arr'; protected static $CRM_PAYMENT = 'payment_arr'; //order payment Y/N protected static $CRM_ORDER_LAST_ID = 'order_last_id'; - + protected static $CRM_ORDER_PROPS = 'order_props'; + protected static $CRM_ORDER_FAILED_IDS = 'order_failed_ids'; + + /** + * onBeforeOrderAdd + * + * @param mixed $arFields - Order arFields + */ + function onBeforeOrderAdd($arFields = array()) { + $GLOBALS['INTARO_CRM_ORDER_ADD'] = true; + return; + } + /** * onUpdateOrder * * @param mixed $ID - Order id * @param mixed $arFields - Order arFields */ - function onUpdateOrder($ID, $arFields = array()) { - self::writeDataOnOrderCreate($ID); + function onUpdateOrder($ID, $arFields) { + + if(isset($GLOBALS['INTARO_CRM_ORDER_ADD']) && $GLOBALS['INTARO_CRM_ORDER_ADD']) + return; + + if(isset($GLOBALS['INTARO_CRM_FROM_HISTORY']) && $GLOBALS['INTARO_CRM_FROM_HISTORY']) + return; + + if(isset($arFields['LOCKED_BY']) && $arFields['LOCKED_BY']) + return; + + self::writeDataOnOrderCreate($ID, $arFields); } @@ -34,7 +56,17 @@ class ICrmOrderEvent { * @param mixed $arFields - Order arFields for sending template */ function onSendOrderMail($ID, &$eventName, &$arFields) { - self::writeDataOnOrderCreate($ID); + if(self::writeDataOnOrderCreate($ID)) + COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_LAST_ID, $ID); + else { + $failedIds = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_ORDER_FAILED_IDS, 0)); + if(!$failedIds) + $failedIds = array(); + + $failedIds[] = $ID; + + COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_FAILED_IDS, serialize($failedIds)); + } } /** @@ -42,7 +74,8 @@ class ICrmOrderEvent { * * @param integer $ID - Order Id */ - function writeDataOnOrderCreate($ID) { + function writeDataOnOrderCreate($ID, $arFields) { + if (!CModule::IncludeModule('iblock')) { //handle err ICrmOrderActions::eventLog('ICrmOrderEvent::writeDataOnOrderCreate', 'iblock', 'module not found'); @@ -60,6 +93,9 @@ class ICrmOrderEvent { ICrmOrderActions::eventLog('ICrmOrderEvent::writeDataOnOrderCreate', 'catalog', 'module not found'); return true; } + + $GLOBALS['INTARO_CRM_ORDER_ADD'] = false; + $GLOBALS['INTARO_CRM_FROM_HISTORY'] = false; $api_host = COption::GetOptionString(self::$MODULE_ID, self::$CRM_API_HOST_OPTION, 0); $api_key = COption::GetOptionString(self::$MODULE_ID, self::$CRM_API_KEY_OPTION, 0); @@ -70,27 +106,43 @@ class ICrmOrderEvent { $optionsPayTypes = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_PAYMENT_TYPES, 0)); $optionsPayStatuses = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_PAYMENT_STATUSES, 0)); // --statuses $optionsPayment = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_PAYMENT, 0)); + $optionsOrderProps = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_ORDER_PROPS, 0)); $api = new IntaroCrm\RestApi($api_host, $api_key); - $arParams = array( + $arParams = ICrmOrderActions::clearArr(array( 'optionsOrderTypes' => $optionsOrderTypes, 'optionsDelivTypes' => $optionsDelivTypes, 'optionsPayTypes' => $optionsPayTypes, 'optionsPayStatuses' => $optionsPayStatuses, - 'optionsPayment' => $optionsPayment - ); + 'optionsPayment' => $optionsPayment, + 'optionsOrderProps' => $optionsOrderProps + )); $arOrder = CSaleOrder::GetById($ID); + + if (is_array($arFields) && !empty($arFields)) { + $arFieldsNew = array( + 'USER_ID' => $arOrder['USER_ID'], + 'ID' => $ID, + 'PERSON_TYPE_ID' => $arOrder['PERSON_TYPE_ID'], + 'CANCELED' => $arOrder['CANCELED'], + 'STATUS_ID' => $arOrder['STATUS_ID'], + 'DATE_INSERT' => $arOrder['DATE_INSERT'], + 'LID' => $arOrder['LID'] + ); + + $arFieldsNew = array_merge($arFieldsNew, $arFields); + $arOrder = $arFieldsNew; + } + $result = ICrmOrderActions::orderCreate($arOrder, $api, $arParams, true); if(!$result) { ICrmOrderActions::eventLog('ICrmOrderEvent::writeDataOnOrderCreate', 'ICrmOrderActions::orderCreate', 'error during creating order'); - return true; + return false; } - COption::SetOptionString(self::$MODULE_ID, self::$CRM_ORDER_LAST_ID, $ID); - return true; } @@ -188,6 +240,7 @@ class ICrmOrderEvent { ); $api->orderEdit($order); + // error pushing order if ($api->getStatusCode() != 201) diff --git a/intaro.intarocrm/install/index.php b/intaro.intarocrm/install/index.php index a0ebc8d7..2a8e5cec 100755 --- a/intaro.intarocrm/install/index.php +++ b/intaro.intarocrm/install/index.php @@ -33,6 +33,7 @@ class intaro_intarocrm extends CModule { var $CRM_ORDER_SITES = 'sites_ids'; var $CRM_ORDER_PROPS = 'order_props'; var $CRM_ORDER_DISCHARGE = 'order_discharge'; + var $CRM_ORDER_FAILED_IDS = 'order_failed_ids'; var $INSTALL_PATH; function intaro_intarocrm() { @@ -64,7 +65,7 @@ class intaro_intarocrm extends CModule { if (!date_default_timezone_get()) { if (!ini_get('date.timezone')) { $APPLICATION->ThrowException(GetMessage("DATE_TIMEZONE_ERR")); - return false; + return false; } } @@ -77,27 +78,19 @@ class intaro_intarocrm extends CModule { $arResult['orderProps'] = array( array( 'NAME' => GetMessage('FIO'), - 'ID' => 'fio' - ), - array( - 'NAME' => GetMessage('ZIP'), - 'ID' => 'index' + 'ID' => 'fio' ), array( 'NAME' => GetMessage('PHONE'), - 'ID' => 'phone' + 'ID' => 'phone' ), array( 'NAME' => GetMessage('EMAIL'), - 'ID' => 'email' - ), - array( - 'NAME' => GetMessage('ZIP'), - 'ID' => 'index' + 'ID' => 'email' ), array( 'NAME' => GetMessage('ADDRESS'), - 'ID' => 'text' + 'ID' => 'text' ), // address /* array( @@ -114,35 +107,35 @@ class intaro_intarocrm extends CModule { ), */ array( 'NAME' => GetMessage('ZIP'), - 'ID' => 'index' + 'ID' => 'index' ), array( 'NAME' => GetMessage('STREET'), - 'ID' => 'street' + 'ID' => 'street' ), array( 'NAME' => GetMessage('BUILDING'), - 'ID' => 'building' + 'ID' => 'building' ), array( 'NAME' => GetMessage('FLAT'), - 'ID' => 'flat' + 'ID' => 'flat' ), array( 'NAME' => GetMessage('INTERCOMCODE'), - 'ID' => 'intercomcode' + 'ID' => 'intercomcode' ), array( 'NAME' => GetMessage('FLOOR'), - 'ID' => 'floor' + 'ID' => 'floor' ), array( 'NAME' => GetMessage('BLOCK'), - 'ID' => 'block' + 'ID' => 'block' ), array( 'NAME' => GetMessage('HOUSE'), - 'ID' => 'house' + 'ID' => 'house' ) ); @@ -698,7 +691,7 @@ class intaro_intarocrm extends CModule { //form orderProps $dbProp = CSaleOrderProps::GetList(array(), array()); while ($arProp = $dbProp->GetNext()) { - $arResult['arProp'][] = $arProp; + $arResult['arProp'][$arProp['PERSON_TYPE_ID']][] = $arProp; } COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_TYPES_ARR, serialize($orderTypesArr)); @@ -708,6 +701,7 @@ class intaro_intarocrm extends CModule { COption::SetOptionString($this->MODULE_ID, $this->CRM_PAYMENT, serialize($paymentArr)); COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_LAST_ID, 0); COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_DISCHARGE, 0); + COption::SetOptionString($this->MODULE_ID, $this->CRM_ORDER_FAILED_IDS, serialize(array())); $APPLICATION->IncludeAdminFile( GetMessage('MODULE_INSTALL_TITLE'), @@ -772,7 +766,7 @@ class intaro_intarocrm extends CModule { $propsCount = 0; $_orderPropsArr = array(); foreach ($arResult['orderProps'] as $orderProp) { - if ((!(int) htmlspecialchars(trim($_POST['address-detail-' . $orderType['ID']]))) && $propsCount > 5) + if ((!(int) htmlspecialchars(trim($_POST['address-detail-' . $orderType['ID']]))) && $propsCount > 4) break; $_orderPropsArr[$orderProp['ID']] = htmlspecialchars(trim($_POST['order-prop-' . $orderProp['ID'] . '-' . $orderType['ID']])); $propsCount++; @@ -879,6 +873,7 @@ class intaro_intarocrm extends CModule { } RegisterModule($this->MODULE_ID); + RegisterModuleDependences("sale", "OnSalePayOrder", $this->MODULE_ID, "ICrmOrderEvent", "onSalePayOrder"); RegisterModuleDependences("sale", "OnSaleCancelOrder", $this->MODULE_ID, "ICrmOrderEvent", "onSaleCancelOrder"); $this->CopyFiles(); if (isset($_POST['LOAD_NOW'])) { @@ -1043,9 +1038,13 @@ class intaro_intarocrm extends CModule { COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_SITES); COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_PROPS); COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_DISCHARGE); + COption::RemoveOption($this->MODULE_ID, $this->CRM_ORDER_FAILED_IDS); UnRegisterModuleDependences("sale", "OnSalePayOrder", $this->MODULE_ID, "ICrmOrderEvent", "onSalePayOrder"); UnRegisterModuleDependences("sale", "OnSaleCancelOrder", $this->MODULE_ID, "ICrmOrderEvent", "onSaleCancelOrder"); + UnRegisterModuleDependences("sale", "OnOrderNewSendEmail", $this->MODULE_ID, "ICrmOrderEvent", "onSendOrderMail"); + UnRegisterModuleDependences("sale", "OnOrderUpdate", $this->MODULE_ID, "ICrmOrderEvent", "onUpdateOrder"); + UnRegisterModuleDependences("sale", "OnBeforeOrderAdd", $this->MODULE_ID, "ICrmOrderEvent", "onBeforeOrderAdd"); if (CModule::IncludeModule("catalog")) { if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/bitrix/php_interface/include/catalog_export/' . $this->INTARO_CRM_EXPORT . '_run.php')) { $dbProfile = CCatalogExport::GetList(array(), array("FILE_NAME" => $this->INTARO_CRM_EXPORT)); diff --git a/intaro.intarocrm/install/step1.php b/intaro.intarocrm/install/step1.php index 9f3ff0b9..587334c1 100755 --- a/intaro.intarocrm/install/step1.php +++ b/intaro.intarocrm/install/step1.php @@ -29,9 +29,6 @@ - - -   diff --git a/intaro.intarocrm/install/step3.php b/intaro.intarocrm/install/step3.php index 7c5a7446..81668f47 100755 --- a/intaro.intarocrm/install/step3.php +++ b/intaro.intarocrm/install/step3.php @@ -58,13 +58,12 @@ $defaultOrderProps = array( - + - - + @@ -72,16 +71,16 @@ $defaultOrderProps = array( - 5) echo 'class="address-detail-' . $bitrixOrderType['ID'] . '"'; if(($countProps > 5) && (count($defaultOrderProps[$bitrixOrderType['ID']]) < 6)) echo 'style="display:none;"';?>> + 4) echo 'class="address-detail-' . $bitrixOrderType['ID'] . '"'; if(($countProps > 4) && (count($defaultOrderProps[$bitrixOrderType['ID']]) < 6)) echo 'style="display:none;"';?>> - + ConvertCharset($orderProp['NAME'], 'utf-8', SITE_CHARSET);; ?> diff --git a/intaro.intarocrm/lang/ru/classes/general/ICMLLoader.php b/intaro.intarocrm/lang/ru/classes/general/ICMLLoader.php new file mode 100644 index 00000000..e21acd04 --- /dev/null +++ b/intaro.intarocrm/lang/ru/classes/general/ICMLLoader.php @@ -0,0 +1,2 @@ + GetMessage('FIO'), 'ID' => 'fio' ), - array( - 'NAME' => GetMessage('ZIP'), - 'ID' => 'index' - ), array( 'NAME' => GetMessage('PHONE'), 'ID' => 'phone' @@ -44,10 +40,6 @@ $arResult['orderProps'] = array( 'NAME' => GetMessage('EMAIL'), 'ID' => 'email' ), - array( - 'NAME' => GetMessage('ZIP'), - 'ID' => 'index' - ), array( 'NAME' => GetMessage('ADDRESS'), 'ID' => 'text' @@ -227,36 +219,26 @@ if (isset($_POST['Update']) && ($_POST['Update'] == 'Y')) { // remove depenedencies UnRegisterModuleDependences("sale", "OnOrderNewSendEmail", $mid, "ICrmOrderEvent", "onSendOrderMail"); UnRegisterModuleDependences("sale", "OnOrderUpdate", $mid, "ICrmOrderEvent", "onUpdateOrder"); - // new agent - $dateAgent = new DateTime(); - $intAgent = new DateInterval('PT60S'); // PT60S - 60 sec; - $dateAgent->add($intAgent); - CAgent::AddAgent( - "ICrmOrderActions::uploadOrdersAgent();", $mid, "N", 600, // interval - 10 mins - $dateAgent->format('d.m.Y H:i:s'), // date of first check - "Y", // агент активен - $dateAgent->format('d.m.Y H:i:s'), // date of first start - 30 - ); + UnRegisterModuleDependences("sale", "OnBeforeOrderAdd", $mid, "ICrmOrderEvent", "onBeforeOrderAdd"); + } else if (($orderDischarge != $previousDischarge) && ($orderDischarge == 1)) { - // remove agent - CAgent::RemoveAgent("ICrmOrderActions::uploadOrdersAgent();", $mid); // event dependencies RegisterModuleDependences("sale", "OnOrderNewSendEmail", $mid, "ICrmOrderEvent", "onSendOrderMail"); RegisterModuleDependences("sale", "OnOrderUpdate", $mid, "ICrmOrderEvent", "onUpdateOrder"); + RegisterModuleDependences("sale", "OnBeforeOrderAdd", $mid, "ICrmOrderEvent", "onBeforeOrderAdd"); + } - $orderPropsArr = array(); - foreach ($orderTypesList as $orderType) { - $propsCount = 0; - $_orderPropsArr = array(); - foreach ($arResult['orderProps'] as $orderProp) { - if ((!(int) htmlspecialchars(trim($_POST['address-detail-' . $orderType['ID']]))) && $propsCount > 5) - break; - $_orderPropsArr[$orderProp['ID']] = htmlspecialchars(trim($_POST['order-prop-' . $orderProp['ID'] . '-' . $orderType['ID']])); - $propsCount++; - } - $orderPropsArr[$orderType['ID']] = $_orderPropsArr; + $orderPropsArr = array(); + foreach ($orderTypesList as $orderType) { + $propsCount = 0; + $_orderPropsArr = array(); + foreach ($arResult['orderProps'] as $orderProp) { + if ((!(int) htmlspecialchars(trim($_POST['address-detail-' . $orderType['ID']]))) && $propsCount > 4) + break; + $_orderPropsArr[$orderProp['ID']] = htmlspecialchars(trim($_POST['order-prop-' . $orderProp['ID'] . '-' . $orderType['ID']])); + $propsCount++; } + $orderPropsArr[$orderType['ID']] = $_orderPropsArr; } COption::SetOptionString($mid, $CRM_ORDER_TYPES_ARR, serialize($orderTypesArr)); @@ -380,7 +362,7 @@ if (isset($_POST['Update']) && ($_POST['Update'] == 'Y')) { $dbProp = CSaleOrderProps::GetList(array(), array()); while ($arProp = $dbProp->GetNext()) { - $arResult['arProp'][] = $arProp; + $arResult['arProp'][$arProp['PERSON_TYPE_ID']][] = $arProp; } //saved cat params @@ -583,13 +565,13 @@ if (isset($_POST['Update']) && ($_POST['Update'] == 'Y')) { - + - + @@ -597,16 +579,16 @@ if (isset($_POST['Update']) && ($_POST['Update'] == 'Y')) { - 5) echo 'class="address-detail-' . $bitrixOrderType['ID'] . '"'; if(($countProps > 5) && (count($optionsOrderProps[$bitrixOrderType['ID']]) < 6)) echo 'style="display:none;"';?>> + 4) echo 'class="address-detail-' . $bitrixOrderType['ID'] . '"'; if(($countProps > 4) && (count($optionsOrderProps[$bitrixOrderType['ID']]) < 6)) echo 'style="display:none;"';?>>