Получение данных из МойСклад через webhook
Привет. Меня зовут Доброхвалов Михаил. Я являюсь основателем и руководителем IT компании WelbeX. В одном из наших кейсов я показывал, как мы реализовали загрузку данных из серсиса МойСклад в mySQL. Сегодня я расскажу, как вы можете реализовать аналогичное решение, используя функционал webhook и сервис myBI Connect. Не все знают, что, кроме подключений по API к источникам данных, myBI Connect умеет еще получать данные через webhook из произвольного источника.
Получение данных
Одним из ключевых вопросов, которые потребуется решить, это получение данных из МойСклад, так как webhook этого сервиса отправляет только ID документа. Следовательно, основные параметры заказа, отгрузки и т.д. мы можем получить только с помощью API МойСклад.
Для того, чтобы принимать данные, нам необходимо настроить вебхук. Для этого мы заходим в раздел "Источники данных", выбираем "Добавить новый" > "Прочее" > "Webhooks" и нажимаем "Подключить".
Далее вводим название "МойСклад" и нажимаем "Продолжить".
Теперь в настройках источника у нас появился URL, который и потребуется нам в дальнейшей работе.
Хранение данных
Все данные, которые вы будете загружать через webhook, по умолчанию сохраняются в таблицу "webhook_requests" в виде JSON.
Хранение данных в формате JSON не всегда удобно. Основной вопрос в том, что данные в формате JSON весят больше, чем таблица начинает съедать объём БД. И второстепенный вопрос заключается в том, что перед использованием этих данных, потребуется преобразование, а это лишние вычисления, которые будут нагружать систему. Поэтому мы будем загружать данные сразу в виде отдельных таблиц с предобработкой.
Обработка данных
Давайте посмотрим, как данные "прилетают" нам из МойСклад. Нам потребуется несколько вебхуков Demand, Loss, Supply, Salesreturn, Enter (отгрузка, списание, приёмка, возврат, оприходование). Все эти вебхуки имеют еще по 3 зацепа: ADD, DELETE, UPDATE.
Для того, чтобы создать вебхуки, вы можете воспользоваться официальной документацией МойСклад.
Какие таблицы нам понадобятся:
- products - таблица с товарами и основными параметрами;
- products_fields - все параметры наших товаров;
- documents - документы о отгрузках, приёмках и возвратах;
- calendar - ну и стандартный календарь для работы с датами.
Сегодня рассмотрим только получение данных об отгрузке, поскольку все остальные данные обрабатываются похожим образом. Как я уже описывал выше, по webhook из МойСклад нам приходит только ID документа, по которому мы уже в дальнейшем через API получаем полные данные.
{
"context": {
"employee": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/context/employee>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/employee/metadata>",
"type": "employee",
"mediaType": "application/json"
}
}
},
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/demand/?limit=2>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/demand/metadata>",
"type": "demand",
"mediaType": "application/json",
"size": 13,
"limit": 2,
"offset": 0
},
"rows": [
{
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/demand/0ee24723-f640-11e5-8a84-bae500000065>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/demand/metadata>",
"type": "demand",
"mediaType": "application/json"
},
"id": "0ee24723-f640-11e5-8a84-bae500000065",
"accountId": "84e60e93-f504-11e5-8a84-bae500000008",
"syncId": "734a9e26-45a2-4ead-849c-e144daeb854d",
"version": 1,
"updated": "2016-03-30 09:24:29",
"name": "00001",
"externalCode": "1SB6iRE9imMFJDMlab7Nk0",
"owner": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/employee/faba7f37-2e58-11e6-8a84-bae500000028>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/employee/metadata>",
"type": "employee",
"mediaType": "application/json"
}
},
"shared": false,
"group": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/group/f97aa1fb-2e58-11e6-8a84-bae500000002>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/group/metadata>",
"type": "group",
"mediaType": "application/json"
}
},
"moment": "2016-03-30 09:24:00",
"applicable": true,
"vatEnabled": true,
"vatIncluded": true,
"sum": 123000,
"rate": {
"currency": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/currency/baac25f0-50ac-11e5-300d-c79b00000055>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/currency/metadata>",
"type": "currency",
"mediaType": "application/json"
}
}
},
"organization": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/organization/850c8195-f504-11e5-8a84-bae50000015e>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/organization/metadata>",
"type": "organization",
"mediaType": "application/json"
}
},
"store": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/store/850ee995-f504-11e5-8a84-bae500000160>",
"type": "store",
"mediaType": "application/json"
}
},
"agent": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/counterparty/850efc5f-f504-11e5-8a84-bae500000161>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/counterparty/metadata>",
"type": "counterparty",
"mediaType": "application/json"
}
},
"organizationAccount": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/organization/850c8195-f504-11e5-8a84-bae50000015e/accounts/850c8af2-f504-11e5-8a84-bae50000015f>",
"type": "account",
"mediaType": "application/json"
}
},
"agentAccount": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/counterparty/850efc5f-f504-11e5-8a84-bae500000161/accounts/850f0617-f504-11e5-8a84-bae500000162>",
"type": "account",
"mediaType": "application/json"
}
},
"documents": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/demand/06406b97-9138-11e6-8a84-bae500000000/documents>",
"mediaType": "application/json",
"size": 0,
"limit": 100,
"offset": 0
}
},
"positions": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/demand/0ee24723-f640-11e5-8a84-bae500000065/positions>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/demand/metadata>",
"type": "demandposition",
"mediaType": "application/json",
"size": 1,
"limit": 100,
"offset": 0
}
},
"payedSum": 0,
"consignee": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/counterparty/869d7628-6396-11e6-8a84-bae50000000a>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/counterparty/metadata>",
"type": "counterparty",
"mediaType": "application/json"
}
},
"transportFacilityNumber": "лb777m",
"shippingInstructions": "Беречь от воздействия солнца",
"cargoName": "Овощи",
"transportFacility": "Mercedes benz",
"carrier": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/counterparty/cffd2c81-62b4-11e6-8a84-bae500000053>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/counterparty/metadata>",
"type": "counterparty",
"mediaType": "application/json"
}
},
"overhead": {
"sum": 200,
"distribution": "price"
}
},
{
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/demand/b44f220c-f64e-11e5-8a84-bae500000068>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/demand/metadata>",
"type": "demand",
"mediaType": "application/json"
},
"id": "b44f220c-f64e-11e5-8a84-bae500000068",
"accountId": "84e60e93-f504-11e5-8a84-bae500000008",
"syncId": "734a9e26-45a2-4ead-849c-e144daeb854d",
"version": 2,
"updated": "2016-04-01 10:37:29",
"name": "00002",
"externalCode": "btlob8zrgFoJoxXLNyxBi3",
"owner": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/employee/faba7f37-2e58-11e6-8a84-bae500000028>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/employee/metadata>",
"type": "employee",
"mediaType": "application/json"
}
},
"shared": false,
"group": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/group/f97aa1fb-2e58-11e6-8a84-bae500000002>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/group/metadata>",
"type": "group",
"mediaType": "application/json"
}
},
"moment": "2016-03-30 11:08:00",
"applicable": false,
"vatEnabled": true,
"vatIncluded": true,
"sum": 123000,
"rate": {
"currency": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/currency/baac25f0-50ac-11e5-300d-c79b00000055>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/currency/metadata>",
"type": "currency",
"mediaType": "application/json"
}
}
},
"organization": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/organization/850c8195-f504-11e5-8a84-bae50000015e>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/organization/metadata>",
"type": "organization",
"mediaType": "application/json"
}
},
"store": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/store/850ee995-f504-11e5-8a84-bae500000160>",
"type": "store",
"mediaType": "application/json"
}
},
"agent": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/counterparty/850f1667-f504-11e5-8a84-bae500000163>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/counterparty/metadata>",
"type": "counterparty",
"mediaType": "application/json"
}
},
"organizationAccount": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/organization/850c8195-f504-11e5-8a84-bae50000015e/accounts/850c8af2-f504-11e5-8a84-bae50000015f>",
"type": "account",
"mediaType": "application/json"
}
},
"agentAccount": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/counterparty/850f1667-f504-11e5-8a84-bae500000163/accounts/850f1eab-f504-11e5-8a84-bae500000164>",
"type": "account",
"mediaType": "application/json"
}
},
"documents": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/demand/06406b97-9138-11e6-8a84-bae500000000/documents>",
"mediaType": "application/json",
"size": 0,
"limit": 100,
"offset": 0
}
},
"positions": {
"meta": {
"href": "<https://online.moysklad.ru/api/remap/1.1/entity/demand/b44f220c-f64e-11e5-8a84-bae500000068/positions>",
"metadataHref": "<https://online.moysklad.ru/api/remap/1.1/entity/demand/metadata>",
"type": "demandposition",
"mediaType": "application/json",
"size": 3,
"limit": 100,
"offset": 0
}
},
"payedSum": 0,
"overhead": {
"sum": 300,
"distribution": "weight"
}
}
]
}
Эти данные нам необходимо разобрать и сложить через webhook в myBI Connect.
Подробное описание работы с webhooks в myBI Connect вы можете найти в этой статье.
Для этого создадим вначале структуру для отправки webhooks.
[
{
table: "documents",
description: "Документы МойСклад",
fields: [
{
name: "id",
type: "integer",
primary: true,
index: false,
nullable: false,
source: "request",
path: "$.documents.id"
},
{
name: "doc_date",
type: "date",
primary: false,
index: false,
nullable: false,
source: "request",
path: "$.documents.doc_date"
},
{
name: "doc_type",
type: "string(15)",
primary: false,
index: false,
nullable: false,
source: "request",
path: "$.documents.doc_type"
},
{
name: "ms_product",
type: "string(100)",
primary: false,
index: false,
nullable: false,
source: "request",
path: "$.documents.ms_product"
},
{
name: "quantity",
type: "integer",
primary: false,
index: false,
nullable: false,
source: "request",
path: "$.documents.quantity"
},
{
name: "price_doc",
type: "float",
primary: false,
index: false,
nullable: false,
source: "request",
path: "$.documents.price_doc"
},
{
name: "store",
type: "string(20)",
primary: false,
index: false,
nullable: false,
source: "request",
path: "$.documents.store"
},
{
name: "ms_doc",
type: "string(100)",
primary: false,
index: false,
nullable: false,
source: "request",
path: "$.documents.ms_doc"
}
]
}
]
После того, как мы проделаем такие же действия с остальными таблицами, мы получим следующую модель данных.
А теперь можем уже строить отчет, который нам необходим. Посмотреть наше демо можно тут.
Войдите в службу, чтобы оставить комментарий.
Комментарии
0 комментариев