Пример #1
0
	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;
		}
	}
Пример #2
0
	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;
							}
						}
					}
				}
			}
		}
	}
Пример #3
0
 /**
  * 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);
     }
 }
Пример #4
0
 /**
  * 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;
             }
         }
     }
 }