Эта страница собрана из всех страниц документации, к ней применены специальные стили для печати и сохранения в PDF. Печатайте или сохраняйте в PDF используя File > Print > Save as PDF.
Для создания PDF, убедитесь что вы используете функцию браузера для печати и сохранить-как-pdf функцию вместо системного диалога.
Перед тем как приступать к интеграции с веб-сервисами АСНА, аптечная сеть должна пройти первичную интеграцию с АСНА согласно Регламенту информационного обмена, выполнить связки справочника товаров на портале связок Alphaone.
Сервисы asna.ru и функциональные возможности аптечного ПО⚓︎
Получение с asna.ru новых/измененных заказов, резервирование товара в аптеке
Получение новых заказов в ручном режиме
Получение с asna.ru новых/измененных заказов, резервирование товара в аптеке
Уведомление на кассе о новых/измененных/сброшенных/отмененных заказах
Информирование первостольника о событиях требующих обработки заказов
Распечатка сборочных листов
Формирование и печать сборочных листов по заказам asna.ru
Комплектация заказа
Уведомление покупателя о готовности заказа к выдаче после фактической сборки заказа в аптеке
Изменение времени бронирования
Продление срока хранения/бронирования заказа в аптеке
Отпуск заказа покупателю
Реализация заказа в ценах на товара, обещанные покупателю на asna.ru
Сбор заказа по истечению времени резерва
Заказ в аптеке снимается с резерва
Отмена заказа покупателем
Заказ в аптеке снимается с резерва
Отмена заказа аптекой(ручной привод)
Заказ в аптеке снимается с резерва
Выход с кассы в админку первостольника
Просмотр, редактирование и отмена заказов покупателей сотрудником аптеки
Редактирование заказа
Поддержка изменений в заказах после их первичной обработки
ВНИМАНИЕ!
В зависимости от выбранных к интеграции опций, ниже в документации определяются списки обязательных атрибутов/полей сущностей, участвующих в информационном обмене.
Пользователь в кассовом модуле ПО должен получать уведомления о приходе новых или измененных заказов, не мешающие работе на кассовом модуле, например в виде неблокирующего всплывающего окна, с максимальной периодичностью один раз в одну минуту, поверх окна «продажа товаров», либо другим способом, до подтверждения первостольником обработки заказа, например, до установки статуса «Собран». В случае, если заказ отредактирован покупателем, повторно отрабатываем данную логику в полном объеме. ПО должно извещать первостольника о том, что заказ можно разукомплектовывать в следующих случаях:
отмена на сайте покупателем
отмена в аптеке первостольником
сброшенные автоматически в аптеке по таймауту (достижении времени сброса резерва)
Пользователь должен иметь возможность распечатать заказ (форма произвольная), для комплектации и удобства работы с сервисом сотруднику аптеки, из кассового модуля. В распечатанном документе выводится список зарезервированных партий по подтвержденному заказу с необходимой информацией по партии для сбора заказа(серия, срок годности, поставщик, количество, название товара, производитель, обещанная покупателю цена реализации в момент оформления заказа на сайте и т.п.)
Пользователь должен иметь возможность переходить на сайт по кнопке «Кабинет первостольника» (вызывается браузер «по умолчанию» с введенным URL https://www.asna.ru/bitrix/admin/?guid={GUID_аптеки} ) для возможности просмотра заказов на сайте, редактирования, отмены. GUID_аптеки - обязательный параметр.
Пользователь должен иметь возможность принудительно запустить обмен с сайтом для получения заказов по нажатию кнопки «Получить заказы» (т.к. клиент, оформивший заказ на терминале не должен ждать стандартного обмена по расписанию).
Для интеграции с веб-сервисами АСНА, аптечная сеть силами своих специалистов или с помощью разработчиков ПО, которое использует аптечная сеть, должна реализовать протокол обмена, описанный в этой документации. Протокол реализуется в следующем порядке:
Авторизация (раздел Авторизация в АСНА REST API). Для авторизации требуется выбрать тестовую аптеку из интегрируемой сети и сообщить ее юридическое лицо, а также полный адрес, выделенному сотруднику отдела разработки веб-сервисов АСНА. Сотрудник АСНА выдаст необходимые для авторизации данные (client_id и client_secret), а также настроит эту аптеку на тестовый режим. Аптека будет видна на сайте АСНА, после регулярной выгрузки полных остатков, на ней можно будет делать заказы, но сумма тестового заказа не может превышать 500 рублей. Кроме этого, при оформлении заказа на тестовой аптеке, сайт может выводить предупреждение о том что эта аптека временно не обрабатывает заказы.
Загрузка справочников АСНА (раздел Справочник связок номенклатуры). Этот вызов API нужно использовать для получения связок номенклатуры аптечной сети и АСНА. Связки аптечная сеть выполняет на этапе базовой интеграции с АСНА.
Выгрузка остатков (раздел Остатки товаров). Необходимо реализовать выгрузку полных остатков аптеки, раз в сутки, желательно ночью, а также выгрузку изменений остатков, каждые 10 минут, если было движение за этот период.
Бронирование (раздел Заказы (бронирование)). Необходимо реализовать запрос изменений по заказам, бронирование, выгрузку ответа по обработанным заказам. Необходимо реализовать обработку 100, 102, 108, 111 статусов от сайта и перередачу на сайт статусов 200, 201, 202, 204, 205, 210, 211, 212, 213. Запрос изменений по заказам, а также передача ответа, должны происходить раз в минуту.
Предзаказы (раздел Сводный прайс-лист). Необходимо реализовать выгрузку полного сводного прайс-листа юридического лица, раз в сутки, после загрузки всех прайс-листов поставщиков, а также изменений по сводному прайс-листу, после обновления прайс-листа поставщика, участвующего в формировании сводного прайс-листа. В рамках работы с бронированием по сводному прайс-листу должны быть реализованы следующие статусы заказов: 203, 206, 207, 208, 209. Реализовать доработку по предзаказам можно после реализации бронирования с наличия, совместного тестирования и запуска ПО в рабочем режиме.
После реализации протокола и тщательного тестирования собственными силами, интегрируемое ПО должно пройти совместное приемочное тестирование с выделенным сотрудником отдела разработки веб-сервисов АСНА. Целью приемочного тестирования является обнаружение ошибок интеграции и своевременного их устранения, перед запуском сети или ПО в рабочем режиме. Перед выполнением совместного тестирования, аптечное ПО должно заранее обеспечить полную выгрузку остатков тестовой аптеки, желательно за несколько часов (более 3) до начала тестирования. Выделенный сотрудник аптечной сети или разработчик ПО должен убедиться, что тестовая аптека появилась на сайте, ее остатки видны и есть возможность формировать заказы.
Выделенный сотрудник отдела разработки веб-сервисов АСНА, совместно с выделенным сотрудником аптечной сети или разработчиком ПО, проводит следующие тесты, чеклист которых можно скачать здесь.
АСНА REST API предназначен для интеграции со сторонним ПО и построен по принципам REST1. По мере развития проекта мы будем стараться максимально придерживаться принципов REST, чтобы наш API соответствовал Level 3 Maturity RESTful Services. Для работы с API используется HTTP(S) протокол.
Основным адресом АСНА REST API служит URL: https://api.asna.cloud/ или http://api.asna.cloud/ . Все обращения к API должны идти на этот адрес, дополненный адресом ресурса, к которому вы обращаетесь. Адреса ресурсов, а также разрешенные методы доступа к ресурсам описаны далее в документации.
В API сервисах АСНА используется версионирование. Версия API, которую вы используете, указывается в URL при запросах к сервису.
1
GET/v5/storesHTTP/1.1
Поддерживаемые, а также устаревшие версии API, вы можете узнать из заголовков api-supported-versions и api-deprecated-versions в каждом ответе от сервиса.
Основным форматом для работы с API является JSON. Для уменьшения объемов передаваемой и принимаемой информации вы можете настроить ваш сериализатор JSON так, чтобы поля, содержащие null или значения по умолчанию, не передавались (мы передаем данные именно в таком виде). Формат данных, передаваемых на сервисы АСНА, указывается в HTTP заголовке Content-Type запроса, для JSON это application/json. Формат, в котором вы хотите получить данные, указывается в заголовке Accept запроса. Кодировка текста - UTF-8.
ВНИМАНИЕ!
Еще раз обращаем особое внимание на то что мы передаем и можем принимать данные в JSON без полей, имеющих значение null или значение по умолчанию для типа данных. Т.е. если какое-то поле имеет значение null или значение по умолчанию (например, для булевого поля false, для целого 0), то его не будет в JSON, который мы вернем. Если ваше ПО или десериализатор не умеет работать с таким JSON, то можно получать его полную версию, добавив заголовок Accept со значением application/x-json-full, но просьба не злоупотреблять этим, так как это сильно увеличивает объемы передаваемых данных.
При использовании HTTPS протокола не рекомендуется использование gzip компрессии. Это связано с потенциальной возможностью использования уязвимостей SSL в этом случае. Если объем передаваемых или принимаемых данных велик, и передача/прием занимает много времени или не проходит, или вы используете протокол HTTP, вы можете использовать компрессию. За компрессию отвечают HTTP заголовки Content-Encoding и Accept-Encoding.
Помимо данного руководства, сервисы API АСНА предоставляют автоматически генерируемую документацию в формате Swagger3. Вы можете использовать эту возможность для изучения нашего API, а также для автоматического формирования клиентского кода, используя обширный набор коммерческих и бесплатных инструментов. Получить swagger.json можно по адресу https://api.asna.cloud/swagger/v5/swagger.json. Подробнее про работу со Swagger можно прочитать в разделе Тестирование АСНА Web API. АСНА REST API имеет встроенный инструмент для просмотра документации в формате Swagger, которым можно воспользоваться, перейдя по адресу https://api.asna.cloud/swagger. Указанный инструмент позволяет не только просматривать документацию, но и выполнять запросы к API.
С версии 5 API может возвращать большинство информации об ошибках на русском языке (по умолчанию используется английский). Для этого необходимо добавить в запросы HTTP-заголовок Accept-Language со значением ru. Возможно, не все сообщения имеют перевод на русский язык, если вы столкнулись с такой ситуацией, то сообщите, пожалуйста, службе технической поддержки.
Все, передаваемые в API, данные проходят первичную валидацию (проверку на правильность заполнения данных). В случае, если в передаваемых данных содержится ошибка, то весь пакет отклоняется. При этом API возвращает 400 HTTP статус(код состояния) и подробную информацию об ошибках в теле ответа. Следует иметь в виду, что подробная информация об ошибках возможна только в том случае, если API удалось распарсить передаваемый пакет, в противном случае информация об ошибках несет только общий характер.
Основные этапы валидации
Проверяется соответствие типов данных
Проверяется заполнение обязательных полей
Проверяется корректность заполнения полей, например предельная розничная цена для ЖНВЛС не должна быть меньше розничной или закупочной
Проверяется дублирование ключа, например кода партии в остатках
Для поддержания необходимого уровня сервиса и исключения излишней нагрузки API использует механизмы ограничения частоты запросов с одного IP адреса (rate limiter). Возможная частота запросов либо указана в документации по конкретному методу, либо может быть получена в техподдержке. Кроме того, не стоит делать запросы к API, если вы не собрали никаких данных, например, не было изменений остатков за период, заказов, пр. Если вам необходимо с одного IP отправлять много запросов, по разным аптекам, то напишите в техподдержку АСНА.
Сервисы API АСНА расположены в облаке и используют облачные ресурсы, поэтому со стороны клиентов, работающих с API необходимо наличие логики повтора вызова API, в случае возникновения временных (transient errors) ошибок, например, таких как таймауты подключения и т.д.
Логика повтора (retry logic) необходима при работе с любыми ресурсами, расположенными в Интернет (в локальной сети это тоже будет не лишним), так как в любой момент возможна потеря связи, отказ коммутационного оборудования, а также апдейт облачных сервисов или внезапная пиковая нагрузка на них. При этом необходимо понимать, какие ошибки являются временными, а какие нет. Например, таймауты подключения, с высокой долей вероятности, ошибка временная, вызванная нагрузкой или временным отсутствием связи, а 400 статус ответа от сервиса является ошибкой постоянной. Если передаваемый на наши сервисы пакет данных содержит ошибки, то вне зависимости от количества попыток, результат будет тот же, пока передаваемый пакет не будет исправлен. В этом случае, нет смысла повторять запросы с ошибочным пакетом. К постоянным ошибкам относится и 404 статус.
При отсутствии со стороны клиента логики повтора, претензии к работе API, связанные с временной недоступностью, рассматриваться не будут.
Веб-сервисы АСНА, это сложная, распределенная система, и как любая сложная система требует периодического обслуживания, например обновления статистики БД или индексов. Для выполнения этих работ предусмотрено технологическое окно, с 5:00 по 9:00 утра по московскому времени. В это время веб-сервисы сервисы АСНА могут быть доступны частично. Пожалуйста, имейте это в виду при работе над интеграцией с нашими сервисами.
Для решения проблем при возникновении инцидентов, необходимо наличие логирования запросов к API со стороны клиентского ПО, список необходимых данных указан ниже:
Точное время запроса с таймзоной
Полный URL запроса и метод
Все заголовки запроса
Тело запроса, если его размер небольшой
Статус ответа от API
Тело ответа, если его размер небольшой
Representational State Transfer (REST) в переводе — это передача состояния представления. Технология позволяет получать и модифицировать данные и состояния удаленных приложений, передавая HTTP-вызовы через интернет или любую другую сеть.
Краткое введение↩
Swagger(OpenAPI) это язык описания интерфейсов для REST API, выраженный с помощью JSON. Swagger используется вместе с набором программных средств с открытым исходным кодом для проектирования, создания, документирования и использования веб-сервисов RESTful. Swagger включает автоматизированную документацию, генерацию кода (на многие языки программирования) и генерацию тестовых примеров. Ссылка↩
АСНА REST API поддерживает авторизацию на основе JWT токенов.
Для обращения к любому из ресурсов АСНА REST API требуется наличие JWT токена в заголовке Authorization HTTP запроса, с типом Bearer. При отсутствии токена API вернет 401 статус (Unauthorized), этот же статус вернется в случае, если время действия токена закончилось (токен выдается на определенное время). В обоих случаях нужно запросить новый токен.
Для выполнения запросов к API, необходимо получить JWT токен от службы единой авторизации облачных сервисов АСНА, расположенной по адресу https://sso.asna.cloud:5000
Полученные службой данные содержат ошибки. Информация об ошибке возвращается в теле ответа. Например, при отсутствии аптеки с таким идентификатором выдается invalid_client
500
Ошибка сервиса. Если ошибка повторяется, сообщите, пожалуйста, разработчикам сервиса
Вы можете получать справочник номенклатуры АСНА, в нормализованном виде, через следующий вызов API. Дополнительные справочники, при необходимости, получаются отдельными вызовами API.
ВНИМАНИЕ!
Запрашивать справочник номенклатуры желательно не чаще одного раза в сутки. Из-за большого размера справочника, выдача ограничена 10000 записей за вызов. Для получения всего справочника используйте параметры count и rvInt при запросе.
GET /v5/references/goods_normalized?count={count}&rvInt={rvInt}
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Вы можете получать справочник номенклатуры АСНА, в нормализованном виде, через следующий вызов API. Дополнительные справочники, при необходимости, получаются отдельными вызовами API.
ВНИМАНИЕ!
Запрашивать справочник номенклатуры желательно не чаще одного раза в сутки. Из-за большого размера справочника, выдача ограничена 10000 записей за вызов. Для получения всего справочника используйте параметры count и rvInt при запросе.
GET /v5/references/goods_denormalized?count={count}&rvInt={rvInt}
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Работа с REST API АСНА происходит в кодах справочников АСНА. Для получения информации о связках номенклатуры вашей аптеки со справочником АСНА, можно использовать следующий вызов API.
ОГРАНИЧЕНИЕ
Запрашивать информацию о связках номенклатуры необходимо ежедневно, но желательно не чаще одного раза в сутки, либо в случае крайней необходимости, например изменился справочник и были сделаны перепривязки.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
[{"id":2000000000,"name":"АКСЕССУАРЫ ДЛЯ МАНИКЮРА И ПЕДИКЮРА","dirId":1,"actual":true,"rv":"AAAAAAAPu+w="},{"id":2000000001,"name":"ГИГИЕНА","dirId":1,"actual":true,"rv":"AAAAAAAPu+0="},{"id":2000000002,"name":"ДЕКОРАТИВНАЯ КОСМЕТИКА, АКСЕССУАРЫ ДЛЯ МАКИЯЖА","dirId":1,"actual":true,"rv":"AAAAAAAPu+4="}]
Имя
Тип
Описание
id
int
Уникальный код категории по справочнику АСНА
name
string
Наименование категории
dirId
int
Уникальный код направления
actual
bool
Признак актуальности строки
rv
byte[]
Версия строки. В JSON массив байт представлен в кодировке base64.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
ОК. В теле ответа содержится JSON со справочником.
Пример ответа
1 2 3 4 5 6 7 8 91011121314151617181920
[{"id":1,"name":"КОСМЕТИКА И ГИГИЕНА","actual":true,"rv":"AAAAAAANWxU="},{"id":2,"name":"ЛЕЧЕНИЕ И ПРОФИЛАКТИКА","actual":true,"rv":"AAAAAAANWxY="},{"id":3,"name":"МАМА И МАЛЫШ","actual":true,"rv":"AAAAAAANWxc="}]
Имя
Тип
Описание
id
int
Уникальный код направления по справочнику АСНА
name
string
Наименование направления
actual
bool
Признак актуальности строки
rv
byte[]
Версия строки. В JSON массив байт представлен в кодировке base64.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
[{"id":2000000000,"name":"БАФ ДЛЯ МАНИКЮРА","catId":2000000000,"actual":false,"rv":"AAAAAAAPueM="},{"id":2000000001,"name":"ВАННОЧКИ ДЛЯ МАНИКЮРА И ПЕДИКЮРА","catId":2000000000,"actual":false,"rv":"AAAAAAAPueQ="},{"id":2000000002,"name":"КИСТИ ДЛЯ МАНИКЮРА","catId":2000000000,"actual":false,"rv":"AAAAAAAPueU="}]
Имя
Тип
Описание
id
int
Уникальный код СПЕ по справочнику АСНА
name
string
Наименование СПЕ
actual
bool
Признак актуальности строки
catId
int
Уникальный код категории
rv
byte[]
Версия строки. В JSON массив байт представлен в кодировке base64.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями. Не должно превышать 10000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
Количество возвращаемых записей, для загрузки частями.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
actual
bool
Возвращать только актуальные записи, если параметр выставлен в true, иначе все. По умолчанию false. Если параметр выставлен в true, не забывайте предварительно зачищать свои таблицы.
Ежедневно, желательно в период наименьшей загруженности сервисов, интегрированное с АСНА программное обеспечение должно отправлять полные сведения о наличии товаров в каждой аптеке. Выгрузка полных сведений об остатках должна производиться не чаще одного раза в сутки. Так как объем передаваемой информации о полных остатках большой, пакет не обрабатывается сразу, а ставится в очередь на обработку.
ОГРАНИЧЕНИЕ
Передача полных остатков ограничена одним запросом в 30 минут, но отправлять полные остатки чаще чем раз в сутки нет необходимости. Желательно отправлять полные остатки в период с 05:15 до 08:45 по московскому времени.
ВНИМАНИЕ
Перед обработкой полных остатков и записью их в БД, сервис произведет удаление всех остатков в БД по этой аптеке.
Уникальный код партии, должен быть уникальным в пределах отправляемого пакета, т.к. это ключ, по которому происходит, обновление записей. Максимум 50 символов.
nnt
int
Код товара по справочнику АСНА
sku
string(50)
Код товара по справочнику клиента. Максимум 50 символов.
qnt
float
Текущее количество в партии (с учетом забронированного товара). Не передавать дробное количество.
doc
string(50)
Номер документа. Максимум 50 символов.
supInn
string
ИНН поставщика
supId
GUID
Идентификатор поставщика по справочнику АСНА
supDate
datetime
Дата поставки в формате ISO8601 с указанием часового пояса
nds
int
НДС товара. Все расчеты идут по ставкам НДС из справочника номенклатуры АСНА
gnvls
bool
Признак ЖНВЛС товара (поле обязательно для ЖНВЛС). Если ПО самостоятельно не контролирует максимально допустимые цены ЖНВЛС, то поле обязательно
dp
bool
Признак Детское питание
man
string(255)
Производитель. Максимум 255 символов
series
string(50)
Cерия товара. Максимум 50 символов
exp
datetime
Cрок годности в формате ISO8601. Поле не является обязательным, т.к. не у всех товаров есть срок годности, но если у товара есть срок, убедительная просьба его заполнять. Покупатели хотят видеть срок на сайте. Для сервиса Контроль сроков годности поле обязательно.
prcMan
decimal
Цена производителя
prcOpt
decimal
Цена оптовая
prcOptNds
decimal
Цена оптовая (закупочная) с НДС. Для сервисов Подмена аптечных цен, Асна Экономия поле обязательно
prcRet
decimal
Цена реализации
prcReestr
decimal
Цена реестра
prcGnvlsMax
decimal
Максимально допустимая розничная цена для ЖНВЛС (поле обязательно для ЖНВЛС). Если товар не ЖНВЛС, то это поле заполнять не нужно, если товар ЖНВЛС и включен расчет цен, то поле обязательно заполняется значением, и оно не может быть меньше розничной цены аптеки. Если ПО самостоятельно не контролирует максимально допустимые цены ЖНВЛС, то поле обязательно
sumOpt
decimal
Cумма оптовая без НДС
sumOptNds
decimal
Cумма оптовая с НДС
mrGnvls
decimal
Процент наценки для ЖВЛНС
tag
int
Признак товара. Может принимать значения: 0 - нормальный, 1- сроковый, 2 - уценка, 3 - мятая упаковка
С определенной периодичностью, интегрированное с АСНА программное обеспечение должно отправлять изменения по остаткам товаров в каждой аптеке. При отсутствии изменений по остаткам, отправлять данные не нужно. Пакеты с изменениями также ставятся в очередь на обработку.
ОГРАНИЧЕНИЕ
Передача изменений остатков ограничена одним запросом в 10 минут.
ВНИМАНИЕ!
Если товар по партии закончился, то необходимо передать эту запись с количеством равным нулю.
ИНФОРМАЦИЯ
Перед обработкой изменений по остаткам аптеки и записью их в БД, сервис не будет производить удаление всех остатков в БД по этой аптеке. Будет произведена операция upsert (update для уже имеющихся в БД строк и insert для отсутствующих).
Уникальный код партии, должен быть уникальным в пределах отправляемого пакета, т.к. это ключ, по которому происходит, обновление записей. Максимум 50 символов.
nnt
int
Код товара по справочнику АСНА
sku
string
Код товара по справочнику клиента. Максимум 50 символов.
qnt
float
Текущее количество в партии (с учетом забронированного товара). Не передавать дробное количество.
doc
string
Номер документа. Максимум 50 символов.
supInn
string
ИНН поставщика
supId
GUID
Идентификатор поставщика по справочнику АСНА
supDate
datetime
Дата поставки в формате ISO8601 с указанием часового пояса
nds
int
НДС товара. Все расчеты идут по ставкам НДС из справочника номенклатуры АСНА
gnvls
bool
Признак ЖНВЛС товара (поле обязательно для ЖНВЛС). Если ПО самостоятельно не контролирует максимально допустимые цены ЖНВЛС то поле обязательно
dp
bool
Признак Детское питание
man
string
Производитель. Максимум 255 символов
series
string
Cерия товара. Максимум 50 символов
exp
datetime
Cрок годности в формате ISO8601. Поле не является обязательным, т.к. не у всех товаров есть срок годности, но если у товара есть срок, убедительная просьба его заполнять. Покупатели хотят видеть срок на сайте. Для сервиса Контроль сроков годности поле обязательно
prcMan
decimal
Цена производителя
prcOpt
decimal
Цена оптовая
prcOptNds
decimal
Цена оптовая (закупочная) с НДС. Для сервисов Подмена аптечных цен, Асна Экономия поле обязательно
prcRet
decimal
Цена реализации
prcReestr
decimal
Цена реестра
prcGnvlsMax
decimal
Максимально допустимая розничная цена для ЖНВЛС (поле обязательно для ЖНВЛС). Если товар не ЖНВЛС, то это поле заполнять не нужно, если товар ЖНВЛС и включен расчет цен, то поле обязательно заполняется значением, и оно не может быть меньше розничной цены аптеки. Если ПО самостоятельно не контролирует максимально допустимые цены ЖНВЛС то поле обязательно
sumOpt
decimal
Cумма оптовая без НДС
sumOptNds
decimal
Cумма оптовая с НДС
mrGnvls
decimal
Процент наценки для ЖВЛНС
tag
int
Признак товара. Может принимать значения: 0 - нормальный, 1- сроковый, 2 - уценка, 3 - мятая упаковка
Уникальный код партии, должен быть уникальным в пределах отправляемого пакета, т.к. это ключ, по которому происходит, обновление записей. Максимум 50 символов.
nnt
int
Код товара по справочнику АСНА
sku
string
Код товара по справочнику клиента. Максимум 50 символов.
qnt
float
Текущее количество в партии (с учетом забронированного товара)
doc
string
Номер документа. Максимум 50 символов.
supInn
string
ИНН поставщика
supId
GUID
Идентификатор поставщика по справочнику АСНА
supDate
datetime
Дата поставки в формате ISO8601 с указанием часового пояса
nds
int
НДС товара
gnvls
bool
Признак ЖНВЛС товара (поле обязательно для ЖНВЛС)
dp
bool
Признак Детское питание
man
string
Производитель. Максимум 255 символов
series
string
Cерия товара. Максимум 50 символов
exp
datetime
Cрок годности в формате ISO8601. Поле не является обязательным, т.к. не у всех товаров есть срок годности, но если у товара есть срок, убедительная просьба его заполнять. Покупатели хотят видеть срок на сайте
prcMan
decimal
Цена производителя
prcOpt
decimal
Цена оптовая
prcOptNds
decimal
Цена оптовая (закупочная) с НДС
prcRet
decimal
Цена реализации
prcReestr
decimal
Цена реестра
prcGnvlsMax
decimal
Максимально допустимая розничная цена для ЖНВЛС (поле обязательно для ЖНВЛС). Если товар не ЖНВЛС, то это поле заполнять не нужно, если товар ЖНВЛС и включен расчет цен, то поле обязательно заполняется значением, и оно не может быть меньше розничной цены аптеки
sumOpt
decimal
Cумма оптовая без НДС
sumOptNds
decimal
Cумма оптовая с НДС
mrGnvls
decimal
Процент наценки для ЖВЛНС
tag
int
Признак товара. Может принимать значения: 0 - нормальный, 1- сроковый, 2 - уценка, 3 - мятая упаковка
stkDate
datetime
Дата остатков в формате ISO8601 с указанием часового пояса
loadDate
datetime
Дата загрузки остатков в формате ISO8601 с указанием часового пояса
Для исключения попадания на сайт товаров с некорректными(слишком низкими) ценами, которые, как правило, получаются из-за некорректных привязок справочника товаров аптеки и справочника товаров АСНА, мы фильтруем такие товары.
Если вы подписаны на рассылку мониторинга, то ежедневно вы будете получать уведомления по электронной почте с вложенной инструкцией, если нет то вы можете перейти на веб-интерфейс фильтра по ссылке http://api.asna.cloud/dispersion?storeId={storeId}, где storeId - идентификатор вашей аптеки.
Инструкция по работе с веб-интерфейсом фильтра встроена в веб-интефейс.
Сводный прайс-лист - это прайс-лист, сформированный из прайс-листов всех поставщиков аптеки, где по каждой номенклатуре выбирается только один поставщик, с наиболее выгодной для аптеке ценой. Исходя из этого, сводный прайс-лист должен содержать в себе только строки с уникальными (не повторяющимися в пределах прайс-листа) кодами номенклатуры (nnt).
Передача сводных прайс-листов в АСНА осуществляется следующими методами:
Передача полного сводного прайс-листа
Передача изменений по сводному прайс-листу
Передача полного сводного прайс-листа юридического лица⚓︎
Ежедневно, желательно в период наименьшей загруженности сервисов, интегрированное с АСНА программное обеспечение должно отправлять полный сводный прайс-лист по каждому юридическому лицу. Выгрузка полного сводного прайс-листа должна производиться не чаще одного раза в сутки. Так как объем передаваемой информации большой, она не обрабатывается сразу, а ставится в очередь на обработку.
ВНИМАНИЕ!
Перед обработкой полного прайс-листа и записью его в БД, сервис произведет удаление сводного прайс-листа в БД по этому юрлицу.
Код товара по справочнику клиента. Максимум 50 символов.
qnt
float
Количество товара
supInn
string
ИНН поставщика. Обязательно, если хотите получать ИНН в строках заказа с asna.ru
supDate
datetime
Дата поставки в формате ISO8601 с указанием часового пояса
exp
datetime
Cрок годности в формате ISO8601. Поле не является обязательным, т.к. не у всех товаров есть срок годности, но если у товара есть срок, убедительная просьба его заполнять. Покупатели хотят видеть срок на сайте. Для сервиса Контроль сроков годности поле обязательно
prcOptNds
decimal
Цена оптовая (закупочная) с НДС. Обязательно, если не передается Цена реализации
prcRet
decimal
Цена реализации. Обязательно, если не передается Цена оптовая (закупочная) с НДС
prcGnvlsMax
decimal
Максимально допустимая розничная цена для ЖНВЛС (поле обязательно для ЖНВЛС). Если эта цена не указана, то АСНА не будет контролировать превышение наценки на ЖНВЛС при расчете розничной цены. В этом случае ПО должно делать это самостоятельно. Если ПО самостоятельно не контролирует максимально допустимые цены ЖНВЛС то поле обязательно
prclDate
datetime
Дата прайс-листа в формате ISO8601 с указанием часового пояса
plType
int
Тип прайслиста, 0 - для юрлица, 1 - для хаба, 2 - для аптеки
status
int
Признак активной или удаленной строки (0 - активная, 1 - удаленная). В полном прайс-листе всегда 0, т.к. в нем должны быть только активные строки
Bad Request. Полученные службой данные содержат ошибки. Информация об ошибке возвращается в теле ответа.
401
Unauthorized. Токен авторизации неверный или истек срок его действия
403
Forbidden. У вас нет прав на выполнение данной операции
429
Too Many Requests. Слишком много запросов с одного IP адреса за промежуток времени
500
Internal Server Error. Ошибка сервиса. Если ошибка повторяется, сообщите, пожалуйста, разработчикам сервиса
Передача изменений по сводному прайс-листу юридического лица⚓︎
С определенной периодичностью, интегрированное с АСНА программное обеспечение должно отправлять изменения по сводному прайс-листу для каждого юрлица. При отсутствии изменений по сводному прайс-листу, отправлять данные не нужно.
ВНИМАНИЕ!
Если товар был удален из сводного прайс-листа, то необходимо передать эту запись со статусом равным 1.
ИНФОРМАЦИЯ
Перед обработкой изменений по сводному прайс-листу юрлица и записью их в БД, сервис не будет производить удаление сводного прайс-листа в БД по этому юрлицу. Будет произведена операция upsert (update для уже имеющихся в БД строк и insert для отсутствующих).
Код товара по справочнику клиента. Максимум 50 символов.
qnt
float
Количество товара
supInn
string
ИНН поставщика. Обязательно, если хотите получать ИНН в строках заказа с asna.ru
supDate
datetime
Дата поставки в формате ISO8601 с указанием часового пояса
exp
datetime
Cрок годности в формате ISO8601. Поле не является обязательным, т.к. не у всех товаров есть срок годности, но если у товара есть срок, убедительная просьба его заполнять. Покупатели хотят видеть срок на сайте. Для сервиса Контроль сроков годности поле обязательно
prcOptNds
decimal
Цена оптовая (закупочная) с НДС. Обязательно, если не передается Цена реализации
prcRet
decimal
Цена реализации. Обязательно, если не передается Цена оптовая (закупочная) с НДС
prcGnvlsMax
decimal
Максимально допустимая розничная цена для ЖНВЛС (поле обязательно для ЖНВЛС). Если эта цена не указана, то АСНА не будет контролировать превышение наценки на ЖНВЛС при расчете розничной цены. В этом случае ПО должно делать это самостоятельно. Если ПО самостоятельно не контролирует максимально допустимые цены ЖНВЛС то поле обязательно
prclDate
datetime
Дата прайс-листа в формате ISO8601 с указанием часового пояса
plType
int
Тип прайслиста, 0 - для юрлица, 1 - для хаба, 2 - для аптеки
status
int
Признак активной или удаленной строки (0 - активная, 1 - удаленная). В полном прайс-листе всегда 0, т.к. в нем должны быть только активные строки
Bad Request. Полученные службой данные содержат ошибки. Информация об ошибке возвращается в теле ответа.
401
Unauthorized. Токен авторизации неверный или истек срок его действия
403
Forbidden. У вас нет прав на выполнение данной операции
429
Too Many Requests. Слишком много запросов с одного IP адреса за промежуток времени
500
Internal Server Error. Ошибка сервиса. Если ошибка повторяется, сообщите, пожалуйста, разработчикам сервиса
Получение информации по сводному прайс-листу юрлица⚓︎
Для периодической проверки информации по сводному прайс-листу, переданному в АСНА, вы можете получить данные по сводному прайс-листу юрлица, используя следующий запрос:
GET /v5/legal_entities/{storeId}/preorders?since={since}
Код товара по справочнику клиента. Максимум 50 символов.
qnt
float
Количество товара
supInn
string
ИНН поставщика
supDate
datetime
Дата поставки в формате ISO8601 с указанием часового пояса
exp
datetime
Cрок годности в формате ISO8601. Поле не является обязательным, т.к. не у всех товаров есть срок годности, но если у товара есть срок, убедительная просьба его заполнять. Покупатели хотят видеть срок на сайте
prcOptNds
decimal
Цена оптовая (закупочная) с НДС
prcRet
decimal
Цена реализации
prcGnvlsMax
decimal
Максимально допустимая розничная цена для ЖНВЛС (поле обязательно для ЖНВЛС). Если эта цена не указана, то АСНА не будет контролировать превышение наценки на ЖНВЛС при расчете розничной цены. В этом случае ПО должно делать это самостоятельно
prclDate
datetime
Дата прайс-листа в формате ISO8601 с указанием часового пояса
plType
int
Тип прайслиста, 0 - для юрлица, 1 - для хаба, 2 - для аптеки
status
int
Признак активной или удаленной строки (0 - активная, 1 - удаленная). В полном прайс-листе всегда 0, т.к. в нем должны быть только активные строки
Ежедневно, желательно в период наименьшей загруженности сервисов, интегрированное с АСНА программное обеспечение может отправлять полный сводный прайс-лист по аптеке. Выгрузка полного сводного прайс-листа должна производиться не чаще одного раза в сутки. Так как объем передаваемой информации большой, она не обрабатывается сразу, а ставится в очередь на обработку.
ВНИМАНИЕ!
Перед обработкой полного прайс-листа и записью его в БД, сервис произведет удаление сводного прайс-листа в БД по этой аптеке.
Код товара по справочнику клиента. Максимум 50 символов.
qnt
float
Количество товара
supInn
string
ИНН поставщика
supDate
datetime
Дата поставки в формате ISO8601 с указанием часового пояса
exp
datetime
Cрок годности в формате ISO8601. Поле не является обязательным, т.к. не у всех товаров есть срок годности, но если у товара есть срок, убедительная просьба его заполнять. Покупатели хотят видеть срок на сайте
prcOptNds
decimal
Цена оптовая (закупочная) с НДС
prcRet
decimal
Цена реализации
prcGnvlsMax
decimal
Максимально допустимая розничная цена для ЖНВЛС (поле обязательно для ЖНВЛС). Если эта цена не указана, то АСНА не будет контролировать превышение наценки на ЖНВЛС при расчете розничной цены. В этом случае ПО должно делать это самостоятельно
prclDate
datetime
Дата прайс-листа в формате ISO8601 с указанием часового пояса
plType
int
Тип прайслиста, 0 - для юрлица, 1 - для хаба, 2 - для аптеки
status
int
Признак активной или удаленной строки (0 - активная, 1 - удаленная). В полном прайс-листе всегда 0, т.к. в нем должны быть только активные строки
Bad Request. Полученные службой данные содержат ошибки. Информация об ошибке возвращается в теле ответа.
401
Unauthorized. Токен авторизации неверный или истек срок его действия
403
Forbidden. У вас нет прав на выполнение данной операции
429
Too Many Requests. Слишком много запросов с одного IP адреса за промежуток времени
500
Internal Server Error. Ошибка сервиса. Если ошибка повторяется, сообщите, пожалуйста, разработчикам сервиса
Передача изменений по сводному прайс-листу аптеки⚓︎
С определенной периодичностью, интегрированное с АСНА программное обеспечение может отправлять изменения по сводному прайс-листу аптеки. При отсутствии изменений по сводному прайс-листу, отправлять данные не нужно.
ВНИМАНИЕ!
Если товар был удален из сводного прайс-листа, то необходимо передать эту запись со статусом равным 1.
ИНФОРМАЦИЯ
Перед обработкой изменений по сводному прайс-листу аптеки и записью их в БД, сервис не будет производить удаление сводного прайс-листа в БД по этой аптеке. Будет произведена операция upsert (update для уже имеющихся в БД строк и insert для отсутствующих).
Код товара по справочнику клиента. Максимум 50 символов.
qnt
float
Количество товара
supInn
string(50)
ИНН поставщика
supDate
datetime
Дата поставки в формате ISO8601 с указанием часового пояса
exp
datetime
Cрок годности в формате ISO8601. Поле не является обязательным, т.к. не у всех товаров есть срок годности, но если у товара есть срок, убедительная просьба его заполнять. Покупатели хотят видеть срок на сайте
prcOptNds
decimal
Цена оптовая (закупочная) с НДС
prcRet
decimal
Цена реализации
prcGnvlsMax
decimal
Максимально допустимая розничная цена для ЖНВЛС (поле обязательно для ЖНВЛС). Если эта цена не указана, то АСНА не будет контролировать превышение наценки на ЖНВЛС при расчете розничной цены. В этом случае ПО должно делать это самостоятельно
prclDate
datetime
Дата прайс-листа в формате ISO8601 с указанием часового пояса
plType
int
Тип прайслиста, 0 - для юрлица, 1 - для хаба, 2 - для аптеки
status
int
Признак активной или удаленной строки (0 - активная, 1 - удаленная). В полном прайс-листе всегда 0, т.к. в нем должны быть только активные строки
Bad Request. Полученные службой данные содержат ошибки. Информация об ошибке возвращается в теле ответа.
401
Unauthorized. Токен авторизации неверный или истек срок его действия
403
Forbidden. У вас нет прав на выполнение данной операции
429
Too Many Requests. Слишком много запросов с одного IP адреса за промежуток времени
500
Internal Server Error. Ошибка сервиса. Если ошибка повторяется, сообщите, пожалуйста, разработчикам сервиса
Получение информации по сводному прайс-листу аптеки⚓︎
Для периодической проверки информации по сводному прайс-листу, переданному в АСНА, вы можете получить данные по сводному прайс-листу аптеки, используя следующий запрос:
Код товара по справочнику клиента. Максимум 50 символов.
qnt
float
Количество товара
supInn
string
ИНН поставщика
supDate
datetime
Дата поставки в формате ISO8601 с указанием часового пояса
exp
datetime
Cрок годности в формате ISO8601. Поле не является обязательным, т.к. не у всех товаров есть срок годности, но если у товара есть срок, убедительная просьба его заполнять. Покупатели хотят видеть срок на сайте
prcOptNds
decimal
Цена оптовая (закупочная) с НДС
prcRet
decimal
Цена реализации
prcGnvlsMax
decimal
Максимально допустимая розничная цена для ЖНВЛС (поле обязательно для ЖНВЛС). Если эта цена не указана, то АСНА не будет контролировать превышение наценки на ЖНВЛС при расчете розничной цены. В этом случае ПО должно делать это самостоятельно
prclDate
datetime
Дата прайс-листа в формате ISO8601 с указанием часового пояса
plType
int
Тип прайслиста, 0 - для юрлица, 1 - для хаба, 2 - для аптеки
status
int
Признак активной или удаленной строки (0 - активная, 1 - удаленная). В полном прайс-листе всегда 0, т.к. в нем должны быть только активные строки
С определенной периодичностью клиентское ПО должно опрашивать API для получения информации о новых или измененных заказах. Все полученные с сайта заказы должны быть приняты и обработаны клиентским ПО.
ВНИМАНИЕ!
Продажа товара по заказам с сайта должна производиться в ценах, не выше, чем указанные в документе заказа, с обязательным контролем максимально допустимой наценки для ЖНВЛС. Указанная цена берется из поля prc.
Заказ может быть трех видов:
Товар только из наличия
Товар только по предзаказу
Комбинированый, товар как из наличия, так и по предзаказу
При создании заказа на сайте формируется статус на заголовок с кодом 100. В этом статусе в поле rcDate сайт передает информацию о времени сброса резерва, которое аптечное ПО должно контролировать.
При получении нового заказа, если присутствуют строки с товаром из наличия, клиентское ПО пытается бронировать все товары по этим строкам, в количестве, которое указано в поле qnt.
Если заказ со строками только из наличия, возможны следующие варианты:
Товары полностью зарезервировались - формируется и возвращается новый статус (с новым уникальным идентификатором) с кодом 200 на заголовок.
Товары полностью не зарезервировались - формируется и возвращается новый статус (с новым уникальным идентификатором) с кодом 202 на заголовок.
Товары зарезервировались частично - формируется и возвращается новый статус (с новым уникальным идентификатором) с кодом 201 на заголовок, а так же возвращаются строки заказа, по которым не хватило количества в наличии (код строки в поле rowId и незарезервированное количество в поле qntUnrsv).
Если заказ со строками только по предзаказу, клиентское ПО должно сформировать и вернуть новый статус (с новым уникальным идентификатором) с кодом 200 на заголовок.
В случае комбинированного заказа возможны варианты:
Товары из наличия полностью зарезервировались и принялись строки предзаказа - формируется и возвращается новый статус (с новым уникальным идентификатором) с кодом 200 на заголовок.
Товары из наличия полностью не зарезервировались или зарезервировались частично, и принялись строки предзаказа - формируется и возвращается новый статус (с новым уникальным идентификатором) с кодом 201 на заголовок, а так же возвращаются строки заказа, по которым не хватило количества в наличии (код строки в поле rowId и незарезервированное количество в поле qntUnrsv).
Если в документе присутствуют строки по предзаказу, то клиентское ПО должно разместить заказы на эти товары у поставщиков (API возвращает в строках заказа информацию об ИНН поставщика в поле supInn, взятую из сводного прайс-листа юрлица) и cформировать и вернуть новый статус (с новым уникальным идентификатором) с кодом 203 на заголовок заказа.
На сайте и в мобильном приложении для пользователя отсутствует возможность редактировать заказ после его создания. Редактирование активных заказов разрешено:
Операторам колл-центра АСНА до статуса 213 - Заказ собран (укомплектован);
Сотрудникам аптеки(первостольникам) вне зависимости от статуса заказа в учетной системе аптеки.
При редактировании заказа на сайте формируется статус на заголовок с кодом 108. В этом статусе в поле rcDate сайт передает информацию о времени сброса резерва, которое аптечное ПО должно контролировать. Если при редактировании заказа на сайте была удалена строка, то на эту строку формируется статус с кодом 102. Отредактированный заказ ПОЛНОСТЬЮ (заголовок, строки и созданные статусы) передается в аптеку.
При получении отредактированного заказа, если присутствуют строки с товаром из наличия, клиентское ПО пытается бронировать все товары по этим строкам, в количестве, которое указано в поле qnt.
Если заказ со строками только из наличия, возможны следующие варианты:
Товары полностью зарезервировались - формируется и возвращается новый статус (с новым уникальным идентификатором) с кодом 200 на заголовок.
Товары полностью не зарезервировались - формируется и возвращается новый статус (с новым уникальным идентификатором) с кодом 202 на заголовок.
Товары зарезервировались частично - формируется и возвращается новый статус (с новым уникальным идентификатором) с кодом 201 на заголовок, а так же возвращаются строки заказа, по которым не хватило количества в наличии (код строки в поле rowId и незарезервированное количество в поле qntUnrsv).
Если заказ со строками только по предзаказу, клиентское ПО должно сформировать и вернуть новый статус (с новым уникальным идентификатором) с кодом 200 на заголовок.
В случае комбинированного заказа возможны варианты:
Товары из наличия полностью зарезервировались и принялись строки предзаказа - формируется и возвращается новый статус (с новым уникальным идентификатором) с кодом 200 на заголовок.
Товары из наличия полностью не зарезервировались или зарезервировались частично, и принялись строки предзаказа - формируется и возвращается новый статус (с новым уникальным идентификатором) с кодом 201 на заголовок, а так же возвращаются строки заказа, по которым не хватило количества в наличии (код строки в поле rowId и незарезервированное количество в поле qntUnrsv).
Если в документе присутствуют строки по предзаказу, то клиентское ПО должно разместить заказы на эти товары у поставщиков (API возвращает в строках заказа информацию об ИНН поставщика в поле supInn, взятую из сводного прайс-листа юрлица) и cформировать и вернуть новый статус (с новым уникальным идентификатором) с кодом 203 на заголовок заказа.
При полном поступлении товаров по предзаказу в аптеку, ПО должно отправить статус 207. В ответ сайт отправит в аптеку статус 104, содержащий новое время сброса резерва, которое ПО должно контролировать.
После того как заказ в аптеке был собран (укомплектован), необходимо отправить статус на заголовок 213. Отправка этого статуса инициируется из аптечного ПО, после того как сотрудник аптеки выставил в ПО статус полной комплектации заказа. Этот статус может формироваться из ПО сотрудником аптеки после каждого изменения комплектации заказа (например, в случае редактирования заказа покупателем). Если заказ содержал в себе строки предзаказа, то можно отправлять этот статус из ПО в случае подтверждения сотрудником аптеки полного прихода товара по ИЗП (предзаказу) и комплектации заказа.
При отмене заказа покупателем на сайте формируется статус на заголовок с кодом 111. Аптека формирует и возвращает новый статус (с новым уникальным идентификатором) подтверждения отмены заказа покупателем с кодом 211. Заказ снимается с резерва.
В случае если у аптеки выставлен параметр cancelOrder, аптека должна иметь возможность отменить заказ. При отмене формируется и возвращается новый статус (с новым уникальным идентификатором) отмены заказа по инициативе аптеки с кодом 212. Заказ снимается с резерва.
Покупатель может попросить продлить время бронирования заказа. Если аптека принимает решение о продлении бронирования, то формируется и возвращается новый статус (с новым уникальным идентификатором) с кодом 204 с измененной датой снятия товара с резерва (поле rcDate).
Клиентское ПО должно контролировать дату снятия заказа с резерва. Эту дату сайт передает в статусах 100, 104, 108. По достижению даты снятия товара с резерва, если товар не был выкуплен, формируется и возвращается новый статус (с новым уникальным идентификатором) с кодом 205. Заказ снимается с резерва.
Возможны следующие варианты: Если заказ был полностью выкуплен, то формируется и возвращается статус с кодом 210. Если был выкуплен только резерв из наличия и(или) товар, частично пришедший по предзаказу, но не выкуплен весь заказ, то формируется и возвращается статус с кодом 209 на каждую выкупленную строку. Этот статус может формироваться несколько раз, на каждый из чеков.
Заказ частично принят аптекой. Формируется на заголовок
202
Rejected
Отказ со стороны аптеки. Формируется на заголовок
203
WaitingForPreorder
Ожидание предзаказа. Формируется и на строку и на заголовок
204
ChangeReservationTime
Изменение времени бронирования. Формируется на заголовок
205
ReserveCancelled
Резерв сброшен. Формируется на заголовок
206
ExceededDeliveryTime
Превышение ожидаемого срока поставки. Формируется на заголовок
207
PreorderCompleted
Предзаказ выполнен. Формируется на заголовок
208
EditingIsForbidden
Редактирование строки запрещено. Формируется на строку
209
PartiallyPurchased
Резерв выкуплен, ожидает предзаказ. Формируется на каждую выкупленную строку
210
Purchased
Заказ выкуплен. Формируется на заголовок
211
CancellationAccepted
Отмена заказа подтверждена. Формируется на заголовок
212
CancelledByStore
Заказ отменен аптекой (если у нее есть такие права). Формируется на заголовок
213
Assembled
Заказ собран (укомплектован). Формируется на заголовок
214
IssuedToCourier
Выдан курьеру (для АСНА-МАРКЕТ). Формируется на заголовок
215
Delivered
Доставлен (для АСНА-МАРКЕТ). Формируется на заголовок
ВНИМАНИЕ!
При получении в пакете нескольких статусов на один и тот же заголовок заказа или строку, ваше ПО обязано применить их к этому заголовку или строке четко в порядке их создания. Для этого нужно предварительно провести сортировку статусов по 2-м полям, полю ts, а затем по полю date в порядке возрастания этих дат.
Работа с заказами АСНА-МАРКЕТ аналогична работе с обычными заказами Заказы (бронирование) с некоторыми изменениями, указанными ниже.
В заказы добавились 2 новых статуса со стороны аптеки, 214 Выдан курьеру и 215 Доставлен.
В заголовках заказов появилось 2 дополнительных поля delivery (признак доставки) и deliveryInfo (информация о доставке).
При заказах с доставкой нет необходимости контролировать время резервирования в аптеке, поэтому текущие поля с временем резерва на всем жизненном цикле заказа = NULL.
Если заказ имел признак необходимости доставки(поле delivery), то при выдаче заказа курьеру ПО должно формировать и отсылать статус 214. При этом в поле cmnt можно передать ФИО курьера, время доставки, телефон курьера. Передача информации о курьере - не обязательна для ПО. После фактической доставки заказа покупателю, ПО обязано сформировать и отправить статус 215.
Клиенты, которые работают с сайтом АСНА, могут получать через API информацию о новых заказах, сформированных на сайте, а также информацию об изменении статусов этих заказов.
ОГРАНИЧЕНИЕ
Запрашивать заказы необходимо не чаще 1-го раза в минуту для каждой аптеки.
ВНИМАНИЕ
Необходимо иметь в ПО возможность, например, по кнопке в кассовом модуле, запросить изменения заказов, так как заказ может быть сделан на терминале и клиент сразу подойдет к кассе.
GET /v5/stores/{storeId}/orders_exchanger?since={since}&orderId={orderId}&excludeOwn={false|true}
Дата, с которой необходимо получить изменения (не включительно) в формате ISO8601
orderId
GUID
Уникальный код заказа
excludeOwn
bool
Исключать или не исключать собственные изменения, по умолчанию true, т.е. при запросе изменений с какой-либо даты, вы получите в ответ только изменения, созданные сайтом, иначе получите назад и созданные аптекой статусы. Только для тестирования можно его выставлять в false.
Уникальный код заказа. Поле необходимо протаскивать в чек, сформированный по этому заказу, для дальнейшей выгрузки этого поля в хранилище данных АСНА (передача товародвижения через FTP)
storeId
GUID
Уникальный код аптеки, на которой сделан заказ
issuerId
GUID
Уникальный код аптеки, которая выдает заказ (для самовывоза)
src
string
Источник заказа («desktop», «terminal», «mobile», «cashier» и т.д.). Поле необходимо протаскивать в чек, сформированный по этому заказу, для дальнейшей выгрузки этого поля в хранилище данных АСНА (передача товародвижения через FTP). Cписок источников заказа
num
string
Номер заказа
date
datetime
Дата заказа в формате ISO8601 с указанием часового пояса
name
string
Имя покупателя
mPhone
string
Номер телефона
payType
string
Тип оплаты
payTypeId
int
ИД типа оплаты по справочнику АСНА
dCard
string
Дисконтная карта
ae
int
Признак АСНА-Экономия (0 - нет, 1 - да). Заказ с признаком АСНА-Экономия не должен редактироваться через клиентское ПО
unionId
GUID
ИД совместной покупки
ts
datetime
Отметка времени, в формате ISO8601. Представляет собой дату и время создания или обновления заголовка сервисом АСНА(в нулевом часовом поясе)
Информация о доставке. Содержит строку в виде экранированного JSON, который при необходимости, можно распарсить и получить данные. Поля addr - адрес доставки, cmnt - комментарий покупателя, type - тип доставки, prc - стоимость доставки, email - почта покупателя
Уникальный код партии. На данный момент не возвращается
nnt
int
Код товара по справочнику АСНА
qnt
float
Количество в заказе
prc
decimal
Цена товара в момент заказа
prcDsc
decimal
Цена товара, обещанная покупателю в момент оформления заказа, с учетом наценки или скидки (АСНА-Экономия,акции производителей, промо-кодов и т.д.)
dscUnion
string
Признак дисконта
dtn
decimal
Дотация для единицы товара. Поле необходимо протаскивать в чек, сформированный по этому заказу, для дальнейшей выгрузки этого поля в хранилище данных АСНА (передача товародвижения через FTP)
prcLoyal
decimal
Цена реализации со скидкой по программам Pfizer, AstraZeneca и Eli Lilly
Отметка времени, в формате ISO8601. Представляет собой дату и время создания или обновления строки сервисом АСНА (в нулевом часовом поясе).
mark
int
Признак расчета цены реализации с возмещаемой скидкой от производителей, ООО "АСНА" (промо-коды). 1 - Запрещается применение по строке заказа скидки производителей на стороне аптечного ПО, 0(null) - разрешены дополнительные скидки производителей на стороне аптечного ПО
ВАЖНО
Производители при расчёте бюджетов возмещения контролируют примененные скидки на основании отчётов, предоставленных как аптечными сетями, так и АСНА. Обработка признака Mark на стороне аптечного ПО позволит избежать:
Двойного применения скидки - скидка по заказам asna.ru компенсируется в аптечную сеть от производителя через АСНА.
Ошибочной выгрузки транзакций по заказам asna.ru производителю со стороны аптечной сети - скидки по подобным транзакциям со стороны производителя компенсировать не будут.
Уникальный код строки заказа (заполняется только если статус на строку)
storeId
GUID
Уникальный код аптеки
date
datetime
Дата и время статуса
status
int
Код статуса
rcDate
datetime
Дата и время сброса резерва в формате ISO8601. Поле заполняется только для 100, 108 ,104 статусов заказа
cmnt
string
Комментарий
ts
datetime
Отметка времени, в формате ISO8601. Представляет собой дату и время создания или обновления статуса сервисом АСНА(в нулевом часовом поясе)
ВНИМАНИЕ!
Поле ts в заголовках, строках и статусах заказа имеет чрезвычайно важное значение для корректного получения изменений по заказам. При запросе изменений по заказам, всегда задавайте параметр since следующего запроса равным максимальному значению поля ts из всех трех массивов(заголовки, строки, статусы) предыдущего запроса. Не используйте локальное время на ваших серверах в качестве параметра since.
Клиенты, которые работают с сайтом АСНА, могут получать через API информацию о новых заказах, сформированных на сайте, а также информацию об изменении статусов этих заказов по сети.
GET /v5/nets/{storeId}/orders_exchanger?since={since}&excludeOwn={false|true}
Дата, с которой необходимо получить изменения (не включительно) в формате ISO8601
excludeOwn
bool
Исключать или не исключать собственные изменения, по умолчанию true, т.е. при запросе изменений с какой-либо даты, вы получите в ответ только изменения, созданные сайтом, иначе получите назад и созданные аптекой статусы. Только для тестирования можно его выставлять в false.
Уникальный код заказа. Поле необходимо протаскивать в чек, сформированный по этому заказу, для дальнейшей выгрузки этого поля в хранилище данных АСНА (передача товародвижения через FTP)
storeId
GUID
Уникальный код аптеки, на которой сделан заказ
issuerId
GUID
Уникальный код аптеки, которая выдает заказ (для самовывоза)
src
string
Источник заказа («desktop», «terminal», «mobile», «cashier» и т.д.). Поле необходимо протаскивать в чек, сформированный по этому заказу, для дальнейшей выгрузки этого поля в хранилище данных АСНА (передача товародвижения через FTP). Cписок источников заказа
num
string
Номер заказа
date
datetime
Дата заказа в формате ISO8601 с указанием часового пояса
name
string
Имя покупателя
mPhone
string
Номер телефона
payType
string
Тип оплаты
payTypeId
int
ИД типа оплаты по справочнику АСНА
dCard
string
Дисконтная карта
ae
int
Признак АСНА-Экономия (0 - нет, 1 - да). Заказ с признаком АСНА-Экономия не должен редактироваться через клиентское ПО
unionId
GUID
ИД совместной покупки
ts
datetime
Отметка времени, в формате ISO8601. Представляет собой дату и время создания или обновления заголовка сервисом АСНА(в нулевом часовом поясе)
Информация о доставке. Содержит строку в виде экранированного JSON, который при необходимости, можно распарсить и получить данные. Поля addr - адрес доставки, cmnt - комментарий покупателя, type - тип доставки, prc - стоимость доставки, email - почта покупателя
Уникальный код партии. На данный момент не возвращается
nnt
int
Код товара по справочнику АСНА
qnt
float
Количество в заказе
prc
decimal
Цена товара в момент заказа
prcDsc
decimal
Цена товара, обещанная покупателю в момент оформления заказа, с учетом наценки или скидки (АСНА-Экономия,акции производителей, промо-коды и т.д.)
dscUnion
string
Признак дисконта
dtn
decimal
Дотация для единицы товара. Поле необходимо протаскивать в чек, сформированный по этому заказу, для дальнейшей выгрузки этого поля в хранилище данных АСНА (передача товародвижения через FTP)
prcLoyal
decimal
Цена реализации со скидкой по программам Pfizer, AstraZeneca и Eli Lilly
Отметка времени, в формате ISO8601. Представляет собой дату и время создания или обновления строки сервисом АСНА (в нулевом часовом поясе).
mark
int
Признак расчета цены реализации с возмещаемой скидкой от производителей, ООО "АСНА" (промо-коды). 1 - Запрещается применение по строке заказа скидки производителей на стороне аптечного ПО, 0(null) - разрешены дополнитель=ные скидки производителей на стороне аптечного ПО
ВАЖНО
Производители при расчёте бюджетов возмещения контролируют примененные скидки на основании отчётов, предоставленных как аптечными сетями, так и АСНА. Обработка признака Mark на стороне аптечного ПО позволит избежать:
Двойного применения скидки - скидка по заказам asna.ru компенсируется в аптечную сеть от производителя через АСНА.
Ошибочной выгрузки транзакций по заказам asna.ru производителю со стороны аптечной сети - скидки по подобным транзакциям со стороны производителя компенсировать не будут.
Уникальный код строки заказа (заполняется только если статус на строку)
storeId
GUID
Уникальный код аптеки
date
datetime
Дата и время статуса
status
int
Код статуса
rcDate
datetime
Дата и время сброса резерва в формате ISO8601. Поле заполняется только для 100, 108 ,104 статусов заказа
cmnt
string
Комментарий
ts
datetime
Отметка времени, в формате ISO8601. Представляет собой дату и время создания или обновления статуса сервисом АСНА(в нулевом часовом поясе)
ВНИМАНИЕ!
Поле ts в заголовках, строках и статусах заказа имеет чрезвычайно важное значение для корректного получения изменений по заказам. При запросе изменений по заказам, всегда задавайте параметр since следующего запроса равным максимальному значению поля ts из всех трех массивов(заголовки, строки, статусы) предыдущего запроса. Не используйте локальное время на ваших серверах в качестве параметра since.
Клиенты, которые работают с заказами с сайта АСНА, должны передавать информацию об изменениях в заказах, произошедших в аптеке, а также информацию о статусе заказов.
Если в накладной поля pricer и idoc заполнены значениями или поле online = 1, то данная накладная сформирована и выгружена в аптеку по интернет заказу покупателя.
В аптечном ПО необходимо настроить прием и обработку электронных накладных интернет заказов от поставщика ФУ Пульс по аналогии обработки накладных по заказам apteka.ru и zdravcity.ru.
Минимальные требования к ПО:
После прихода товара с розничными ценами по электронной накладной ФК Пульс, необходимо забронировать товар(исключить из свободной продажи, отложенный чек, чек резерва и т.п..);
Сотрудник аптеки(первостольник) должен иметь возможность по номеру заказа(IDOC) найти/скопировать содержимое оприходованной накладной интернет заказа в чек.
Дополнительные возможности:
В накладных интернет заказов от поставщика ФК Пульс выгружается информация о покупателе (ФИО, телефон и email):
В агрегированном виде в поле: ECOM_BUYER
В разагрегированном виде в полях:
ECOM_PERS – ФИО покупателя
ECOM_PHONE – телефон покупателя
ECOM_MAIL – email покупателя
Каждый заказ собирается на складе поставщика в отдельный пакет/коробку и маркируется этикеткой. Скачать пример этикетки.
На этикетке присутствует штрихкод, который содержит номер заказа(IDOC) дополненный лидирующими нулями слева до 12 символов + контрольный символ.
Данная информация может быть использована в аптечном ПО, для удобства обработки заказов сотрудником аптеки – поиск заказ по ФИО, номеру телефона, email покупателя, через сканирование ШК.
Если аптека получает накладные от поставщика ФК Пульс через сервисы сводных прайс-листов PharmSM и т.п.., то для обработки интернет заказов необходимо настроить прямое получение электронных накладных от поставщика.
Для этого необходимо согласовать с поставщиком:
Способ получение электронных накладных: Email или FTP, передать адрес для доставки электронных накладных.
Структуру файла электронной накладной: шаблон поставщика(Скачать) или шаблон аптечного ПО(передать требования к файлу накладной).
Доработать логику формирования файла "Данные о товародвижении" по приходным и расходным документам интернет заказов с доставкой со склада Пульс:
Название
Тип
Описание
5) Тип документа
Целочисленный
15 - Приход сторонний интернет-заказ, 16 - Продажи сторонний интернет-заказ, 2 – продажа через ККМ
26) Уникальный код заказа
Строковый(40)
Уникальный внутренний код заказа. Данное поле заполняется только для расходных документов типа – 2 (Чеки), документов типа 15 (Приход сторонний интернет-заказ) и 16 (Продажи сторонний интернет-заказ) В данном поле указывать оригинальный номер заказа из электронной накладной поставщика: поле IDOC Пример: "5093447"
27) Источник заказа
Строковый(40)
Данное поле заполняется только для расходных документов типа – 2 (Чеки), 16 (Продажи сторонний интернет-заказ) и для приходных документов типа – 15 (Приход сторонний интернет-заказ). В данном поле указывать "puls.asna.ru"
Реализовать метод, описанный ниже (Отправка информации о выкупленных заказах)
Если ваше ПО уже интегрированно с сайтом asna.ru, то п.1 из списка выше выполнять не надо.
Отправка информации о выкупленных заказах может производиться одним из двух способов.
Это можно делать при пробитии чека с заказом на кассе, но обязательно способом, не блокирующим работу кассы, например в отдельном потоке.
Информацию о выкупленных заказах можно передавать и по расписанию, например каждые 10-15 минут.
Обязательно наличие retry-логики, попытки отправить информацию должны продолжаться до тех пор, пока не будет получен статус успешного завершения операции, если вы получали от api транзиентную(временную) ошибку.
Bad Request. Полученные службой данные содержат ошибки. Информация об ошибке возвращается в теле ответа. В случае если было отправлено несколько номеров заказов и не все заказы найдены в БД, то вернется этот статус со списком заказов, которые не были найдены в БД, в теле ответа. Найденные заказы при этом будут записаны. См. пример ниже.
401
Unauthorized. Токен авторизации неверный или истек срок его действия
403
Forbidden. У вас нет прав на выполнение данной операции
429
Too Many Requests. Слишком много запросов с одного IP адреса за промежуток времени
500
Internal Server Error. Ошибка сервиса. Если ошибка повторяется, сообщите, пожалуйста, разработчикам сервиса
{"statusCode":400,"isError":true,"isTransient":false,"exceptionMessage":"Please correct the specified validation errors","referenceDocumentLink":"https://api.asna.cloud/docs/v5/validation.html","validationErrors":[{"field":"4849534","message":"Order not found"}]}
Бюджет для каждой аптеки начисляется отдельно, но зависит от показателей работы всей сети, к которой относится аптека
Бюджет делится на две части: «Общий маркетинг» и «Товар дня» итоговая сумма складывается арифметически из двух этих частей, которые рассчитываются независимо.
Бюджет за мероприятие «Товар дня» начисляется независимо от выполнения планов по другим типам мероприятий. Базой для расчета бонуса является объем закупки в промо-период (стандарт: месяц проведения акции и 10 дней до него) конкретных товаров (или разрешенных для их замены SKU), в зачет идет закуп только у разрешенных дистрибьюторов (по контракту, содержащему конкретный товар). В одном мероприятии участвует 4 товара (без учета разрешенных заменителей), мероприятие организуется на каждый месяц отдельно. План выставляется в упаковках на каждый товар и на каждую участвующую аптеку. Бонус за каждую закупленную упаковку устанавливается для каждого товара в каждом мероприятии индивидуально (стандарт = 30% от суммы закупа в учетных ценах АСНА) Выполнение оценивается по сети целиком, в соответствии с описанием мероприятия «Товар дня»
Бюджет по «Общему маркетингу» начисляется по каждому товару из маркетингового ассортимента в отдельности. На каждый товар может быть несколько уровней возможного бонуса (2 или 4) в зависимости от группы маркетингового ассортимента, к которой товар относится. Какой уровень бонуса в итоге получит сеть по каждому товару зависит от выполнения сетью планов по маркетинговым мероприятиям.
Базой для расчета бюджета аптеки является маркетинговая закупка в учетных ценах АСНА-CIP (учетная цена на каждый маркетинговый товар устанавливается на квартал со стороны АСНА) закупленного аптекой товара, при условии, что для этой аптеки товар является маркетинговым в данном квартале (определяется мероприятиями типа «Маркетинговый ассортимент») и товар был куплен у разрешенного поставщика (для части производителей на квартал устанавливаются ограничения дистрибьюторов – только купленный у этих поставщиков товар данного производителя идет в зачет для начисления бюджета).
Если мероприятие выполнено по сети, то за зачтенный (по разрешенным дистрибьюторам) факт закупки каждого товара в учетных ценах (АСНА-CIP цены) начисляется заранее обозначенный процент бонуса.
Процент выполнения сетью матрицы БДН = количество строк (товаров по аптекам сети с планом по БДН), по которым товар был на остатке 80% и более дней в квартале, разделить на суммарное количество строк с планом по аптекам данной сети. Выполненным условие БДН для сети считается от 85% строк.
Сеть имеет план закупа в учетных ценах (АСНА-CIP) по каждому мероприятию (набор SKU одного бренда в одной конкурентной группе - "кластере") на квартал. В зачет идет только закуп у разрешенных дистрибьюторов.
Приоритезация товаров в рамках группы аналогичных к закупке (если расчет потребности и закуп организован "слотами", и возможен закуп аналогичного товара при более выгодной цене или отсутствии первичного по потребности)
Использование в кассовом интерфейсе: приоритет при запросе покупателя, подсветка, часть мотивации персонала.
Комплексный подход к мотивации персонала - начисление баллов за маркетинговые товары, 0 или "-" за немаркетинговые и немаржинальные товары. Отчетность по индивидуальной мотивации, информаирование на кассе о результатах текущей сессии по набранным баллам/выполнению плана конкретным фармацевтом/аптекой/сменой.
1.Подсветка в интерфейсах закупки, в заказах и черновых накладных, возможно блок на возможность исключить из чернового заказа для заведующих. Подсветка в интерфейсе настройки ассортиментного плана аптеки.
Автоматический заказ/попадание в черновые заказы
Увеличенная потребность для заказа - например, на 1 упаковку больше, чем под статистику продаж, чтобы сток не обнулялся.
Оповещения при обнулении стоков по данным SKU
Внутренняя аналитика выполнения условий по БДН в разрезе аптек и сети
Автоматическое включение в ассортиментный план аптеки, невозможность локального (заведующей) исключения позиций - при централизованном управлении сетью.
При заказе товара в первую очередь посылать заказ только разрешенным дистрибьюторам, а к запрещенным, например, только при согласовании ответственным пользователем, если ни у одного разрешенного нет товара, или, какой-то лимит по отличию цены превышен. То есть приоритезация заказа товара по разрешенным поставщикам.
Подсветка товаров, для которых есть ограничения поставщиков в интерфейсах заказа товара, ассортиментного плана.
Внутренний мониторинг сетью/аптекой выполнения планов АСНА в отчетности. Более оперативен относительно куба и портала АСНА - так как данные не надо валидировать и ждать обменов.
Настройка мотивации персоанала на продажу конкретных товаров в конкурентных группах (кластерах) - баллы/планы на фармацевта/аптеку + системы мониторинга - индивидуальные на кассе и общие в отчетности.
Настройка замен/расширения с приоритетом для товаров УСТМ в кассовых модулях. Запрос покупателя на аналогичные товары - напоминание фармацевту о замене в порядке приоритета, о расширении (связанная нозология/группа) - тоже в порядке приоритета с учетом принадлежности товаров к УСТМ и маркетинговому ассортименту в принципе.
Товар из выкладки всегда есть в мероприятиях бездефектурного наличия, поэтому дополнительные меры контроля наличия при соблюдении выше описанных рекомендаций не нужны.
Если в ПО есть признаки и интерфейс по работе с выкладкой (адресация выкладки, напоминания, авто-печать ценников и т.п.), то там везде можно учитывать этот признак автоматически. Подсвечивать в прайсе, если необходимо.
При приходовании товаров (в накладных или в ином интерфейсе) нужно подсвечивать и напоминать о необходимости выложить данный товар.
Если в ПО есть календарь мероприятий/ электронная отметка принадлежности к акционной витрине - можно использовать информацию там.
Можно заранее добавить нужные количества товара/какую-то часть плана в авто-заказ для каждой участвующей аптеки. Избежать таким образом акционной дефектуры.
Если есть возможность автоматической настройки скидок под мероприятие на определенный период - можно также использовать поступившую информацию.
Можно использовать для мотивации персонала, загружая планы в систему напрямую/распределяя между сотрудниками.
Напоминание первостольнику в кассовом модуле при запросе товара из нозологии/группы аналогов. Напоминание на расширение покупки при заказе связанной группы товаров.
Мотивация персонала: план на аптеку/фармацевта в ПО, отчеты, мониторинг выполнения планов, баллы за продажу и т.п.
Внутренний мониторинг сетью/аптекой выполнения планов АСНА в отчетности. Более оперативен относительно куба и портала АСНА - так как данные не надо валидировать и ждать обменов.
Ежедневно, желательно не чаще одного раза в сутки, вы можете получать информацию о рекомендуемых поставщиках маркетингового товара на каждый товар.
ВНИМАНИЕ!
Справочник содержит очень большое количество записей, поэтому необходимо запрашивать его частями. Если в ответе пришло количество записей меньше чем запрашиваемое количество, то вы получили все имеющиеся записи на данный момент. Кроме этого существует возможность получить справочник рекомендуемых поставщиков другим способом, см. Справочник связей маркетинговый производитель - поставщик и Справочник связей товар - маркетинговый производитель
GET /v5/references/recommended_suppliers?rv={rv}&count={count}&rvInt={rvInt}&actual={false|true}
Количество возвращаемых записей, для загрузки частями. Не должно превышать 100000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
actual
bool
Если true, то возвращает только актуальные записи за текущий период. Не забывайте в этом случае перед получением зачищать все полученные ранее данные по рекомендуемым поставщикам в своей базе. Следует иметь в виду, что с этим параметром при получении данных частями, если в момент получения какая-либо запись стала неактуальной, то она не будет передана. Таким образом до следующего получения полного списка, эта строка будет у вас числиться актуальной. По умолчанию false.
Получить справочник рекомендуемых поставщиков, по списку ИНН, по протоколу версии 5, count строк, начиная с версии rv (массив байт) или версии rvInt (int64)
Количество возвращаемых записей, для загрузки частями. Не должно превышать 100000.
rv
byte[]
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных. В JSON массив байт представлен в кодировке base64.
rvInt
long
Версия последней записи, для загрузки частями. Берется текущее максимальное значение поля из базы данных.
actual
bool
Если true, то возвращает только актуальные записи за текущий период. Не забывайте в этом случае перед получением зачищать все полученные ранее данные по рекомендуемым поставщикам в своей базе. Следует иметь в виду, что с этим параметром при получении данных частями, если в момент получения какая-либо запись стала неактуальной, то она не будет передана. Таким образом до следующего получения полного списка, эта строка будет у вас числиться актуальной. По умолчанию false.
Тип мероприятия, параметр не является обязательным, если его не указать то вернутся все типы. Таблица с типами мероприятий расположена в конце раздела. Можно передать несколько типов мероприятий, например type=13&type=16&type=9
test
bool
Если true, то вы получите тестовый набор данных
full
bool
Если true, то получать не только со статусом Активно, но и с другими статусами. По умолчанию false
Тип мероприятия, параметр не является обязательным, если его не указать то вернутся все типы. Таблица с типами мероприятий расположена в конце раздела. Можно передать несколько типов мероприятий, например type=13&type=16&type=9
full
bool
Если true, то получать не только со статусом Активно, но и с другими статусами. По умолчанию false
{"planId":"676A6268-5586-4BA7-99E0-CE567A0676DE","loadDate":"2019-12-03T15:07:49+00:00","plans":[{"nnt":110680,"statusId":1,"status":"Оставлено в АП","method":"Метод не задан""qnt":1},{"nnt":112484,"statusId":1,"status":"Оставлено в АП","method":"Метод не задан""qnt":2},{"nnt":113579,"statusId":1,"status":"Оставлено в АП","methodId":1,"method":"Переключение покупателя на приоритетную позицию""qnt":1}]}
АСНА REST API может уведомлять заинтересованных подписчиков о событиях, происходящих в сервисе. Например, вы можете получать уведомление о поступлении новых заказов или об успешной загрузке ваших остатков в облако. Для это API использует технологию Webhooks, т.е. осуществляет HTTP запросы на ваши адреса, зарегистрированные в API. Использование уведомлений возможно, если ваши сервисы находятся в открытом доступе и имеют либо постоянный IP адрес, либо постоянное доменное имя. В случае отсутствия постоянного доменного имени или адреса можно воспользоваться службами Dynamic DNS или утилитами, типа ngrok1 . За консультацией вы можете обратиться в Отдел веб-сервисов компании АСНА.
При получении запроса на ваш URL, вы можете вычислить хэш тела запроса по алгоритму SHA256 и сравнить его значение с содержимым заголовка X-Signature. В случае если вычисленное вами значение совпадает с тем, что находится в заголовке, вы обрабатываете запрос, иначе отклоняете его.
Алгоритм формирования значения заголовка X-Signature⚓︎
Содержимое тела запроса в виде массива байт хэшируется по алгоритму SHA256 с использованием секретного ключа.
Полученный массив байт переводим в строку с шестнадцатиричным кодированием (hex-encoded string)
Спереди к полученной строке добавляем строку sha256=
Проверка подписи не обязательна, но если вы хотите быть уверены что запрос пришел именно от АСНА API, а не от постороннего, возможно вредоносного, ПО, то наличие этой проверки в вашем сервисе сделает его более защищенным.
Клиенты, которые желают защитить от несанкционированного доступа свои URL, используемые для получения уведомлений от АСНА REST API, должны получить ключ, который будет использоваться для формирования подписи запроса.
Уникальный идентификатор клиента по справочнику АСНА (например, если нужно получить уведомление о событии приема полных остатков по определенной аптеке, то в качестве clientId подставляется уникальный идентификатор этой аптеки )
url
string
URL, на который API должен делать запрос при возникновении события
Уникальный идентификатор клиента по справочнику АСНА (например, если нужно получить уведомление о событии приема полных остатков по определенной аптеке, то в качестве clientId подставляется уникальный идентификатор этой аптеки )
url
string
URL, на который API должен делать запрос при возникновении события
Уникальный идентификатор клиента по справочнику АСНА (например, если нужно удалить уведомление о событии приема полных остатков по определенной аптеке, то в качестве clientId подставляется уникальный идентификатор этой аптеки )
Если вы, при вызове API, получили в ответ HTTP-статус 202 Accepted, то это значит что переданные данные требуют отложенной обработки и были поставлены в очередь на обработку. В этом случае HTTP-заголовок Location содержит URL, запросив который вы получите статус обработки.
Проверить статус отложенной обработки можно несколькими способами.
Через вызов API, описанный в этом разделе, можно получить информацию о статусе отложенной обработки.
Получить статус отложенной обработки можно, кроме вышеописанного, способом, описанным в Информирование о событиях API (Webhooks).
Иногда может возникнуть необходимость проверить отправляемые данные на соответствие формату JSON. Как правило, это происходит если API отклоняет запрос со статусом 400, но вы не можете обнаружить причину. Для проверки ваших данных, вы можете использовать следующий вызов API:
HTTP/1.1400Bad RequestContent-Type:application/json{"statusCode":400,"isError":true,"isTransient":false,"exceptionMessage":"Please correct the specified validation errors and try again","validationErrors":[{"field":"stocks[0].prtId","message":"Line: 1 Position: 88 Value: 111445 Error: Invalid type. Expected String but got Integer."},{"field":"stocks[0].supDate","message":"Line: 1 Position: 166 Value: Error: String '' does not validate against format 'date-time'."},{"field":"stocks[0].gnvls","message":"Line: 1 Position: 188 Value: 1 Error: Invalid type. Expected Boolean, Null but got Integer."},{"field":"stocks[0].dp","message":"Line: 1 Position: 197 Value: 0 Error: Invalid type. Expected Boolean, Null but got Integer."},{"field":"stocks[0].exp","message":"Line: 1 Position: 246 Value: 0 Error: Invalid type. Expected String, Null but got Integer."},{"field":"stocks[1].prtId","message":"Line: 1 Position: 436 Value: 8608872 Error: Invalid type. Expected String but got Integer."},{"field":"stocks[1].supDate","message":"Line: 1 Position: 516 Value: Error: String '' does not validate against format 'date-time'."},{"field":"stocks[1].gnvls","message":"Line: 1 Position: 538 Value: 1 Error: Invalid type. Expected Boolean, Null but got Integer."},{"field":"stocks[1].dp","message":"Line: 1 Position: 547 Value: 0 Error: Invalid type. Expected Boolean, Null but got Integer."},{"field":"stocks[1].exp","message":"Line: 1 Position: 596 Value: 0 Error: Invalid type. Expected String, Null but got Integer."}]}
Имя
Тип
Описание
field
string
Поле, в котором обнаружена ошибка
message
string
Описание ошибки
Возможна ситуация когда пакет не удается распарсить, в этом случае мы не можем понять в каких полях ошибка. Ниже пример такого ответа.
123456
{"statusCode":400,"isError":true,"isTransient":false,"exceptionMessage":"Invalid character after parsing property name. Expected ':' but got: 1. Path 'stocks[0]', line 5, position 20."}
Bad Request. Полученные службой данные содержат ошибки. Информация об ошибке возвращается в теле ответа.
401
Unauthorized. Токен авторизации неверный или истек срок его действия
403
Forbidden. У вас нет прав на выполнение данной операции
429
Too Many Requests. Слишком много запросов с одного IP адреса за промежуток времени
500
Internal Server Error. Ошибка сервиса. Если ошибка повторяется, сообщите, пожалуйста, разработчикам сервиса
Ngrok - утилита, обеспечивающая безопасные туннели для инструментов разработки и отладки вебхуков с локального хоста. Имеется бесплатная и платная версии. Ссылка↩
При разработке интеграции может возникнуть необходимость предварительно ознакомиться с работой API, понять как он устроен, сделать тестовые запросы и получить тестовые ответы. Для этого существует несколько вариантов, которые будут описаны ниже.
Помимо данного руководства, сервисы API АСНА предоставляют автоматически генерируемую документацию в формате Swagger (OpenAPI). Скачать ее можно по ссылке https://api.asna.cloud/swagger/v5/swagger.json. Существует целый ряд бесплатных и коммерческих инструментов, которые позволяют просматривать документацию в этом формате в структурированном виде. АСНА Web API имеет встроенный инструмент для просмотра документации в формате Swagger, которым можно воспользоваться, перейдя по адресу https://api.asna.cloud/swagger, либо Открыть его из документации. Указанный инструмент позволяет не только просматривать документацию, но и выполнять запросы к API.
Для тестирования любого REST API, не исключая и АСНА Web API, существует приложение Postman. Официальная страница приложения расположена по адресу https://www.getpostman.com , а само приложение можно скачать для вашей операционной системы по ссылке https://www.getpostman.com/apps . Приложение бесплатно. Postman удобнее всего использовать совместно со Swagger.
Для получения ссылки на эту документацию, а также для получения информации по аптеке, заказу, отправки информации об ошибке вы можете использовать бот.
Для подключения бота можно использовать ссылки, указанные ниже. Бот работает в популярных мессенджерах Skype и Telegram, Facebook Messenger, Slack, а также в Webchat и по электронной почте.
Skype:
Веб клиент Skype, кроме того, расположен в правом нижнем углу этой страницы (голубой круг).
Отправленные данные не появляются на сервисах АСНА.
При каждом вызове API сервис возвращает HTTP статус (код ответа, КодОтвета в 1С), именно он служит индикатором успешной или неуспешной передачи. Как правило, при успешном вызове, сервис возвращает статусы 200, 201, 202. Если при вызове сервис вернул 400 статус (Bad Request), то с большой вероятностью вы отправляете данные, которые не проходят первичную валидацию на сервере. При этом сервис возвращает в теле ответа информацию об ошибках в полученных данных и данные не поступают на дальнейшую обработку.
Если в теле ответа вы получили сообщение Missing required data или {«»:[«The input was not valid.»]}, то это говорит о том что JSON, который вы отправляете на сервис, не является валидным с точки зрения стандарта.
Убедитесь в том что JSON не содержит символа запятая в качестве разделителя дробной и целой части в числах, т.к. в стандарте запятыми разделяются поля. Убедитесь в том что в значениях полей типа string не содержатся двойные кавычки, т.к. в стандарте этот символ используется для указания начала и конца значения текстового поля. Если же в значении текстового поля необходимо передать символ двойной кавычки, то этот символ необходимо экранировать символом .
Убедитесь в том что необязательные поля, которые вы не заполняете по тем или иным причинам, либо отсутствуют в сформированном JSON, либо имеют значение null. Убедитесь в том, что кодировка текста в передаваемых данных UTF-8. Данные должны пересылаться без маркера BOM.
Внесите необходимые исправления и, при необходимости, снова проверьте онлайн-валидатором.
Если сформированный вами JSON валиден с точки зрения стандарта, но не проходит валидацию на обязательные поля и типы значений на сервере АСНА, то сервис вернет в теле ответа подробную информацию о том, какие поля не прошли валидацию.
Для проверки вы можете использовать JSON схему, которая прилагается в виде ссылки в каждом разделе документации, связанном с передачей данных. Произвести валидацию по схеме вы можете по ссылке JSON Schema Lint. В левое окно загружается схема, в правое ваш JSON. Не забудьте указать версию спецификации схемы - draft-04.
Внесите соответствующие изменения и повторите отправку.
Видео-инструкция по валидации данных с помощью схемы⚓︎
ВОПРОС
При передаче данных на сервисы АСНА возвращается 400 «Missing required data».
Этот статус и сообщение сервисы АСНА возвращают, если не могут десериализовать присланные данные. Проверьте что кодировка JSON utf-8, а также наличие HTTP-заголовка Content-Type со значением application/json. Если json загружается в тело запроса из файла, то убедитесь что в тело запроса не попадает BOM (несколько байт перед началом json), например для utf-8 BOM EF BB BF.
ВОПРОС
Я получил токен на сервере авторизации и передаю его при вызовах API, но в ответ приходит HTTP статус 401.
Авторизационный токен действителен в течение некоторого времени (на данном этапе это время составляет 60 минут), это сделано для того, чтобы даже перехватив токен, злоумышленник не смог им пользоваться постоянно . Кроме того, короткоживущий токен позволяет быстро отключить от API клиентов, которые по тем или иным причинам прекратили сотрудничество с АСНА. В случае получения 401 статуса, клиентское ПО должно получить новый токен на сервере авторизации. Этот процесс подробно описан в разделе Авторизация в АСНА REST API документации.
ВОПРОС
Мы не видим своей аптеки на сайте asna.ru
Для того, чтобы аптека появилась на сайте asna.ru, необходимо выполнение следующих условий:
Аптека должна выполнить интеграцию по протоколу АСНА Web API в части выгрузки полных остатков и изменений по остаткам, а также бронирования товара.
Аптека должна регулярно выгружать по протоколу полные остатки (раз в сутки) и изменения остатков (раз в 10 минут), если было товародвижение за этот интервал времени. При отсутствии выгрузки полных остатков более 24 часов, аптека убирается с сайта.
На Портале настроек АСНА-Экономия у данной аптеки должны быть выполнены настройки в разделе Центр управления параметрами АСНА-Экономия: включено бронирование товара и выставлены параметры брони.
После включения настроек аптека появится на сайте после синхронизации настроек (1-2 часа). Для проверки даты остатков вы можете использовать АСНА-бот.
Если все три пункта выполнены, но аптеки на сайте нет, то обратитесь, пожалуйста, в техподдержку отдела веб-сервисов.
Не могу подключиться к серверу авторизации. В чем причина?
Сервер авторизации работает по адресу sso.asna.cloud, используя порт 5000 для протокола HTTPS и порт 6000 для протокола HTTP. Всегда используйте протокол HTTPS для работы с сервером авторизации, за исключением ситуаций, когда это физически невозможно. Если при подключении по HTTPS на порт 5000 возникают проблемы, а подключение к серверу авторизации по HTTP (порт 6000) работает, то убедитесь что ваше ПО использует для подключения по HTTPS один из следующих протоколов - TLS 1.0, TLS 1.1, TLS 1.2. Протоколы SSL 2.0, SSL 3.0 не поддерживаются, как устаревшие и небезопасные. Проверьте настройки Свойства браузера (Internet Options) в Панели управления, согласно приведенной ниже картинке:
Общий порядок действий при возникновении проблемы подключения к серверу авторизации
Убедитесь в том что ваш DNS сервер разрешает хост sso.asna.cloud в IP адрес, дав команду ping sso.asna.cloud в командной строке. Если вы увидели в ответе IP адрес, то DNS работает.
Нет, не нужно. На сайт должны выгружаться только целые упаковки, цена должна соответствовать цене целой упаковки.
ВОПРОС
У нас к одному коду товара по справочнику АСНА привязано несколько наших кодов. Как нам выгружать остатки?
Если есть множественная привязка ваших товаров к одному по справочнику АСНА, то такие позиции выгружать на сайт не нужно. Для того чтобы эти товары попали на сайт, необходимо избавиться от множественных связок, используя возможности портала связок Alphaone.
ВОПРОС
У нас несколько партий товара с разными ценами. Почему на сайте мы видим не все партии?
Мы сворачиваем все остатки по номенклатуре, отбирая максимальную розничную цену и минимальный срок годности, при этом суммируя количество. Принцип, по которому идет сворачивание остатков, может в дальнейшем измениться.
ВОПРОС
Мы не видим нашей аптеки на сайте. В чем причина?
Причин может быть много, например, у аптеки сняли признак Активна, не выставлены признаки выгрузки на сайт и бронирования на портале Alphaone. Кроме этого, аптека убирается с сайта, если не было выгрузки полных остатков больше 24 часов. Все эти параметры можно проверить в боте отдела веб-сервисов АСНА Бот отдела веб-сервисов АСНА.
Административная панель первостольника это закрытая часть сайта, в которую возможен доступ только сотрудникам аптеки. В этой административной панели сотрудники аптеки могут видеть все заказы покупателей в этой аптеке, а также изменять их, при необходимости. Разработчики аптечного ПО могут реализовать возможность входа в админку первостольника непосредственно из ПО, например по кнопке или пункту меню.
Ссылки на административную панель первостольника⚓︎
В ссылках необходимо подставить параметры storeId - уникальный идентификатор аптеки по справочнику АСНА, а num - номер заказа
ВОПРОС
Что делать, если при сборе заказа выяснилось что та или иная позиция заказа отсутствует в аптеке?
Так как процесс бронирования из наличия автоматизирован и предполагает что бронирование осуществляется по тем остаткам товара, которые числятся в ПО, то возможны ситуации, когда в ПО товар есть, а в наличии его нет (пересорт, недостача и т.д.). При обнаружении такой ситуации, аптека должна уведомить покупателя по телефону, а покупатель в свою очередь может либо отредактировать заказ либо отменить его. Именно для того, чтобы избежать таких ситуаций, мы просим выгружать нам остатки своевременно и из первоисточника (аптеки), а не из центральной БД (офиса), что, конечно, не устанит проблему на 100%, но уменьшит количество подобных ситуаций.
ВОПРОС
Как должна происходить продажа заказа, в котором есть товар и по наличию и по предзаказу?
Идеальная ситуация, к которой мы стремимся - один чек на один заказ, т.е. покупатель ожидает поступления всего предзаказа и только потом выкупает весь заказ. В случае, если заказ был сделан с терминала в аптеке или покупатель находится рядом с аптекой и хочет выкупить ту часть заказа, которая была забронирована из наличия, есть возможность выкупить заказ в два этапа. Сначала покупатель может выкупить то что было забронировано из наличия аптеки, затем, после получения подтверждения о поступлении предзаказа, выкупить оставшуюся часть. Продажа предзаказа в несколько этапов нежелательна и не предусмотрена, в крайнем случае, покупатель может выкупить то что уже поступило по предзаказу и отказаться от оставшейся части.
ВОПРОС
Может ли покупатель редактировать заказ, в котором есть товар по предзаказу?
Да, может, при этом ни добавлять товары по предзаказу, ни увеличивать количество товара по предзаказу будет невозможно, как только сайт получит 203 статус по заказу.
ВОПРОС
Может ли покупатель редактировать заказ с признаком АСНА-Экономия?
Да, может. При этом цены на товары будут перерасчитываться, исходя из суммы заказа. При уменьшении суммы заказа ниже порога АСНА-Экономии, признак АСНА-Экономия на заказ будет сброшен и покупатель получит заказ по черным (розничным) ценам.
ВОПРОС
Заказ был сделан по АСНА-Экономия, но при выкупе заказа покупатель решил отказаться от некоторых товаров. Как должна происходить продажа?
Заказ с признаком АСНА-Экономия не должен редактироваться через клиентское ПО. Есть два варианта:
Первостольник, через админку первостольника, может изменить заказ покупателя. Цены на товары могут перерасчитаться, исходя из суммы заказа. Желательно, чтобы ПО имело возможность быстро получить изменения с сайта, например, по нажатию на кнопку или пункт меню.
Покупатель может отменить заказ и купить товар, который ему нужен, по ценам аптеки.
ВОПРОС
Что делать если к одному sku по справочнику АСНА привязано 2 или более sku по справочнику номенклатуры аптеки?
В случае, если существуют множественные привязки (много кодов аптеки к одному коду АСНА), клиентское ПО должно иметь возможность проверять каждый код аптеки и бронировать актуальный товар.
Может ли товар находиться в нескольких маркетинговых мероприятиях одного типа?
Один товар может находиться во всех мероприятиях, но не может находиться дважды в одном мероприятии.
ВОПРОС
nntParent - за что отвечает данное поле?
В некоторых мероприятиях есть основной товар и дополнительный. План рассчитывается только на основной товар, а если товар дополнительный, то у него будет заполнено parentNnt, а план нулевой. Дополнительные товары идут в зачет.
ВОПРОС
Для типа мероприятий 9 количество всегда равно 1, или есть исключения?
Количество не всегда равно 1. Возможны другие значения. 30(31) - обязательные товары для БДН, 1 - рекомендуемые товары для БДН(например, новый вводимый товар или товар, который сложно заказать у поставщиков)
ВОПРОС
periodYM - для чего нужен данный параметр, если у мероприятия есть период действия?
Например, мероприятие Товар дня, может быть на месяц, но мероприятие само годовое. И значения ННТ меняются от месяца к месяцу.
ВОПРОС
Меняется ли CIP-цена в зависимости от мероприятия?
Нет, не изменяется. CIP-цена одна для одного SKU во всех типах мероприятий.