Модуль "Доставка за 30 минут"

Плагин для доставки за 30 минут через вызов водителя такси, велокурьера, грузовика, робота-доставщика. Поддерживаются сервисы Яндекс Доставка и Достависта.

Подходит для доставки горячей еды, товаров, мебели.

Основные возможности

  • Расчёт стоимости доставки в момент оформления заказа.
  • Установка и настройка за 5 минут. Просто укажите 3 настройки: API ключ яндекс доставки, API ключ яндекс карт, адрес вашего склада, создайте службу доставки и модуль готов к работе.
  • Полная поддержка робота-доставщика.
  • Поддержка всех стран и валют: Россия, Казахстан, Беларусь и другие страны.
  • Подходит для фастфуда и ресторанов. Можно заказать курьера с термосумкой.
  • Подходит для крупногабаритной доставки.
  • Расчёт конечной стоимости доставки во время оформления заказа. И фиксация цены на 10 минут.
  • Работа напрямую с кабинетом и API яндекс доставки. Никаких посреднических договоров и сервисов.
  • Выбор из нескольких вариантов доставки с разной ценой и временем доставки.
  • Возможность отложить приезд курьера на период от 30 до 240 минут, если менеджеру нужно время на сборку заказа.
  • События Битрикс, через которые можно гибко настраивать работу модуля под себя.
  • Изменение внешнего вида через стандартное изменение шаблона компонента в Битрикс.
  • Указание адреса точкой на карте. Например, если пункт назначения — точка на трассе или определённый заезд в промышленной зоне.
  • Подробнейшая документация для пользователей и разработчиков.
  • Передача ID заказа в интерфейсе служб доставки.
  • Онлайн-техподдержка в телеграм @pavelphp напрямую с разработчиком. Будьте уверены, что любая ваша проблема будет решена в течение 1–2 дней. Срочные проблемы — раньше. Также можете написать по любым вопросам на почту pavel@pavelphp.ru. Возможна техподдержка онлайн через демонстрацию экрана.

Интерфейс пользователя

  • Для оформления доставки через вызов курьера пользователь выбирает способ доставки. Выбор способа доставки
  • Затем указывает адрес кликнув на карте или через форму поиска адреса. Выбор адреса доставки
  • Далее выбирает одно из ценовых предложений. Выбор тарифа

Для служб доставки, которые предоставляют возможность фиксировать цену, цена будет зафиксированна. При создании заявки цена будет точно такой же, как указана у пользователя. Если в настройках модуля выбрана опция «Подтвердить заявку при оплате», то после оплаты заказ в доставке автоматически подтвердится и начнётся поиск курьера.

Интерфейс менеджера интернет-магазина

Подтверждение заявки на доставку

На странице просмотра заказа в административной панели появится «вкладка Доставка 30 минут», из неё менеджер может:

  • Создавать, обновлять данные и отменять заявку на доставку.
  • Для Яндекс доставки доступно открытие крышки робота-доставщика, а также запрос телефона курьера.

Установка

  1. Загрузите модуль из маркетплейса.
  2. Установите его через административную панель. Зайдите «Marketplace» → «Установленные решения». В списке найдите модуль «Доставка за 30 минут», наведите мышку на 3 полоски слева и выберите пункт «Установить».

Настройка

  1. Откройте страницу настроек модуля: «Настройки» → «Настройки продукта» → «Настройки модулей» → «Доставка за 30 минут». Либо откройте страницу https://[ваш сайт]/bitrix/admin/settings.php?lang=ru&mid=pavelphp.kurerskiedostavki&mid_menu=1.
  2. Заполните 4 обязательных поля: токен яндекс доставки или токен Dostavista, токен Яндекс карт, адрес склада, координаты склада. Также реккомендуем заполнить «Имя контактного лица», «Телефон контактного лица» и «Инструкции для водителя».
  3. Нажмите сохранить.
  4. В административной панели откройте «Магазин» → «Настройки» → «Службы доставки». Либо откройте страницу https://[ваш сайт]/bitrix/admin/sale_delivery_service_list.php?lang=ru&filter_group=0.
  5. Нажмите на стрелку справа от кнопки «Добавить» и выберите пункт «Доставка 30 минут».
  6. Нажмите сохранить.

