0 Пользователей и 1 Гость просматривают эту тему.
  • 16 Ответов
  • 2039 Просмотров
*

Undorik

  • Осваиваюсь на форуме
  • 27
  • 1 / 0
Тема переименована.

^^^^^^^^^^^^^^^

Здравствуйте.
Подскажите пожалуйста, я где-то видел реализацию, но никак найти не могу, чтобы модуль доставки добавлял % к сумме заказа, а не фиксированное число.

Т.е. первый вариант - самовывоз, по нулям, это работает,
второй вариант, курьер - 10% от ИТОГО.

Спасибо.
« Последнее редактирование: 06.01.2013, 21:24:44 от Undorik »
*

gartes

  • Завсегдатай
  • 1417
  • 113 / 5
  • Е = mс²
Если плагин доставки стандартный т.е. weight_countries
То
1 Налоги и правила расчета

   Вид расчета  наценка
   Операция +%
   Значение 10

2 в способе доставки
   Налог   название правила налогов

Для VM 2.0....
Думаю работать будет..) ;)
       
*

Undorik

  • Осваиваюсь на форуме
  • 27
  • 1 / 0
Если плагин доставки стандартный т.е. weight_countries
То
1 Налоги и правила расчета

   Вид расчета  наценка
   Операция +%
   Значение 10

2 в способе доставки
   Налог   название правила налогов

Для VM 2.0....
Думаю работать будет..) ;)
       
пробовал, берет налог только с минимальной стоимости доставки (если ее указывать) или просто ноль, если нет даже минимальной. Пробовал ставить другие типы налогов. Не помогает :(
*

Undorik

  • Осваиваюсь на форуме
  • 27
  • 1 / 0
*

gartes

  • Завсегдатай
  • 1417
  • 113 / 5
  • Е = mс²
Значит так

/vmshipment/weight_countries/weight_countries.xml
После 25 строки ставим это :
Код
<param name="shippingCost" type="text" size="10" default="" label="shipping cost"/>

Далее
/vmshipment/weight_countries/weight_countries.php
После 165 строки есть функция  :function getCosts
Меняем на мою

Код
 

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);
return $method->cost + $method->package_fee+($cart_prices[salesPrice]*0.01*$method->shippingCost);
}else{
return $method->cost + $method->package_fee+$method->shippingCost;
}
}
    }// end function getCosts


Все сохраняем и в настройке способа доставки в поле  shipping cost
Можем ставить такое
10% наценка или наоборот -10% скидка
или просто 10 наценка 10 в твоей валюте ну или -10

Все Ура!
Пользуйся!
PS Да к с тате толь что придумал ;D
« Последнее редактирование: 06.01.2013, 02:50:55 от gartes »
*

Undorik

  • Осваиваюсь на форуме
  • 27
  • 1 / 0
Выпадает в ошибку 500 при попытке зайти в товар на сайте или в настройки доставки в админке. Но, чую, истина где-то рядом.
Что делает
Код
if (preg_match('/%$/', $method->shippingCost))
?
« Последнее редактирование: 06.01.2013, 10:49:44 от Undorik »
*

gartes

  • Завсегдатай
  • 1417
  • 113 / 5
  • Е = mс²
ищет знак проценты "%"       в строке параметров шип кост
« Последнее редактирование: 06.01.2013, 11:26:09 от gartes »
*

Undorik

  • Осваиваюсь на форуме
  • 27
  • 1 / 0
ищет проценты в строке параметров шип кост

А все, нашел! Мой косяк был, скобочку недокомментил от старого скрипта!
ура ура ура!
*

gartes

  • Завсегдатай
  • 1417
  • 113 / 5
  • Е = mс²
Круть это модуль Новой почты.... ;D тут темка есть зайди глянь что может но только для Украины
*

Undorik

  • Осваиваюсь на форуме
  • 27
  • 1 / 0
Ой
« Ответ #12 : 06.01.2013, 20:58:06 »
Запил стандартного модуля под УНИВЕРСАЛЬНУЮ доставку Почтой России. Может и пригодится кому.
Выражаю огромную благодарность gartes. Собственно переписка выше.

Просьба еще раз проверить и, если возможно, оптимизировать алгоритм (сижу с самого утра без обеда и сна :) ).

Требования: посылки от 1 грамма до 10 килограмм и фиксированная минимальная сумма (стандартный модуль умеет). У меня товар вбит в килограммах везде и я не уверен как себя поведет доставка, если у вас стоят другие величины.

