From b98c6ba9eafc2f5b19b684ab6b8b8e235b3521a2 Mon Sep 17 00:00:00 2001 From: gorokh Date: Tue, 17 Sep 2019 15:42:26 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D0=BD=D0=B0=D0=BA=D0=BE=D0=B2=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=82=D0=BE=D0=B2=D0=B0=D1=80=D0=B0=20=D0=B2=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BA=D0=B0=D0=B7=20=D0=BA=D0=B0=D0=BA=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=BD=D1=8B=D0=B5=20=D1=82=D0=BE=D0=B2=D0=B0=D1=80=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=BF=D0=BE=D0=B7=D0=B8=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B8=D0=B7=20CRM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 + .../general/history/RetailCrmHistory_v5.php | 102 +++++++++++++----- .../general/order/RetailCrmOrder_v5.php | 11 +- intaro.retailcrm/description.ru | 2 +- intaro.retailcrm/install/version.php | 4 +- 5 files changed, 87 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d96f15d..36e019be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 2019-09-17 v.2.5.2 +* Поддержка функции добавления одинакового товара в заказ как разные товарные позиции из CRM + ## 2019-08-28 v.2.5.1 * Исправление генерации единиц измерения diff --git a/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php b/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php index 28838277..07d8b35d 100644 --- a/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php +++ b/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php @@ -126,7 +126,7 @@ class RetailCrmHistory } if ($registerNewUser === true) { - $userPassword = uniqid("R"); + $userPassword = uniqid(); $arFields = array( "EMAIL" => $customer['email'], @@ -137,12 +137,12 @@ class RetailCrmHistory ); $registeredUserID = $newUser->Add($arFields); if ($registeredUserID === false) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'CUser::Register', 'Error register user: ' . $newUser->LAST_ERROR); + RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'CUser::Register', 'Error register user'); continue; } if(RCrmActions::apiMethod($api, 'customersFixExternalIds', __METHOD__, array(array('id' => $customer['id'], 'externalId' => $registeredUserID))) == false) { - continue; + continue; } } @@ -361,7 +361,7 @@ class RetailCrmHistory } if ($registerNewUser === true) { - $userPassword = uniqid("R"); + $userPassword = uniqid(); $newUser = new CUser; $arFields = array( @@ -384,7 +384,7 @@ class RetailCrmHistory $registeredUserID = $newUser->Add($arFields); if ($registeredUserID === false) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'CUser::Register', 'Error register user ' . $newUser->LAST_ERROR); + RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'CUser::Register', 'Error register user'); continue; } @@ -423,7 +423,7 @@ class RetailCrmHistory if (isset($order['externalId'])) { $itemUpdate = false; - if ($order['externalId'] && is_numeric($order['externalId'])) { + if ($order['externalId']) { try { $newOrder = Bitrix\Sale\Order::load($order['externalId']); } catch (Bitrix\Main\ArgumentNullException $e) { @@ -566,9 +566,6 @@ class RetailCrmHistory } } elseif (array_key_exists($key, $order['delivery']['address'])) { if ($propsKey[$orderProp]['TYPE'] == 'LOCATION') { - if( $order['delivery']['address']['index'] ) { - $location = CSaleLocation::GetByZIP($order['delivery']['address']['index']); - } $order['delivery']['address'][$key] = trim($order['delivery']['address'][$key]); if(!empty($order['delivery']['address'][$key])){ $parameters = array(); @@ -585,9 +582,7 @@ class RetailCrmHistory $parameters['filter']['NAME.LANGUAGE_ID'] = 'ru'; try { - if ( !isset($location) ) { - $location = \Bitrix\Sale\Location\Search\Finder::find($parameters, array('USE_INDEX' => false, 'USE_ORM' => false))->fetch(); - } + $location = \Bitrix\Sale\Location\Search\Finder::find($parameters, array('USE_INDEX' => false, 'USE_ORM' => false))->fetch(); $somePropValue = $propertyCollection->getItemByOrderPropertyId($propsKey[$orderProp]['ID']); self::setProp($somePropValue, $location['CODE']); } catch (\Bitrix\Main\ArgumentException $argumentException) { @@ -611,7 +606,7 @@ class RetailCrmHistory foreach ($optionsLegalDetails[$personType] as $key => $orderProp) { if (array_key_exists($key, $order)) { $somePropValue = $propertyCollection->getItemByOrderPropertyId($propsKey[$orderProp]['ID']); - self::setProp($somePropValue, RCrmActions::fromJSON($order[$key])); + self::setProp($somePropValue, $order[$key]); } } } @@ -646,11 +641,32 @@ class RetailCrmHistory if (isset($order['items'])) { $itemUpdate = true; + $response = RCrmActions::apiMethod($api, 'orderGet', __METHOD__, $order['id']); + if (isset($response['order'])) { + $orderTemp = $response['order']; + $ditems = []; + foreach ($orderTemp['items'] as $item) { + $ditems[$item['offer']['xmlId']]['quantity'] += $item['quantity']; + $ditems[$item['offer']['xmlId']]['discountTotal'] += $item['quantity'] * $item['discountTotal']; + $ditems[$item['offer']['xmlId']]['initialPrice'] = (float)$item['initialPrice']; + $ditems[$item['offer']['xmlId']]['price_sum'] = $ditems[$item['offer']['xmlId']]['initialPrice'] * $ditems[$item['offer']['xmlId']]['quantity'] - $ditems[$item['offer']['xmlId']]['discountTotal']; + $ditems[$item['offer']['xmlId']]['price_item'] = $ditems[$item['offer']['xmlId']]['price_sum'] / $ditems[$item['offer']['xmlId']]['quantity']; + } + unset($orderTemp); + } + + $log->write($ditems, 'duplicateItemsOrderHistory'); + foreach ($order['items'] as $product) { + if($ditems[$product['offer']['xmlId']]['quantity']){ + $product['quantity'] = $ditems[$product['offer']['xmlId']]['quantity']; + } + $item = self::getExistsItem($basket, 'catalog', $product['offer']['externalId']); if (!$item) { if ($product['delete']) { + continue; } @@ -679,9 +695,11 @@ class RetailCrmHistory } if ($product['delete']) { - $item->delete(); + if ($ditems[$product['offer']['xmlId']]['quantity'] <= 0) { + $item->delete(); - continue; + continue; + } } if ($product['quantity']) { @@ -709,6 +727,12 @@ class RetailCrmHistory $item->setField('DISCOUNT_VALUE', ''); $item->setField('DISCOUNT_PRICE', $resultDiscount); $item->setField('PRICE', $itemCost - $resultDiscount); + + //set price dublicate item + if ($ditems[$product['offer']['xmlId']]['price_item']) { + $item->setField('PRICE', $ditems[$product['offer']['xmlId']]['price_item']); + $item->setField('DISCOUNT_PRICE', ''); + } } } } @@ -772,16 +796,20 @@ class RetailCrmHistory if (!empty($newHistoryPayments)) { foreach ($newOrder->getPaymentCollection() as $orderPayment) { if (array_key_exists($orderPayment->getField('XML_ID'), $newHistoryPayments)) { + $paymentId = $orderPayment->getId(); $paymentExternalId = RCrmActions::generatePaymentExternalId($paymentId); if (is_null($paymentId)) { RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'paymentsUpdate', 'Save payment error, order=' . $order['number']); continue; } + + $paymentExternalId = $orderPayment->getId(); + if ($paymentExternalId) { $newHistoryPayments[$orderPayment->getField('XML_ID')]['externalId'] = $paymentExternalId; RCrmActions::apiMethod($api, 'paymentEditById', __METHOD__, $newHistoryPayments[$orderPayment->getField('XML_ID')]); - \Bitrix\Sale\Internals\PaymentTable::update($paymentId, array('XML_ID' => '')); + \Bitrix\Sale\Internals\PaymentTable::update($paymentExternalId, array('XML_ID' => '')); } } } @@ -815,6 +843,26 @@ class RetailCrmHistory } } + /** + * @param $array + * @param $value + * + * @return array + */ + public static function search_array_by_value($array, $value) + { + $results = array(); + if (is_array($array)) { + $found = array_search($value,$array); + if ($found) { + $results[] = $found; + } + foreach ($array as $subarray) + $results = array_merge($results, static::search_array_by_value($subarray, $value)); + } + return $results; + } + public static function assemblyCustomer($customerHistory) { $server = \Bitrix\Main\Context::getCurrent()->getServer()->getDocumentRoot(); @@ -1017,9 +1065,10 @@ class RetailCrmHistory $serviceCode = str_replace(array('-'), "_", $serviceCode); } } + if ($deliveryCode) { try { - $deliveryService = \Bitrix\Sale\Delivery\Services\Manager::getObjectByCode($deliveryCode . ':' . $serviceCode); + $deliveryService = \Bitrix\Sale\Delivery\Services\Manager::getObjectByCode($deliveryCode . ':' . $orderCrm['delivery']['service']['code']); } catch (Bitrix\Main\SystemException $systemException) { RCrmActions::eventLog('RetailCrmHistory::deliveryEdit', '\Bitrix\Sale\Delivery\Services\Manager::getObjectByCode', $systemException->getMessage()); } @@ -1036,13 +1085,13 @@ class RetailCrmHistory if ($delivery) { if (!$update) { - $shipment = $shipmentColl->createItem($delivery); - $shipment->setFields(array( - 'BASE_PRICE_DELIVERY' => $orderCrm['delivery']['cost'], - 'CURRENCY' => $order->getCurrency(), - 'DELIVERY_NAME' => $delivery->getName(), - 'CUSTOM_PRICE_DELIVERY' => 'Y' - )); + $shipment = $shipmentColl->createItem($delivery); + $shipment->setFields(array( + 'BASE_PRICE_DELIVERY' => $orderCrm['delivery']['cost'], + 'CURRENCY' => $order->getCurrency(), + 'DELIVERY_NAME' => $delivery->getName(), + 'CUSTOM_PRICE_DELIVERY' => 'Y' + )); } else { foreach ($shipmentColl as $shipment) { if (!$shipment->isSystem()) { @@ -1157,8 +1206,7 @@ class RetailCrmHistory foreach ($paymentsCrm['payments'] as $paymentCrm) { if (isset($paymentCrm['externalId']) && !empty($paymentCrm['externalId'])) { //find the payment - $nowPaymentId = RCrmActions::getFromPaymentExternalId($paymentCrm['externalId']); - $nowPayment = $paymentsList[$nowPaymentId]; + $nowPayment = $paymentsList[$paymentCrm['externalId']]; //update data if ($nowPayment instanceof \Bitrix\Sale\Payment) { $nowPayment->setField('SUM', $paymentCrm['amount']); @@ -1170,7 +1218,7 @@ class RetailCrmHistory $nowPayment->setField('PAID', $optionsPayment[$paymentCrm['status']]); } - unset($paymentsList[$nowPaymentId]); + unset($paymentsList[$paymentCrm['externalId']]); } } elseif (array_key_exists($paymentCrm['type'], $optionsPayTypes)) { $newHistoryPayments[$paymentCrm['id']] = $paymentCrm; diff --git a/intaro.retailcrm/classes/general/order/RetailCrmOrder_v5.php b/intaro.retailcrm/classes/general/order/RetailCrmOrder_v5.php index 1f7ce7ba..b5177f06 100644 --- a/intaro.retailcrm/classes/general/order/RetailCrmOrder_v5.php +++ b/intaro.retailcrm/classes/general/order/RetailCrmOrder_v5.php @@ -56,9 +56,9 @@ class RetailCrmOrder 'createdAt' => $arFields['DATE_INSERT'], 'customer' => array('externalId' => $arFields['USER_ID']), 'orderType' => isset($arParams['optionsOrderTypes'][$arFields['PERSON_TYPE_ID']]) ? - $arParams['optionsOrderTypes'][$arFields['PERSON_TYPE_ID']] : '', + $arParams['optionsOrderTypes'][$arFields['PERSON_TYPE_ID']] : '', 'status' => isset($arParams['optionsPayStatuses'][$arFields['STATUS_ID']]) ? - $arParams['optionsPayStatuses'][$arFields['STATUS_ID']] : '', + $arParams['optionsPayStatuses'][$arFields['STATUS_ID']] : '', 'customerComment' => $arFields['USER_DESCRIPTION'], 'managerComment' => $arFields['COMMENTS'], 'delivery' => array( @@ -140,10 +140,11 @@ class RetailCrmOrder //basket foreach ($arFields['BASKET'] as $product) { $item = array( + 'externalId' => $product['PRODUCT_ID'], 'quantity' => $product['QUANTITY'], 'offer' => array('externalId' => $product['PRODUCT_ID'], - 'xmlId' => $product['PRODUCT_XML_ID'] - ), + 'xmlId' => $product['PRODUCT_XML_ID'] + ), 'productName' => $product['NAME'] ); @@ -205,7 +206,7 @@ class RetailCrmOrder 'amount' => $payment['SUM'] ); if (!empty($payment['ID'])) { - $pm['externalId'] = $payment['ID']; + $pm['externalId'] = RCrmActions::generatePaymentExternalId($payment['ID']); } if (!empty($payment['DATE_PAID'])) { $pm['paidAt'] = new \DateTime($payment['DATE_PAID']); diff --git a/intaro.retailcrm/description.ru b/intaro.retailcrm/description.ru index 4aa7eb64..d8ac25bc 100644 --- a/intaro.retailcrm/description.ru +++ b/intaro.retailcrm/description.ru @@ -1 +1 @@ -- Исправление генерации единиц измерения +- Поддержка функции добавления одинакового товара в заказ как разные товарные позиции из CRM diff --git a/intaro.retailcrm/install/version.php b/intaro.retailcrm/install/version.php index bf8a2326..920dee62 100644 --- a/intaro.retailcrm/install/version.php +++ b/intaro.retailcrm/install/version.php @@ -1,5 +1,5 @@ "2.5.1", - "VERSION_DATE" => "2019-08-28 15:20:00" + "VERSION" => "2.5.2", + "VERSION_DATE" => "2019-09-17 15:20:00" ); From 27a4e558fb0a49bb1172d129df4a79cd01c69853 Mon Sep 17 00:00:00 2001 From: gorokh Date: Tue, 17 Sep 2019 18:10:30 +0300 Subject: [PATCH 2/2] fix --- .../general/history/RetailCrmHistory_v5.php | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php b/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php index 07d8b35d..ee303722 100644 --- a/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php +++ b/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php @@ -126,7 +126,7 @@ class RetailCrmHistory } if ($registerNewUser === true) { - $userPassword = uniqid(); + $userPassword = uniqid("R"); $arFields = array( "EMAIL" => $customer['email'], @@ -137,7 +137,7 @@ class RetailCrmHistory ); $registeredUserID = $newUser->Add($arFields); if ($registeredUserID === false) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'CUser::Register', 'Error register user'); + RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'CUser::Register', 'Error register user: ' . $newUser->LAST_ERROR); continue; } @@ -361,7 +361,7 @@ class RetailCrmHistory } if ($registerNewUser === true) { - $userPassword = uniqid(); + $userPassword = uniqid("R"); $newUser = new CUser; $arFields = array( @@ -384,7 +384,7 @@ class RetailCrmHistory $registeredUserID = $newUser->Add($arFields); if ($registeredUserID === false) { - RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'CUser::Register', 'Error register user'); + RCrmActions::eventLog('RetailCrmHistory::orderHistory', 'CUser::Register', 'Error register user' . $newUser->LAST_ERROR); continue; } @@ -423,7 +423,7 @@ class RetailCrmHistory if (isset($order['externalId'])) { $itemUpdate = false; - if ($order['externalId']) { + if ($order['externalId'] && is_numeric($order['externalId'])) { try { $newOrder = Bitrix\Sale\Order::load($order['externalId']); } catch (Bitrix\Main\ArgumentNullException $e) { @@ -566,6 +566,9 @@ class RetailCrmHistory } } elseif (array_key_exists($key, $order['delivery']['address'])) { if ($propsKey[$orderProp]['TYPE'] == 'LOCATION') { + if( $order['delivery']['address']['index'] ) { + $location = CSaleLocation::GetByZIP($order['delivery']['address']['index']); + } $order['delivery']['address'][$key] = trim($order['delivery']['address'][$key]); if(!empty($order['delivery']['address'][$key])){ $parameters = array(); @@ -582,7 +585,9 @@ class RetailCrmHistory $parameters['filter']['NAME.LANGUAGE_ID'] = 'ru'; try { - $location = \Bitrix\Sale\Location\Search\Finder::find($parameters, array('USE_INDEX' => false, 'USE_ORM' => false))->fetch(); + if ( !isset($location) ) { + $location = \Bitrix\Sale\Location\Search\Finder::find($parameters, array('USE_INDEX' => false, 'USE_ORM' => false))->fetch(); + } $somePropValue = $propertyCollection->getItemByOrderPropertyId($propsKey[$orderProp]['ID']); self::setProp($somePropValue, $location['CODE']); } catch (\Bitrix\Main\ArgumentException $argumentException) { @@ -606,7 +611,7 @@ class RetailCrmHistory foreach ($optionsLegalDetails[$personType] as $key => $orderProp) { if (array_key_exists($key, $order)) { $somePropValue = $propertyCollection->getItemByOrderPropertyId($propsKey[$orderProp]['ID']); - self::setProp($somePropValue, $order[$key]); + self::setProp($somePropValue, RCrmActions::fromJSON($order[$key])); } } } @@ -809,7 +814,7 @@ class RetailCrmHistory if ($paymentExternalId) { $newHistoryPayments[$orderPayment->getField('XML_ID')]['externalId'] = $paymentExternalId; RCrmActions::apiMethod($api, 'paymentEditById', __METHOD__, $newHistoryPayments[$orderPayment->getField('XML_ID')]); - \Bitrix\Sale\Internals\PaymentTable::update($paymentExternalId, array('XML_ID' => '')); + \Bitrix\Sale\Internals\PaymentTable::update($paymentId, array('XML_ID' => '')); } } } @@ -1057,6 +1062,7 @@ class RetailCrmHistory if (isset($orderCrm['delivery']['service']['code'])) { $deliveryCode = \Bitrix\Sale\Delivery\Services\Manager::getCodeById($deliveryId); $serviceCode = $orderCrm['delivery']['service']['code']; + $service = \Bitrix\Sale\Delivery\Services\Manager::getService($deliveryId); if (is_object($service)) { $services = $service->getProfilesList(); @@ -1068,7 +1074,7 @@ class RetailCrmHistory if ($deliveryCode) { try { - $deliveryService = \Bitrix\Sale\Delivery\Services\Manager::getObjectByCode($deliveryCode . ':' . $orderCrm['delivery']['service']['code']); + $deliveryService = \Bitrix\Sale\Delivery\Services\Manager::getObjectByCode($deliveryCode . ':' . $serviceCode); } catch (Bitrix\Main\SystemException $systemException) { RCrmActions::eventLog('RetailCrmHistory::deliveryEdit', '\Bitrix\Sale\Delivery\Services\Manager::getObjectByCode', $systemException->getMessage()); } @@ -1206,7 +1212,8 @@ class RetailCrmHistory foreach ($paymentsCrm['payments'] as $paymentCrm) { if (isset($paymentCrm['externalId']) && !empty($paymentCrm['externalId'])) { //find the payment - $nowPayment = $paymentsList[$paymentCrm['externalId']]; + $nowPaymentId = RCrmActions::getFromPaymentExternalId($paymentCrm['externalId']); + $nowPayment = $paymentsList[$nowPaymentId]; //update data if ($nowPayment instanceof \Bitrix\Sale\Payment) { $nowPayment->setField('SUM', $paymentCrm['amount']); @@ -1218,7 +1225,7 @@ class RetailCrmHistory $nowPayment->setField('PAID', $optionsPayment[$paymentCrm['status']]); } - unset($paymentsList[$paymentCrm['externalId']]); + unset($paymentsList[$nowPaymentId]); } } elseif (array_key_exists($paymentCrm['type'], $optionsPayTypes)) { $newHistoryPayments[$paymentCrm['id']] = $paymentCrm;