Расчет стоимости доставки Почтой Росии в Ubercart, Drupal

Расчет стоимости доставки Почтой Росии в Ubercart, Drupal

Почти каждый работавший с ubercart на drupal сталкивался с необходимостью расчитать стоимость доставки товара Почтой России. Наша почтовая служба не предоставляет веб-сервиса расчета стоимости доставки, чтобы его можно было интегрировать с модулями расчета друпала. Тут уж приходится изворачиваться.

Я попробовал реализовать что-то похожее с помощью стандартных средств ubercart: conditional actions, flatrate. Изначально хотел использовать weight quote, но пришлось отказаться от этой затеи.

Первое что вам нужно будет сделать - выполнить квест на добычу прейскуранта из вашего почтового отделения. Да необходимо отметить, что описанным ниже образом можно расчитать доставку только для одного региона отправки. В почтовом отделении используется внутренняя программа расчета. делиться они не хотят) но тарифы все же можно добыть.

Я так до конца и не понял как вычисляется стоимость доставки ценного письма первого класса (туда можно запихнуть мелкие товары, письмо ограничено по весу). Также существует бандероль, в которой теперь отправляют только печатную продукцию. Для всего стального существует посылка, она значительно дороже письма и бандероли. В прейскуранте я нашел лишь фиксированную цену на письмо + дополнение за каждые дополнительные 20гр.

Стоимость же доставки посылки зависит от расстояния. Все области, края, республики, автономные округа разделены на 5 поясов, в каждом из которых определена базовая стоимость за 500г. посылку и надбавка за каждые дополнительные 500г. В некоторые округи посылка доставляется комбинированным способом, и цену для них пришлось определять примерно. Все дальнейшее рассмотрим на примере посылок.

Итак, чтобы все это можно было вычислить и отобразить покупателю, создаем 6 способов доставки flatrate. По одному на каждый пояс и комбинированный способ.
Даем одинаковые описания, но разные заголовки, чтобы самим не путать, а пользователь видел одно и тоже. Указываем базовую стоимость посылки. Все это можно проделать на странице admin/store/settings/quotes/methods/flatrate.

Теперь для каждого способа доставки нужно ограничить регионы при которых они отображаются, так чтобы при указании адреса пользовалем отобразиться мог только один из них. Нужно зайти в условия доставки и добавить условие "Проверить Регион/область доставки заказа" и выбрать из списка регионов, соответствующие этому поясу.

ВНИМАНИЕ! В drupal и вашем прейскуранте могут различаться регионы (объединение и переименование), советую уточнить достоверную информацию прежде чем делать выводы.

При редактировании товара нужно будет указать надбавку исходя из веса товара. Разумеется у нас будет некоторая неточность не в пользу покупателя, но на практике ей можно пренебрегнуть. Чтобы автоматизировать процесс расчета надбавки можно изменить функцию uc_flatrate_nodeapi в модуле uc_flatrate, обычно располагающемся в папке sites/all/modules/ubercart/shipping/uc_flatrate.

function uc_flatrate_nodeapi(&$node, $op) {
if (uc_product_is_product($node->type)) {
switch ($op) {
case 'insert':
case 'update':
if (is_array($node->flatrate)) {
if (!$node->revision) {
db_query("DELETE FROM {uc_flatrate_products} WHERE vid = %d", $node->vid);
}
foreach ($node->flatrate as $mid => $rate) {
// NAUGRIM
if($node->weight > 0) {
switch($mid){
case 3 : $rate = $node->weight*2.83/20; break;
case 4 : $rate = $node->weight*8.5/500; break;
case 5 : $rate = $node->weight*9.8/500; break;
case 6 : $rate = $node->weight*14.40/500; break;
case 7 : $rate = $node->weight*20.70/500; break;
case 8 : $rate = $node->weight*23.80/500; break;
case 9 : $rate = $node->weight*35/500; break;
default: $rate = 0;
}
}
if (($rate !== '') and ($node->weight > 0)) {
db_query("INSERT INTO {uc_flatrate_products} (vid, nid, mid, rate) VALUES (%d, %d, %d, %f)",
$node->vid, $node->nid, $mid, $rate);
}
}
}
break;
case 'load':
$return = array('flatrate' => array());
$result = db_query("SELECT mid, rate FROM {uc_flatrate_products} WHERE vid = %d", $node->vid);
while ($rate = db_fetch_object($result)) {
$return['flatrate'][$rate->mid] = $rate->rate;
}
return $return;
break;
case 'delete':
db_query("DELETE FROM {uc_flatrate_products} WHERE nid = %d", $node->nid);
break;
case 'delete revision':
db_query("DELETE FROM {uc_flatrate_products} WHERE vid = %d", $node->vid);
break;
}
}
}

думаю здесь вы разберетесь, что к чему.

Как же быть, если вам нужно расчитать стоимость доставки и бандеролью, и письмом, и посылкой?
Ранее я писал о том как программно можно добавить дополнительные shipping types. Их можно использовать в условиях методов доставки (где мы использовали условие на регион доставки) "Условие: Заказ содержит товар с особенным типом доставки". То есть если в корзине есть товар с типом доставки "посылка" значит бандеролью весь заказ отправить будет нельзя. Полагаю общая идея ясна.

Да я понимаю, что точно расчитать стоимость доставки Почтой России таким образом невозможно, но все же это достаточно приближенный результат и достигнуть его можно достаточно быстро. Существуют и платные модули расчета, но если помню правильно они работают за абонентскую плату.

вернуться назад