msCDEK 1.0.0: расчет доставки ТК СДЕК

Описание

msCDEK позволяет рассчитывать стоимость доставки, с учетом веса заказа, для 8 тарифов ТК СДЕК.

На самом деле, поддерживаются все тарифы СДЕК, но для этого необходимо вручную прописывать JSON в свойство properties метода доставки. Подробнее в конце заметки.

Особенности

  1. Учет веса товаров в заказе
  2. Вывод сроков доставки
  3. Сниппет для расчета доставки в карточке товара
  4. Поддержка авторизации
  5. Совместимость с msRussianPost при расчете сроков доставки

Поддерживаемые типы отправлений:

  1. Экспресс-Лайт Склад-Склад
  2. Экспресс-Лайт Склад-Дверь
  3. Экспресс-Лайт Дверь-Склад
  4. Экспресс-Лайт Дверь-Дверь
  5. Посылка Склад-Склад (Требуется авторизация!)
  6. Посылка Склад-Дверь (Требуется авторизация!)
  7. Посылка Дверь-Склад (Требуется авторизация!)
  8. Посылка Дверь-Дверь (Требуется авторизация!)
Помимо стоимости, рассчитывается срок доставки.
Данный компонент возможно использовать вместе с компонентом msRussianPost – они унифицированы.


Установка

Шаг 1: только стоимость доставки
После установки создается 8 новых способов доставки, по умолчанию они все выключены. Включите требуемые, не забыв отметить доступные способы оплаты.
В чанке tpl.msOrder.outer замените поле ввода города на вызов чанка [[$tpl.msCDEK.city]]. В данном чанке находится вызов сниппета для вывода списка городов и скрипт для динамического пересчета стоимости после выбора другого города

Шаг 2: срок доставки
В чанке tpl.msOrder.outer добавьте в удобное место вызов чанка [[$tpl.msCDEK.time]], в нем находится контейнер для вывода срока доставки.

Расчет в карточке товара

Для расчета в карточке товара используется сниппет msCDEK. Его параметры:
&tpl — Чанк оформления. По умолчанию: 'tpl.msCDEK.delivery'
&tariffId — ID тарифа. По умолчанию: '1' (Экспресс-Лайт Дверь-Дверь)
&weight — Вес отправления. По умолчанию: '1'
&to — ID пункта назначения. По умолчанию:'44' (Москва)
&toPlaceholder — Если указано, все результаты сохраняются в плейсхолдер с указанным именем. По умолчанию: 'false'

Системные настройки

mscdek_from_cityid — ID места отправления. По умолчанию: '137' (г. Санкт-Петербург)
ms2_delivery_weight_in_kg — Если включено, то вес отправления считается в килограммах. В противном случае – в граммах. По умолчанию: Включено
mscdek_cities_list — Путь к файлу с массивом городов и ID в сериализованном виде. По умолчанию:'libs/city_c_rus.ser'
mscdek_default_size — Размер одной стороны отправления, указывается в см. Используется «для галочки», менять не нужно. По умолчанию: 1
mscdek_login — Имя пользователя для интеграции. По умолчанию: ''
mscdek_password — Пароль для интеграции. По умолчанию: ''

О логине и пароле:
Логин (Account), выдается компанией СДЭК по вашему запросу. Обязательны для учета индивидуальных тарифов и учета условий доставок по тарифам «посылка». Запрос необходимо отправить на адрес integrator@cdek.ru с указанием номера договора со СДЭК. ВАЖНО: Учетная запись для интеграции не совпадает с учетной записью доступа в Личный Кабинет СДЭК.

Совместимость с msRussianPost
Для вывода срока доставки используется отправка и обработка запроса происходит одинаково в обоих компонентах, используются переменные с одинаковыми названиями.
Это позволяет, например, корректно выводить результаты расчета для доставок через Почту России, используя чанки от msCDEK.

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

Тарифы и города

В комплекте с компонентом есть файлы с соответствиями названий и ID для городов и тарифов.
Список городов и их ID находится в файле /core/components/mscdek/docs/cities_rus.txt
Список тарифов и их ID находится в файле /core/components/mscdek/docs/tariffs_ids.txt

