From 594feae948d749c46426d14d221d472d91e3f711 Mon Sep 17 00:00:00 2001 From: gorokh Date: Tue, 18 Feb 2020 10:54:42 +0300 Subject: [PATCH] fix discount --- .../general/history/RetailCrmHistory_v5.php | 90 +- .../general/order/RetailCrmOrder_v5.php | 18 +- intaro.retailcrm/options.php | 1572 +++++++++-------- 3 files changed, 869 insertions(+), 811 deletions(-) diff --git a/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php b/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php index 8eef60b7..98d97e59 100644 --- a/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php +++ b/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php @@ -23,6 +23,7 @@ class RetailCrmHistory public static $CRM_ORDER_NUMBERS = 'order_numbers'; public static $CRM_CANSEL_ORDER = 'cansel_order'; public static $CRM_CURRENCY = 'currency'; + public static $CRM_DISCOUNT_ROUND = 'discount_round'; const CANCEL_PROPERTY_CODE = 'INTAROCRM_IS_CANCELED'; @@ -652,22 +653,34 @@ class RetailCrmHistory $response = RCrmActions::apiMethod($api, 'orderGet', __METHOD__, $order['id']); if (isset($response['order'])) { $orderTemp = $response['order']; - $ditems = []; + + $duplicateItems = []; foreach ($orderTemp['items'] as $item) { - $ditems[$item['offer']['externalId']]['quantity'] += $item['quantity']; - $ditems[$item['offer']['externalId']]['discountTotal'] += $item['quantity'] * $item['discountTotal']; - $ditems[$item['offer']['externalId']]['initialPrice'] = (float)$item['initialPrice']; - $ditems[$item['offer']['externalId']]['price_sum'] = $ditems[$item['offer']['externalId']]['initialPrice'] * $ditems[$item['offer']['externalId']]['quantity'] - $ditems[$item['offer']['externalId']]['discountTotal']; - $ditems[$item['offer']['externalId']]['price_item'] = $ditems[$item['offer']['externalId']]['price_sum'] / $ditems[$item['offer']['externalId']]['quantity']; + $duplicateItems[$item['id']]['externalId'] += $item['offer']['externalId']; + $duplicateItems[$item['id']]['quantity'] += $item['quantity']; + $duplicateItems[$item['id']]['discountTotal'] += $item['quantity'] * $item['discountTotal']; + $duplicateItems[$item['id']]['initialPrice'] = (float)$item['initialPrice']; + $duplicateItems[$item['id']]['price_sum'] = ($item['quantity'] * $item['initialPrice']) - ($item['quantity'] * $item['discountTotal']); + } unset($orderTemp); } - $log->write($ditems, 'duplicateItemsOrderHistory'); + $collectItems = []; + foreach ($duplicateItems as $it) { + $collectItems[$it['externalId']]['quantity'] += $it['quantity']; + $collectItems[$it['externalId']]['price_sum'] += $it['price_sum']; + $collectItems[$it['externalId']]['discountTotal_sum'] += $it['discountTotal']; + $collectItems[$it['externalId']]['initialPrice_sum'] += $it['quantity'] * $it['initialPrice']; + } + + $log->write($duplicateItems, 'duplicateItemsOrderHistory'); + $log->write($collectItems, 'collectItemsOrderHistory'); + $optionDiscRound = COption::GetOptionString(self::$MODULE_ID, self::$CRM_DISCOUNT_ROUND, 0); foreach ($order['items'] as $product) { - if($ditems[$product['offer']['externalId']]['quantity']){ - $product['quantity'] = $ditems[$product['offer']['externalId']]['quantity']; + if ($collectItems[$product['offer']['externalId']]['quantity']) { + $product['quantity'] = $collectItems[$product['offer']['externalId']]['quantity']; } $item = self::getExistsItem($basket, 'catalog', $product['offer']['externalId']); @@ -685,7 +698,7 @@ class RetailCrmHistory $item->setFields(array( 'CURRENCY' => $newOrder->getCurrency(), 'LID' => $site, - 'BASE_PRICE' => $product['initialPrice'], + 'BASE_PRICE' => $collectItems[$product['offer']['externalId']]['initialPrice_sum'] / $collectItems[$product['offer']['externalId']]['quantity'], 'NAME' => $product['offer']['name'] ? RCrmActions::fromJSON($product['offer']['name']) : $elem['NAME'], 'DETAIL_PAGE_URL' => $elem['URL'], 'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider', @@ -703,7 +716,7 @@ class RetailCrmHistory } if ($product['delete']) { - if ($ditems[$product['offer']['externalId']]['quantity'] <= 0) { + if ($collectItems[$product['offer']['externalId']]['quantity'] <= 0) { $item->delete(); continue; @@ -712,36 +725,22 @@ class RetailCrmHistory if ($product['quantity']) { $item->setFieldNoDemand('QUANTITY', $product['quantity']); + $item->setField('PRICE', $collectItems[$product['offer']['externalId']]['initialPrice_sum'] / $collectItems[$product['offer']['externalId']]['quantity']); } - if (array_key_exists('discountTotal', $product)) { - $itemCost = $item->getField('PRICE'); + if (array_key_exists('discountTotal_sum', $collectItems[$product['offer']['externalId']])) { + $item->setField('CUSTOM_PRICE', 'Y'); + $item->setField('DISCOUNT_NAME', ''); + $item->setField('DISCOUNT_VALUE', ''); + $item->setField('DISCOUNT_PRICE', $product['discountTotal_sum']); - if (empty($itemCost)) { - $itemCost = $item->getField('BASE_PRICE'); + $price = $collectItems[$product['offer']['externalId']]['price_sum'] / $collectItems[$product['offer']['externalId']]['quantity']; + + if ('Y' == $optionDiscRound) { + $price = self::truncate($price, 2); } - $discount = (double) $item->getField('DISCOUNT_PRICE'); - - if (isset($itemCost) && $itemCost >= 0) { - if ($discount < 0) { - $resultDiscount = $product['discountTotal'] + $discount; - } else { - $resultDiscount = $product['discountTotal']; - } - - $item->setField('CUSTOM_PRICE', 'Y'); - $item->setField('DISCOUNT_NAME', ''); - $item->setField('DISCOUNT_VALUE', ''); - $item->setField('DISCOUNT_PRICE', $resultDiscount); - $item->setField('PRICE', $itemCost - $resultDiscount); - - //set price dublicate item - if ($ditems[$product['offer']['externalId']]['price_item']) { - $item->setField('PRICE', $ditems[$product['offer']['externalId']]['price_item']); - $item->setField('DISCOUNT_PRICE', ''); - } - } + $item->setField('PRICE', $price); } } } @@ -1378,6 +1377,25 @@ class RetailCrmHistory return false; } } + + /** + * Truncate a float number + * + * @param float $val + * @param int f Number of precision + * + * @return float + */ + public static function truncate($val, $precision = "0") + { + if(($p = strpos($val, '.')) !== false + || ($p = strpos($val, ',')) !== false + ) { + $val = floatval(substr($val, 0, $p + 1 + $precision)); + } + + return $val; + } } class RetailUser extends CUser diff --git a/intaro.retailcrm/classes/general/order/RetailCrmOrder_v5.php b/intaro.retailcrm/classes/general/order/RetailCrmOrder_v5.php index da3a3a95..a883c7e5 100644 --- a/intaro.retailcrm/classes/general/order/RetailCrmOrder_v5.php +++ b/intaro.retailcrm/classes/general/order/RetailCrmOrder_v5.php @@ -201,23 +201,23 @@ class RetailCrmOrder $discount = (double) $product['DISCOUNT_PRICE']; - if ($discount < 0) { + //discount + $dpItem = $product['BASE_PRICE'] - $product['PRICE']; + if ( $dpItem > 0 && $discount <= 0) { + $discount = $dpItem; + } + + if ($discount <= 0) { $item['discountManualAmount'] = 0; $initialPrice = (double) $product['PRICE']; } else { - $item['discountManualAmount'] = (double) $product['DISCOUNT_PRICE']; - $initialPrice = (double) $product['PRICE'] + (double) $product['DISCOUNT_PRICE']; + $item['discountManualAmount'] = $discount; + $initialPrice = (double) $product['PRICE'] + $discount; } $item['discountManualPercent'] = 0; $item['initialPrice'] = $initialPrice; - $dpItem = $product['BASE_PRICE'] - $product['PRICE']; - if ( $dpItem > 0) { - $item['discountManualAmount'] = $dpItem; - $item['initialPrice'] = (double)$product['BASE_PRICE']; - } - $order['items'][] = $item; if ($send && $dimensionsSetting == 'Y') { diff --git a/intaro.retailcrm/options.php b/intaro.retailcrm/options.php index 11ff85c4..fb995d66 100644 --- a/intaro.retailcrm/options.php +++ b/intaro.retailcrm/options.php @@ -45,6 +45,8 @@ $CRM_ADDRESS_OPTIONS = 'address_options'; $CRM_DIMENSIONS = 'order_dimensions'; $PROTOCOL = 'protocol'; +$CRM_DISCOUNT_ROUND = 'discount_round'; + if(!CModule::IncludeModule('intaro.retailcrm') || !CModule::IncludeModule('sale') || !CModule::IncludeModule('iblock') || !CModule::IncludeModule('catalog')) return; @@ -440,6 +442,15 @@ if (isset($_POST['Update']) && ($_POST['Update'] == 'Y')) { UnRegisterModuleDependences("main", "OnBeforeProlog", $mid, "RetailCrmUa", "add"); } + //discount_round + if (htmlspecialchars(trim($_POST['discount_round'])) == 'Y') { + $discount_round = 'Y'; + RegisterModuleDependences("main", "OnBeforeProlog", $mid, "RetailCrmDc", "add"); + } else { + $discount_round = 'N'; + UnRegisterModuleDependences("main", "OnBeforeProlog", $mid, "RetailCrmDc", "add"); + } + //version $version = COption::GetOptionString($mid, $CRM_API_VERSION); @@ -514,6 +525,8 @@ if (isset($_POST['Update']) && ($_POST['Update'] == 'Y')) { COption::SetOptionString($mid, $CRM_UA_KEYS, serialize(RCrmActions::clearArr($uaKeys))); COption::SetOptionString($mid, $CRM_DIMENSIONS, $orderDimensions); + COption::SetOptionString($mid, $CRM_DISCOUNT_ROUND, $discount_round); + $request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest(); if ($request->isHttps() === true) { @@ -620,6 +633,8 @@ if (isset($_POST['Update']) && ($_POST['Update'] == 'Y')) { $optionUa = COption::GetOptionString($mid, $CRM_UA, 0); $optionUaKeys = unserialize(COption::GetOptionString($mid, $CRM_UA_KEYS)); + $optionDiscRound = COption::GetOptionString($mid, $CRM_DISCOUNT_ROUND, 0); + $version = COption::GetOptionString($mid, $CRM_API_VERSION, 0); //currency @@ -658,807 +673,832 @@ if (isset($_POST['Update']) && ($_POST['Update'] == 'Y')) { ); $tabControl = new CAdminTabControl("tabControl", $aTabs); $tabControl->Begin(); -?> -AddHeadString(''); ?> -'); ?> + - -
-BeginNextTab(); -?> - - - - - - - - - - - - - 1):?> - - - - - - - - - - - - - - - - - -BeginNextTab(); ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - value="Y" type="checkbox" /> -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -BeginNextTab(); ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4) echo 'class="address-detail-' . $bitrixOrderType['ID'] . '"'; if(($countProps > 4) && ($addressOptions[$bitrixOrderType['ID']] == 0)) echo 'style="display:none;"';?>> - - - - - - - - - 0):?> - - - - - - - - - - - - - - - - - - - > - - - - - - - - > - - - - - - - - - - -BeginNextTab(); ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0) :?> - - - - - - - - > - - - - - - > - - - - - - - > - - - - - - - - > - - - - - - > - - - - - - - - > - - - - - - - 0) :?> - - - - - - - - > - - - - - - - - > - - - - - - - > - - - - - - - - > - - - - - - > - - - - - - - - > - - - - - - - - - - - - - - - > - - - - - - > - () - - - - - - - - - - - - - - > - - () - - - > - - - - - - > - - - - - - - -Buttons(); ?> - - -End(); ?> -
- - - - - - - -
-
- -
- - + + + + BeginNextTab(); + ?> + + + + + + + + + + + + + 1):?> + + + + + + + + + + + + BeginNextTab(); ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BeginNextTab(); ?> + + + + + + + + + + + + + + + + + + + 4) echo 'class="address-detail-' . $bitrixOrderType['ID'] . '"'; if(($countProps > 4) && ($addressOptions[$bitrixOrderType['ID']] == 0)) echo 'style="display:none;"';?>> + + + + + 0):?> + + + + + + + + + + + > + + + + > + + + + + + + BeginNextTab(); ?> + + + + + + + + + + + + + + + + + + + + + + + + + + 0) :?> + + + + > + + + + > + + + + + > + + + + > + + + + > + + + + > + + + + + 0) :?> + + + + > + + + + > + + + + + > + + + + > + + + + > + + + + > + + + + + + + + + > + + + + > + + + + + + + + + + > + + + + + + + + > + + + > + + + + > + + + + + + Buttons(); ?> + + + End(); ?> + + + + + + + + +
+ + +
+
+ + + +
+ +
+ + + +
+ +
+ + + +
+ + + + + +
+
+ + + + + + + +
+ + + value="Y" type="checkbox" /> +
+
+ + + +
+ + + +
+ + + +
+ + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + +
+ +
+ +
+ + + +
+ +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
() + +
+ + + +
+ +
+ + + +
+ () +
+ +
+ +
+ - -
-
-
+ + +
+
-
-
-
-
0%
+
+
+
+
0%
+
+ 0%
- 0% +
+
+
+
+
+
-
-
-
- -
-
-
- +