После этого можно полноценно пользоваться доставкой. На странице оформления заказа появится пункт «Доставка за 30 минут».

Регистрация в яндекс доставки и получение API токена интеграции

Для начала работы с Яндекс Доставкой нужно:

  1. Зарегистрироваться или войти в кабинет по адресу https://dostavka.yandex.ru.
  2. Привязать компанию или ИП.
  3. Пополнить счёт Яндекс Доставки, сделав платёж с расчётного счёта вашей компании или ИП на реквизиты Яндекс Доставки на 500 рублей. Но мы рекомендуем пополнить минимум на 2000 рублей. В назначении платежа укажите номер договора с Яндекс Доставкой. Реквизиты доступны в разделе «Контакты». Реквизиты Яндекс Доставки
  4. Дождитесь пока ваш платёж обработают и статус привязки вашей компании обновится.
  5. Перейдите на вкладку «Интеграции». Яндекс Доставка вкладка интеграции
  6. В разделе «Активируйте интеграцию», нажмите «Получить токен». Яндекс Доставка окно с токеном
  7. Укажите этот токен в настройках модуля. dostavista-forma-registracii.png

Регистрация в Dostavista и получение API токена интеграции

Для начала работы с Dostavista нужно:

  1. Зарегистрироваться или войти в качестве юридического лица в рабочий кабинет по адресу https://dostavista.ru/ и в тестовый кабинет по адресу https://apitest.dostavista.ru/. Всего 2 кабинета.
  2. В рабочем кабинете заполните данные договора в форме. Пример заполнения формы регистрации достависта
  3. Наведите курсор в правый верхний угол на название своего профила, всплывёт окно, нажмите на кнопку «Пополнить». Пополните баланс на 500 рублей с рассчётного счёта компании или ИП. Но мы рекомендуем пополнить минимум на 2000 рублей.
  4. В тестовом кабинете навести курсор на блок с вашим именем в правом верхнем углу и открыть раздел «Настройки» -> «Интеграции».
  5. Нажмите на кнопку «Скопировать токен» и укажите его в настройках модуля. Пример заполнения формы регистрации достависта
  6. Включите режим отладки в настройках модуля и сделайте несколько заказов.
  7. После этого согласно официальной документации напишите на адрес api@dostavista.ru с просьбой открыть вам доступ к API интеграции в рабочем кабинете.
  8. Повторите шаг 4 для рабочего кабинета и выключите режим отладки из шага 5.

Получение API токена яндекс карт

  1. Откройте кабинет разработчика https://yandex.ru/maps-api/console.
  2. Откройте раздел «Ключи». Нажмите на кнопку «Новый ключ». Окно добавления нового ключа в яндекс картах
  3. Для пункта «Продукт» выберите «JavaScript API». В поле «Название ключа» укажите любое название. Нажмите «Создать ключ». В таблице появится созданный ключь Таблица с ключами в яндекс картах
  4. Для созданного ключа откройте меню, нажав на многоточие слева от ключа, и выберите пункт «Привязать продукт». Меню редактирования ключа в яндекс картах
  5. В появившемся окне выберите «API Геосаджеста» и нажмите «Привязать продукт». Окно привязки продукта в яндекс картах
  6. Снова откройте меню и выберите пункт «Настройки».
  7. В поле «Ограничение по HTTP Referer» укажите домен вашего сайта. Нажмите «Создать».
  8. Запись о ключе должна выглядеть примерно так. Окно настроки ключа в яндекс картах
  9. Укажите значение из столбца «Значение ключа» в настройках модуля.

Опции модуля

