Сделки

Запрос к внешнему сервису

Для взаимодействия с внешними сервисами используется операция «Запрос к внешнему сервису». Операция доступна как в сценариях сделки, так и в действиях перехода.

Данные отправляются POST-запросом, в формате JSON, в теле. Набор полей тот же, что и в карточке сделки.

{
    "class": "BumsTradeM_Deal",
    "id": 3,
    "data": {
        "deal": {
            "Id": "3",
            "GUID": "",
            "Name": "№1",
            "Description": "",
            "Contractor": {
                "Id": 1000000,
                "Name": "Тестов Тест"
            },
            ...
        }
    }
}

Если вы хотите обновить данные сделки, сервис должен вернуть данные в формате JSON. Набор полей, как в запросе на редактирование сделки. Если сервис вернёт некорректный JSON, то изменения не вступят в силу, а сообщение об ошибке будет записано в log.

{
    "Model": {
        "Description": "some new value"
    },
    "Positions": [
        {
            "Price": {
                "Value": 42,
                "CurrencyId": 1,
                "Rate": 1
            },
            "OfferId": 51
        },
        {
            "Price": {
                "Value": 43,
                "CurrencyId": 1,
                "Rate": 1
            },
            "OfferId": 52
        }
    ]
}

Задача для примера: При переходе сделки и состояния «Оформление заказ» в состояние «Предоплата», цены товаров должны обновляться из сторонней системы.

1. Добавляем схему «Продажа товаров» из готовых схем

Подробности создания схемы есть в справке Мегаплана.

../_images/deals_tutorial_schema.png

2. Реализуем внешний сервис

Для имитации внешнего сервиса, будем использовать Google Apps Script в режиме Web-приложения. Скрипт получит данные от Мегаплана и возвратит позиции сделок с обновленными ценами. Данные придут в формате карточки сделки, а результат будет отправлен в формате запроса на редактирование сделки.

Скрипт пересоздает первую позицию с переданным товаром и новой ценой (остальные позиции удалятся).

function doPost(e) {
  if (typeof e !== 'undefined')
    return ContentService.createTextOutput(
      JSON.stringify(
        createAnswer(
          JSON.parse(e.postData.contents)
        )
      )
    );
}

function createAnswer(request) {
  return {
    "Positions": [
      {
        "OfferId": request.data.deal.Positions[0].Offer.Id,
        "Price": {
          "Value": 42
        }
      }
    ]
  };
}

3. Создаем действие

К переходу из состояния «Оформление заказ» в состояние «Предоплата», добавляем действие «Запрос к внешнему сервису». Адресом для запроса указываем адрес нашего google script. Например, https://script.google.com/macros/s/AKfycbzk8G5RrOJAHu21V4t7XXbDqoowsrgSkWWGPv1oodQkiB3kQO/exec

../_images/deals_tutorial_operation.png

4. Создаем сделку

Создаем сделку с одной позицией и ценой, например, 110 руб.

../_images/deals_tutorial_deal.png

5. Результат

Переводим сделку в состояние «Предоплата» и наблюдаем обновленную цену.

../_images/deals_tutorial_result.png

Пример обработки данных сделки на PHP есть в библиотеке.