1
0
mirror of synced 2025-01-31 23:31:41 +03:00

Merge pull request #31 from iyzoer/master

v2.2.6
This commit is contained in:
Akolzin Dmitry 2017-10-25 13:47:14 +03:00 committed by GitHub
commit a6486001f2
10 changed files with 224 additions and 77 deletions

View File

@ -1,3 +1,7 @@
## 2017-10-25 v.2.2.6
* Доработана система синхронизации оплат
* Исправлены ошибки в истории заказов
## 2017-09-22 v.2.2.5
* Теперь учитываются группы доставки
* Изменен алгоритм передачи оплат

View File

@ -895,7 +895,7 @@ class ApiClient
);
}
if (empty($entity) || !in_array($entity, ['customer', 'order'])) {
if (empty($entity) || !in_array($entity, array('customer', 'order'))) {
throw new \InvalidArgumentException(
'Parameter `entity` must contain a data & value must be `order` or `customer`'
);
@ -924,7 +924,7 @@ class ApiClient
);
}
if (empty($entity) || !in_array($entity, ['customer', 'order'])) {
if (empty($entity) || !in_array($entity, array('customer', 'order'))) {
throw new \InvalidArgumentException(
'Parameter `entity` must contain a data & value must be `order` or `customer`'
);
@ -953,7 +953,7 @@ class ApiClient
);
}
if (empty($entity) || !in_array($entity, ['customer', 'order'])) {
if (empty($entity) || !in_array($entity, array('customer', 'order'))) {
throw new \InvalidArgumentException(
'Parameter `entity` must contain a data & value must be `order` or `customer`'
);

View File

@ -314,9 +314,14 @@ class RCrmActions
case 'ordersEdit':
case 'customersGet':
case 'customersEdit':
case 'ordersPaymentEdit':
return self::proxy($api, $methodApi, $method, array($params, 'externalId', $site));
case 'paymentEditById':
return self::proxy($api, 'ordersPaymentEdit', $method, array($params, 'id', $site));
case 'paymentEditByExternalId':
return self::proxy($api, 'ordersPaymentEdit', $method, array($params, 'externalId', $site));
default:
return self::proxy($api, $methodApi, $method, array($params, $site));
}

View File

@ -157,6 +157,10 @@ class RetailCrmEvent
$site = null;
}
if ($site == null) {
return;
}
//new order?
$orderCrm = RCrmActions::apiMethod($api, 'ordersGet', __METHOD__, $arOrder['ID'], $site);
if (isset($orderCrm['order'])) {
@ -164,6 +168,7 @@ class RetailCrmEvent
$arParams['crmOrder'] = $orderCrm['order'];
} else {
$methodApi = 'ordersCreate';
$GLOBALS['RETAILCRM_ORDER_NEW_ORDER'] = true;
}
//user
@ -191,4 +196,174 @@ class RetailCrmEvent
return true;
}
/**
* paymentSave
*
* @param object $event - Payment object
*/
function paymentSave($event)
{
$apiVersion = COption::GetOptionString(self::$MODULE_ID, 'api_version', 0);
if ((isset($GLOBALS['RETAIL_CRM_HISTORY']) && $GLOBALS['RETAIL_CRM_HISTORY']) || $apiVersion != 'v5') {
return;
}
$optionsSitesList = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_SITES_LIST, 0));
$optionsPaymentTypes = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_PAYMENT_TYPES, 0));
$optionsPayStatuses = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_PAYMENT, 0));
$arPayment = array(
'ID' => $event->getId(),
'ORDER_ID' => $event->getField('ORDER_ID'),
'PAID' => $event->getField('PAID'),
'PAY_SYSTEM_ID' => $event->getField('PAY_SYSTEM_ID'),
'SUM' => $event->getField('SUM'),
'LID' => $event->getField('LID'),
'DATE_PAID' => $event->getField('DATE_PAID'),
'METHOD' => $GLOBALS['RETAILCRM_ORDER_NEW_ORDER'],
);
try {
$newOrder = Bitrix\Sale\Order::load($arPayment['ORDER_ID']);
$arPayment['LID'] = $newOrder->getField('LID');
} catch (Bitrix\Main\ArgumentNullException $e) {
RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'Bitrix\Sale\Order::load', $e->getMessage() . ': ' . $arPayment['ORDER_ID']);
return;
}
if(!empty($optionsSitesList) && array_key_exists($arPayment['LID'], $optionsSitesList)) {
$site = $optionsSitesList[$arPayment['LID']];
} else {
$site = null;
}
if ($site == null) {
return;
}
$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);
$api = new RetailCrm\ApiClient($api_host, $api_key);
$orderCrm = RCrmActions::apiMethod($api, 'ordersGet', __METHOD__, $arPayment['ORDER_ID'], $site);
if (isset($orderCrm['order'])) {
$payments = $orderCrm['order']['payments'];
}
if ($arPayment['METHOD'] === true) {
if ($payments) {
foreach ($payments as $payment) {
if (!isset($payment['externalId'])) {
if ($payment['type'] == $optionsPaymentTypes[$arPayment['PAY_SYSTEM_ID']] && $payment['amount'] == $arPayment['SUM']) {
$payment['externalId'] = $arPayment['ID'];
RCrmActions::apiMethod($api, 'paymentEditById', __METHOD__, $payment, $site);
}
}
}
}
} else {
if ($payments) {
foreach ($payments as $payment) {
if (isset($payment['externalId'])) {
$paymentsExternalIds[$payment['externalId']] = $payment;
}
}
if (!empty($arPayment['PAY_SYSTEM_ID']) && isset($optionsPaymentTypes[$arPayment['PAY_SYSTEM_ID']])) {
$paymentToCrm = array(
'type' => $optionsPaymentTypes[$arPayment['PAY_SYSTEM_ID']],
'amount' => $arPayment['SUM']
);
if (!empty($arPayment['ID'])) {
$paymentToCrm['externalId'] = $arPayment['ID'];
}
if (!empty($arPayment['DATE_PAID'])) {
if (is_object($arPayment['DATE_PAID'])) {
$culture = new Bitrix\Main\Context\Culture(array("FORMAT_DATETIME" => "YYYY-MM-DD HH:MI:SS"));
$paymentToCrm['paidAt'] = $arPayment['DATE_PAID']->toString($culture);
} elseif (is_string($arPayment['DATE_PAID'])) {
$paymentToCrm['paidAt'] = $arPayment['DATE_PAID'];
}
}
if (!empty($optionsPayStatuses[$arPayment['PAID']])) {
$paymentToCrm['status'] = $optionsPayStatuses[$arPayment['PAID']];
}
if (!empty($arPayment['ORDER_ID'])) {
$paymentToCrm['order']['externalId'] = $arPayment['ORDER_ID'];
}
} else {
RCrmActions::eventLog('RetailCrmOrder::orderSend', 'payments', 'OrderID = ' . $arFields['ID'] . '. Payment not found.');
}
if (!array_key_exists($arPayment['ID'], $paymentsExternalIds)) {
RCrmActions::apiMethod($api, 'ordersPaymentCreate', __METHOD__, $paymentToCrm, $site);
} elseif (array_key_exists($arPayment['ID'], $paymentsExternalIds) && $paymentsExternalIds[$arPayment['ID']]['type'] == $optionsPaymentTypes[$arPayment['PAY_SYSTEM_ID']]) {
RCrmActions::apiMethod($api, 'paymentEditByExternalId', __METHOD__, $paymentToCrm, $site);
} elseif (array_key_exists($arPayment['ID'], $paymentsExternalIds) && $paymentsExternalIds[$arPayment['ID']]['type'] != $optionsPaymentTypes[$arPayment['PAY_SYSTEM_ID']]) {
RCrmActions::apiMethod($api, 'ordersPaymentDelete', __METHOD__, $paymentsExternalIds[$arPayment['ID']]['id']);
RCrmActions::apiMethod($api, 'ordersPaymentCreate', __METHOD__, $paymentToCrm, $site);
}
}
}
}
/**
* paymentDelete
*
* @param object $event - Payment object
*/
function paymentDelete($event)
{
$apiVersion = COption::GetOptionString(self::$MODULE_ID, 'api_version', 0);
if ((isset($GLOBALS['RETAIL_CRM_HISTORY']) && $GLOBALS['RETAIL_CRM_HISTORY']) || $apiVersion != 'v5') {
return;
}
$optionsSitesList = unserialize(COption::GetOptionString(self::$MODULE_ID, self::$CRM_SITES_LIST, 0));
$arPayment = array(
'ID' => $event->getId(),
'ORDER_ID' => $event->getField('ORDER_ID')
);
try {
$newOrder = Bitrix\Sale\Order::load($arPayment['ORDER_ID']);
$arPayment['LID'] = $newOrder->getField('LID');
} catch (Bitrix\Main\ArgumentNullException $e) {
RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'Bitrix\Sale\Order::load', $e->getMessage() . ': ' . $arPayment['ORDER_ID']);
return;
}
if(!empty($optionsSitesList) && array_key_exists($arPayment['LID'], $optionsSitesList)) {
$site = $optionsSitesList[$arPayment['LID']];
} else {
$site = null;
}
if ($site == null) {
return;
}
$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);
$api = new RetailCrm\ApiClient($api_host, $api_key);
$orderCrm = RCrmActions::apiMethod($api, 'ordersGet', __METHOD__, $arPayment('ORDER_ID'), $site);
if (isset($orderCrm['order']['payments']) && $orderCrm['order']['payments']) {
foreach ($orderCrm['order']['payments'] as $payment) {
if (isset($payment['externalId']) && $payment['externalId'] == $event->getId()) {
RCrmActions::apiMethod($api, 'ordersPaymentDelete', __METHOD__, $payment['id']);
}
}
}
}
}