Настройки модуля расположены на странице https://[ваш сайт]/bitrix/admin/settings.php?lang=ru&mid=pavelphp.kurerskiedostavki&mid_menu=1.

  • Токен яндекс доставки. Создаётся в личном кабинете Яндекс Доставки в разделе «Интеграция». Пример: y0__wgBEJuzHGJGJD8762GLRU1aCGMHSBHqCPXnh645CcTK.
  • Токен яндекс доставки. Создаётся в личном кабинете Dostavista в разделе «Интеграции». Пример: 7002B5AA6112EC1074E2795C8E0106938B6F3CBD.
  • Метод рассчёта цены Яндекс Метод Яндекс API, которым рассчитывается стоимость доставки для создания заявки. Выбор зависит от страны, где осуществляется доставка.
  • Токен Яндекс карт. Создаётся в кабинете управления яндекс картами. Пример: 48df0ca6-f242-acd0-91a8-98eed091a72c.
  • Адрес склада. Откуда забирать товар водителю. Пример: Москва, Петровско-Разумовская аллея, 12Ас7, офис 17
  • Координаты склада. Широта и долгота через запятую. Пример: 55.795347, 37.560934.
  • Инструкции для водителя. Эта информация отобразится в приложении водителя, когда он будет брать заказ на складе. Пример: Подняться в БЦ на второй этаж, пройти в кабинет №215, позвонить в дверь.
  • Имя контактного лица. Контактное лицо вашей компании, с которым водитель сможет связаться при необходимости. Пример: Менеджер Елена.
  • Телефон контактного лица. Контактное лицо вашей компании, с которым водитель сможет связаться при необходимости. Пример: +7 123 456-78-90.
  • По умолчанию доставка от двери до двери. При оформлении заказа, опция от двери до двери будет включена по умолчанию. Но клиент сможет её отключить.
  • Возврат товара водителем. Если клиент не примет заказ, водитель вернёт товар в пункт назначения, а не оставит себе. Рекоммендуется отключить, так стоимость тарифа доставки при расчёте будет дешевле до 75%.
  • Доставка товара роботом. Включить в варианты доставки Яндекс Доставки, доставку с помощью робота-доставщика.
  • Термосумка. Требование к курьеру, что у него должна быть термосумка.
  • Отправить СМС. Попросить сервис доставки отправить СМС пользователю. Рекоммендуется включить для повышения сервиса. Отключать стоит в случаях, когда вы сами отправляете СМС, и вам нужно чтобы сервис доставки не отправлял дубликат.
  • Грузчики. Сколько грузчиков требуется включая водителя.
  • Режим отладки. Запросы к API модулей будут отправляться на тестовые API, а для Яндекс Доставки заказа будут создаваться не подтверждёнными.
  • Создать заявку при оплате. При оплате заказа, для заказа будет создана заявка на доставку.
  • Размер товара по умолчанию. Если у товара в характеристиках не заполнена информация о его размере, то это значение будет использовано по умолчанию. Если реальный размер заказа и размер заказа, переданный в заявку Яндекс Доставки сильно отличаются, то водитель вправе отказаться от доставки. Но решение он принимает самостоятельно.
  • Вес товара по умолчанию. Вес товара по умолчанию, если не указанно иное.
  • Локаль. Язык сообщений от API Яндекс Доставки.
  • Язык яндекс карты. Язык, на котором будут показываться адреса и карта.
  • Включить логирование. Логирование всех запросов к API яндекс доставки. Полезно для отладки. Все записи хранятся в административной панели.
  • Селектор формы заказа. CSS селектор до тега form на странице оформления заказа. Нужен для работы окна выбора адреса на странице оформления заказа. Для стандартного компонента равен #bx-soa-order-form
  • Период обновления заявок. Берутся все заказы, чьё последнее изменение статуса произошло в течение указанного количества дней, если у них есть не отменённые или не выполненные заявки яндекс доставки, то происходит запрос к яндекс API для обновления информации. Обновление происходит раз в минуту.
  • Хранить логи. Как долго хранить лог запросов к API сервисов доставки.

Настройка для стран кроме России

В настройках модуля выберите значение check-price у опции «Метод рассчёта цены».

Важные нюансы

  • Убедитесь что на счёте достаточно средств. Получить расчёт стоимости по заказу будет невозможно, если стоимость заказа больше остатка суммы на счёте.

Как сделать доставку дешевле?

  • В личном кабинете Яндекс Доставки в разделе «Настройки доставки» обратите внимание на настройку «Приоритет в API» о приоритете стоимости и скорости. Возможно, вам будет интересно, выбрать вариант оптимизации по стоимости.
  • Для Достависы откажитесь от опции возврата товара. Она добавляет к стоимости +75%.
  • При оформлении заказа несколько раз обновите цены. Сервисы доставки могут выдавать цену +-150 руб для подряд идущих запросов с интерфалом 1-2 секунды.

