<?php /** * OrderEvent */ class ICrmOrderEvent { protected static $MODULE_ID = 'intaro.intarocrm'; protected static $CRM_API_HOST_OPTION = 'api_host'; protected static $CRM_API_KEY_OPTION = 'api_key'; protected static $CRM_ORDER_TYPES_ARR = 'order_types_arr'; protected static $CRM_DELIVERY_TYPES_ARR = 'deliv_types_arr'; protected static $CRM_PAYMENT_TYPES = 'pay_types_arr'; 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) { 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; if(isset($arFields['CANCELED'])) return; self::writeDataOnOrderCreate($ID, $arFields); } /** * onSendOrderMail * in: sale.order.ajax, sale.order.full * * @param mixed $ID - Order id * @param mixed $eventName - Event type * @param mixed $arFields - Order arFields for sending template */ function onSendOrderMail($ID, &$eventName, &$arFields) { if(isset($GLOBALS['INTARO_CRM_FROM_HISTORY']) && $GLOBALS['INTARO_CRM_FROM_HISTORY']) return; 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)); } } /** * writeDataOnOrderCreate via api * * @param $ID - Order Id * @param array $arFields * @return boolean */ function writeDataOnOrderCreate($ID, $arFields) { if (!CModule::IncludeModule('iblock')) { //handle err ICrmOrderActions::eventLog('ICrmOrderEvent::writeDataOnOrderCreate', 'iblock', 'module not found'); return true; } if (!CModule::IncludeModule("sale")) { //handle err ICrmOrderActions::eventLog('ICrmOrderEvent::writeDataOnOrderCreate', 'sale', 'module not found'); return true; } if (!CModule::IncludeModule("catalog")) { //handle err 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); //saved cat params $optionsOrderTypes = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_ORDER_TYPES_ARR, 0)); $optionsDelivTypes = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_DELIVERY_TYPES_ARR, 0)); $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 = ICrmOrderActions::clearArr(array( 'optionsOrderTypes' => $optionsOrderTypes, 'optionsDelivTypes' => $optionsDelivTypes, 'optionsPayTypes' => $optionsPayTypes, 'optionsPayStatuses' => $optionsPayStatuses, '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 false; } return true; } /** * * @param type $ID -- orderId * @param type $cancel -- Y / N - cancel order status * @param type $reason -- cancel reason * @return boolean */ function onSaleCancelOrder($ID, $cancel, $reason) { if(isset($GLOBALS['INTARO_CRM_FROM_HISTORY']) && $GLOBALS['INTARO_CRM_FROM_HISTORY']) return; if(!$ID || !$cancel) return true; if (!CModule::IncludeModule('iblock')) { //handle err ICrmOrderActions::eventLog('ICrmOrderEvent::onSaleCancelOrder', 'iblock', 'module not found'); return true; } if (!CModule::IncludeModule("sale")) { //handle err ICrmOrderActions::eventLog('ICrmOrderEvent::onSaleCancelOrder', 'sale', 'module not found'); return true; } if (!CModule::IncludeModule("catalog")) { //handle err ICrmOrderActions::eventLog('ICrmOrderEvent::onSaleCancelOrder', 'catalog', 'module not found'); return true; } $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); //saved cat params $optionsPayStatuses = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_PAYMENT_STATUSES, 0)); // --statuses $api = new IntaroCrm\RestApi($api_host, $api_key); $order = array(); if($cancel == 'Y') { $order = array( 'externalId' => (int) $ID, 'status' => $optionsPayStatuses[$cancel.$cancel], 'statusComment' => ICrmOrderActions::toJSON($reason) ); } else if($cancel == 'N') { $arOrder = CSaleOrder::GetById((int) $ID); $order = array( 'externalId' => (int) $ID, 'status' => $optionsPayStatuses[$arOrder['STATUS_ID']], 'managerComment' => $arOrder['COMMENTS'] ); } $api->orderEdit($order); // error pushing order if ($api->getStatusCode() != 201) ICrmOrderActions::eventLog('ICrmOrderEvent::onSaleCancelOrder', 'IntaroCrm\RestApi::orderEdit', $api->getLastError()); return true; } /** * * @param type $ID -- orderId * @param type $payed -- Y / N - pay order status * @return boolean */ function onSalePayOrder($ID, $payed) { if(isset($GLOBALS['INTARO_CRM_FROM_HISTORY']) && $GLOBALS['INTARO_CRM_FROM_HISTORY']) return; if(!$ID || !$payed || ($payed != 'Y')) return true; if (!CModule::IncludeModule('iblock')) { //handle err ICrmOrderActions::eventLog('ICrmOrderEvent::onSalePayOrder', 'iblock', 'module not found'); return true; } if (!CModule::IncludeModule("sale")) { //handle err ICrmOrderActions::eventLog('ICrmOrderEvent::onSalePayOrder', 'sale', 'module not found'); return true; } if (!CModule::IncludeModule("catalog")) { //handle err ICrmOrderActions::eventLog('ICrmOrderEvent::onSalePayOrder', 'catalog', 'module not found'); return true; } $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); //saved cat params $optionsPayment = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_PAYMENT, 0)); $api = new IntaroCrm\RestApi($api_host, $api_key); $order = array( 'externalId' => (int) $ID, 'paymentStatus' => $optionsPayment[$payed] ); $api->orderEdit($order); // error pushing order if ($api->getStatusCode() != 201) ICrmOrderActions::eventLog('ICrmOrderEvent::onSalePayOrder', 'IntaroCrm\RestApi::orderEdit', $api->getLastError()); return true; } /** * * @param type $ID -- orderId * @param type $value -- ACCOUNT_NUMBER * @return boolean */ function onBeforeOrderAccountNumberSet($ID, $value) { if(isset($GLOBALS['ICRM_ACCOUNT_NUMBER']) && $GLOBALS['ICRM_ACCOUNT_NUMBER']) return $GLOBALS['ICRM_ACCOUNT_NUMBER']; } }