Добавление других типов доставки

Поддерживается работа со всеми тарифами СДЕК. Для этого необходимо создать новый метод доставки, указать в нем класс-обработчик msCDEKHandler, после чего через базу или иным способом занести в поле properties данного метода JSON массив:

{"tariffId":139,"name":"\u041f\u043e\u0441\u044b\u043b\u043a\u0430 \u0434\u0432\u0435\u0440\u044c-\u0434\u0432\u0435\u0440\u044c"}
tariffId — ID нужного тарифа
name — название. Не обязательно

______

Компонент можно будет приобрести в скором времени в магазине MODSTORE.PRO.Описание

msRussianPost позволяет рассчитывать стоимость доставки, с учетом веса заказа и стоимости всех товаров, для всех основных типов перевозок Почтой России.

В тексте упоминается компонент msCDEK — его описание появится в скором времени.

Особенности

  1. Учет стоимости и веса товаров в заказе
  2. Вывод стоимости доставки с учетом страхования
  3. Вывод сроков доставки
  4. Сниппет для расчета доставки в карточке товара
  5. Кэширование результатов расчета
  6. Совместимость с msCDEK при расчете сроков доставки

Поддерживаемые типы отправлений:

  1. Простая бандероль
  2. Заказная бандероль
  3. Заказная бандероль 1 класс
  4. Ценная бандероль
  5. Ценная посылка
  6. Ценная авиабандероль
  7. Ценная авиапосылка
  8. Ценная бандероль 1 класс
  9. Курьерская доставка EMS
Помимо стоимости, рассчитывается срок доставки.
Данный компонент возможно использовать вместе с компонентом msCDEK – они унифицированы.


Установка

Шаг 1: только стоимость доставки
После установки создается 9 новых способов доставки, по умолчанию они все выключены. Включите требуемые, не забыв отметить доступные способы оплаты.
В чанке tpl.msOrder.outer замените поле ввода города на вызов чанка [[$tpl.msRussianPost.city]]. В данном чанке находится вызов сниппета для вывода списка городов и скрипт для динамического пересчета стоимости после выбора другого города

Шаг 2: срок доставки
В чанке tpl.msOrder.outer добавьте в удобное место вызов чанка [[$tpl.msRussianPost.time]], в нем находится контейнер для вывода срока доставки.

Расчет в карточке товара

Для расчета в карточке товара используется сниппет msRussianPost. Его параметры:
&tpl — Чанк оформления. По умолчанию: 'tpl.msRussianPost.delivery'
&sending — Тип отправления, указывается название. По умолчанию: 'Ценная посылка'
&weight — Вес отправления. По умолчанию: '1'
&cost — Стоимость отправления в рублях. По умолчанию: '0'
&to — Пункт назначения. По умолчанию:'Москва'
&toPlaceholder — Если указано, все результаты сохраняются в плейсхолдер с указанным именем. По умолчанию: 'false'

Системные настройки

msrussianpost_from_index — Индекс места отправления. По умолчанию: '190000' (Главпочтамт г. Санкт-Петербург)
ms2_delivery_weight_in_kg — Если включено, то вес отправления считается в килограммах. В противном случае – в граммах. По умолчанию: Включено
msrussianpost_cache_ttl — Время жизни результатов расчета в кэше, в секундах. По умолчанию:'604800'
msrussianpost_response_to_modx_log — Возможность отправить ответ сервиса расчетов в лог ошибок MODX на уровне ERROR. Может быть полезно при разработке, но на реальных проектах настоятельно рекомендуется отключать. По умолчанию: Отключено

Совместимость с msCDEK
Для вывода срока доставки используется отправка и обработка запроса происходит одинаково в обоих компонентах, используются переменные с одинаковыми названиями.
Это позволяет, например, корректно выводить результаты расчета для доставок через Почту России, используя чанки от msCDEK.

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

Компонент можно будет приобрести в скором времени в магазине MODSTORE.PRO.

