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..ee303722 100644 --- a/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php +++ b/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php @@ -142,7 +142,7 @@ class RetailCrmHistory } if(RCrmActions::apiMethod($api, 'customersFixExternalIds', __METHOD__, array(array('id' => $customer['id'], 'externalId' => $registeredUserID))) == false) { - continue; + continue; } } @@ -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' . $newUser->LAST_ERROR); continue; } @@ -646,11 +646,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 +700,11 @@ class RetailCrmHistory } if ($product['delete']) { - $item->delete(); + if ($ditems[$product['offer']['xmlId']]['quantity'] <= 0) { + $item->delete(); - continue; + continue; + } } if ($product['quantity']) { @@ -709,6 +732,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,12 +801,16 @@ 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')]); @@ -815,6 +848,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(); @@ -1009,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(); @@ -1017,6 +1071,7 @@ class RetailCrmHistory $serviceCode = str_replace(array('-'), "_", $serviceCode); } } + if ($deliveryCode) { try { $deliveryService = \Bitrix\Sale\Delivery\Services\Manager::getObjectByCode($deliveryCode . ':' . $serviceCode); @@ -1036,13 +1091,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()) { 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" );