Главная

Описание API модуля вьюверов 2.0

C чего начать

  1. Создать инди метафайл, в котором необходимо прописать URI требуемого вьювера и конфигурацию (см. раздел "Метафайл")
  2. Создать (при необходимости) js-модули (см. примеры) с реализацией кастомных колонок или хэдеров и положить их в каталог extensions/modules или extensions/libs

Список доступных пространств имен:

  • viewers2 - глобально доступные утилитарные методы и данные
    • data - доступные посредством обращения к одноименному объекту данные документа
    • headers - применяемые для расчета хэдеров типы, переменные и методы
      • defaultHeaders - список встроенных хэдеров
    • rows - применяемые для расчета колонок типы, переменные и методы
      • defaultColumns - список встроенных колонок

Метафайл

В поле конфигурации метафайла ("config") для настройки вьюверов доступны следующие поля:

// Может быть массивом объектов, например, для документа Заказ+Мерч
"documentType": {
    "name": "order", // "merch", "movement", "order", "request", "return", "sale"
    "skus": "D"      // "D", "CO", "COD"
},
// Опциональные параметры подключаемых файлов с кастомными атрибутами/реквизитами и колонками (тоже может быть массивом).
// Поиск файлов ведется в подкаталоге modules или libs
"customHeadersFile": "customheaders.js",
"customColumnsFile": "customcolumns.js",
// Опциональный параметр, содержащий заглушку, подставляемую вместу пустого значения
"customEmptyValue": "<ПУСТО>",
// Список необходимых хэдеров; встроенные (весь список ниже) или кастомные
// Если документов несколько, то массив массивов
"requiredHeaders": [
    "agreement",     // Договор
    "baseDocument",  // Документ-основание
    "buyer",         // Владелец
    "comment",       // Комментарий к документу
    "counteragent",  // Контрагент
    "deliveryDate",  // Дата доставки
    "distributor",   // Дистрибьютор
    "exchangeState", // Стадия обмена
    "isRetail",      // Розница
    "overdue",       // Просрочка
    "outletAddress", // Адрес торговой точки
    "outletName",    // Название торговой точки
    "payType",       // Тип оплаты
    "priceType",     // Тип цены
    "provider",      // Поставщик
    "receiver",      // Получатель
    "relatedDocs",   // Связанные документы
    "responsible",   // Ответственный
    "store",         // Склад
    "storeReceiver", // Склад-получатель
    "storeSender"    // Склад-отправитель
],
// Список необходимых колонок; встроенные (весь список ниже) или кастомные
// Если документов несколько, то массив массивов
"requiredColumns": [
    "amount",        // Сумма
    "baseDocument",  // Документ-основание
    "discount",      // Скидка
    "discountPromo", // Бонус-скидка
    "facing",        // Фейсинг
    "price",         // Цена
    "quantity",      // Количество / Остаток в торговой точке
    "salePrice",     // Цена отгрузки
    "saleQuantity",  // Отгруженное количество
    "skuName",       // Наименование товара
    "VAT",           // НДС
    "weight"         // Вес
]

Особенности

  • Чтобы заменить стандартную хэдер или колонку просто создайте кастомную с таким же именем
  • Столбцы или хэдеры выводятся в порядке, указанном в метафайле
  • Возвращать явно emptyValue не требуется, если из функции получения значения вернется приводимое к false значение, emptyValue заменит его автоматически
  • check вызывается для каждой колонки один раз для первой строки, в дальнейшем, если check вернул false, value данной колонки вычисляться не будет

Примеры

Структура хэдера

function doCheck() {
    return !+false%1;
}
headerName: {
    // Обязательно:
    name: function (index, data, utils) { // Передаются индекс текущего хэдера, данные документа и функции-утилиты
        return "Header name";
    },
    value: function (index, data, utils) { // Передаются индекс текущего хэдера, данные документа и функции-утилиты
        return "значение";
    },
    // Опционально:
    check: doCheck, // если false - не отобразится, в функцию передается индекс текущего хэдера, данные документа и функции-утилиты
    type: "header" // "header", "attribute"
}

Структура колонки

function doCheck() {
    return +(!!+"0"==0);
}
columnName: {
    // Обязательно:
    name: function (row, index, data) { // Передаются текущая строка, ее индекс и данные документа.
        return "Column name";
    },
    // Методы получения сырого значения (используется для подсчета подытогов) и конвертированного, для вывода.
    // В методы передаются текущая строка, ее индекс и данные документа.
    rawValue: function (row, index, data) {
        return "сырое_значение";
    },
    value: function (row, index, data) {
        return "<h1>" + this.rawValue(row, index, data) + "</h1>";
    },
    // Опционально:
    check: doCheck, // если false - не отобразится, передаются текущая строка, ее индекс и данные документа
    total: { // Методы для подсчета и форматирования итогов
        count: function (total, next) {
            return prev + next;
        },
        format: function (total) {
            return prev + next;
        }
    }
}

Содержимого файла (модуля) с кастомными хэдерами

module.exports = {
    customHeaders: {
        customHeader: {
            name: function () {
                return "ID документа"
            },
            value: api.context.docId,
            check: function () {
                return api.context.docId != "0";
            }
        },
        anotherCustomHeader: {
            name: function () {
                return "Текущая дата"
            },
            value: function getNewDate() {
                return new Date();
            },
            type: "attribute"
        }
    }
}

Содержимого файла (модуля) с кастомными колонками

module.exports = {
    customColumns: {
        customCoulmn: {
            name: function() {
                return "Номер строки"
            },
            rawValue: function(row, index) {
                return index;
            },
            value: function(row, index) {
                return "№" + index;
            },
            check: function (row, index, data) {
                return data.rows.length != 1;
            },
            total: {
                count: function (total, next) {
                    return total + next;
                },
                format: function (total) {
                    return total + " строк";
                }
            }
        }
    }
}

Структура строк документа

"documentRows": [
    {
        "groupName": "Актуальный » Чёрный чай » Бренд 5",
        "appendix": "(1 поз)",
        "rows": [
            {
                "main": [
                    "R Royal Earl Grey 100п",
                    "<span class='w-s'>5 шт  <img class='matched-sku-row rotate' style='display:none;'src='qrc:/themes/material/icons/menu_top.svg'></span>",
                    " — ",
                    "201,24",
                    "1 006,20 Р",
                    " — "
                ],
                "additional": [
                    [
                        "R Royal Earl Grey 100п",
                        "<span class='w-s'>5 шт </span>",
                        "5 шт",
                        "201,24",
                        " — ",
                        " — "
                    ],
                    [
                        "R Royal Earl Grey 10x10п",
                        "<span class='w-s'>5 шт </span>",
                        "5 шт",
                        "201,24",
                        " — ",
                        " — "
                    ]
                ]
            }
        ],
        "totals": {
            "raw": [
                1,
                null,
                null,
                null,
                1006.2,
                0
            ],
            "formatted": [
                "1 поз",
                null,
                null,
                null,
                "1 006,20 Р",
                "0,000"
            ]
        }
    }
]