Кастомизация

Мы сделали наш модуль гибким и максимально дружелюбным к адаптации функционала под ваши задачи. Ниже перечислены примеры реализации частых доработок.

Адаптация под свой шаблон

Чтобы сменить дизайн, скопируйте папку /bitrix/components/pavelphp/create.delivery.claim/templates/.default/ в папку вашего шаблона сайта. Затем поменяйте дизайн. Это стандартный способ изменения шаблона в Битрикс.

Указание габаритов и веса товаров

Габариты и вес товаров берутся из стандартных свойств торгового каталога Битрикс. Но если вам нужна какая-то дополнительная логика, то используйте события OnBeforeSendCreateClaim. С помощью него вы можете получать и изменять все поля товаров.

Указание маркировки

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

Заполнять подхезд, квартиру, этаж, код домофона

Если на странице оформления заказа у вас присутствуют эти поля, то чтобы передать их в форму оформления заявки, вам надо модифицировать шаблон компонента pavelphp:order.ajax.logic. В нём в обработчике события pavelphp.kurerskiedostavki_askOrderInfo добавить новые данные для передачи в iframe оформления заказа.

Далее, в шаблоне компонента pavelphp:create.delivery.claim в событии pavelphp.kurerskiedostavki_setOrderInfo использовать эти поля для заполнения формы.

Вывод данных о доставке в личном кабинете пользователя

Чтобы получить данные о заявке на доставку, используйте следующий код:

<?php
// Номер заказа
$orderID = '10';
Loader::includeModule('pavelphp.kurerskiedostavki');
$ClaimRecord = \pavelphp\kurerskiedostavki\ClaimTable::getList([
    'filter' => ['ORDER_ID' => orderID],
    'order' => ['CREATED_AT' => 'DESC'],
])->fetch();
// Тут содержится ответ API сервиса доставки со всеми данными
$claim_responce = json_decode($ClaimRecord['DATA'], true);
// Тут содержится унифицированный для всех служб доставки объект \pavelphp\kurerskiedostavki\Claim с информацией о доставке
$Claim = unserialize($ClaimRecord['CLAIM']);
// Получаем название класса работы с API используемого сервиса доставки
$delivery_service = $ClaimRecord['DELIVERY_SERVICE'];
$deliverClass = Helper::getServiceClass($delivery_service);
// Получаем унифицированные данные о статусе доставке
$statusInfo = $seriveClass::getClaimStatusInfo($Claim->service_status);
// Узнаём конечный ли статус у заказа, будет ли он ещё меняться, активен ли он.
$isActive = $seriveClass::isActiveStatus($Claim->service_status);
?>

Далее, просто выведите полученные данные в шаблоне компонента. Например:

Статус заказа: <?=$statusInfo['human_status']. ' ('.$Claim->service_status.')'?>
Информация о курьере:<br />
Имя: <?=$Claim->courier_name?><br />
Телефон: <?=$Claim->courier_phone?><br />
Автомобиль: <?=$Claim->courier_info?><br />

Сообщения об ошибках

При вводе адреса в яндекс картах выводится ошибка "Сервер не смог обработать запрос"

В настройках яндекс карт нужно включить API Геосаджеста.

Ошибки в консоли браузера

В консоли браузера могут появиться сообщения об ошибках с префиксом ERROR_kurerskiedostavki.

  • ERROR_kurerskiedostavki_CANT_FIND_FORM - не можем найти форму оформления заказа по стандартному селектору #bx-soa-order-form, чтобы провести с ней нужные манипуляции. Скорее всего, вы используйте кастомный шаблон компонента sale.order.ajax. Заполните поле «Селектор формы заказа» в настройках модуля таким значением, чтобы этот селектор выбирал форму оформления заказа.

Документация для разработчиков

