Коллеги, у нас появилась проблема – как правильнее\удобнее документировать техническую логику проектных решений.
Например – по нажатию «сохранить» в счете проверяется 10 условий и на каждое из них система по разному реагирует. Все это храниться в коде и когда возвращаемся к этому коду через год - очень тяжело понять что и как. Документация, оформленная с клиентом – не помогает – слишком верхнеуровневая.

Подскажите, пожалуйста, а как это у Вас делается?

Нравится

2 комментария

комментировать, комментировать и еще раз комментировать.

"Гусев Александр Юрьевич" написал:Например – по нажатию «сохранить» в счете проверяется 10 условий и на каждое из них система по разному реагирует. Все это храниться в коде и когда возвращаемся к этому коду через год - очень тяжело понять что и как

Техническое задание никто не отменял, если в нем все описано, проблем с пониманием логики не будет. И комментарии в коде, комментарии :smile:

Показать все комментарии

Есть 3 поля:
[сумма], [процент], [комиссия]

нужно, чтобы при изменении суммы или процента прересчитывалась комиссия, и при изменении комиссии пересчитывался процент.

комиссия = сумма * процент / 100
процент = комиссия * 100 / сумма

{
        type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
        name: 'Amount',
        columnPath: 'Amount',
        dataValueType: Terrasoft.DataValueType.FLOAT,
        visible: true
},
{
        type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
        name: 'Percent',
        columnPath: 'Percent',
        dataValueType: Terrasoft.DataValueType.FLOAT,
        visible: true,
        dependencies: ['Commission'],
        methodName: 'OpportunityPercentGenerate'
},
{
        type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
        name: 'Commission',
        columnPath: 'Commission',
        dataValueType: Terrasoft.DataValueType.FLOAT,
        visible: true,
        dependencies: ['Amount', 'Percent'],
        methodName: 'OpportunityCommissionGenerate'
}

this.methods.OpportunityCommissionGenerate = function() {
        var amount = this.get('Amount');
        var percent = this.get('Percent');
        if (Ext.isEmpty(amount) || Ext.isEmpty(percent)) {
                this.set('Commission', 0);
                return;
        }
        var commission = ((amount * percent) / 100);
        this.set('Commission', commission);
};

this.methods.OpportunityPercentCenerate = function() {
        var amount = this.get('Amount');
        var commission = this.get('Commission');

        if (Ext.isEmpty(amount) || Ext.isEmpty(commission)) {
                this.set('Percent', 0);
                return;
        }
        var percent = ((commission * 100) / amount);
        this.set('Percent', percent);
};

работает только первое условие (комиссия = сумма * процент / 100);

Что нужно еще сделать чтобы работало все?

Нравится

2 комментария

Здравствуйте, Василий.

Необходимо без опечатки назвать метод. У вас в свойстве поля:
OpportunityPercentGenerate
А определен:
OpportunityPercentCenerate

Показать все комментарии

Как добавить поля, значение которого будет соответствовать итоговой величине по определенному полю детали, к примеру сумме и определенного типа запись детали?

Нравится

8 комментариев

Добрый день. Ознакомьтесь с видеоуроком, в котором рассказывается, как добавить на страницу редактирования вычисляемое поле: Настройка полей: вычисляемые поля

Спасибо большое!

А можете скинуть пример кода для итогового поля, в котором будет отображаться сумма по какому-то полю детали.

Василий, в методе обработчике можно выполнять запрос и в callback-функции устанавливать значение для поля карточки:

var select = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "InvoiceProduct" });
select.addColumn("Id");
select.addColumn("Invoice");
select.addColumn("TotalAmount");
select.filters.addItem(select.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Invoice",
    this.get("Id")));
select.getEntityCollection(function(response) {
    if (response && response.success) {
        for (var i = 0; i < response.collection.collection.items.length; i++) {
            this.set("MyAmount", this.get("MyAmount") + response.collection.collection.items[i].values.TotalAmount);
        }
    }
}, this);

Пример для карточки счета и детали продукт в счете. MyAmount - суммирующее поле, TotalAmount - поле детали.

Это надо сделать так ???

{
        type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
        name: 'Column',
        columnPath: 'Column',
        dataValueType: Terrasoft.DataValueType.FLOAT,
        visible: true
        methodName: 'MyMethod'
}
 
