Exemplo n.º 1
0
 function Compability($arOrder, $arConfig)
 {
     $arLocationFrom = CSaleHelper::getLocationByIdHitCached($arOrder["LOCATION_FROM"]);
     $arLocationTo = CDeliveryEMS::__GetLocation($arOrder["LOCATION_TO"]);
     if ($arConfig['category']['VALUE'] == 'doc' && $arOrder['WEIGHT'] > 2000) {
         return array();
     } elseif (CDeliveryEMS::__IsRussian($arLocationFrom) && $arOrder['WEIGHT'] <= 31500 && $arLocationTo['EMS_ID']) {
         return array('delivery');
     } else {
         return array();
     }
 }
Exemplo n.º 2
0
	public static function Calculate($profile, $arConfig, $arOrder, $STEP, $TEMP = false)
	{
		//echo '<pre style="text-align: left;">'; print_r($arOrder); print_r($arConfig); echo '</pre>';

		if ($STEP >= 4)
			return array(
				"RESULT" => "ERROR",
				"TEXT" => GetMessage('SALE_DH_EMS_ERROR_CONNECT'),
			);

		if ($arOrder["WEIGHT"] <= 0) $arOrder["WEIGHT"] = 1;

		$arLocationTo = CDeliveryEMS::__GetLocation($arOrder["LOCATION_TO"]);

		if ($arLocationTo['IS_RUSSIAN'] == 'Y')
			$arLocationFrom = CDeliveryEMS::__GetLocation($arOrder["LOCATION_FROM"]);

		if (isset($arLocationTo['EMS_CITIES_NOT_LOADED']))
		{
			// get cities and proceed to next step

			$data = CDeliveryEMS::__EMSQuery('ems.get.locations', array('type' => 'cities', 'plain' => 'true'));

			if (!is_array($data) || $data['rsp']['stat'] != 'ok' || !is_array($data['rsp']['locations']))
			{
				return array(
					"RESULT" => "ERROR",
					"TEXT" => GetMessage('SALE_DH_EMS_ERROR_CONNECT'),
				);
			}

			$arCitiesList = array();
			foreach ($data['rsp']['locations'] as $arLocation)
			{
				$arCitiesList[$arLocation['name']] = $arLocation['value'];
			}

			CheckDirPath(dirname(__FILE__)."/ems/");
			if ($fp = fopen(dirname(__FILE__)."/ems/city.php", "w"))
			{
				fwrite($fp, '<'."?\r\n");
				fwrite($fp, '$'."arEMSCityList = array();\r\n");
				foreach ($arCitiesList as $key => $value)
				{
					fwrite($fp, '$'."arEMSCityList['".addslashes($key)."'] = '".htmlspecialcharsbx(trim($value))."';\r\n");
				}
				fwrite($fp, '?'.'>');
				fclose($fp);
			}

			return array(
				"RESULT" => "NEXT_STEP",
				"TEXT" => GetMessage('SALE_DH_EMS_CORRECT_CITIES'),
			);
		}

		if (isset($arLocationTo['EMS_COUNTRIES_NOT_LOADED']))
		{
			// get cities and proceed to next step

			$data = CDeliveryEMS::__EMSQuery('ems.get.locations', array('type' => 'countries', 'plain' => 'true'));

			if (!is_array($data) || $data['rsp']['stat'] != 'ok' || !is_array($data['rsp']['locations']))
			{
				return array(
					"RESULT" => "ERROR",
					"TEXT" => GetMessage('SALE_DH_EMS_ERROR_CONNECT'),
				);
			}

			$arCountriesList = array();
			foreach ($data['rsp']['locations'] as $arLocation)
			{
				$arCountriesList[$arLocation['name']] = $arLocation['value'];
			}

			CheckDirPath(dirname(__FILE__)."/ems/");
			if ($fp = fopen(dirname(__FILE__)."/ems/country.php", "w"))
			{
				fwrite($fp, '<'."?\r\n");
				fwrite($fp, '$'."arEMSCountryList = array();\r\n");
				foreach ($arCountriesList as $key => $value)
				{
					fwrite($fp, '$'."arEMSCountryList['".addslashes($key)."'] = '".htmlspecialcharsbx(trim($value))."';\r\n");
				}
				fwrite($fp, '?'.'>');
				fclose($fp);
			}

			return array(
				"RESULT" => "NEXT_STEP",
				"TEXT" => GetMessage('SALE_DH_EMS_CORRECT_COUNTRIES'),
			);
		}

		// echo '<pre style="text-align: left">';
		// print_r($arLocationFrom);
		// print_r($arLocationTo);
		// echo '</pre>';

		if (!$arLocationTo['EMS_ID'])
		{
			if ($arLocationTo['IS_RUSSIAN'] == 'Y')
				$text = str_replace('#CITY#', $arLocationTo['CITY_NAME_ORIG'], GetMessage('SALE_DH_EMS_ERROR_NO_CITY_TO'));
			else
				$text = str_replace('#COUNTRY#', $arLocationTo['COUNTRY_NAME_ORIG'], GetMessage('SALE_DH_EMS_ERROR_NO_COUNTRY_TO'));

			return array(
				"RESULT" => "ERROR",
				"TEXT" => $text,
			);
		}

		if ($arLocationTo['IS_RUSSIAN'] == 'Y' && !$arLocationFrom['EMS_ID'])
		{
			$text = str_replace('#CITY#', $arLocationFrom['CITY_NAME_ORIG'], GetMessage('SALE_DH_EMS_ERROR_NO_CITY_FROM'));

			return array(
				"RESULT" => "ERROR",
				"TEXT" => $text,
			);
		}


		$cache_id = "sale|8.0.3|ems|".$profile."|".$arConfig["category"]["VALUE"]."|".$arOrder["LOCATION_FROM"]."|".$arOrder["LOCATION_TO"];

		// 0-0.1,0.1-0.5,0.5-1,1-1.5,1.5-2,2-3....30-31,31-31.5

		if ($arOrder['WEIGHT'] < 100)
			$cache_id .= '|weight_0';
		elseif ($arOrder['WEIGHT'] < 2000)
			$cache_id .= '|weight_half_'.(ceil($arOrder['WEIGHT']/1000) * 2);
		elseif ($arOrder['WEIGHT'] < 31000)
			$cache_id .= '|weight_'.(ceil($arOrder['WEIGHT']/1000));
		else
			$cache_id .= '|weight_max';

		$obCache = new CPHPCache();
		/*if ($obCache->InitCache(DELIVERY_EMS_CACHE_LIFETIME, $cache_id, "/"))
		{
			$vars = $obCache->GetVars();
			$result = $vars["RESULT"];
			$transit = $vars["TRANSIT"];

			if ($arLocationTo['IS_RUSSIAN'] == 'Y')
				$result += $arOrder["PRICE"] * DELIVERY_EMS_PRICE_TARIFF;

			return array(
				"RESULT" => "OK",
				"VALUE" => $result,
				'TRANSIT' => $transit,
			);
		}*/

		$arParams = array();

		if ($arLocationTo['IS_RUSSIAN'] != 'Y')
		{
			$arParams['type'] = $arConfig["category"]["VALUE"];
		}
		else
		{
			$arParams['from'] = $arLocationFrom['EMS_ID'];
		}

		$arParams['to'] = $arLocationTo['EMS_ID'];
		$arParams['weight'] = $arOrder['WEIGHT'] / 1000;

		$arParams['plain'] = 'true';

		$data = CDeliveryEMS::__EMSQuery('ems.calculate', $arParams);

		//echo '<pre style="text-align: left;">answer: '; print_r($data); echo '</pre>';

		if (is_array($data) && $data['rsp']['stat'] == 'ok')
		{
			$obCache->StartDataCache();

			$result = doubleval($data['rsp']['price']);
			$transit = '';
			if ($data['rsp']['term'])
				$transit = $data['rsp']['term']['min'].'-'.$data['rsp']['term']['max'];

			$obCache->EndDataCache(
				array(
					"RESULT" => $result,
					"TRANSIT" => $transit,
				)
			);

			if ($arLocationTo['IS_RUSSIAN'] == 'Y')
				$result += $arOrder["PRICE"] * DELIVERY_EMS_PRICE_TARIFF;

			return array(
				"RESULT" => "OK",
				"VALUE" => $data['rsp']['price'],
				'TRANSIT' => $data['rsp']['term']['min'].'-'.$data['rsp']['term']['max']
			);
		}

		return array(
			"RESULT" => "ERROR",
			"TEXT" => GetMessage('SALE_DH_EMS_ERROR_RESPONSE').(is_array($data) ? ' ('.$data['rsp']['err']['msg'].')' : ''),
		);
	}