• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/delivery/services/base.php
  • Класс: BitrixSaleDeliveryServicesBase
  • Вызов: Base::calculate
public function calculate(BitrixSaleShipment $shipment = null, $extraServices = array()) // null for compability with old configurable services api
{
	$result = new DeliveryCalculationResult();

	if ($shipment && !$shipment->getCollection())
	{
		$result->addError(new Error('BitrixSaleDeliveryServicesBase::calculate() can't calculate empty shipment!'));
		return $result;
	}

	if ($shipment)
	{
		$result = $this->calculateConcrete($shipment);

		if (empty($extraServices))
		{
			$extraServices = $shipment->getExtraServices();
		}

		$this->extraServices->setValues($extraServices);
		$this->extraServices->setOperationCurrency($shipment->getCurrency());
		$extraServicePrice = $this->extraServices->getTotalCostShipment($shipment);

		if ((float)$extraServicePrice > 0)
		{
			$result->setExtraServicesPrice($extraServicePrice);
		}
	}

	$eventParams = [
		'RESULT' => $result,
		'SHIPMENT' => $shipment,
		'DELIVERY_ID' => $this->id,
	];

	$event = new Event('sale', self::EVENT_ON_CALCULATE, $eventParams);
	$event->send();
	$resultList = $event->getResults();

	if (is_array($resultList) && !empty($resultList))
	{
		foreach ($resultList as &$eventResult)
		{
			if ($eventResult->getType() != EventResult::SUCCESS)
			{
				continue;
			}

			$params = $eventResult->getParameters();

			if (isset($params['RESULT']))
			{
				$result = $params['RESULT'];
			}
		}
	}

	return $result;
}