public static function ApplyBasketDiscount(&$order, $func = NULL, $value, $unit, $basketposition = 0) { if (CSaleDiscountActionApply::$getPercentFromBasePrice === null) CSaleDiscountActionApply::$getPercentFromBasePrice = (string)Option::get('sale', 'get_discount_percent_from_base_price') == 'Y'; if (empty($order['BASKET_ITEMS']) || !is_array($order['BASKET_ITEMS'])) return; $manualMode = CSaleDiscountActionApply::isManualMode($order); if ($manualMode) $discountBasket = array_filter($order['BASKET_ITEMS'], 'CSaleDiscountActionApply::filterApplied'); else $discountBasket = (is_callable($func) ? array_filter($order['BASKET_ITEMS'], $func) : $order['BASKET_ITEMS']); if (empty($discountBasket)) return; $clearBasket = array_filter($discountBasket, 'CSaleDiscountActionApply::ClearBasket'); if (empty($clearBasket)) return; unset($discountBasket); $unit = (string)$unit; $value = (float)$value; if ($value != 0) { /** * развертка по штучно * и сортируем по цене, что бы продать самый дешевый товар * **/ $_explandBasket = $_sortBasket = array(); foreach ($clearBasket as $key => $arOneRow) { $_price = (float)$arOneRow['PRICE']; $_sortBasket[$_price] = $arOneRow; } ksort($_sortBasket); //unset($clearBasket); $index = 1; foreach ($_sortBasket as $key => $arOneRow) { $QUANTITY = $arOneRow['QUANTITY']; while($QUANTITY > 0){ if($index % $basketposition == 0){ /** * Скидка на ед. товара */ $dblCurValue = $value; if ($unit == CSaleDiscountActionApply::VALUE_TYPE_PERCENT) { if (self::$getPercentFromBasePrice) { if (!isset($arOneRow['DISCOUNT_PRICE'])) $arOneRow['DISCOUNT_PRICE'] = 0; $dblCurValue = (isset($arOneRow['BASE_PRICE']) ? $arOneRow['BASE_PRICE'] : $arOneRow['PRICE'] + $arOneRow['DISCOUNT_PRICE'] )*$value/100; } else { $dblCurValue = ($arOneRow['PRICE']*$value)/100; } } $dblResult = $arOneRow['PRICE'] + $dblCurValue; if ($dblResult >= 0 && (!$manualMode || $arOneRow[CSaleDiscountActionApply::BASKET_APPLIED_FIELD] == 'Y')) { $arOneRow['PRICE'] = $dblResult; if (isset($arOneRow['PRICE_DEFAULT'])) $arOneRow['PRICE_DEFAULT'] = $dblResult; if (isset($arOneRow['DISCOUNT_PRICE'])) { $arOneRow['DISCOUNT_PRICE'] = (float)$arOneRow['DISCOUNT_PRICE']; $arOneRow['DISCOUNT_PRICE'] -= $dblCurValue; } else { $arOneRow['DISCOUNT_PRICE'] = -$dblCurValue; } if ($arOneRow['DISCOUNT_PRICE'] < 0){ //$arOneRow['DISCOUNT_PRICE'] = 0; $arOneRow['DISCOUNT_PRICE'] = $arOneRow['PRICE']; } if (isset($arOneRow['VAT_RATE'])) { $dblVatRate = (float)$arOneRow['VAT_RATE']; if ($dblVatRate > 0) $arOneRow['VAT_VALUE'] = (($arOneRow['PRICE'] / ($dblVatRate + 1)) * $dblVatRate); } foreach (self::$resetFields as &$fieldName) { if (isset($arOneRow[$fieldName]) && !is_array($arOneRow[$fieldName])) $arOneRow['~'.$fieldName] = $arOneRow[$fieldName]; } unset($fieldName); //$order['BASKET_ITEMS'][$key] = $arOneRow; } } $QUANTITY--; if(! isset($_explandBasket[$arOneRow['PRODUCT_ID']])){ $_explandBasket[$arOneRow['PRODUCT_ID']] = array(); } $_explandBasket[$arOneRow['PRODUCT_ID']][] = $arOneRow; $index++; } } //unset($clearBasket); } foreach ($clearBasket as $key => $arOneRow) { if(! empty($_explandBasket[$arOneRow['PRODUCT_ID']])){ $Total = 0.0; $Total_discount = 0.0; $_QUANTITY = count($_explandBasket[$arOneRow['PRODUCT_ID']]); foreach($_explandBasket[$arOneRow['PRODUCT_ID']] as $ItemProduct){ $Total += $ItemProduct['PRICE']; $Total_discount -= $ItemProduct['DISCOUNT_PRICE']; } $dblResult = ($Total/$_QUANTITY); $dblCurValue = $Total_discount/$_QUANTITY; $arOneRow['PRICE'] = $dblResult; if (isset($arOneRow['PRICE_DEFAULT'])) $arOneRow['PRICE_DEFAULT'] = $dblResult; if (isset($arOneRow['DISCOUNT_PRICE'])) { $arOneRow['DISCOUNT_PRICE'] = (float)$arOneRow['DISCOUNT_PRICE']; $arOneRow['DISCOUNT_PRICE'] -= $dblCurValue; } else { $arOneRow['DISCOUNT_PRICE'] = -$dblCurValue; } if (isset($arOneRow['VAT_RATE'])) { $dblVatRate = (float)$arOneRow['VAT_RATE']; if ($dblVatRate > 0) $arOneRow['VAT_VALUE'] = (($arOneRow['PRICE'] / ($dblVatRate + 1)) * $dblVatRate); } } foreach (self::$resetFields as &$fieldName) { if (isset($arOneRow[$fieldName]) && !is_array($arOneRow[$fieldName])) $arOneRow['~'.$fieldName] = $arOneRow[$fieldName]; } unset($fieldName); $order['BASKET_ITEMS'][$key] = $arOneRow; } }
public static function ApplyBasketDiscount(&$arOrder, $func, $dblValue, $strUnit) { if (self::$getPercentFromBasePrice === null) { self::$getPercentFromBasePrice = (string)Option::get('sale', 'get_discount_percent_from_base_price') == 'Y'; } if (!empty($arOrder['BASKET_ITEMS']) && is_array($arOrder['BASKET_ITEMS'])) { $arDiscountBasket = (is_callable($func) ? array_filter($arOrder['BASKET_ITEMS'], $func) : $arOrder['BASKET_ITEMS']); if (!empty($arDiscountBasket)) { $arClearBasket = array_filter($arDiscountBasket, 'CSaleDiscountActionApply::ClearBasket'); if (!empty($arClearBasket)) { $strUnit = (string)$strUnit; $dblValue = (float)$dblValue; if ($strUnit == self::VALUE_TYPE_SUMM) { $dblSumm = 0.0; if (self::$getPercentFromBasePrice) { foreach ($arClearBasket as &$arOneRow) { if (!isset($arOneRow['DISCOUNT_PRICE'])) $arOneRow['DISCOUNT_PRICE'] = 0; $dblSumm += (float)(isset($arOneRow['BASE_PRICE']) ? $arOneRow['BASE_PRICE'] : $arOneRow['PRICE'] + $arOneRow['DISCOUNT_PRICE'] ) * (float)$arOneRow['QUANTITY']; } unset($arOneRow); } else { foreach ($arClearBasket as &$arOneRow) { $dblSumm += (float)$arOneRow['PRICE'] * (float)$arOneRow['QUANTITY']; } unset($arOneRow); } $dblValue = ($dblSumm > 0 ? ($dblValue*100)/$dblSumm : 0.0); $strUnit = self::VALUE_TYPE_PERCENT; } if ($dblValue != 0) { foreach ($arClearBasket as $key => $arOneRow) { $dblCurValue = $dblValue; if ($strUnit == self::VALUE_TYPE_PERCENT) { if (self::$getPercentFromBasePrice) { if (!isset($arOneRow['DISCOUNT_PRICE'])) $arOneRow['DISCOUNT_PRICE'] = 0; $dblCurValue = (isset($arOneRow['BASE_PRICE']) ? $arOneRow['BASE_PRICE'] : $arOneRow['PRICE'] + $arOneRow['DISCOUNT_PRICE'] )*$dblValue/100; } else { $dblCurValue = ($arOneRow['PRICE']*$dblValue)/100; } } $dblResult = $arOneRow['PRICE'] + $dblCurValue; if ($dblResult >= 0) { $arOneRow['PRICE'] = $dblResult; if (isset($arOneRow['PRICE_DEFAULT'])) $arOneRow['PRICE_DEFAULT'] = $dblResult; if (isset($arOneRow['DISCOUNT_PRICE'])) { $arOneRow['DISCOUNT_PRICE'] = (float)$arOneRow['DISCOUNT_PRICE']; $arOneRow['DISCOUNT_PRICE'] -= $dblCurValue; } else { $arOneRow['DISCOUNT_PRICE'] = -$dblCurValue; } if ($arOneRow['DISCOUNT_PRICE'] < 0) $arOneRow['DISCOUNT_PRICE'] = 0; if (isset($arOneRow['VAT_RATE'])) { $dblVatRate = (float)$arOneRow['VAT_RATE']; if ($dblVatRate > 0) $arOneRow['VAT_VALUE'] = (($arOneRow['PRICE'] / ($dblVatRate + 1)) * $dblVatRate); } foreach (self::$resetFields as &$fieldName) { if (isset($arOneRow[$fieldName]) && !is_array($arOneRow[$fieldName]) ) { $arOneRow["~".$fieldName] = $arOneRow[$fieldName]; } } unset($fieldName); $arOrder['BASKET_ITEMS'][$key] = $arOneRow; } } } } } } }
/** * Apply discount to basket. * * @param array &$order Order data. * @param callable $func Filter function. * @param float $value Discount value. * @param string $unit Value unit. * @return void */ public static function ApplyBasketDiscount(&$order, $func, $value, $unit) { if (empty($order['BASKET_ITEMS']) || !is_array($order['BASKET_ITEMS'])) { return; } $manualMode = self::isManualMode($order); if (self::$getPercentFromBasePrice === null) { if ($manualMode) { self::$getPercentFromBasePrice = isset($order['USE_BASE_PRICE']) && $order['USE_BASE_PRICE'] == 'Y'; } else { self::$getPercentFromBasePrice = (string) Option::get('sale', 'get_discount_percent_from_base_price') == 'Y'; } } if ($manualMode) { $discountBasket = array_filter($order['BASKET_ITEMS'], 'CSaleDiscountActionApply::filterApplied'); } else { $discountBasket = is_callable($func) ? array_filter($order['BASKET_ITEMS'], $func) : $order['BASKET_ITEMS']; } if (empty($discountBasket)) { return; } $allBasket = count($order['BASKET_ITEMS']) == count($discountBasket); $clearBasket = array_filter($discountBasket, 'CSaleDiscountActionApply::ClearBasket'); if (empty($clearBasket)) { return; } unset($discountBasket); $unit = (string) $unit; $value = (double) $value; $type = Sale\OrderDiscountManager::DESCR_TYPE_VALUE; $discountDescr = array('VALUE' => abs($value), 'VALUE_ACTION' => $value < 0 ? Sale\OrderDiscountManager::DESCR_VALUE_ACTION_DISCOUNT : Sale\OrderDiscountManager::DESCR_VALUE_ACTION_EXTRA); switch ($unit) { case self::VALUE_TYPE_SUMM: $discountDescr['VALUE_TYPE'] = $allBasket ? Sale\OrderDiscountManager::DESCR_VALUE_TYPE_SUMM_BASKET : Sale\OrderDiscountManager::DESCR_VALUE_TYPE_SUMM; if (isset($order['CURRENCY'])) { $discountDescr['VALUE_UNIT'] = $order['CURRENCY']; } break; case self::VALUE_TYPE_PERCENT: $discountDescr['VALUE_TYPE'] = Sale\OrderDiscountManager::DESCR_VALUE_TYPE_PERCENT; break; case self::VALUE_TYPE_FIX: default: $discountDescr['VALUE_TYPE'] = Sale\OrderDiscountManager::DESCR_VALUE_TYPE_CURRENCY; if (isset($order['CURRENCY'])) { $discountDescr['VALUE_UNIT'] = $order['CURRENCY']; } break; } unset($allBasket); if ($unit == self::VALUE_TYPE_SUMM) { $dblSumm = 0.0; if (self::$getPercentFromBasePrice) { foreach ($clearBasket as &$arOneRow) { if (!isset($arOneRow['DISCOUNT_PRICE'])) { $arOneRow['DISCOUNT_PRICE'] = 0; } $dblSumm += (double) (isset($arOneRow['BASE_PRICE']) ? $arOneRow['BASE_PRICE'] : $arOneRow['PRICE'] + $arOneRow['DISCOUNT_PRICE']) * (double) $arOneRow['QUANTITY']; } unset($arOneRow); } else { foreach ($clearBasket as &$arOneRow) { $dblSumm += (double) $arOneRow['PRICE'] * (double) $arOneRow['QUANTITY']; } unset($arOneRow); } $value = $dblSumm > 0 ? $value * 100 / $dblSumm : 0.0; $unit = self::VALUE_TYPE_PERCENT; } if ($value != 0) { if (!$manualMode) { $prepareResult = Sale\OrderDiscountManager::prepareDiscountDescription($type, $discountDescr); if ($prepareResult->isSuccess()) { if (!isset($order['DISCOUNT_DESCR'])) { $order['DISCOUNT_DESCR'] = array(); } if (!isset($order['DISCOUNT_DESCR']['BASKET'])) { $order['DISCOUNT_DESCR']['BASKET'] = array(); } $order['DISCOUNT_DESCR']['BASKET'][] = $prepareResult->getData(); } unset($prepareResult); } $applyResultList = array(); foreach ($clearBasket as $basketCode => $arOneRow) { $calculateValue = $value; if ($unit == self::VALUE_TYPE_PERCENT) { if (self::$getPercentFromBasePrice) { if (!isset($arOneRow['DISCOUNT_PRICE'])) { $arOneRow['DISCOUNT_PRICE'] = 0; } $calculateValue = (isset($arOneRow['BASE_PRICE']) ? $arOneRow['BASE_PRICE'] : $arOneRow['PRICE'] + $arOneRow['DISCOUNT_PRICE']) * $value / 100; } else { $calculateValue = $arOneRow['PRICE'] * $value / 100; } $calculateValue = roundEx($calculateValue, SALE_VALUE_PRECISION); } $dblResult = $arOneRow['PRICE'] + $calculateValue; if (abs($dblResult) < self::EPS) { $dblResult = 0; } if ($dblResult >= 0 && (!$manualMode || isset($arOneRow[self::BASKET_APPLIED_FIELD]))) { $arOneRow['PRICE'] = $dblResult; if (isset($arOneRow['PRICE_DEFAULT'])) { $arOneRow['PRICE_DEFAULT'] = $dblResult; } if (isset($arOneRow['DISCOUNT_PRICE'])) { $arOneRow['DISCOUNT_PRICE'] = (double) $arOneRow['DISCOUNT_PRICE']; $arOneRow['DISCOUNT_PRICE'] -= $calculateValue; } else { $arOneRow['DISCOUNT_PRICE'] = -$calculateValue; } if ($arOneRow['DISCOUNT_PRICE'] < 0) { $arOneRow['DISCOUNT_PRICE'] = 0; } if (isset($arOneRow['VAT_RATE'])) { $dblVatRate = (double) $arOneRow['VAT_RATE']; if ($dblVatRate > 0) { $arOneRow['VAT_VALUE'] = $arOneRow['PRICE'] / ($dblVatRate + 1) * $dblVatRate; } } foreach (self::$resetFields as &$fieldName) { if (isset($arOneRow[$fieldName]) && !is_array($arOneRow[$fieldName])) { $arOneRow['~' . $fieldName] = $arOneRow[$fieldName]; } } unset($fieldName); $order['BASKET_ITEMS'][$basketCode] = $arOneRow; $applyResultList[$basketCode] = $discountDescr; $applyResultList[$basketCode]['RESULT_VALUE'] = abs($calculateValue); if (isset($arOneRow['CURRENCY'])) { $applyResultList[$basketCode]['RESULT_UNIT'] = $arOneRow['CURRENCY']; } } } unset($basketCode); if (!isset($order['DISCOUNT_RESULT'])) { $order['DISCOUNT_RESULT'] = array(); } if (!isset($order['DISCOUNT_RESULT']['BASKET'])) { $order['DISCOUNT_RESULT']['BASKET'] = array(); } foreach ($applyResultList as $basketCode => $applyResult) { $prepareResult = Sale\OrderDiscountManager::prepareDiscountDescription($type, $applyResult); if ($prepareResult->isSuccess()) { if (!isset($order['DISCOUNT_RESULT']['BASKET'][$basketCode])) { $order['DISCOUNT_RESULT']['BASKET'][$basketCode] = array(); } $order['DISCOUNT_RESULT']['BASKET'][$basketCode][] = $prepareResult->getData(); } unset($prepareResult); } unset($basketCode, $applyResult, $applyResultList); } }
/** * Apply discount to basket. * * @param array &$order Order data. * @param callable $func Filter function. * @param float $value Discount value. * @param string $unit Value unit. * @return void */ public static function ApplyBasketDiscount(&$order, $func, $value, $unit) { if (self::$getPercentFromBasePrice === null) { self::$getPercentFromBasePrice = (string) Option::get('sale', 'get_discount_percent_from_base_price') == 'Y'; } if (empty($order['BASKET_ITEMS']) || !is_array($order['BASKET_ITEMS'])) { return; } $manualMode = self::isManualMode($order); if ($manualMode) { $discountBasket = array_filter($order['BASKET_ITEMS'], 'CSaleDiscountActionApply::filterApplied'); } else { $discountBasket = is_callable($func) ? array_filter($order['BASKET_ITEMS'], $func) : $order['BASKET_ITEMS']; } if (empty($discountBasket)) { return; } $clearBasket = array_filter($discountBasket, 'CSaleDiscountActionApply::ClearBasket'); if (empty($clearBasket)) { return; } unset($discountBasket); $unit = (string) $unit; $value = (double) $value; if ($unit == self::VALUE_TYPE_SUMM) { $dblSumm = 0.0; if (self::$getPercentFromBasePrice) { foreach ($clearBasket as &$arOneRow) { if (!isset($arOneRow['DISCOUNT_PRICE'])) { $arOneRow['DISCOUNT_PRICE'] = 0; } $dblSumm += (double) (isset($arOneRow['BASE_PRICE']) ? $arOneRow['BASE_PRICE'] : $arOneRow['PRICE'] + $arOneRow['DISCOUNT_PRICE']) * (double) $arOneRow['QUANTITY']; } unset($arOneRow); } else { foreach ($clearBasket as &$arOneRow) { $dblSumm += (double) $arOneRow['PRICE'] * (double) $arOneRow['QUANTITY']; } unset($arOneRow); } $value = $dblSumm > 0 ? $value * 100 / $dblSumm : 0.0; $unit = self::VALUE_TYPE_PERCENT; } if ($value != 0) { foreach ($clearBasket as $key => $arOneRow) { $dblCurValue = $value; if ($unit == self::VALUE_TYPE_PERCENT) { if (self::$getPercentFromBasePrice) { if (!isset($arOneRow['DISCOUNT_PRICE'])) { $arOneRow['DISCOUNT_PRICE'] = 0; } $dblCurValue = (isset($arOneRow['BASE_PRICE']) ? $arOneRow['BASE_PRICE'] : $arOneRow['PRICE'] + $arOneRow['DISCOUNT_PRICE']) * $value / 100; } else { $dblCurValue = $arOneRow['PRICE'] * $value / 100; } } $dblResult = $arOneRow['PRICE'] + $dblCurValue; if ($dblResult >= 0 && (!$manualMode || $arOneRow[self::BASKET_APPLIED_FIELD] == 'Y')) { $arOneRow['PRICE'] = $dblResult; if (isset($arOneRow['PRICE_DEFAULT'])) { $arOneRow['PRICE_DEFAULT'] = $dblResult; } if (isset($arOneRow['DISCOUNT_PRICE'])) { $arOneRow['DISCOUNT_PRICE'] = (double) $arOneRow['DISCOUNT_PRICE']; $arOneRow['DISCOUNT_PRICE'] -= $dblCurValue; } else { $arOneRow['DISCOUNT_PRICE'] = -$dblCurValue; } if ($arOneRow['DISCOUNT_PRICE'] < 0) { $arOneRow['DISCOUNT_PRICE'] = 0; } if (isset($arOneRow['VAT_RATE'])) { $dblVatRate = (double) $arOneRow['VAT_RATE']; if ($dblVatRate > 0) { $arOneRow['VAT_VALUE'] = $arOneRow['PRICE'] / ($dblVatRate + 1) * $dblVatRate; } } foreach (self::$resetFields as &$fieldName) { if (isset($arOneRow[$fieldName]) && !is_array($arOneRow[$fieldName])) { $arOneRow['~' . $fieldName] = $arOneRow[$fieldName]; } } unset($fieldName); $order['BASKET_ITEMS'][$key] = $arOneRow; } } } }