public static function Calculate($profile, $arConfig, $arOrder, $STEP, $TEMP = false) { $arOrder["WEIGHT"] = CSaleMeasure::Convert($arOrder["WEIGHT"], "G", "KG"); $arLocationTo = CSaleLocation::GetByID($arOrder["LOCATION_TO"]); if (LANGUAGE_ID !== 'en') { $arCountry = CSaleLocation::GetCountryLangByID($arLocationTo['COUNTRY_ID'], 'en'); if (false !== $arCountry) { $arLocationTo['COUNTRY_NAME_LANG'] = $arCountry['NAME']; } } CDeliveryUPS::__GetLocation($arLocationTo, $arConfig); $arPriceTable = CDeliveryUPS::__GetExport($arConfig["export_csv"]["VALUE"]); $arZones = CDeliveryUPS::__GetZones($zones_file); reset($arPriceTable); do { list($key, $arZoneTable) = each($arPriceTable[$profile]); } while ($key && doubleval($arOrder["WEIGHT"]) > doubleval($key)); $zone = $arZones[$arLocationTo["COUNTRY_SID"]][$profile == "express_saver" ? 1 : 2]; $sum = $arPriceTable[$profile][$key][$zone]; return array("RESULT" => "OK", "VALUE" => $sum); }
function Calculate($profile, $arConfig, $arOrder, $STEP, $TEMP = false) { $arLocationFrom = CDeliveryDHLUSA::__GetLocation($arOrder['LOCATION_FROM']); $arLocationTo = CDeliveryDHLUSA::__GetLocation($arOrder['LOCATION_TO']); $location_from_zip = COption::GetOptionString('sale', 'location_zip'); if ($location_from_zip) { $arLocationFrom['ZIP_LIST'] = array($location_from_zip); } $arOrder["WEIGHT"] = CSaleMeasure::Convert($arOrder["WEIGHT"], "G", "LBS"); if ($arOrder["WEIGHT"] <= 0) { $arOrder["WEIGHT"] = 0.1; } // weight must not be null - let it be 1 gramm $cache_id = "dhl_usa" . "|" . $arConfig["category"]['VALUE'] . "|" . $arOrder["LOCATION_FROM"] . "|" . $location_from_zip . "|" . $arOrder["LOCATION_TO"] . "|" . intval($arOrder['WEIGHT']); $obCache = new CPHPCache(); if ($obCache->InitCache(DELIVERY_DHL_USA_CACHE_LIFETIME, $cache_id, "/")) { // cache found $vars = $obCache->GetVars(); $result = $vars["RESULT"]; $transit_time = $vars["TRANSIT"]; return array("RESULT" => "OK", "VALUE" => $result, "TRANSIT" => $transit_time); } // format HTTP query request data $arQuery = array('userStatus' => 'NON_AUTHENTICATED_USER', 'customerType' => 'P', 'ratesType' => 'book', 'rateSuppressed' => 'N', 'CLIENT' => 'CLASS_NAME_P', 'CALLING_JSP' => '/jsp/ratesQuery.jsp', 'INTGRTDSURVEY' => 'false', 'totalPieces' => '1', 'packagesPerMonth' => ''); $arQuery['originCountryCode'] = 'US'; $arQuery['originZip'] = $arLocationFrom['ZIP_LIST'][0]; $arQuery['destinationCountry'] = $arLocationTo['COUNTRY_DHLUSA']; $arQuery['destinationCountryName'] = $arLocationTo['COUNTRY_NAME']; $arQuery['destinationCity'] = $arLocationTo['CITY_NAME']; $arQuery['destinationZip'] = $arLocationTo['ZIP_LIST'][0]; $timestamp = strtotime(date('Y-m-d')); $timestamp = strtotime('+1 day', $timestamp); // holidays list - http://www.dhl-usa.com/USSvcs/USSvcsHDay.asp?nav=FindServInfo/USHol $y = date('Y'); $arHolidaysList = array(strtotime($y . '-01-01'), strtotime($y . '-05-28'), strtotime($y . '-06-04'), strtotime($y . '-09-03'), strtotime($y . '-11-22'), strtotime($y . '-12-25')); while (date('N', $timestamp) > 5 || in_array($timestamp, $arHolidaysList)) { $timestamp += 86400; } $arQuery['shipDate'] = date('d F, Y', $timestamp); $arQuery['pkgType'] = $arConfig['package_type']['VALUE']; $arQuery['packagingType'] = $arConfig['package_type']['VALUE']; $arQuery['packageWeight'] = $arOrder['WEIGHT']; $arQuery['dmnLength'] = ''; $arQuery['dmnWidth'] = ''; $arQuery['dmnHeight'] = ''; $arQuery['dutiableFlag'] = 'N'; // !!!!!! foreach ($arQuery as $key => $value) { $arQuery[$key] = urlencode($key) . '=' . urlencode($value); } CDeliveryDHLUSA::__Write2Log(print_r($arQuery, true)); CDeliveryDHLUSA::__Write2Log(implode('&', $arQuery)); // get data from server $data = QueryGetData(DELIVERY_DHL_USA_SERVER, DELIVERY_DHL_USA_SERVER_PORT, DELIVERY_DHL_USA_SERVER_PAGE, implode("&", $arQuery), $error_number = 0, $error_text = "", DELIVERY_DHL_USA_SERVER_METHOD); CDeliveryDHLUSA::__Write2Log($data); if (strlen($data) <= 0) { return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_DHL_USA_ERROR_CONNECT')); } if (strstr($data, DELIVERY_DHL_USA_VALUE_CHECK_STRING)) { // first check string found if (preg_match(DELIVERY_DHL_USA_VALUE_CHECK_REGEXP, $data, $matches)) { $obCache->StartDataCache(); // final price found $result = $matches[1]; $result = preg_replace('/\\s/', '', $result); $result = str_replace(',', '.', $result); $result = doubleval($result); $matches = array(); $transit_time = 0; if (preg_match(DELIVERY_DHL_USA_TIME_CHECK_REGEXP, $data, $matches)) { $transit_time = intval($matches[1]); } $obCache->EndDataCache(array("RESULT" => $result, "TRANSIT" => $transit_time)); return array("RESULT" => "OK", "VALUE" => $result, "TRANSIT" => $transit_time); } else { return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_DHL_USA_ERROR_RESPONSE')); } } return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_DHL_USA_ERROR_RESPONSE')); }
function Calculate($profile, $arConfig, $arOrder, $STEP, $TEMP = false) { if ($STEP >= 3) { return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_RUSSIANPOST_ERROR_CONNECT')); } if ($arOrder["WEIGHT"] <= 0) { $arOrder["WEIGHT"] = 1; } $arLocationFrom = CDeliveryRUSSIANPOST::__GetLocation($arOrder["LOCATION_FROM"]); if ($arOrder['LOCATION_ZIP']) { $arLocationTo = CDeliveryRUSSIANPOST::__GetLocation($arOrder["LOCATION_TO"]); $arLocationTo['ZIP'] = array(0 => $arOrder['LOCATION_ZIP']); } else { $arLocationTo = CDeliveryRUSSIANPOST::__GetLocation($arOrder["LOCATION_TO"], true); } $zip = COption::GetOptionString('sale', 'location_zip'); if (strlen($zip) > 0) { $arLocationFrom["ZIP"] = array(0 => $zip); } if ($arLocationTo["IS_RUSSIAN"] == 'Y' && count($arLocationTo["ZIP"]) <= 0) { return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_RUSSIANPOST_ERROR_NOZIP')); } $cache_id = "sale|8.0.3|russianpost|" . $profile . "|" . $arConfig["category"]["VALUE"] . "|" . $arOrder["LOCATION_FROM"] . "|" . ($arLocationTo["IS_RUSSIAN"] == 'Y' ? $arLocationTo["ZIP"][0] : $arOrder["LOCATION_TO"]); if (in_array($arConfig["category"]["VALUE"], array(23, 12, 13, 26, 16))) { $cache_id .= "|" . ceil(CSaleMeasure::Convert($arOrder["WEIGHT"], "G", "KG") / 0.5); } else { $cache_id .= "|" . ceil(CSaleMeasure::Convert($arOrder["WEIGHT"], "G", "KG") / 500); } $obCache = new CPHPCache(); if ($obCache->InitCache(DELIVERY_RUSSIANPOST_CACHE_LIFETIME, $cache_id, "/")) { $vars = $obCache->GetVars(); $result = $vars["RESULT"]; // only these delivery types have insurance tax of 3% or 4% from price if (in_array($arConfig["category"]["VALUE"], array(26, 16))) { $result += $arOrder["PRICE"] * DELIVERY_RUSSIANPOST_PRICE_TARIFF; } elseif ($arConfig["category"]["VALUE"] == 36) { $result += $arOrder["PRICE"] * DELIVERY_RUSSIANPOST_PRICE_TARIFF_1; } return array("RESULT" => "OK", "VALUE" => $result); } $arQuery = array(); $arProfile = array("ground" => 1, "avia" => 2); if ($arLocationTo["IS_RUSSIAN"] == "Y") { $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_CATEGORY . "=" . urlencode($arConfig["category"]["VALUE"]); $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_CATEGORY_NAME . "=" . urlencode(GetMessage("SALE_DH_RUSSIANPOST_CONFIG_CATEGORY_" . $arConfig["category"]["VALUE"])); $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PROFILE . "=" . urlencode($arProfile[$profile]); $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PROFILE_NAME . '=' . urlencode(GetMessage("SALE_DH_RUSSIANPOST_" . ToUpper($profile))); $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_COUNTRY . "=643"; $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_COUNTRY_NAME . '=' . urlencode($GLOBALS['APPLICATION']->ConvertCharset('Российская Федерация', LANG_CHARSET, 'utf-8')); $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_WEIGHT . "=" . urlencode($arOrder["WEIGHT"]); // price does not affect on half of delivery types. others have 3% or 4% insurance tax which is ignored here for caching and used later. $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PRICE . "=0"; // if (!in_array($arConfig["category"]["VALUE"], array(26, 36, 16))) // { // $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PRICE."=".urlencode(round($arOrder["PRICE"])); // } // else // { // $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PRICE."=0"; // } $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_ZIP . "=" . urlencode($arLocationTo["ZIP"][0]); } else { $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_CATEGORY . "=" . urlencode($arConfig["category"]["VALUE"]); $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_CATEGORY_NAME . "=" . urlencode(GetMessage("SALE_DH_RUSSIANPOST_CONFIG_CATEGORY_" . $arConfig["category"]["VALUE"])); $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PROFILE . "=" . urlencode($arProfile[$profile]); $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PROFILE_NAME . '=' . urlencode(GetMessage("SALE_DH_RUSSIANPOST_" . ToUpper($profile))); $arCountry = CDeliveryRUSSIANPOST::__GetCountry($arLocationTo); $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_COUNTRY . "=" . urlencode($arCountry["ID"]); $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_COUNTRY_NAME . "=" . urlencode($GLOBALS['APPLICATION']->ConvertCharset($arCountry["NAME"], LANG_CHARSET, 'utf-8')); $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_WEIGHT . "=" . urlencode($arOrder["WEIGHT"]); $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_PRICE . "=0"; $arQuery[] = DELIVERY_RUSSIANPOST_SERVER_POST_ZIP . "=0"; } $data = QueryGetData(DELIVERY_RUSSIANPOST_SERVER, DELIVERY_RUSSIANPOST_SERVER_PORT, DELIVERY_RUSSIANPOST_SERVER_PAGE, implode("&", $arQuery), $error_number = 0, $error_text = "", DELIVERY_RUSSIANPOST_SERVER_METHOD); $data = $GLOBALS['APPLICATION']->ConvertCharset($data, 'utf-8', LANG_CHARSET); CDeliveryRUSSIANPOST::__Write2Log($error_number . ": " . $error_text); CDeliveryRUSSIANPOST::__Write2Log($data); if (strlen($data) <= 0) { return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_RUSSIANPOST_ERROR_CONNECT')); } if (strstr($data, DELIVERY_RUSSIANPOST_VALUE_CAPTHA_STRING)) { $cResult = preg_match(DELIVERY_RUSSIANPOST_CAPTHA_REGEXP, $data, $matches); $arCode = array(); $arCode["key"] = IntVal($matches[1]); $data = QueryGetData(DELIVERY_RUSSIANPOST_SERVER, DELIVERY_RUSSIANPOST_SERVER_PORT, DELIVERY_RUSSIANPOST_SERVER_PAGE, implode("&", $arCode), $error_number = 0, $error_text = "", DELIVERY_RUSSIANPOST_SERVER_METHOD_CAPTHA); } if (strstr($data, DELIVERY_RUSSIANPOST_VALUE_CHECK_STRING)) { $bResult = preg_match(DELIVERY_RUSSIANPOST_VALUE_CHECK_REGEXP_RUS, $data, $matches); // both regexps must be checked! it's not only for russian and non-russian if (!$bResult) { $bResult = preg_match(DELIVERY_RUSSIANPOST_VALUE_CHECK_REGEXP, $data, $matches); } if ($bResult) { $obCache->StartDataCache(); $result = $matches[1]; $result = str_replace(array(" ", ","), array("", "."), $result); $result = doubleval($result); $obCache->EndDataCache(array("RESULT" => $result)); // only these delivery types have insurance tax of 3% or 4% from price if (in_array($arConfig["category"]["VALUE"], array(36, 16))) { $result += $arOrder["PRICE"] * DELIVERY_RUSSIANPOST_PRICE_TARIFF; } elseif ($arConfig["category"]["VALUE"] == 26) { $result += $arOrder["PRICE"] * DELIVERY_RUSSIANPOST_PRICE_TARIFF_1; } return array("RESULT" => "OK", "VALUE" => $result); } else { return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_RUSSIANPOST_ERROR_RESPONSE')); } } else { return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_RUSSIANPOST_ERROR_RESPONSE')); } }
function Calculate($profile, $arConfig, $arOrder, $STEP) { if ($STEP >= 3) { return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_CPCR_ERROR_CONNECT')); } $arOrder["WEIGHT"] = CSaleMeasure::Convert($arOrder["WEIGHT"], "G", "KG"); if ($arOrder["WEIGHT"] <= 0) { $arOrder["WEIGHT"] = 1; } // weight must not be null - let it be 1 kg $arLocationFrom = CDeliveryCPCR::__GetLocation($arOrder["LOCATION_FROM"]); $arLocationTo = CDeliveryCPCR::__GetLocation($arOrder["LOCATION_TO"]); // caching is dependent from category, locations "from" & "to" and from weight interval $cache_id = "sale3|9.5.0|cpcr|" . $arConfig["category"]['VALUE'] . "|" . $arLocationFrom["ORIGINAL"]["COUNTRY_ID"] . "|" . $arLocationFrom["ORIGINAL"]["CITY_ID"] . "|" . $arLocationTo["ORIGINAL"]["COUNTRY_ID"] . "|" . $arLocationTo["ORIGINAL"]["CITY_ID"]; if ($arOrder["WEIGHT"] <= 0.5) { $cache_id .= "|0"; } elseif ($arOrder["WEIGHT"] <= 1) { $cache_id .= "|1"; } else { $cache_id .= "|" . ceil($arOrder["WEIGHT"]); } // other intervals - up to next natural number $obCache = new CPHPCache(); if ($obCache->InitCache(DELIVERY_CPCR_CACHE_LIFETIME, $cache_id, "/")) { // cache found $vars = $obCache->GetVars(); $arResult = $vars["RESULT"]; } else { // format HTTP query request data $arQuery = array(); $arQuery[] = DELIVERY_CPCR_SERVER_POST_FROM_COUNTRY . "=" . urlencode($arLocationFrom["COUNTRY"]); if (is_set($arLocationFrom["CITY_ID"])) { $arQuery[] = DELIVERY_CPCR_SERVER_POST_FROM_CITY . "=" . urlencode($arLocationFrom["CITY_ID"]); } else { $arQuery[] = DELIVERY_CPCR_SERVER_POST_FROM_CITY_NAME . "=" . urlencode($GLOBALS['APPLICATION']->ConvertCharset($arLocationFrom["CITY"], LANG_CHARSET, 'windows-1251')); } $arQuery[] = DELIVERY_CPCR_SERVER_POST_WEIGHT . "=" . urlencode($arOrder["WEIGHT"]); $arQuery[] = DELIVERY_CPCR_SERVER_POST_CATEGORY . "=" . "1"; //urlencode($arConfig["category"]["VALUE"]); // price coefficient will be added later - to make caching independent from price $arQuery[] = DELIVERY_CPCR_SERVER_POST_PRICE . "=0"; $arQuery[] = DELIVERY_CPCR_SERVER_POST_TO_COUNTRY . "=" . urlencode($arLocationTo["COUNTRY"]); /* if (is_set($arLocationTo["REGION"])) $arQuery[] = DELIVERY_CPCR_SERVER_POST_TO_REGION."=".urlencode($arLocationTo["REGION"]); else $arQuery[] = DELIVERY_CPCR_SERVER_POST_TO_REGION."=".urlencode(DELIVERY_CPCR_CITY_DEFAULT); */ if (is_set($arLocationTo["CITY_ID"])) { $arQuery[] = DELIVERY_CPCR_SERVER_POST_TO_CITY . "=" . urlencode($arLocationTo["CITY_ID"]); } else { $arQuery[] = DELIVERY_CPCR_SERVER_POST_TO_CITY_NAME . "=" . urlencode($GLOBALS['APPLICATION']->ConvertCharset($arLocationTo["CITY"], LANG_CHARSET, 'windows-1251')); } CDeliveryCPCR::__Write2Log(print_r($arLocationTo, true)); $arQuery[] = DELIVERY_CPCR_SERVER_POST_ADDITIONAL; $query_string = implode("&", $arQuery); $query_page = DELIVERY_CPCR_SERVER_PAGE; // get data from server $ob = new CHTTP(); $ob->http_timeout = 50; $data = $ob->Query(DELIVERY_CPCR_SERVER_METHOD, DELIVERY_CPCR_SERVER, DELIVERY_CPCR_SERVER_PORT, $query_page . (DELIVERY_CPCR_SERVER_METHOD == 'GET' ? (strpos($query_page, '?') === false ? '?' : '&') . $query_string : ''), DELIVERY_CPCR_SERVER_METHOD == 'POST' ? $query_string : false); if ($data) { $data = $GLOBALS["APPLICATION"]->ConvertCharset($ob->result, 'windows-1251', LANG_CHARSET); } CDeliveryCPCR::__Write2Log($query_page); CDeliveryCPCR::__Write2Log($query_string); CDeliveryCPCR::__Write2Log($error_number . ": " . $error_text); CDeliveryCPCR::__Write2Log($data); if (strpos($data, "<?xml") === false) { return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_CPCR_ERROR_CONNECT')); } require_once $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/xml.php"; $objXML = new CDataXML(); $objXML->LoadString($data); $arResult = $objXML->GetArray(); $arProfiles = array('SIMPLE' => '"цеоюпд-щйяопеяя"', 'ECONOM' => '"оекхйюм-ярюмдюпр"', 'SIMPLE13' => '"цеоюпд-щйяопеяя 13"', 'SIMPLE18' => '"цеоюпд-щйяопеяя 18"', 'BIZON' => '"ахгнм-йюпцн"', 'COLIBRI' => '"йнкхапх-днйслемр"', 'PELICAN' => '"оекхйюм-нмкюим"', 'FRAXT' => '"тпюур"'); $arTmpResult = array(); if (isset($arResult["root"]["#"]["Error"]) and is_array($arResult["root"]["#"]["Error"])) { return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_CPCR_ERROR_CONNECT') . ' (' . htmlspecialcharsbx(strip_tags($arResult["root"]["#"]["Tariff"][0]["#"]["TariffType"][0]["#"])) . ')'); } else { if (!empty($arResult["root"]["#"]["Tariff"])) { foreach ($arResult["root"]["#"]["Tariff"] as $key => $val) { foreach ($val["#"] as $k => $v) { foreach ($arProfiles as $prof => $title) { if (ToUpper($v[0]["#"]) == ToUpper($title)) { $arTmpResult[ToLower($prof)] = array('VALUE' => $val["#"]["Total_Dost"][0]["#"], 'TRANSIT' => $val["#"]["DP"][0]["#"]); unset($arProfiles[$prof]); break; } } } } } $arResult = $arTmpResult; if (count($arTmpResult) > 0) { $obCache->StartDataCache(); $obCache->EndDataCache(array("RESULT" => $arResult)); } else { return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_CPCR_ERROR_CONNECT')); } } } if (is_array($arResult[$profile])) { $arResult[$profile]['RESULT'] = 'OK'; // it's starnge but it seems that CPCR new calculator doesnt count insurance tax at all. so, temporarily comment this line. // TODO: check this later //$arResult[$profile]['VALUE'] += $arOrder["PRICE"] * DELIVERY_CPCR_PRICE_TARIFF return $arResult[$profile]; } else { return array("RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_CPCR_ERROR_RESPONSE')); } }