array( 'WEIGHT_LESS_1000' => array(1, 550, GetMessage('SALE_DH_KP_LESS_1')), 'WEIGHT_MORE_1000' => array(2, 50, GetMessage('SALE_DH_KP_MORE_1')) ), "CAPITAL" => array( 'WEIGHT_LESS_1000' => array(3, 450, GetMessage('SALE_DH_KP_LESS_1')), 'WEIGHT_MORE_1000' => array(4, 50, GetMessage('SALE_DH_KP_MORE_1')), ) ); return array( /* Basic description */ 'SID' => 'kaz_post', 'NAME' => GetMessage('SALE_DH_KP_NAME'), 'DESCRIPTION' => GetMessage('SALE_DH_KP_DESCR').' http://www.kazpost.kz', 'DESCRIPTION_INNER' => GetMessage('SALE_DH_KP_DESCR').' http://www.kazpost.kz', 'BASE_CURRENCY' => 'KZT', 'HANDLER' => __FILE__, /* Handler methods */ 'DBGETSETTINGS' => array('CDeliveryKazPost', 'GetSettings'), 'DBSETSETTINGS' => array('CDeliveryKazPost', 'SetSettings'), 'GETCONFIG' => array('CDeliveryKazPost', 'GetConfig'), 'COMPABILITY' => array('CDeliveryKazPost', 'Compability'), 'CALCULATOR' => array('CDeliveryKazPost', 'Calculate'), /* List of delivery profiles */ 'PROFILES' => array( 'distant_inner' => array( 'TITLE' => GetMessage('SALE_DH_KP_DI_TITLE'), 'DESCRIPTION' => GetMessage('SALE_DH_KP_DI_DESCR'), 'RESTRICTIONS_WEIGHT' => array(0, self::$MAX_WEIGHT), 'RESTRICTIONS_SUM' => array(0), 'TAX_RATE' => 0, 'RESTRICTIONS_MAX_SIZE' => 0, 'RESTRICTIONS_DIMENSIONS_SUM' => 0, 'RESTRICTIONS_DIMENSIONS' => self::$MAX_DIMENSIONS ) ) ); } public static function GetConfig() { $arConfig = array( 'CONFIG_GROUPS' => array( 'distant_inner' => GetMessage('SALE_DH_KP_DI_TITLE'), ), ); $aviableBoxes = self::getAviableBoxes(); foreach ($aviableBoxes as $boxId => $arBox) CSaleDeliveryHelper::makeBoxConfig($boxId, $arBox, 'distant_inner', $arConfig); $arConfig['CONFIG']['tarif_section_1'] = array( 'TYPE' => 'SECTION', 'TITLE' => GetMessage('SALE_DH_KP_TARIF_TITLE'), 'GROUP' => 'distant_inner', ); foreach (self::$TARIFS["BASE"] as $arTarif) { $tarifId = $arTarif[self::$TARIF_IDX]; $arConfig['CONFIG']['TARIF_'.$tarifId] = array( 'TYPE' => 'STRING', 'DEFAULT' => $arTarif[self::$TARIF_DEFAULT], 'TITLE' => $arTarif[self::$TARIF_DESCR], 'GROUP' => 'distant_inner', ); } $arConfig['CONFIG']['tarif_section_2'] = array( 'TYPE' => 'SECTION', 'TITLE' => GetMessage('SALE_DH_KP_TARIF_IREG'), 'GROUP' => 'distant_inner', ); foreach (self::$TARIFS["CAPITAL"] as $arTarif) { $tarifId = $arTarif[self::$TARIF_IDX]; $arConfig['CONFIG']['TARIF_'.$tarifId] = array( 'TYPE' => 'STRING', 'DEFAULT' => $arTarif[self::$TARIF_DEFAULT], 'TITLE' => $arTarif[self::$TARIF_DESCR], 'GROUP' => 'distant_inner', ); } return $arConfig; } public static function GetSettings($strSettings) { return unserialize($strSettings, ['allowed_classes' => false]); } public static function SetSettings($arSettings) { foreach ($arSettings as $key => $value) { if ($value <> '') $arSettings[$key] = $value; else unset($arSettings[$key]); } return serialize($arSettings); } public static function Calculate($profile, $arConfig, $arOrder, $STEP, $TEMP = false) { $arPacks = CSaleDeliveryHelper::getBoxesFromConfig($profile, $arConfig); $arPackagesParams = CSaleDeliveryHelper::getRequiredPacks( $arOrder["ITEMS"], $arPacks, self::$MAX_WEIGHT ); $packageCount = count($arPackagesParams); if ($packageCount <= 0) { return [ "RESULT" => "ERROR", "TEXT" => GetMessage("SALE_DH_KP_OVERLOAD"), ]; } $totalPrice = 0; $shopLocationId = CSaleHelper::getShopLocationId(SITE_ID); $arShopLocation = CSaleHelper::getLocationByIdHitCached($shopLocationId); $arLocationTo = CSaleHelper::getLocationByIdHitCached($arOrder['LOCATION_TO']); foreach ($arPackagesParams as $arPackage) { $totalPrice += self::calculatePackPrice( $arPackage, $profile, $arConfig, $arShopLocation['REGION_ID'] ?? 0, $arLocationTo['REGION_ID'] ?? 0 ); } return [ 'RESULT' => 'OK', 'VALUE' => $totalPrice, 'PACKS_COUNT' => $packageCount, ]; } public static function Compability($arOrder, $arConfig) { $result = array(); $aviableBoxes = CSaleDeliveryHelper::getBoxesFromConfig('distant_inner', $arConfig); foreach ($aviableBoxes as $arBox) { if (CSaleDeliveryHandler::checkDimensions($arOrder["MAX_DIMENSIONS"], $arBox["DIMENSIONS"])) { $result = array('distant_inner'); break; } } return $result; } private static function getConfValue(&$arConfig, $key) { return CSaleDeliveryHelper::getConfValue($arConfig[$key]); } private static function getAviableBoxes() { return array( array( "NAME" => GetMessage("SALE_DH_KP_STNDRD_BOX"), "DIMENSIONS" => array("800", "800", "500") ) ); } private static function calculatePackPrice($arPackage, $profile, $arConfig, $regionIdFrom, $regionIdTo) { $arDebug = array(); $basePrice = $totalPrice = 0; if($regionIdFrom == $regionIdTo) $tarifGroup = 'CAPITAL'; else $tarifGroup = 'BASE'; $basePrice = floatval(self::getConfValue($arConfig, 'TARIF_'.self::$TARIFS[$tarifGroup]['WEIGHT_LESS_1000'][self::$TARIF_IDX])); $arDebug[] = 'Base Price less 1000 g: '.$basePrice; if($arPackage['WEIGHT'] > self::$BASE_WEIGHT) { $addWeight = ceil(($arPackage['WEIGHT'] - self::$BASE_WEIGHT)/500); $addPrice = floatval(self::getConfValue($arConfig, 'TARIF_'.self::$TARIFS[$tarifGroup]['WEIGHT_MORE_1000'][self::$TARIF_IDX])); $arDebug[] = 'Price for additional weight more than 1000 g: '.$addWeight * $addPrice; $basePrice += $addWeight * $addPrice; } $totalPrice = $basePrice; $arDebug[] = 'Total value: '.$totalPrice; return $totalPrice; } } AddEventHandler('sale', 'onSaleDeliveryHandlersBuildList', array('CDeliveryKazPost', 'Init')); ?>