Запил стандартного модуля под УНИВЕРСАЛЬНУЮ доставку Почтой России. Может и пригодится кому.
Выражаю огромную благодарность
gartes. Собственно переписка выше.
Просьба еще раз проверить и, если возможно, оптимизировать алгоритм (сижу с самого утра без обеда и сна
).
Требования: посылки от 1 грамма до 10 килограмм и фиксированная минимальная сумма (стандартный модуль умеет). У меня товар вбит в килограммах везде и я не уверен как себя поведет доставка, если у вас стоят другие величины.
О тарифах почты (на сайте черт ногу сломит, мучайте 8-800, но тоже не панацея). Расскажу коротко о тех, которые (вроде бы) подходят мне, в принципе допиливаемо под что угодно.
1 тариф, бандероль с объявленной стоимостью. Эта стоимость необходима для использования наложенного платежа.
мы платим 78.82 за первые 500 грамм и последующие так же, округляется в бОльшую сторону +4% за объявленную стоимость.
от 0 до 2 кг
2 тариф, посылка, там зоны, с зонами не разбирался, и на их сайте тоже вырвиглаз, брал по максимуму пока что.
199 рублей за первые 500г и 33.70 за следующие и 4% за объявленную стоимость
3 тариф отправления 1го класса (на 8-800 говорят быстрее идет, ага
)
154,58 за первые 100 грамм 17.11 за следующие и 4% за объявленную стоимость.
вся задача сводится к:
если стоимость доставки вышла небольшой - выставить минимум, учитывая в принципе транспортный_расход/лень_идти_до_почты/упаковку (далее "жадность")
если стоимость доставки вышла относительно большой (а значит продается товар с хорошим ценником), то забить на жадность и считать по минималке, лишь бы не спугнуть покупателя.
переменные
в файле /vmshipment/weight_countries/weight_countries.xml после 25й строки
<param name="shippingCost" type="text" size="10" default="" label="наценка почты от стоимости (% или рубли)"/>
<param name="shippingAddWeight" type="text" size="10" default="" label="вес первой или последующей полной или неполной единицы веса (грамм) "/>
<param name="shippingFirstCostCount" type="text" size="10" default="" label="тариф почты за первую единицу веса (рубли)"/>
<param name="shippingNextCostCount" type="text" size="10" default="" label="тариф почты за последующие единицы веса (рубли)"/>
<param name="shippingGreed" type="text" size="10" default="" label="жадность (рубли)"/>
Функция /vmshipment/weight_countries/weight_countries.php
После 165 строки есть функция :function getCosts
Тут все как у
gartes`а.
function getCosts (VirtueMartCart $cart, $method, $cart_prices) {
if ($method->free_shipment && $cart_prices['salesPrice'] >= $method->free_shipment) {
return 0;
} else {
if (preg_match('/%$/', $method->shippingCost)) { // % или фиксированная сумма
$method->shippingCost = substr($method->shippingCost, 0, -1);
Потом страшное условие. Коротко: если фактическая цена доставки слишком мала то лепим минималку
if (($method->package_fee // если, налоги (рубли, кому нужно)
+($cart_prices[salesPrice]*0.01*$method->shippingCost) // плюс процентная наценка от стоимости товара (рубли)
+$method->shippingFirstCostCount // плюс цена за первую единицу веса
+(ceil( //
(($this->getOrderWeight($cart, $method->weight_unit)*1000 - // плюс оставшийся вес (у меня в килограммах!) переведенный в граммы!
$method->shippingAddWeight)) / // деленный на зачение последующих тарифицируемых значений массы посылки
$method->shippingAddWeight)) // округленный в большую сторону (по правилам почты)
*$method->shippingNextCostCount) <= // и уможенный на тариф за следующие единицы веса (рубли), меньше или равен
($method->cost - $method->shippingGreed) ) { //минимальной стоимости доставки за вычетом(!) нашей жадности
return $method->cost + $method->package_fee;
иначе пишем обычную стоимость доставки
} else {
return $method->package_fee // если, налоги (рубли, кому нужно)
+($cart_prices[salesPrice]*0.01*$method->shippingCost) // плюс процентная наценка от стоимости товара (рубли)
+$method->shippingFirstCostCount // плюс цена за первую единицу веса
+(ceil( //
(($this->getOrderWeight($cart, $method->weight_unit)*1000 - // плюс оставшийся вес (у меня в килограммах!) переведенный в граммы!
$method->shippingAddWeight)) / // деленный на зачение последующих тарифицируемых значений массы посылки
$method->shippingAddWeight)) // округленный в большую сторону (по правилам почты)
*$method->shippingNextCostCount;
}
и вот в этом "иначе" можно добавить свою "жадность", но я решил так не делать.
конец доделывать не стал
// если у нас не % от товара а фиксированное число далее функционал недописан!
}else{
return $method->cost + $method->package_fee + $method->shippingCost +
+$method->shippingFirstCostCount // плюс цена за первую единицу веса
+(ceil( //
(($this->getOrderWeight($cart, $method->weight_unit)*1000 - // плюс оставшийся вес (у меня в килограммах!) переведенный в граммы!
$method->shippingAddWeight)) / // деленный на зачение последующих тарифицируемых значений массы посылки
$method->shippingAddWeight)) // округленный в большую сторону (по правилам почты)
*$method->shippingNextCostCount;
}
}
}// end function getCosts
запиливать вариант, когда вместо % в доставке идет фиксированное число, я не стал, у меня нет такой доставки, но в принципе делается по аналогии.
В принципе удобно манипулировать теми же %тами и убрать жадность в ноль и поставить 5,6,7 процентов, в общем кому как удобнее. Возможно запиливаемо под EMS и что там у нас еще бывает.
Вот так это выглядит у меня в VM
Вопросы, может кто знает, но проверять сил нет уже
1. Если VirtueMart обновится слетит или нет?
2. Если все-таки встретятся товары с граммами/фунтами что будет?
3. Если кто знает как запилить сюда какие-то почтовые зоны для посылок - будет интересно по слушать.
4. Оптимизация. Я не программист, но чую можно как-то попроще сделать.