Eofferix принимает JSON-файлы и JSON-ответы. Данные можно загрузить как разовый файл, получать автоматически из вложения к email, забирать по прямой ссылке, по ссылке с авторизацией, через FTP/FTPS/SFTP или из API поставщика.
После получения JSON можно преобразовать в XML, в таблицы CSV/XLSX, в другой JSON с измененными параметрами и значениями или импортировать в приложения, которые поддерживает сервис.

Как работает снапшот
Файл анализируется сервисом и превращается в короткий снапшот с уникальными узлами. Если в массиве тысяча товаров, в снапшоте будет показана структура одного типового элемента и набор встречающихся полей, а не тысяча повторов.
В снапшоте можно задать новые названия узлам, изменить структуру, убрать лишние поля, создать новые узлы и настроить правила преобразования. На следующем запуске эти правила применяются ко всему JSON, который пришел из источника.
Что можно преобразовать
- Переименование полей. Например,
idпревратить вexternal_id,nameвtitle,prices.baseвprice. - Фильтрация записей. Оставить только товары, где
flags.active = true, или выгружать только товары с остатком больше нуля. - Изменение вложенности. Развернуть вложенный
stock[]в список складов, собратьattributes[]в характеристики, а изображения перенести в отдельный узелmedia. - Расчет значений. Сложить строку категории, посчитать цену со скидкой, привести валюту, заполнить дату импорта.
- Преобразовать изображения. Конвертировать в формат
jpg/png/webp, изменить размер изображений, наложить водяной знак. - Импорт в приложение. Привязать узлы JSON к полям каталога, CRM, CMS или другого поддерживаемого направления.

Примеры преобразований
Инструмент преобразований позволяет сильно изменить итоговую выгрузку: отфильтровать лишние элементы, переименовать узлы, собрать новую структуру, посчитать значения по правилам, заполнить новые поля данными из других мест документа и подготовить результат под требования маркетплейса, сайта, PIM или внутренней системы.
Что сделано в примере с ценой
Ниже те же правила разложены по шагам. Каждый скриншот показывает только строку правила, которая отвечает за текущий шаг.
1. Сначала удаляем пробелы из значения цены. Это полезно, когда поставщик присылает цену как строку вроде 12 990.

2. Если цена не пустая, сервис увеличивает ее на 15%. Так можно добавить наценку, не меняя исходный JSON.

3. Дальше правило смотрит на другой узел документа: /catalog/items/stock/qty. Если остаток меньше 5, цена заменяется на 0.

4. Еще одно правило использует узел /catalog/items/brand: для бренда TestBrand цена дополнительно умножается на 1,5.

5. В конце результат округляется до одного знака по стандартным правилам.

Простой пример: переименовать поля и оставить активные товары
В этом примере берем элементы из catalog.items[], оставляем только активные товары и приводим названия полей к формату целевой выгрузки.
{
"id": "A-100",
"sku": "ITEM-100",
"name": "Кресло Nordic",
"prices": {
"base": 129.90,
"discount": 119.90
},
"flags": {
"active": true
}
}{
"external_id": "A-100",
"sku": "ITEM-100",
"title": "Кресло Nordic",
"price": 119.90,
"old_price": 129.90
}Правила:
- В исходном JSON есть товар с
id = A-100. Остальные товары идут по такой же структуре, но снапшот показывает один представитель повторяющегося массиваcatalog.items[]. Кликните значениеtrueвнутри объектаflags, в полеactive, и в блоке Условия выгрузки выберите Условие для элемента целиком. Так можно выгружать только элементы со значениемtrueили, наоборот, не выгружать элементы со значениемfalse.
Условие применено к элементу целиком: товар попадает в выгрузку, если flags.active равно true; второе правило можно использовать как обратную проверку для false. - Переименуйте узел
idвexternal_id: кликните по названию узла и введите новое название.
Настройки узла: новое имя external_id вводится в поле Название узла. - По тому же принципу переименуйте
nameвtitle. Отдельный скриншот здесь не нужен: действие такое же, как дляid. - С ценами есть два рабочих сценария. Если структура
pricesподходит, достаточно переименоватьprices.discountвprice, аprices.baseвold_price. Еслиpriceиold_priceдолжны лежать на уровне товара, создайте новые узлы рядом сidиname, заполните их значениями из/catalog/items/prices/discountи/catalog/items/prices/base, затем не выгружайте старый контейнерprices.
Для нового поля price используется действие заменить: значение берется из другого узла документа.
Новые узлы
Новый узел нужен, когда в результате должно появиться поле, которого нет в исходном JSON, или когда исходные данные нужно разложить иначе.

Узел можно заполнить:
- значением из другого места исходного файла, например записать в него название, артикул, бренд или соединить несколько значений и получить, к примеру, единое поле
Название артикул бренд; - системным значением, например датой запуска или именем источника;
- выражением, например склеить путь категории или посчитать процент скидки;
- можно сделать его переменной.
Переменные: зачем они нужны
Переменная хранит промежуточный результат. Ее удобно использовать, когда одно значение нужно применить в нескольких местах или в нескольких условиях.
Важно: переменные не попадают в итоговую выгрузку. Они служат только для помощи остальным преобразованиям: можно сохранить промежуточный результат и использовать его дальше в правилах, условиях или расчетах.

Например, переменная final_price рассчитывается один раз:
final_price = prices.discount если prices.discount заполнен, иначе prices.base
После этого ее можно использовать сразу в нескольких правилах:
product.prices.price = final_price;product.prices.old_price = prices.base, еслиfinal_priceменьше базовой цены;product.prices.discount_percentрассчитывается отprices.baseиfinal_price;- условие выгрузки проверяет, что
final_priceбольше нуля.
Так правила остаются короче, а цена в разных частях результата не расходится из-за повторного ручного расчета.