Документация по разработке bpm’online
PDF
Документация по разработке
Разработка в bpm'online на примерах

Добавление мультивалютного поля

Glossary Item Box

Общие сведения

Одной из распространенных задач конфигурирования системы является добавление на страницу элемента управления [Мультивалютное поле]. Этот элемент предоставляет пользователю возможность не просто вводить денежную сумму, но и указывать ее валюту. Также он позволяет фиксировать эквивалент суммы в базовой валюте, которая задана в настройках системы. При изменении валюты существующая сумма автоматически пересчитывается с учетом обменных курсов валют. На рисунке 1 представлено мультивалютное поле в интерфейсе системы.

Рис. 1. — Мультивалютное поле

Для добавления мультивалютного поля на страницу редактирования необходимо:

1. Добавить в схему объекта четыре колонки:

  • колонку — справочник валюты;
  • колонку курса валюты;
  • колонку для хранения общей суммы в выбранной валюте;
  • колонку для хранения суммы в базовой валюте.

К СВЕДЕНИЮ

В схеме объекта может быть определена только одна колонка — для хранения общей суммы в выбранной валюте. Остальные колонки могут являться виртуальными, если бизнес-задача не предполагает хранения в базе данных их значений. Они могут быть определены как атрибуты в схеме модели представления.

2. Указать в объявлении класса модели представления в качестве зависимостей три модуля:

  • MoneyModule,
  • MultiCurrencyEdit,
  • MultiCurrencyEditUtilities.

3. Подключить к модели представления миксин Terrasoft.MultiCurrencyEditUtilities и инициализировать его в переопределенном методе init().

4. Добавить конфигурационный объект с настройками мультивалютного поля в массив diff схемы модели представления страницы редактирования. В нем в свойстве values кроме общих для всех элементов управления свойств должны содержаться свойства:

  • primaryAmount — наименование колонки, которая содержит сумму в базовой валюте;
  • currency — наименование колонки, которая ссылается на справочник валют;
  • rate — наименование колонки, которая содержит курс валюты;
  • generator — генератор элемента управления. Для мультивалютного поля необходимо указать MultiCurrencyEditViewGenerator.generate.

5. Добавить логику пересчета суммы в зависимости от валюты. Для этого применить механизм вычисляемых полей, подробно описанный в статье Добавление вычисляемых полей.

Описание примера

Необходимо добавить мультивалютное поле [Итого] на страницу редактирования проекта.

Исходный код

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера

1. Добавить в замещающую схему объекта необходимые колонки

В пользовательском пакете создайте замещающую схему объекта [Проект] ([Project]) (рис. 2). Подробно создание замещающего объекта и добавление колонок описано в статье "Добавление нового поля".

Рис. 2. — Свойства замещающей схемы объекта

В замещающую схему добавьте четыре колонки, свойства которых приведены на рис. 3 — рис. 6. Свойства колонок в дизайнере объектов отображены в расширенном режиме.

Рис. 3. — Свойства колонки [UsrCurrency]

Рис. 4. — Свойства колонки [UsrAmount]

Рис. 5. — Свойства колонки [UsrPrimaryAmount]

Рис. 6. — Свойства колонки [UsrCurrencyRate]

Для колонки [UsrCurrency] добавьте значение по умолчанию - системная настройка [Базовая валюта] (рис. 7).

Рис. 7. — Значение по умолчанию для колонки [UsrCurrency]

2. В пользовательском пакете создать замещающую страницу редактирования проекта

Создайте замещающий клиентский модуль, в котором в качестве родительского объекта укажите схему [Страница редактирования проекта] ([Project edit page], ProjectPageV2) (рис. 8). Процесс создания замещающей страницы описан в статье "Создание клиентской схемы".

Рис. 8. — Свойства замещающей страницы редактирования [Проекты]

В объявлении класса модели представления в качестве зависимостей добавьте модули MoneyModule, MultiCurrencyEdit, MultiCurrencyEditUtilities (см. исходный код ниже).