Модуль содержит 2 компонента:

  • pavelphp:create.delivery.claim - компонент для оформления заявки на доставку. Именно в нём отображается карта, варианты доставки и происходит подтверждение заявки. Любые модификации дизайна и логики возможны простым переопределением шаблона компонента.
  • pavelphp:order.ajax.logic - автоматически подключается при выводе компонента bitrix:sale.order.ajax. Содержит логику работы модуля для страницы оформления заказа. Любые модификации возможны простым переопределением шаблона компонента.

Модуль использует 3 таблицы:

  • pavelphp_kurerskiedostavki_log - хранит HTTP запросы к API сервиса доставки. Можно отключить логирование через настройки модуля.
  • pavelphp_kurerskiedostavki_claim - хранит последнюю полученную актуальную информацию о заявах на доставку у сервиса доставки.
  • pavelphp_kurerskiedostavki_user_choose - хранит информацию о доставке указанную пользователем при оформлении заказа.

Основные классы:

  • pavelphp\kurerskiedostavki\Helper - вспомогательные функции.
  • pavelphp\kurerskiedostavki\Handlers - содержит функции для событий битрикс.
  • pavelphp\kurerskiedostavki\YandexAPI - методы для работы с API яндекс доставки.
  • pavelphp\kurerskiedostavki\DostavistaAPI - методы для работы с API Достависта.
  • pavelphp\kurerskiedostavki\Claim - унифицированная структура для хранения данных о доставки.
  • pavelphp\kurerskiedostavki\DeliveryOffer - унифицированная структура для хранения данных о варианте доставки.
  • pavelphp\kurerskiedostavki\UserChoose - структура для хранения данных, которые заполнял пользователь при оформлении доставки.
  • pavelphp\kurerskiedostavki\ResponseError - в случае, если запрос к API завершился ошибкой, то вернётся этот объект.

События

Используйте события для модификации запросов и ответов к API сервисов доставки.

Пример создания собственного обработчика события.

<?php
// Расположите этот код в файле bitrix/php_interfce/init.php либо local/php_interfce/init.php
use Bitrix\Main\EventManager;
use Bitrix\Main\Entity\EventResult;
$eventManager = EventManager::getInstance();
$eventManager->addEventHandler(
    'pavelphp.kurerskiedostavki',
    'OnBeforeSendCreateClaim',
    function (\Bitrix\Main\Event $event) {
        // Получаем параметры события
        $params = $event->getParameters();
        // Записываем данные в лог
        \Bitrix\Main\Diag\Debug::writeToFile(
                $params,
                'params',
                'events_kurerskiedostavki.log'
            );
        // Изменяем данные
        $params['POST_DATA']['route_points'] = [];
        // Сохраняем данные
        $result = new EventResult;
        $result->modifyFields($params);
        // Возвращаем результат
        return $result;
    });
?>

OnBeforeSendCreateClaim

Вызывается перед отправкой запроса на создание заявки методом claims/create. Параметры:

  • POST_DATA - содержит все данные о заявке. Можно изменить.
  • INFO - дополнительная информация по запросу.
  • INFO.URL - url по которому отправляются данные
  • INFO.DELIVERY_SERVICE - код службы доставки.

OnAfterSendCreateClaim

Вызывается после отправки запроса на создание заявки методом claims/create. Параметры:

  • RESPONSE - содержит ответ от яндекс API. Можно изменить.
  • INFO - дополнительная информация по запросу.
  • INFO.URL - url по которому отправляются данные.
  • INFO.DELIVERY_SERVICE - код службы доставки.
  • INFO.REQUEST - данные, отправленные при запросе.
  • INFO.STATUS - код статуса.

OnBeforeSendGetPrice

Вызывается перед отправкой запроса на расчёт цен на доставку методом offers/calculate. Параметры:

  • POST_DATA - содержит все данные о заявке. Можно изменить.
  • INFO - дополнительная информация по запросу.
  • INFO.URL - url по которому отправляются данные
  • INFO.DELIVERY_SERVICE - код службы доставки.

OnAfterSendGetPrice

Вызывается после отправки запроса на расчёт цен на доставку методом offers/calculate. Параметры:

  • RESPONSE - содержит ответ от яндекс API. Можно изменить.
  • INFO - дополнительная информация по запросу.
  • INFO.URL - url по которому отправляются данные.
  • INFO.DELIVERY_SERVICE - код службы доставки.
  • INFO.REQUEST - данные, отправленные при запросе.
  • INFO.STATUS - код статуса.

