if (empty($result['cache'])) {
if (!empty($result['data'])) $result['data_original'] = $result['data']; // сохранение в кэш оригинального расчета (если в дальнейшем требуется индивидуальный пересчет после загрузки из кэша)
echo 'new';
}
else {
if (isset($result['data_original'])) $result['data'] = $result['data_original']; // восстановление оригинального расчета
echo 'cache';
}
удаление тарифов почты, если есть любые другие тарифы
if (empty($result['cache']) && !empty($result['data'])) {
$n = 0;
foreach ($result['data'] as $k => $v) if ($v['format'] == 'post') $n++;
if (count($result['data']) != $n) foreach ($result['data'] as $k => $v) if ($v['format'] == 'post') unset($result['data'][$k]);
}
удаление тарифов СДЭК, если есть тарифы boxberry
$company_id_delete = array(5);
$company_id_exists = array(30);
if (empty($result['cache']) && !empty($result['data'])) {
$ar = array(array('office'), array('door', 'house'));
foreach ($ar as $f) {
$a = false;
foreach ($result['data'] as $k => $v) if (in_array($v['company_id'], $company_id_exists) && in_array($v['format'], $f)) { $a = true; break; }
if ($a) foreach ($result['data'] as $k => $v) if (in_array($v['company_id'], $company_id_delete) && in_array($v['format'], $f)) unset($result['data'][$k]);
}
}
универсальная обработка тарифов скидка на доставку (фиксированная стоимость, блокировка наложки) в зависимости от местоположения (региона, страны), тарифа и формата доставки
если не нужна прямая зависимость от параметров битрикса и не нужен сложный учет скидок или ограничений, тогда вместо данного кода, лучше использовать штатные функции обработки расчета (в личном кабинете eDost у магазина в разделе "функции")
$ar = array(
array(
'location_code' => array('0000073738'),
'region_name' => array('Хабаровский край'),
'country_name' => array('Россия'),
'tariff_id' => array(37),
'company_id' => array(5),
'format' => array('office'),
'normal' => array(
'price_from' => 0,
'price_to' => 5000,
'discount_percent' => 20,
'discount_fix' => 0,
'pricecash_discount_disable' => true,
'change' => array(
'price' => 100,
'pricecash' => -1
)
),
'invert' => array(
'price_from' => 0,
'price_to' => 0,
'discount_percent' => 100,
'discount_fix' => 350,
'pricecash_discount_disable' => true,
'change' => array(
'price' => 250,
'pricecash' => -1
)
),
),
array(
'country_name' => array('Россия'),
'invert' => array(
'change' => array(
'pricecash' => -1
)
),
),
);
if (empty($result['cache']) && !empty($result['data'])) {
foreach ($ar as $param) {
$a = (!empty($param['location_code']) && in_array($order['LOCATION_TO'], $param['location_code']) ||
!empty($param['region_name']) && in_array($order['location']['region_name'], $param['region_name']) ||
!empty($param['country_name']) && in_array($order['location']['country_name'], $param['country_name']) ? true : false);
foreach ($result['data'] as $k => $v)
if (!empty($param['tariff_id']) && in_array($v['id'], $param['tariff_id']) ||
empty($param['tariff_id']) && (empty($param['company_id']) || !empty($param['company_id']) && in_array($v['company_id'], $param['company_id'])) && (empty($param['format']) || in_array($v['format'], $param['format']))) {
$p = $s = $s2 = false;
if ($a && isset($param['normal'])) $p = $param['normal'];
if (!$a && isset($param['invert'])) $p = $param['invert'];
if (empty($p) || isset($p['price_from']) && $order['PRICE'] <= $p['price_from'] || isset($p['price_to']) && $order['PRICE'] > $p['price_to']) continue;
if (!empty($p['change'])) {
if (isset($p['change']['price'])) $s = $p['change']['price'];
if (isset($p['change']['pricecash'])) $s2 = $p['change']['pricecash'];
}
else {
$s = $v['price']*(!empty($p['discount_percent']) ? (100 - $p['discount_percent'])/100 : 1) - (!empty($p['discount_fix']) ? $p['discount_fix'] : 0);
if ($s < 0) $s = 0;
if ($v['pricecash'] >= 0 && !isset($p['pricecash_discount_disable'])) {
$s2 = $v['pricecash']*(!empty($p['discount_percent']) ? (100 - $p['discount_percent'])/100 : 1) - (!empty($p['discount_fix']) ? $p['discount_fix'] : 0);
if ($s2 < 0) $s2 = 0;
}
}
if ($s !== false) {
if ($result['data'][$k]['price'] > $s) $result['data'][$k]['priceoriginal']['price'] = $result['data'][$k]['price'];
$result['data'][$k]['price'] = $s;
}
if ($s2 !== false) {
if ($result['data'][$k]['pricecash'] != -1 && $result['data'][$k]['pricecash'] > $s2) $result['data'][$k]['priceoriginal']['pricecash'] = $result['data'][$k]['pricecash'];
$result['data'][$k]['pricecash'] = $s2;
}
}
}
}
изменение формата доставки EMS с курьера на почту
$company_id = array(2);
$new_format = 'post';
if (empty($result['cache']) && !empty($result['data'])) foreach ($result['data'] as $k => $v) if (in_array($v['company_id'], $company_id)) $result['data'][$k]['format'] = $new_format;
изменение тарифа в зависимости от товаров на складе при наличии товаров на складе поставщика в городе покупателя, пунктам выдачи СДЭК присваивается цена из тарифа "Самовывоз 4" (в заказе сохраняется самый дешевый тариф СДЭК из доступных)
if (empty($result['cache']) && !empty($result['data'])) $result['data_original'] = $result['data'];
else if (isset($result['data_original'])) $result['data'] = $result['data_original'];
if (!empty($result['data'])) {
$company = 5;
$shop = 's4';
$ar = array();
if (!empty($order['ITEMS'])) foreach ($order['ITEMS'] as $v) $ar[] = $v['PRODUCT_ID'];
if (!empty($ar)) {
$store = false;
$ar = CCatalogStore::GetList(array('SORT' => 'ASC'), array('PRODUCT_ID' => $ar, 'ACTIVE' => 'Y'), false, false, array('ID', 'TITLE', 'ADDRESS', 'PRODUCT_AMOUNT'));
while ($v = $ar->fetch()) if ($v['TITLE'] == $order['location']['bitrix']['city']) {
if (!empty($v['PRODUCT_AMOUNT'])) $store = true;
else { $store = false; break; }
}
if ($store) {
$shop_k = false;
foreach ($result['data'] as $k => $v) if ($v['company_id'] == $shop) $shop_k = $k;
if ($shop_k !== false) {
$p = false;
foreach ($result['data'] as $k => $v) if ($v['company_id'] == $company && $v['format'] == 'office' && ($p === false || $v['price'] < $p)) { $company_k = $k; $p = $v['price']; }
if ($p !== false) {
$ar = array('price', 'pricecash', 'day', 'insurance');
foreach ($ar as $v) $result['data'][$company_k][$v] = $result['data'][$shop_k][$v];
foreach ($result['data'] as $k => $v) if ($v['company_id'] == $company && $v['format'] == 'office' && $k != $company_k) unset($result['data'][$k]);
}
}
}
}
}
сбросить формат доставки в карточке товара тарифы будут выводиться без разделения на "Курьером до двери", "До пункта выдачи" и т.д.)
if (strpos($_SERVER['REQUEST_URI'], '/catalog') === 0 || strpos($_SERVER['REQUEST_URI'], '/bitrix/components/edost/catalogdelivery') === 0)
if (!empty($result['data'])) foreach ($result['data'] as $k => $v) $result['data'][$k]['format'] = '';
заменить 'дни' на 'рабочие дни'
if (empty($result['cache']) && !empty($result['data'])) foreach ($result['data'] as $k => $v) if (!empty($v['day'])) {
$result['data'][$k]['day'] = str_replace(array('день', 'дня', 'дней'), array('рабочий день', 'рабочих дня', 'рабочих дней'), $v['day']);
}
исключение стоимости доставки из итого (для почты и EMS)
$id = array(1, 2, 3, 61, 62, 68);
if (empty($result['cache']) && !empty($result['data'])) foreach ($result['data'] as $k => $v)
if (in_array($v['id'], $id) && $v['price'] > 0) {
$result['data'][$k]['priceinfo'] = $v['price'];
$result['data'][$k]['price'] = 0;
}
удаление из расчета тарифа "DPD (parcel до пункта выдачи)" (код 91)
if (isset($result['data']['91'])) unset($result['data']['91']);
50% скидка на тариф "Курьер 1" (код 61) при заказе в субботу-воскресенье предупреждение: используется время сервера - оно может отличаться от часового пояса магазина и покупателя
if (isset($result['data']['61'])) {
if (empty($result['cache'])) $result['data']['61']['price_original'] = $result['data']['61']['price'];
$p = $result['data']['61']['price_original'];
if (date('N') >= 6) $p = round($p*0.5);
$result['data']['61']['price'] = $p;
}
изменение стоимости доставки тарифа "PickPoint"
$id = 57; // PickPoint
if (empty($result['cache']) && isset($result['data'][$id])) {
$ar = array('0000073738', '0000103664');
if (in_array($order['LOCATION_TO'], $ar)) {
$result['data'][$id]['price'] = 250;
$result['data'][$id]['pricecash'] = 250;
}
$result['data'][$id]['priceoffice'] = array(
5 => array(
'type' => 5,
'price' => $result['data'][$id]['price'] + 100,
'priceinfo' => 0,
'pricecash' => 800,
),
);
}
$order - оригинальные параметры заказа
$config - настройки модуля
*/