3. Добавить необходимые атрибуты

В свойстве attributes схемы модели представления страницы редактирования определите атрибуты UsrCurrency, UsrCurrencyRate, UsrAmount, UsrPrimaryAmount, соответствующие добавленным колонкам схемы объекта.

Мультивалютный модуль работает только с колонкой Currency, поэтому дополнительно создайте атрибут Currency, в котором объявите виртуальную колонку. Эту колонку свяжите с созданной ранее колонкой UsrCurrency при помощи метода-обработчика.

Для корректной работы мультивалютного модуля добавьте атрибуты CurrencyRateList (коллкекция курсов валют) и CurrencyButtonMenuList (коллекция для кнопки выбора валюты) (см. исходный код ниже).

5. Подключить к модели представления миксин Terrasoft.MultiCurrencyEditUtilities

Объявите миксин Terrasoft.MultiCurrencyEditUtilities в свойстве mixins схемы модели представления страницы. Выполните его инициализацию в переопределенном методе init() схемы модели представления (см. исходный код ниже).

6. Реализовать логику пересчета суммы в зависимости от валюты.

В коллекцию methods схемы модели представления страницы добавьте методы-обработчики зависимостей атрибутов (см. исходный код ниже).

7. Добавить мультивалютное поле на страницу

В массив diff схемы модели представления страницы редактирования добавьте конфигурационный объект с настройками мультивалютного поля .

Исходный код замещающей схемы:

// В качестве зависимостей нужно указать модули
// MoneyModule, MultiCurrencyEdit и MultiCurrencyEditUtilities.
define("ProjectPageV2", ["MoneyModule", "MultiCurrencyEdit", "MultiCurrencyEditUtilities"],
    function(MoneyModule, MultiCurrencyEdit, MultiCurrencyEditUtilities) {
        return {
            // Название схемы объекта страницы редактирования.
            entitySchemaName: "Project",
            // Атрибуты модели представления.
            attributes: {
                // Валюта.
                "UsrCurrency": {
                    // Тип данных атрибута — справочник.
                    "dataValueType": this.Terrasoft.DataValueType.LOOKUP,
                    // Конфигурация справочнка валют.
                    "lookupListConfig": {
                        "columns": ["Division", "Symbol"]
                    }
                },
                // Курс.
                "UsrCurrencyRate": {
                    "dataValueType": this.Terrasoft.DataValueType.FLOAT,
                    // Зависимости атрибута.
                    "dependencies": [
                        {
                            // Колонки, от которых зависит атрибут.
                            "columns": ["UsrCurrency"],
                            // Метод-обработчик.
                            "methodName": "setCurrencyRate"
                        }
                    ]
                },
                // Сумма.
                "UsrAmount": {
                    "dataValueType": this.Terrasoft.DataValueType.FLOAT,
                    "dependencies": [
                        {
                            "columns": ["UsrCurrencyRate", "UsrCurrency"],
                            "methodName": "recalculateAmount"
                        }
                    ]
                },
                // Сумма в базовой валюте.
                "UsrPrimaryAmount": {
                    "dependencies": [
                        {
                            "columns": ["UsrAmount"],
                            "methodName": "recalculatePrimaryAmount"
                        }
                    ]
                },
                // Валюта — виртуальная колонка для совместимости с модулем MultiCurrencyEditUtilities.
                "Currency": {
                    "type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    "dataValueType": this.Terrasoft.DataValueType.LOOKUP,
                    "lookupListConfig": {
                        "columns": ["Division"]
                    },
                    "dependencies": [
                        {
                            "columns": ["Currency"],
                            "methodName": "onVirtualCurrencyChange"
                        }
                    ]
                },
                // Коллекция курсов валют
                "CurrencyRateList": {
                    dataValueType: this.Terrasoft.DataValueType.COLLECTION,
                    value: this.Ext.create("Terrasoft.Collection")
                },
                // Коллекция для кнопки выбора валюты
                "CurrencyButtonMenuList": {
                    dataValueType: this.Terrasoft.DataValueType.COLLECTION,
                    value: this.Ext.create("Terrasoft.BaseViewModelCollection")
                }
            },
            // Миксины модели представления.
            mixins: {
                // Миксин управления мультивалютностью на странице редактирования.
                MultiCurrencyEditUtilities: "Terrasoft.MultiCurrencyEditUtilities"
            },
            // Методы модели представления страницы.
            methods: {
                // Переопределение базового метода Terrasoft.BasePageV2.onEntityInitialized().
                onEntityInitialized: function() {
                    // Вызов родительской реализации метода onEntityInitialized.
                    this.callParent(arguments);
                    this.set("Currency", this.get("UsrCurrency"), {silent: true});
                    // Инициализация миксина управления мультивалютностью.
                    this.mixins.MultiCurrencyEditUtilities.init.call(this);
                },
                // Устанавливает курс валюты.
                setCurrencyRate: function() {
                    //Загружает курс валют на дату начала проекта.
                    MoneyModule.LoadCurrencyRate.call(this, "UsrCurrency", "UsrCurrencyRate", this.get("StartDate"));
                },
                // Пересчитывает сумму.
                recalculateAmount: function() {
                    var currency = this.get("UsrCurrency");
                    var division = currency ? currency.Division : null;
                    MoneyModule.RecalcCurrencyValue.call(this, "UsrCurrencyRate", "UsrAmount", "UsrPrimaryAmount", division);
                },
                // Пересчитывает сумму в базовой валюте.
                recalculatePrimaryAmount: function() {
                    var currency = this.get("UsrCurrency");
                    var division = currency ? currency.Division : null;
                    MoneyModule.RecalcBaseValue.call(this, "UsrCurrencyRate", "UsrAmount", "UsrPrimaryAmount", division);
                },
                // Обработчик изменения виртуальной колонки валюты.
                onVirtualCurrencyChange: function() {
                    var currency = this.get("Currency");
                    this.set("UsrCurrency", currency);
                }
            },
            // Настройка визуализации мультивалютного поля на странице редактирования.
            diff: /**SCHEMA_DIFF*/[
                // Метаданные для добавления поля [Сумма].
                {
                    // Операция добавления.
                    "operation": "insert",
                    // Мета-имя родительского контейнера, в который добавляется компонент.
                    "parentName": "Header",
                    // Поле добавляется в коллекцию компонентов
                    // родительского контейнера.
                    "propertyName": "items",
                    // Мета-имя компонента схемы, над которым производится действие.
                    "name": "UsrAmount",
                    // Свойства, передаваемые в конструктор компонента.
                    "values": {
                        // Имя колонки модели представления, к которой выполняется привязка.
                        "bindTo": "UsrAmount",
                        // Расположение элемента в контейнере.
                        "layout": { "column": 0, "row": 2, "colSpan": 12 },
                        // Наименование колонки, которая содержит сумму в базовой валюте.
                        "primaryAmount": "UsrPrimaryAmount",
                        // Наименование колонки, которая содержит валюту суммы.
                        "currency": "UsrCurrency",
                        // Наименование колонки, которая содержит курс валюты.
                        "rate": "UsrCurrencyRate",
                        // Свойство определяющее доступность для редактирования поля суммы в базовой валюте.
                        "primaryAmountEnabled": false,
                        // Генератор представления элемента управления.
                        "generator": "MultiCurrencyEditViewGenerator.generate"
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    });

После сохранения схемы и обновления страницы приложения на странице редактирования проекта появится мультивалютное поле [Итого] ([Amount]) (рис. 1). Значение поля будет автоматически пересчитано после выбора валюты из выпадающего списка (рис. 9).

Рис. 9. — Выпадающий список валют

© Terrasoft 2002-2019.

Был ли данный материал полезен?

Как можно улучшить эту статью?