D6 + UC2 - виды доставок в зависимости от суммы и адреса заказа

Аватар пользователя Andruxa Andruxa 8 апреля 2012 в 1:34

Расскажу о том, как в форме оформления заказа выводить те способы доставки, которые актуальны для данного заказа.

Типичный случай для интернет-магазина: покупателю предлагается доставка курьером по Default City (город, где расположен склад магазина), которая может быть бесплатной при сумме заказа, превышающей определённый порог и доставка почтой / EMS / транспортной компанией - в другие города.

Оговорюсь сразу - я слыхал, но лично не встречал модуль расчета стоимости доставки почтой России, про расчет доставки транспортными компаниями мне вообще ничего не известно, d.org тому в подтверждение,
остаётся модуль расчета стоимости доставки EMS, в заказе которого я принимал самое непосредственное участие.

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

Итак, для расчета доставки по Default City стоит использовать модуль Flatrate, идущий в комплекте с уберкартом - если курьеры не берут доп.плату за вес заказа, либо Weight quote - если стоимость доставки зависит от веса заказа.
Для доставки по России - EMS, как вариант - замаскированный под почту России.

Создаем 2 вида доставки курьером по DC - для платной (до определённой суммы заказа) и бесплатной (свыше) доставки курьером.
Название способа перевозки можно указать одинаковое - например, "Доставка курьером по [DC]", чтобы не путать покупателя, а "Элемент строки" - указать разные названия, например "Платная доставка курьером" и "Бесплатная доставка курьером" - чтобы не путать администратора магазина.
Соответственно, для платной доставки указываем определённую стоимость, для бесплатной - указываем стоимость 0р.

После настройки всех способов доставки, идём в админке в Управление магазином > Условные действия (/admin/store/ca)
Там находим триггеры "Вычисление стоимости доставки по " . название_способа_доставки

Настраиваем платную доставку курьером: проходим по ссылке изменить, попадаем на закладку Метаданные, которые нас мало интересуют и дальше переходим на закладку Условия.
Удостоверимся, что выбран оператор "И. Если все условия ИСТИННЫ." (условий может быть несколько) и ниже в списке выбираем Порядок - Проверить сумму заказа, и жмем на Добавить условие.
Настраиваем его: Общая стоимость заказа - пороговое значение, выше которого доставка бесплатна, ниже Order total comparison type - "Сумма заказа меньше указанного значения" или "Сумма заказа меньше или равна введенному значению", в зависимости от условий доставки магазина.

Если покупатель ввёл в поле Город название DC или не ввёл его вообще, что также подразумевает доставку по DC - надо показывать доставку курьером, поэтому в списке Доступные условия выбираем Система - Выполнение PHP-кода, жмем на Добавить условие и вводим Пользовательский PHP:
return (mb_strtoupper($order->delivery_city) == 'НАЗВАНИЕ_DC') || ($order->delivery_city == '');
преобразование в заглавные (или прописные - кому как нравится) делается из-за того, что заранее неизвестно, как покупатель введёт название города - с заглавной, заглавными, прописными или вообще зАбОрЧиКоМ - тут креатив покупателей воистину не знает границ.
Если название DC пишется через дефис или может быть сокращено (Комсомольск-на-Амуре, С.Петербург и т.п.) - вам повезло, предусмотрите как можно больше вариантов в условии.
Далее, для Москвы и Санкт Петербурга в списке Регионов предусмотрены одноименные регионы. Если ваш DC - Москва или Питер, то есть вариант, что покупатель выберет их вместо ввода города вручную.
Поэтому добавляем третье условие - Заказ:Адрес доставки - Check an order's shipping Регион, включаем чекбокс "Отрицать условие" и в списке регионов с помощью шифта выбираем все, кроме Москвы или Питера - в зависимости от ситуации.
Наконец, сохраняем условия.

В итоге получается следующее: если сумма заказа меньше определённой, при этом в поле город введено название DC (или выбран регион DC - для Мск и Спб) - будет вычислена стоимость и показана покупателю доставка курьером.

Сборка автомата Калашникова производится в обратном порядке
Аналогично настраиваем триггер для бесплатной доставки - только в условии "Проверить сумму заказа" указываем Order total comparison type - "Сумма заказа больше указанного значения" (или "больше или равна")

Теперь про триггер для доставки EMS.
Модуль работает таким образом, что если не указан город (населённый пункт) и не выбран регион доставки, он возвращает False вместо стоимости доставки, и в списке возможных вариантов доставки не показывается, поэтому условие надо добавить только одно: выполнение PHP-кода:
return (mb_strtoupper($order->delivery_city) == 'НАЗВАНИЕ_DC');, и включить чекбокс "Отрицать условие" -
чтобы не предлагать покупателю доставку почтой/EMS по DC

Разумеется, возможны варианты вроде срочной доставки - они добавляются и настраиваются аналогичным образом.

Комментарии

Аватар пользователя lexsaenko lexsaenko 20 октября 2013 в 12:58

Здравствуйте! У меня возникла похожая ситуация только на Drupal 7 и Ubercart 3, но я никак не могу с ней справится.
Суть проблемы:
Есть 4 способа доставки. первых два выводятся всегда, два других должны выводится когда товар домтавляется "под заказ". Указание что товар "в наличии" или "под заказ" задается через поле field_stock (создано дополнительно).

Я так понимаю для такой проверки необходимо указать php код что если поле содержит значение "под эаказ" возвращать true.

Помогите составить правильный php код, или может есть какой то другой способ? Заранее спасибо.

Аватар пользователя Andruxa Andruxa 21 октября 2013 в 23:18

в заказе может быть несколько товаров, как должна обрабатываться ситуация, когда в заказе есть товары и в наличии, и под заказ?

Аватар пользователя lexsaenko lexsaenko 22 октября 2013 в 15:51

Andruxa wrote:
в заказе может быть несколько товаров, как должна обрабатываться ситуация, когда в заказе есть товары и в наличии, и под заказ?

Я в принципе нашел решение, но может вы подскажите другой вариант. Итак. Я сделал так: товары которые "в наличии" я помечал как "закрепленные вверху списков". Если в заказе были товары и под заказ и в наличии, то выводился способ доставки с указанием что это смешанный заказ и стоимость доставки сообщается индивидуально. Для этого вида доставки добавил условия на проверку первых 10 товаров добавленных в корзину на "закрепление в верху списков" и так же проверку на не "закрепленность" (через оператор OR) и объеденил эти две проверки оператором AND . Если есть два товара с разным наличием то выводится этот вид доставки.

Для второго вида доставки который должен выводится если заказ содержит товары только "под заказ" создал проверку, опять же первых 10 товаров добавленных в корзину, на "закрепленность вверху списков" объеденил их оператором OR и к нему добавил отрицание.

Все заработало. Единственный минус что это работает только если в корзину добавлено до 10 разных товаров. Но я думаю на первое время должно хватить.:-)

Если есть другие варианты я буду рад применить их))