View File

@ -503,8 +503,10 @@ class RetailCrmHistory
if ($propsRemove) {//delete props
foreach ($propertyCollectionArr['properties'] as $orderProp) {
$somePropValue = $propertyCollection->getItemByOrderPropertyId($orderProp['ID']);
self::setProp($somePropValue);
if ($orderProp['PROPS_GROUP_ID'] == 0) {
$somePropValue = $propertyCollection->getItemByOrderPropertyId($orderProp['ID']);
self::setProp($somePropValue);
}
}
$orderCrm = RCrmActions::apiMethod($api, 'orderGet', __METHOD__, $order['id']);
@ -514,8 +516,10 @@ class RetailCrmHistory
$propsKey = array();
foreach ($propertyCollectionArr['properties'] as $prop) {
$propsKey[$prop['CODE']]['ID'] = $prop['ID'];
$propsKey[$prop['CODE']]['TYPE'] = $prop['TYPE'];
if ($prop['PROPS_GROUP_ID'] != 0) {
$propsKey[$prop['CODE']]['ID'] = $prop['ID'];
$propsKey[$prop['CODE']]['TYPE'] = $prop['TYPE'];
}
}
//fio
if ($order['firstName'] || $order['lastName'] || $order['patronymic']) {
@ -589,12 +593,13 @@ class RetailCrmHistory
//optionsLegalDetails
if ($optionsLegalDetails[$personType]) {
foreach ($optionsLegalDetails[$personType] as $key => $orderProp) {
if (array_key_exists($key, $order)) {
if (array_key_exists($key, $order['contragent'])) {
$somePropValue = $propertyCollection->getItemByOrderPropertyId($propsKey[$orderProp]['ID']);
self::setProp($somePropValue, $order[$key]);
self::setProp($somePropValue, $order['contragent'][$key]);
}
}
}
if ($propsRemove) {
$order = $orderDump;
}
@ -641,7 +646,6 @@ class RetailCrmHistory
}
if ($product['delete']) {
$item->delete();
$basket->save();
continue;
}
@ -660,8 +664,6 @@ class RetailCrmHistory
$item->setField('DISCOUNT_VALUE', '');
}
}
$basket->save();
}
}
@ -1187,7 +1189,7 @@ class RetailCrmHistory
unset($paymentsList[$newPaymentId]);
//RCrmActions::apiMethod($api, 'ordersPaymentEdit', __METHOD__, array('id' => $paymentCrm['id'], 'externalId' => $newPaymentId));
RCrmActions::apiMethod($api, 'ordersPaymentEdit', __METHOD__, array('id' => $paymentCrm['id'], 'externalId' => $newPaymentId));
}
if ($optionsPayment[$paymentCrm['status']] == 'Y') {

View File

@ -155,10 +155,10 @@ class RetailCrmOrder
}
$normalizer = new RestNormalizer();
$order = $normalizer->normalize($order, 'ordersSend');
$order = $normalizer->normalize($order, 'orders');
$log = new Logger();
$log->write($order, 'order');
$log->write($order, 'orderSend');
if($send) {
if (!RCrmActions::apiMethod($api, $methodApi, __METHOD__, $order, $site)) {

View File

@ -179,62 +179,15 @@ class RetailCrmOrder
}
$normalizer = new RestNormalizer();
$order = $normalizer->normalize($order, 'ordersSend');
$order = $normalizer->normalize($order, 'orders');
$log = new Logger();
$log->write($order, 'order');
$log->write($order, 'orderSend');
if($send) {
if (!RCrmActions::apiMethod($api, $methodApi, __METHOD__, $order, $site)) {
return false;
}
if ($methodApi == 'ordersEdit') {
$crmPayments = array();
if (!empty($arParams['crmOrder']['payments'])) {
foreach ($arParams['crmOrder']['payments'] as $crmPayment) {
if (isset($crmPayment['externalId'])) {
$crmPayments['externalIds'][$crmPayment['externalId']] = $crmPayment;
} else {
$crmPayments['ids'][$crmPayment['id']] = $crmPayment;
}
}
}
foreach ($order['payments'] as $payment) {
if (isset($crmPayments['externalIds'][$payment['externalId']])) {
//update payment
if ($payment['type'] == $crmPayments['externalIds'][$payment['externalId']]['type']) {
if (RCrmActions::apiMethod($api, 'ordersPaymentEdit', __METHOD__, $payment, $site)) {
unset($crmPayments['externalIds'][$payment['externalId']]);
}
} else {
RCrmActions::apiMethod($api, 'ordersPaymentDelete', __METHOD__, $crmPayments['externalIds'][$payment['externalId']]['id']);
$payment['order']['externalId'] = $order['externalId'];
RCrmActions::apiMethod($api, 'ordersPaymentCreate', __METHOD__, $payment, $site);
unset($crmPayments['externalIds'][$payment['externalId']]);
}
} else {
//create
$payment['order']['externalId'] = $order['externalId'];
RCrmActions::apiMethod($api, 'ordersPaymentCreate', __METHOD__, $payment, $site);
}
}
//delete in crm
if (!empty($crmPayments['ids'])) {
foreach ($crmPayments['ids'] as $payment) {
//delete
RCrmActions::apiMethod($api, 'ordersPaymentDelete', __METHOD__, $payment['id']);
}
}
if (!empty($crmPayments['externalIds'])) {
foreach ($crmPayments['externalIds'] as $payment) {
//delete
RCrmActions::apiMethod($api, 'ordersPaymentDelete', __METHOD__, $payment['id']);
}
}
}
}
return $order;
@ -332,6 +285,10 @@ class RetailCrmOrder
$site = null;
}
if ($site == null) {
continue;
}
$arCustomers = RetailCrmUser::customerSend($user, $api, $optionsContragentType[$order['PERSON_TYPE_ID']], false, $site);
$arOrders = self::orderSend($order, $api, $arParams, false, $site);

