Есть два пути по добавлению своей логистики в AlterCPA — через хаки или стандартную службу доставки. Вариант хаков мощнее, серьёзнее, но требует понимания работы платформы. А вот через стандартную службу доставки можно привязать всё с помощью трёх ссылок и любой удобной реализации на любимом вами языке без вмешательства в код самой системы. Значит, такая штука доступна и в бесплатной AlterCPA Moe.
Общие принципы работы служб доставки мы уже разбирали в статье «Организация логистики в AlterCPA Pro и AlterCPA Moe«, рекомендую перечитать её и вспомнить, как и зачем мы играем в курьеров. Продвинутым технарям рекомендую изучить документацию службам доставки в хаках.
Как добавить стандартную службу доставки?
Логистика настраивается в разделе «Доставка» в управлении компанией. Вам нужно добавить новую службу с типом «Встроенная» или «Generic». Она располагает рядом полезных опций:
- Службу доставки нужно активировать после настройки. Если поставить галочку «По умолчанию», то именно она будет присваиваться всем поступающим лидам.
- При наличии URL трекинга, включите автоматический перенос заказов по статусам доставки. Так CRM сама перетащит лид в «Оплачен» или «Возврат», если логистика выдаст соответствующий статус.
- Цена и себестоимость доставки задаются фиксировано, она не поддерживает динамическое определение ценников перед отправкой с помощью наценки. Процент за расчётно-кассовое обслуживание (РКО) в себестоимости считается от цены заказа для покупателя, а не от себестоимости.
- С активным трекингом можно включить автоматическую отправку заказов в колл-центр обзвона доставки, если они зависают в каком-то из статусов на несколько дней.
- При наличии ссылки отправки, можно также автоматически добавлять заказы в курьерскую службу. Это особенно удобно при работе с фулфилментом: просто укажите статус, откуда посылку забрать и куда переложить. Рекомендую добавить вложенный статус для ошибок отправки — перетаскивать их в возврат сомнительно.
- Главная фишка встроенной службы доставки — возможность указать три ссылки интеграции, о которых и пойдёт речь в этой статье. Читаем и автоматизируем!
Важный момент: автоматику отправки можно будет настроить только после того, как вы укажете ссылку для отправки посылок. Пока служба не активна, туда можно вписать любой бред, сохранить, вернуться назад и провести нужные настройки.
В чём удобство её применения?
Она задумывалась как заглушка для курьерской службы, которая обслуживается вручную. Главное её преимущество — это три волшебных ссылки для веб-хуков:
- URL трекинга позволяет реализовать отслеживание посылки на всех этапах пути. Он должен получить трек-код посылки и выдать историю её статусов.
- URL отправки позволяет создавать посылки на стороне логистической службы. На него отсылаются данные заказа, а в ответ ожидается трек-код.
- URL документов позволяет добавить печать этикеток на посылки. Он должен выдать ссылку на файлы с документами.
Наш путь прост: создаём файлы на стороннем хостинге, добавляем ссылки на них в службу доставки и получаем готовый автоматизированный интерфейс логистики!
Особенности работы ссылок
Все три ссылки поддерживают макросы. С помощью макроса в ссылки трекинга и документов нужно вписать трек-код посылки или идентификатор заказа. Доступные макросы:
{code}
или{track}
— трек-код посылки, полученный при отправке.{order}
— идентификатор заказа на стороне CRM.{track:xxx}
— трекинг-параметр с названиемxxx
, полученный при отправке.
Дополнительные параметры могут использоваться, например, для указания внутреннего ID в конкретной службе доставки или любых других действий. Они извлекаются из поля meta
при отправке посылки.
Трекинг посылки
Опрос статусов посылок производится дважды в день автоматически. Оператор может проверить историю статусов вручную со страницы заказа. При получении определённых статусов, посылка автоматически переводится в статусы «Доставлено», «Оплачено» и «Возврат».
По указанному URL ваш логистический сервис должен выдать историю статусов в формате JSON в виде простого массива объектов, каждый из которых соответствует своему статусу. Соблюдение указанной ниже структуры является строго обязательным.
Объект статуса может содержать следующие поля:
status
— обязательное поле с символьным статусом доставки, список ниже.time
— обязательное поле со временем возникновения статуса в формате UNIX timestamp.country
— символьный ISO-код страны.zip
— индекс или ZIP-код.city
— город или населённый пункт.comment
— произвольный комментарий к статусу.
Поле status
может содержать одно из следующих значений:
wait
— посылка ожидает отправки.transfer
— посылка находится в пути, переводится в статус «Доставка».problem
— при доставке посылки возникли проблемы, требуется реакция поставщика.delivered
— посылка прибыла в пункт назначения, переводится в статус «Доставлено».paid
— посылка успешно выкуплена, переводится в статус «Оплачено».return
— посылка возвращена или утилизирована, переводится в статус «Возврат».comment
— произвольный комментарий, не меняющий состояние посылки.
Пример ответа функции может выглядеть вот так:
[ { "status":"delivered", "time":1234567890, "zip":"AB1234", "city":"Neverland" }, { "status":"paid", "time":1234567891, "comment":"Awesome!" } ]
Ссылка на проверку истории статусов посылки может выглядеть так:
https://yourlogistics/track.php?code={track}
Файл обработчика на PHP можно реализовать так:
<?php // Prepare the code and URL $code = filter_var( $_GET['code'] ); $url = "https://someotherlogiscits/track/$code" $status = []; // Status to status table $s2s = [ 123 => 'delivered', 234 => 'return', 345 => 'paid', 456 => 'problem' ]; // Converts service status to CRM status // Fetch the info from the service $reply = file_get_contents( $url ); $result = json_decode( $reply, true ); // Walt through statuses in tracking array foreach ( $result['tracking'] as $t ) { $stage = [ 'status' => $s2s[$t['status']] ?: 'comment', 'time' => strtotime($t['time']) ]; if ( $t['location'] ) $stage['city'] = $t['location']; if ( $t['geo'] ) $stage['country'] = $t['geo']; if ( $t['messages'] ) $stage['comment'] = implode( ' ', $t['messages'] ); $status[] = $stage; } // Show the results echo json_encode( $status );
В этом файле необходимо подготовить массив статусов в соответсвии со стандартом AlterCPA. Удобно использовать $s2s
для сопоставления статуса на стороне службы доставки со статусом AlterCPA. Если статусов нет или произошла ошибка — просто выдаём пустой массив.
Отправка посылки
Отправка посылок может производиться автоматически по расписанию или вручную с карточки заказа. CRM отправляет на указанную ссылку POST-запрос в формате JSON с данными заказа, поэтому использовать какие-либо макросы в ссылке отправки не обязательно.
По указанному URL ваш логистический сервис должен получить заказ в JSON, создать посылку и ответить в JSON-формате со следующими полями:
status
— статус отправки, может бытьok
илиerror
, обязательное поле.error
— код ошибки для статусаerror
, который осядет в логе отправки.message
— текстовое сообщение об ошибке, которое будет добавлено в изменения заказа.track
— трек-код для проверки посылки и распечатки документов, обязательное поле.price
— цена доставки посылки, которая будет записана в себестоимость доставки заказа.meta
— дополнительные поля, которые нужно добавить к заказу для дальнейшей проверки статусов, например ключ или дополнительный код. Указываются в виде ассоциативного массива поле-значение.
Заказ в виде ассоциативного массива с полями:
id
— идентификатор заказа на стороне CRM.name
— имя покупателя.phone
— телефон покупателя в международном формате, только цифры.email
— почта покупателя.country
— ISO-код страны покупателя, две буквы, нижний регистр.zip
,region
,city
,street
,address
— элементы адреса покупателя: индекс, регион, город, улица, дом.created
,approved
— время создания и подтверждения заказа в формате UNIX timestamp.price
— общая цена заказа, которая включает в себя цену товаров, доставки и наценки.delivery
— стоимость доставки заказа в составе цены.markup
— стоимость дополнительной наценки или скидки в составе цены.currency
— трёхбуквенный ISO-код валюты заказа.meta
— дополнительные поля заказа, зависят от настроек произвольных полей оффера.param
— внутренние параметры оффера.items
— товары в заказе.
Поле items
представлено массивом, в котором собраны вложенные в заказ товары. Массив содержит как минимум один элемент с основным товаром. Каждый товар представлен полями:
id
— внутренний идентификатор товарной позиции (оффера или товара)name
— название товара для покупателя.sku
— артикул товара или ID оффера.price
— цена за единицу товара.count
— количество товаров в заказе.param
— параметры товара из CRM, оптимально использовать их для передачи размеров и веса товара.
Пример запроса с полным составом заказа:
{ "id": 1707, "name": "John Doe", "phone": "79876543210", "email": "john.doe@gmail.com", "country": "ru", "zip": "127000", "region": "Moscow City", "city": "Moscow", "street": "Bolshaya Lubyanka", "address": "house 1", "created": 1658581026, "approved": 1658678174, "price": 1550, "delivery": 500, "markup": 50, "currency": "rub", "meta": { "prepaid": 1, "prepay": 550 }, "param": { "crm-id": "4132", "ref-code": "10" }, "items": [ { "id": 1, "name": "Cube Cat", "article": "cube", "price": 600, "count": 1, "param": { "weight": 100, "width": 21, "height": 16, "depth": 20 } }, { "id": 2, "name": "Green Hat", "article": "hat", "price": 400, "count": 1, "param": [] } ] }
Ссылка на отправку посылок может выглядеть так, макросы не нужны:
https://yourlogistics/send.php?token=secret
Пример файла обработчика для отправки заказов:
<?php // Get the lead data and make some magic $data = json_decode( file_get_contents('php://input'), true ); $result = makesomemagic( $data ); // Process the result if ( $result['success'] ) { $code = trim( $result['track'] ); $info = [ 'status' => 'ok', 'track' => $code, 'meta' => [ 'mode' => 'fullfillment' ] ]; } else $info = [ 'status' => 'error', 'message' => $result['error'] ]; // Show the result info echo json_encode( $info );
Как именно будет работать магия, которая связывает ваш файл с логистическим сервисом — решать только вам. Рекомендуется добавить какую-нибудь авторизацию в сам файл, например, использовать API-токен. Выдавать трек-код на выходе — обязательно.
Распечатка документов
Распечатка документов работает поштучно в карточке товара или массово в разделе «Заказы». При штучной обработке, оператор нажимает на кнопку «Документы» и открывает файл для распечатки. При массовой работе, сервис делает отдельный запрос по каждому заказу, скачивает файлы и формирует из них готовый архив.
По указанному URL ваш логистический сервис должен выдать ответ в формате JSON с двумя полями: status
и url
. Поле status
должно содержать ok
в случае успешного формирования пакета документов и error
в случае ошибки. Поле url
должно содержать ссылку на документ или пакет документов, которая будет предоставлена пользователю.
Пример успешного ответа функции может выглядеть вот так:
{ "status": "ok", "url": "https://yourlogistics/docs/abcdef123456.zip" }
В ответе нужно указывать именно ссылку на готовый файл документа. Ваш сервис должен по запросу подготовить сам документ, сложить его в виде готового компилированного файла в какую-нибудь папку и выдать ссылку на него.
Ссылка на распечатку документов может выглядеть так:
https://yourlogistics/docs.php?code={track}
Тогда файл обработчика на PHP может быть таким:
<?php // Prepare the code and URL $code = filter_var( $_GET['code'] ); $uid = md5( $code . 'secret' ); $url = "https://yourlogiscits/docs/$uid.pdf" if (!file_exists( "docs/$uid.pdf" )) { $data = somemagictoprint( $code ); file_put_contents( "docs/$uid.pdf", $data ); } // Show the results echo json_encode([ 'status' => 'ok', 'url' => $url ]);
В этом файле функция somemagictoprint
должна создавать сам контент документа. Она поместит его в файл с кодированным названием и будет выдавать на него ссылку. Конкретная реализация зависит от службы доставки.
Краткие итоги
Несколько финальных советов по созданию вашей собственной логистической службы:
- Самый простой вариант реализации — создать «обёртку» над функциями логистической службы. Обычно, у неё присутствуют именно функции отправки, проверки статуса и распечатки документов.
- Постарайтесь сохранять данные о посылках и запросах в каком-нибудь журнале. Оптимальнее всего вести отдельную базу посылок и их статусов, извлекая данные из базы, а не проксируя их в службу доставки.
- Не забывайте выдавать реальную цену доставки при добавлении заказа, чтобы точно оценивать расходы на вашу логистику.
- Обязательно организуйте все три функции — и отправку, и документы, и трекинг. Это закроет все потребности в логистике.
- Создание полноценной службы доставки через хаки всё равно лучше.
Удачи с подключением логистических сервисов!