OnBeforeSendGetInfo

Вызывается перед отправкой запроса на расчёт цен на доставку методом offers/calculate. Параметры:

  • INFO - дополнительная информация по запросу.
  • INFO.URL - url по которому отправляются данные.
  • INFO.DELIVERY_SERVICE - код службы доставки.

OnAfterSendGetInfo

Вызывается после отправки запроса на обновление информации о заявке методом claims/info. Параметры:

  • RESPONSE - содержит ответ от яндекс API. Можно изменить.
  • INFO - дополнительная информация по запросу.
  • INFO.URL - url по которому отправляются данные.
  • INFO.DELIVERY_SERVICE - код службы доставки.
  • INFO.REQUEST - данные, отправленные при запросе.
  • INFO.STATUS - код статуса.

OnClaimStatusChanged

Вызывается когда после обновления заявки, статус заявки меняется.

  • OLD_DATA - старые данные о заявке. Если заявка новая, то будет содержать значение NULL.
  • NEW_DATA - новые обновлённые данные о заявке.
  • INFO - дополнительная информация по событию.
  • INFO.DELIVERY_SERVICE - код службы доставки.

Вопросы и ответы

Отсутствуют способы доставки на 2 шаге

Возможные причины:

  1. На вашем счёте в личном кабинете яндекс недостаточно средств на оформление доставки. Яндекс выдаёт только те варианты доставок, для которых на лицевом счёте достаточно средств. Если вы создадите заявку на доставку, а на её оплату будет недостаточно средств, то она отменится со статусом estimating_failed. Желательно, чтобы сумма на счёте была с запасом на 1000 руб. и более, чтобы учесть непредвиденные затраты на возврат товара курьером или штрафы.
  2. В настройках Яндекс Доставки ограничены способы доставки. Например, запрещена доставка на автомобиле.

Чтобы определить проблему, попробуйте оформить аналогичный заказ на доставку через личный кабинет Яндекс Доставки, чтобы увидеть содержание ошибки.

Время в заявках спешит/отстаёт на несколько часов

Вам нужно настроить в Битриксе часовой пояс. Для этого зайдите в административную панель сайта.

  1. Перейдите в «Настройки» → «Настройки продукта» → «Настройки модулей».
  2. Выберите модуль «Главный модуль».
  3. В секции «Часовые пояса» установите галочку «Разрешить использование часовых поясов».
  4. В выпадающем списке «Часовой пояс сервера по умолчанию» укажите ваш часовой пояс.

Настройка часового пояса в Битрикс

Как указать точный подъезд к которому будет подъезжать водитель?

На странице настройки модуля в поле «Инструкции для водителя».

Как указать необходимость термосумки?

На странице настройки модуля в поле «Термосумка».

Это указывается в настройках модуля. Настройка работает для всех заказов. Если вам нужно гибко управлять требованием наличия/отсутствия термосумки, вы можете программно прописать собственную логику используя событие OnBeforeSendCreateClaim.

Как указать колличество грузчиков

На странице настройки модуля в поле «Грузчики».

Это указывается в настройках модуля. Настройка работает для всех заказов. Если вам нужно гибко управлять требованием наличия/отсутствия грузчиков, вы можете программно прописать собственную логику используя событие OnBeforeSendCreateClaim.

Автообновление заявки

Заявки обновляются каждую минуту через вызов агента \pavelphp\kurerskiedostavki\Handlers::updateAgent();.

Для оптимизации нагрузки запросы к API отправляются для заказа только, если выполняются следующие условия:

  1. Способ доставки заказа «Доставка за 30 минут».
  2. Статус заказа сменился N дней назад. По умолчанию N равен 3, но его можно настроить на странице настройки модуля.
  3. Заявка автивна, то есть находится не в статусах: отменена, завершена, ошибка.

Доработка плагина по ТЗ

Мы предоставляем услуги по платной доработке плагина под ваши задачи. Напишите нам в ТГ @pavelphp, на почту pavel@pavelphp.ru или по телефону +7 (967) 062-76-00 . Возможна помощь в режиме демонстрации экрана.