.....;
 
this.methods.MyMethod = function () {
     .....; // здесь код подсчёта суммы
}

Нет, подписаться Вам необходимо не на изменение какого-то поля, а на изменение детали. Сделать это можно описав метод changeDetailSubscribeByName внутри метода Init. В замещающем модуле это будет выглядеть примерно так:

var baseInit = this.init;
this.methods.init = function() {
    if (baseInit) {
        baseInit.call();
    }
    this.changeDetailSubscribeByName('product', function() {
        //здесь код подсчёта
    });
};

где product - название детали

Показать все комментарии

Добрый день!
Нужно создать 2 поля на странице продажи. В первом выбирается тип, во втором выбирается значения соответствующие выбранному типу.
Как это можно осуществить?

Нравится

12 комментариев

Довольно просто. По аналогии с полями контакт-контрагент:

{
    type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
    name: 'Contact',
    columnPath: 'Contact',
    dataValueType: Terrasoft.DataValueType.LOOKUP,
    visible: true,
    rules: [
        {
	    ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
	    autocomplete: true,
	    autoClean: false,
	    baseAttributePatch: 'Account',
	    comparisonType: Terrasoft.ComparisonType.EQUAL,
	    type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
	    attribute: 'Account'
	 } ]
 },

Здравствуйте, Василий!

Попробуйте воспользоваться предоставленной выше рекомендацией . Также советую обратить Ваше внимание на топик Настройка логики полей в BPMonline 7.0.

Акмаль, спасибо за предоставленный совет.

Приятного дня!

я делал по аналогии.
Этот код нужно вставлять в замещающий клиентский модуль же?
Я его вставлял туда, но у меня в результате просто белое окно при патытке редактировать продажу.
Затем я удалил содержимое процедуры и опубликовал еще раз, в замещающем клиентском модуле. Вот что оставил, но при нажатии на изменить продажу все ровно чистый экран:

define('OpportunityPage', ['terrasoft', 'Opportunity', 'OpportunityPageStructure', 'OpportunityPageResources'],
function(Terrasoft, Opportunity, structure, resources) {
    return structure;
}); 

При этом, потом если заходить в замещающий модуль для редактирования кода, всплывает сообщение "Не удалось загрузить Silverlight Plug-In". Он начинает подгружаться, только после перезапуска сайта и выключения/включения плагина.

Акмаль, куда вообще нужно вставлять этот код???

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

Василий, вам нужно скопировать весь код из базовой страницы продажи и вставить его в замещающий модуль. И уже там делать изменения.

Спасибо, все работает !!!

Но, у меня тогда еще вопрос:
Почему у меня без копирования всего кода все работало при добавлении детали?

Код в замещающем модуле, куда добавлял деталь:

define('AccountPage', ['terrasoft', 'Account', 'AccountPageStructure', 'AccountPageResources'],
function(Terrasoft, Account, structure, resources) {
        structure.userCode = function() {
            this.schema.rightPanel.push({
                name: 'Product',
                schemaName: 'UsrSupplierProductDetail',
                type: Terrasoft.ViewModelSchemaItem.DETAIL,
                filterPath: 'UsrSupplier',
                filterValuePath: 'Id',
                caption: resources.localizableStrings.SupplierProductDetailCaption,
                visible: true,
                collapsed: true,
                leftWidth: '60%',
                rightWidth: '40%',
                wrapContainerClass: 'control-group-container'
            });
        };
        return structure;
    });

Здравствуйте, Василий!

Можете немного подробнее разъяснить Ваш вопрос: "Почему у меня без копирования всего кода все работало при добавлении детали?"

Когда я добавлял деталь, я код не копировал из страницы контрагента, и пустого экрана у меня не было (все работало). Когда я начал добавлять поле, я опирался на это и не копировал код из родительского модуля. В результате, у меня получился просто пустая страничка продажи. Вопрос: "Почему у меня без копирования всего кода все работало при добавлении детали?"

Интересно.
А при добавлении поля тоже использовали

rightPanel.push

??

использовал

leftPanel.push

Такое раньше бывало, если полю указать неправильный тип.

Показать все комментарии