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

Сложный
PDF

Пример. Добавить мультивалютное поле Общая сумма (Amount) на страницу проекта.

1. Создать схему замещающего объекта 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Замещающий объект (Add —> Replacing object).

  3. Заполните свойства схемы.

    • Код (Code) — "Project".
    • Заголовок (Title) — "Проект" ("Project").
    • Родительский объект (Parent object) — выберите "Project".
  4. В схему добавьте колонку.

    1. В контекстном меню узла Колонки (Columns) структуры объекта нажмите add_button.
    2. В выпадающем меню нажмите Справочник (Lookup).

    3. Заполните свойства добавляемой колонки.

      • Код (Code) — "UsrCurrency".
      • Заголовок (Title) — "Валюта" ("Currency").
      • Справочник (Lookup) — выберите "Currency".
      • Значение по умолчанию (Default value).

        1. В поле Значение по умолчанию (Default value) нажмите scr_edit_button.png.
        2. Тип значения (Default value type) — выберите "Cистемная настройка" ("System setting").
        3. Cистемная настройка (System setting) — выберите "Базовая валюта" ("Base currency", код PrimaryCurrency).

    Свойства колонки представлены на рисунке ниже.

  5. Аналогично добавьте колонки, которые содержат общую сумму, сумму в базовой валюте и курс валют. Свойства колонок приведены в таблице ниже.

    Свойства добавляемых колонок
    Тип данных

    (Data type)

    Код

    (Code)

    Заголовок

    (Title)

    Деньги

    (Currency)

    "UsrAmount"
    "Общая сумма"

    ("Amount")

    Деньги

    (Currency)

    "UsrPrimaryAmount"
    "Сумма в базовой валюте"

    ("Amount, base currency")

    Дробное число (0,0001)

    (Decimal (0.0001))

    "UsrCurrencyRate"
    "Курс валют"

    ("Exchange rate")

  6. На панели инструментов дизайнера объектов нажмите Сохранить (Save), а затем Опубликовать (Publish).

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

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Замещающая модель представления (Add —> Replacing view model).

  3. Заполните свойства схемы.

    • Код (Code) — "ProjectPageV2".
    • Заголовок (Title) — "Страница редактирования проекта" ("Project edit page").
    • Родительский объект (Parent object) — выберите "ProjectPageV2".
  4. В объявлении класса модели представления в качестве зависимостей добавьте модули MoneyModule, MultiCurrencyEdit, MultiCurrencyEditUtilities.
  5. Настройте расположение мультивалютного поля.

    1. В свойство attributes добавьте атрибуты:

      • UsrCurrency — валюта. Соответствует колонке UsrCurrency.
      • UsrCurrencyRate — курс валюты. Соответствует колонке UsrCurrencyRate.
      • UsrAmount — общая сумма. Соответствует колонке UsrAmount.
      • UsrPrimaryAmount — сумма в базовой валюте. Соответствует колонке UsrPrimaryAmount.
      • Currency — валюта. Соответствует колонке Currency. Это колонка, с которой взаимодействует мультивалютный модуль. В атрибуте Currency объявите виртуальную колонку, которую с помощью метода-обработчика свяжите с колонкой UsrCurrency.
      • CurrencyRateList — коллекция курсов валют. Предназначен для корректной работы мультивалютного модуля.
      • CurrencyButtonMenuList — коллекция для кнопки выбора валюты. Предназначен для корректной работы мультивалютного модуля.
    2. В свойство mixins добавьте миксин MultiCurrencyEditUtilities.
    3. В свойстве methods реализуйте методы:

      • onEntityInitialized() — переопределяет базовый виртуальный метод. Срабатывает после выполнения инициализации схемы объекта страницы записи.
      • setCurrencyRate() — устанавливает курс валюты.
      • recalculateAmount() — пересчитывает общую сумму.
      • recalculatePrimaryAmount() — пересчитывает сумму в базовой валюте.
      • onVirtualCurrencyChange() — метод-обработчик изменения виртуальной колонки валюты.
    4. В массив модификаций diff добавьте конфигурационный объект с настройками расположения мультивалютного поля.

    Исходный код схемы замещающей модели представления страницы проекта представлен ниже.

    ProjectPageV2
    /* В качестве зависимостей укажите модули 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,
                        /* Массив конфигурационных объектов, которые определяют зависимости колонки [UsrCurrencyRate]. */
                        "dependencies": [
                            {
                                /* Значение колонки [UsrCurrencyRate] зависит от значения колонки [UsrCurrency]. */
                                "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() {
                        /* Вызывается родительская реализация метода. */
                        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*/
            };
        });
    
  6. На панели инструментов дизайнера нажмите Сохранить (Save).

Результат выполнения примера 

Чтобы посмотреть результат выполнения примера, обновите страницу раздела Проекты (Projects).

В результате выполнения примера на страницу проекта добавлено мультивалютное поле Общая сумма (Amount).

Значение поля автоматически пересчитывается после выбора валюты в выпадающем списке.