Спасибо сервису postcalc.ru за возможность создания данного компонента.

Обновлено 26.09.2017


С текущего момента поддержкой компонента занимается Павел Карелин.
Воеводский Михаил
29 июля 2015, 07:39
modx.pro
7 460
+7

Комментарии: 59

Воеводский Михаил
03 августа 2015, 18:27
0
Компонент доступен в магазине.
    Дмитрий
    22 декабря 2015, 14:14
    0
    Не рассчитывает срок доставки при входе user'а в личный кабинет (manager тоже самое).
    Если не логиниться то все работает ок.
    В логах ошибка

    [2015-12-22 11:34:39] (ERROR @ /var/www/~/core/components/mscdek/model/mscdek/mscdek.class.php: 89) PHP warning: in_array() expects parameter 2 to be array, null given
    [2015-12-22 11:34:39] (ERROR @ /var/www/~/core/components/mscdek/model/mscdek/mscdek.class.php: 245) PHP warning: array_search() expects parameter 2 to be array, null given

    подскажите как настроить
    Klike
    14 сентября 2016, 21:40
    0
    Михаил, возможно ли совместное использование с дополнением: GeoLocation, для автоматического определения местоположения посетителя. И соответственно, с дальнейшей подстановкой в вызов. (Например, в карточке товара, для примерного расчета стоимости и времени доставки)
      Воеводский Михаил
      15 сентября 2016, 00:29
      0
      Совместимость с GeoLocation не реализовывалась. Напишите в поддержке, укажите данные для доступа в админку — посмотрю.
        Klike
        15 сентября 2016, 15:28
        0
        Пока не приобрёл, просто раз есть возможность вывода срока доставки и стоимости в карточке товара, думал как-то определяется город посетителя сайта.
          Воеводский Михаил
          15 сентября 2016, 16:00
          0
          Вывод стоимости на странице товара возможен при указании сниппету города для расчета. Если у Вас будут оба компонента — посмотрю, возможно ли их совместить.
            Володя
            15 сентября 2016, 17:07
            0
            тогда можно указать выбранный город при вызове сниппета
            [[!+gl.selected.city.name_ru]]
          Klike
          11 января 2017, 08:48
          0
          Михаил, подскажите пожалуйста, как можно добавить все возможные города доставки CDEK в бд? Например, Сургута нет в списке. Можно, конечно, вручную его добавить, но как быть со всеми остальными?
            Воеводский Михаил
            11 января 2017, 13:50
            0
            Другого способа, кроме как вручную, нет. Поскольку города хранятся в БД, после обновления компонента список не будет обновлен/затерт, потому можно смело добавлять все необходимые города. Полный список городов на сайте СДЕК.
        Stan Ezersky
        19 ноября 2016, 13:43
        0
        del
          Александр
          19 декабря 2016, 12:40
          0
          Как вывести при оформлении заказа отдельно стоимость доставки?
          Александр
          21 декабря 2016, 11:40
          0
          Предусмотрены ли какие либо проверки и, соответственно, возвращаемые ошибки при работе модуля?
          ситуация такая: пользователь набрал товаров с общим весом большим чем максимально возможное по тарифу сдека, и возвращается нулевая цена доставки.
          в итоге заказ был оформлен и оплачен с нулевой стоимостью доставки.
            Воеводский Михаил
            21 декабря 2016, 11:45
            0
            Если Вы вызвали чанк для отображения срока доставки, то в нем отобразится сообщение «Извините, доставка не может быть рассчитана», это стандартный ответ самого сервиса СДЕК. Дополнительно к этому, будет заблокирована кнопка отправки заказа.
              Александр
              21 декабря 2016, 11:54
              0
              после решения предыдущего вопроса об отдельной стоимости доставки, чанк с временем доставки перестает отображаться.
              дилемма однако…
            Юрий
            02 февраля 2017, 11:42
            0
            Почему то не хочет считать доп. стоимость ни в процентах ни как. С чем может быть связано?
              Воеводский Михаил
              06 февраля 2017, 14:50
              1
              +1
              Не предусмотрено.

              В файле components/minishop2/custom/delivery/mscdekhandler.class.php замените тело метода getCost() на следующее:
              $addCost = parent::getCost($order, $delivery, $cost);
                      if ($this->getLocalService()) {
                          return $this->localService->getCost($order, $delivery, $cost) + ($addCost - $cost);
                      } else {
                          return $addCost;
                      }
              Данное изменение войдет в грядущее обновление компонента, однако, оно отложено на неопределенный срок.
              Алексей
              06 февраля 2017, 13:22
              0
              Собираюсь реализовать расчет срока доставки в карточке товара. Название населённого пункта я получаю по geoAPI. Судя по документации, получается, что мне нужно самостоятельно хранить в БД соответствие названий населённых пунктов и их id. Правильно я понимаю?
                Алексей
                06 февраля 2017, 13:25
                0
                Эти соответствия уже хранятся в БД, судя по комментам выше. Могу ли я получить срок доставки не по id, а по названию города?
                  Воеводский Михаил
                  06 февраля 2017, 14:43
                  0
                  В сниппет, как раз, необходимо передавать названия городов.
                Игорь Игамов
                16 февраля 2017, 02:14
                0
                Здравствуйте. В обновлении указано что добавили пункты доставок, скажите пожалуйста как их получить?
                Как еще получить выбранный город после Ajax запроса? Просто написал свой сниппет, который получает город, но только он работает после перезагрузки.
                Спасибо!
                  Denis S
                  26 февраля 2017, 14:09
                  0
                  Мне для рассчета доставки надо все города чтоб были, а не только областные центры!
                  Как это сделать и как сделать умную строку вводу города, чтоб было как у СДЭКА — payanyday.com/
                  вводишь пару букв он тебе варианты накидывает. Это важно, так как люди не только в Москве/ ЕКБ / Питере и тд живут, а еще и в поселках и деревнях Маленького Яичного))))

                      Дмитрий
                      26 февраля 2017, 17:21
                      0
                        Denis S
                        26 февраля 2017, 17:46
                        0
                        Это не решение. Это в принципе по умолчанию в модуле должно быть, ибо иначе он полумертвый
                          Denis S
                          26 февраля 2017, 17:58
                          0
                          а вы это реализовывали? если совет дали) сколько возьмете?
                            Дмитрий
                            27 февраля 2017, 10:34
                            0
                            Именно такое не делал, но делал подобное. Могу сделать, напишите на почту, обсудим.
                          Воеводский Михаил
                          27 февраля 2017, 02:47
                          0
                          Подобное в планах, но срок реализации не назову. В качестве временного решения возможно добавить все города в базу, а к выпадающему списку с названиями городов добавить простой в использовании selectpicker.
                          Denis S
                          27 февраля 2017, 13:08
                          0
                          Когда выбираешь — АНАДЫРЬ!
                          Извините, доставка не может быть рассчитана. Код ошибки: 3
                          Что значит?
                            Воеводский Михаил
                            27 февраля 2017, 13:38
                            0
                            Это стандартный ответ от СДЕК без пояснений. Мб, превышен вес либо выбран вариант доставки до склада, но в Анадыре нет пунктов выдачи.
                            Denis S
                            03 марта 2017, 09:39
                            0
                            Михаил, мне сделали города умным поиском, но у вас в модуле косяк! Больше 5000 городов как вводишь модуль дохнет! А у нас в РФ пунктов выдачи почти 7000!!! Решите вопрос!
                              Воеводский Михаил
                              05 марта 2017, 04:11
                              0
                              Денис, достаточно написать только в поддержку, дублировать сразу везде не требуется. В течение 1-2 дней обновлю компонент в магазине.
                              Андрей Коробков
                              04 июля 2017, 23:45
                              0
                              Михаил, возможно ли через ваш компонент для определенного списка городов, получать адреса офисов? Желательно с координатами google.maps
                                Воеводский Михаил
                                04 июля 2017, 23:57
                                0
                                Сниппет msCDEKPoints по переданному названию города получает список адресов пунктов выдачи в этом городе. Важно: название города должно точно совпадать с записью в БД. Самый простой способ проверить — использовать ввод названия города с автодополнением.
                                  Андрей Коробков
                                  05 июля 2017, 00:08
                                  0
                                  Михаил, спасибо за быстрый ответ. Сниппет получает только адреса? Какие-нибудь координаты выдаются (google, ya)?
                                  Автодополнение — это от кого использовать?
                                    Воеводский Михаил
                                    05 июля 2017, 00:09
                                    0
                                    В текущей версии — только адреса. Можно получать любую информацию о пунктах, добавлю задачу в очередь.
                                      Андрей Коробков
                                      05 июля 2017, 00:47
                                      0
                                      Михаил, еще два вопроса:
                                      1. Любую — это какую? Режим работы возможно получить (дни недели, время)?
                                      2. Сайт на поддоменах, т.е. каждый город — поддомен — будет на них работать?
                                        Воеводский Михаил
                                        05 июля 2017, 00:55
                                        0
                                        1) СДЕК предоставляет очень подробную информацию о пунктах. Пример для Санкт-Петербурга: integration.cdek.ru/pvzlist.php?type=PVZ&cityid=137
                                        2) Сниппету абсолютно все равно, где он работает. Главное — в параметре &city передать правильное название города
                                  mngatoff
                                  11 июля 2017, 12:50
                                  0
                                  я что-то недоразобрался… у меня в селекто вообще нет городов, а в автокомплите всякая шушера — вводишь «Москва», получаешь всё что угодно кроме москвы — все пригороды и т д. Даже если прям написать «Москва», выбирается пригород. в том числе куча мест, при выборе которых не меняется сумма заказа. То есть, туда видимо не доставляют этим способом. Как бы это пофиксить? где я неправ?
                                    mngatoff
                                    11 июля 2017, 13:01
                                    0
                                    а с geolocation это всё не поженить?
                                    Воеводский Михаил
                                    11 июля 2017, 13:10
                                    0
                                    В селекте будут все города — больше 16 000. Он оставлен только в целях совместимости для тех, кто не обновит список стран и городов при обновлении компонента.

                                    В автодополнении по алфавиту выводятся все населенные пункты, в полное наименование которых входит введенное значение. В частности, Москва. В следующем обновлении добавлю вывод совпадающего значения на первое место.
                                      mngatoff
                                      11 июля 2017, 13:16
                                      0
                                      как бы исключать из списка города, в которые доставка не работает? или сообщение выводить — что сюда нельзя?

                                      спасибо, про селект понял.

                                      и еще, было бы здорово добавить функционал выгрузки заказов в сдэк — либо через интеграцию, либо хотя бы в виде экспорта таблицы в нужном формате
                                        Воеводский Михаил
                                        11 июля 2017, 13:18
                                        0
                                        1) Если выводить время доставки, то при невозможности в этом блоке отображается сообщение
                                        2) Можно подробнее о формате? Возможно, получится добавить.
                                mngatoff
                                01 августа 2017, 17:01
                                0
                                так, то что селект для выбора пунктов надо добавить самому это понятно. А куда пишется выбранное значение? какой должен быть name у селекта?
                                и где в админке инфа по выбранным способам?
                                  Воеводский Михаил
                                  01 августа 2017, 17:04
                                  0
                                  <div><select id="deliveryPoints" class="form-control" name="deliveryPoint"></select></div>
                                  Информация о выбранном пункте выдачи записывается в комментарий к заказу.
                                  Алеша
                                  26 сентября 2017, 11:40
                                  0
                                  Камрады, подскажите, кто как выводит сниппет на странице товара? У меня просто белый экран
                                    Павел Карелин
                                    26 сентября 2017, 23:52
                                    0
                                    В компоненте присутствовали пара ошибок. Скоро будет обновление. Если кому то не терпится.
                                    /assets/components/mscdek/js/web/default.js
                                    $(function () {
                                                if (APPConfig.$city_select["0"].nodeName == "SELECT") {
                                                    APPConfig.$city_select.on('change', function () {
                                                        console.log('change');
                                                        miniShop2.Order.add('city', $(this).val());
                                                        delivery_reset();
                                                        //  delivery_getPoints();
                                                    });
                                                    $.post('/assets/components/mscdek/action.php', {mscdek_action: "delivery/getcities"}, function (success) {
                                                        miniShop2.Order.add('city', '');
                                                        APPConfig.$city_select.html('<option value="">  Выберите  </option>' + success);
                                                    });
                                                } else if (APPConfig.$city_select["0"].nodeName == "INPUT") {
                                                    APPConfig.$city_select.on('keyup', citySelectFunc);
                                                    selectID = document.getElementById("city_select");
                                                    selectID.addEventListener('cut', citySelectFunc);
                                                    selectID.addEventListener('paste', citySelectFunc);
                                                }
                                    }());
                                    на
                                    $(function () {
                                            if (typeof APPConfig.$city_select["0"] !== "undefined") {
                                                if (APPConfig.$city_select["0"].nodeName == "SELECT") {
                                                    APPConfig.$city_select.on('change', function () {
                                                        console.log('change');
                                                        miniShop2.Order.add('city', $(this).val());
                                                        delivery_reset();
                                                        //  delivery_getPoints();
                                                    });
                                                    $.post('/assets/components/mscdek/action.php', {mscdek_action: "delivery/getcities"}, function (success) {
                                                        miniShop2.Order.add('city', '');
                                                        APPConfig.$city_select.html('<option value="">  Выберите  </option>' + success);
                                                    });
                                                } else if (APPConfig.$city_select["0"].nodeName == "INPUT") {
                                                    APPConfig.$city_select.on('keyup', citySelectFunc);
                                                    selectID = document.getElementById("city_select");
                                                    selectID.addEventListener('cut', citySelectFunc);
                                                    selectID.addEventListener('paste', citySelectFunc);
                                                }
                                            }
                                    }());
                                    Содержимое чанка chunk.delivery.tpl на
                                    <p>Стоимость доставки: [[+priceByCurrency]] [[+currency]] </p>
                                    <p>Время доставки: [[+time]] дней</p>
                                    msCDEK/core/components/mscdek/model/mscdek/mscdek.class.php
                                    $goodsDimensions = array(array('weight' => $weightOrGoodsDimensions));
                                    на
                                    $goodsDimensions = array('weight' => $weightOrGoodsDimensions);
                                    Билд соберу думаю в конце этой недели.
                                    Воеводский Михаил
                                    26 сентября 2017, 21:29
                                    0
                                    С сегодняшнего дня поддержкой компонента занимается Павел Карелин.
                                      Сергей Кепкин
                                      03 октября 2017, 14:08
                                      0
                                      Подскажите, если выводится сообщение «неопределенное количество» — это что имеется ввиду с точки зрения СДЭК?
                                        Сергей Кепкин
                                        03 октября 2017, 15:15
                                        0
                                        Адлер почему не определяется? Ладно там какие-то Овинки, но Адлер-то?? На оригинальном сайте все находит, через плагин почему-то нет.
                                          Сергей Кепкин
                                          10 октября 2017, 14:25
                                          0
                                          Подскажите, как заменить выбор города более удобным инструментом, например, если нужен список из всего 10 городов, как отправлять выбранный город в Ваш сниппет?
                                          <select name="city">
                                              <option disabled>Выберите город</option>
                                              <option value="Чебурашка">Чебурашка</option>
                                              <option selected value="Крокодил Гена">Крокодил Гена</option>
                                              <option value="Шапокляк">Шапокляк</option>
                                              <option value="Крыса Лариса">Крыса Лариса</option>
                                          </select>
                                            Rrp2010
                                            24 октября 2017, 17:02
                                            +1
                                            Интересно, когда обновится документация?
                                            Павел Карелин
                                            27 октября 2017, 12:29
                                            0
                                            msCDEK исключен из продажи до той поры пока у меня не получится его переписать. Если кто то жаждет переписать компонент нормально с нуля, милости просим. Я подозреваю будет лес рук.
                                              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                              59