View File

@ -1,4 +1,2 @@
- Теперь учитываются группы доставки
- Изменен алгоритм передачи оплат
- Исправлено задваивание количества товаров в отгрузке
- Небольшие исправления
- Доработана система синхронизации оплат
- Исправлены ошибки в истории заказов

View File

@ -285,6 +285,8 @@ class intaro_retailcrm extends CModule
foreach ($arResult['arSites'] as $site) {
if ($_POST['sites-id-' . $site['LID']] && !empty($_POST['sites-id-' . $site['LID']])) {
$siteCode[$site['LID']] = htmlspecialchars(trim($_POST['sites-id-' . $site['LID']]));
} else {
$siteCode[$site['LID']] = null;
}
}
if (count($arResult['arSites']) != count($siteCode)) {
@ -813,6 +815,8 @@ class intaro_retailcrm extends CModule
RegisterModuleDependences("main", "OnAfterUserUpdate", $this->MODULE_ID, "RetailCrmEvent", "OnAfterUserUpdate");
RegisterModuleDependences("sale", "OnSaleOrderEntitySaved", $this->MODULE_ID, "RetailCrmEvent", "orderSave");
RegisterModuleDependences("sale", "OnSaleOrderEntityDelete", $this->MODULE_ID, "RetailCrmEvent", "orderDelete");
RegisterModuleDependences("sale", "OnSalePaymentEntitySaved", $this->MODULE_ID, "RetailCrmEvent", "paymentSave");
RegisterModuleDependences("sale", "OnSalePaymentEntityDeleted", $this->MODULE_ID, "RetailCrmEvent", "paymentDelete");
COption::SetOptionString($this->MODULE_ID, $this->CRM_CATALOG_BASE_PRICE, htmlspecialchars(trim($_POST['price-types'])));
COption::SetOptionString($this->MODULE_ID, $this->CRM_INVENTORIES_UPLOAD, 'N');
@ -1017,6 +1021,8 @@ class intaro_retailcrm extends CModule
UnRegisterModuleDependences("sale", "OnSaleOrderEntityDelete", $this->MODULE_ID, "RetailCrmEvent", "orderDelete");
UnRegisterModuleDependences("main", "OnBeforeProlog", $this->MODULE_ID, "RetailCrmCollector", "add");
UnRegisterModuleDependences("main", "OnBeforeProlog", $this->MODULE_ID, "RetailCrmUa", "add");
UnRegisterModuleDependences("sale", "OnSalePaymentEntitySaved", $this->MODULE_ID, "RetailCrmEvent", "paymentSave");
UnRegisterModuleDependences("sale", "OnSalePaymentEntityDeleted", $this->MODULE_ID, "RetailCrmEvent", "paymentDelete");
if (CModule::IncludeModule("catalog")) {
if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/bitrix/php_interface/include/catalog_export/' . $this->RETAIL_CRM_EXPORT . '_run.php')) {

View File

@ -1,5 +1,5 @@
<?
$arModuleVersion = array(
"VERSION" => "2.2.5",
"VERSION_DATE" => "2017-09-22 18:00:00"
"VERSION" => "2.2.6",
"VERSION_DATE" => "2017-09-25 12:00:00"
);