О тарифах почты (на сайте черт ногу сломит, мучайте 8-800, но тоже не панацея). Расскажу коротко о тех, которые (вроде бы) подходят мне, в принципе допиливаемо под что угодно.
1 тариф, бандероль с объявленной стоимостью. Эта стоимость необходима для использования наложенного платежа.
мы платим 78.82 за первые 500 грамм и последующие так же, округляется в бОльшую сторону +4% за объявленную стоимость.
от 0 до 2 кг
2 тариф, посылка, там зоны, с зонами не разбирался, и на их сайте тоже вырвиглаз, брал по максимуму пока что.
199 рублей за первые 500г и 33.70 за следующие и 4% за объявленную стоимость
3 тариф отправления 1го класса (на 8-800 говорят быстрее идет, ага :D )
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. Оптимизация. Я не программист, но чую можно как-то попроще сделать.
*

Undorik

  • Осваиваюсь на форуме
  • 27
  • 1 / 0
*

gartes

  • Завсегдатай
  • 1417
  • 113 / 5
  • Е = mс²
Цитировать
Вопросы, может кто знает, но проверять сил нет уже
1. Если VirtueMart обновится слетит или нет?
2. Если все-таки встретятся товары с граммами/фунтами что будет?
3. Если кто знает как запилить сюда какие-то почтовые зоны для посылок - будет интересно по слушать.
4. Оптимизация. Я не программист, но чую можно как-то попроще сделать.


1 не не слетит VM при обновлении папку plugins не трогает слетит все то что в ядре менялось но там лучше не че не трогать
  Вот что подумал если AIO Обновить то наверное грохнит...
  Модулю имя другое и и каталог...
2 думаю тоже не чего если ручки у пользователя не корявые и поставит в настройках модуля свои единицы и все.
     А вообще подумать надо и наверное если не КГ то функцию написать перевода величин... Думаю что в VM уже где то это есть просто подключить и отдать
3 зоны для посылок-- Вот тут вопрос не понял что именно.... Можно в БД базу индексов всей РФ загнать и когда клиент в ведет индекс его город область автоматом станет в регистрацию....  

4 так ты весь код кинь будем - делать - посмотреть )) а то я пока прочитал глаза чуть не сломал

Удачи тебе!
« Последнее редактирование: 07.01.2013, 00:41:08 от gartes »
*

Undorik

  • Осваиваюсь на форуме
  • 27
  • 1 / 0
3 зоны для посылок-- Вот тут вопрос не понял что именно.... Можно в БД базу индексов всей РФ загнать и когда клиент в ведет индекс его город область автоматом станет в регистрацию.... 
Я к тому, что у меня условий задачи нет. Я хз какие индексы к какой зоне как относить. Реализовать можно так же условиями и не забивать в бд ничего лишнего.

4 так ты весь код кинь будем - делать - посмотреть )) а то я пока прочитал глаза чуть не сломал
это и есть весь код, просто кусками.

вот склееный
Код
	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) ) {                        //минимальной стоимости доставки за вычетом(!) нашей жадности

// выше в условии реальная стоимость почтовой отправки, но нам этого мало!
// в данном случае, если реальная стоимость отправки через почту, например 30 рублей
// наш минимальный заданный тариф нашего магазина для почтовый отправлений 60 рублей и жадность 20 (60-20 = 40)

return $method->cost + $method->package_fee; // тогда делаем стоимость доставки по нашему минимальному тарифу (цена+налог кому нужно)

//иначе, когда реальная стоимость почтовой отправки например 100 привышает тариф минимальной отправкки нашего магазина 60 за вычетом жадности 20
// считаем по полной

} 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 // плюс цена за первую единицу веса
+(round(                                                            //               
(($this->getOrderWeight($cart, $method->weight_unit)*1000 -     // плюс оставшийся вес (у меня в килограммах!) переведенный в граммы!                                 
$method->shippingAddWeight)) /                                  // деленный на зачение последующих тарифицируемых значений массы посылки
$method->shippingAddWeight, 0, PHP_ROUND_HALF_UP))              // округленный в большую сторону (по правилам почты)
*$method->shippingNextCostCount;




}
}
    }// end function getCosts
*

Undorik

  • Осваиваюсь на форуме
  • 27
  • 1 / 0
  Вот что подумал если AIO Обновить то наверное грохнит...

угу, убивает, проверено
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Возможность доставки/оформления заказа в определённое время

Автор PavelK

Ответов: 3
Просмотров: 234
Последний ответ 18.08.2020, 16:13:53
от rsn
Сортировка способов доставки

Автор stardel

Ответов: 9
Просмотров: 2334
Последний ответ 21.10.2019, 09:05:27
от rsn
Добавить выбор города в плагин доставки?

Автор warlocksp

Ответов: 2
Просмотров: 344
Последний ответ 09.07.2019, 16:50:55
от Borodin
Исправить надпись цены доставки - ?

Автор warlocksp

Ответов: 13
Просмотров: 1522
Последний ответ 22.01.2019, 08:04:36
от warlocksp
Как добавить отображение суммы доставки в корзину?

Автор Dolphin4ik_1

Ответов: 1
Просмотров: 307
Последний ответ 28.12.2018, 23:19:15
от Dolphin4ik_1