поле категория обращения

Добрый день!
в ITIL 7.6
есть такое поле "Категория" в карточке Обращения - оно обязательно к заполнению
Скажите, пожалуйста, где настроена обязательность этого поля?(хотела бы сделать обязательным в зависимости от определенных условий)
В объекте "Обращение" прописано, что колонка "Категория" обязательна к заполнению на уровне приложения, но если унаследовать объект "Обращение", и убрать обязательность этой колонки,
то колонка "Категория" все равно остается обязательной для заполнения - т.е. где-то еще в каком-то скрипте настроена обязательность этой колонки?

Нравится

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

Привет Дарья.

Для управления обязательностью поля лучше использовать бизнес правила, пример использования: http://www.community.terrasoft.ru/forum/topic/12988

Спасибо за совет)) но я не пытаюсь управлять обязательностью какого-то поля. Я пытаюсь найти, где в стандартной конфигурации Itil 7,6 прописана обязательность колонки категория в обращении. Помимо самого объекта обязательность данной колонки похоже прописана где-то еще, но только вот где?

В самом объекте case у поля Категория стоит признак обязательно на уровне приложения.

Да, стоит, как я уже писала. Но если его снять, то поле будет по-прежнему обязательно. Значит, где-то еще в скрипте прописана обязательность, только вот где?

Обязательность поля Категория проставлена в 2х местах:

1) В самом объекте case;
2) В карточке редактирования обращения CasePage;

Спасибо, Григорий. А можно поточнее - из какой именно схемы casepage - в каком пакете? Я не нашла обязательность этого поля в схемах casepage

Дарья, просто откройте мастером страницу редактиования обращения и снимите в свойствах поля Категория признак обязательно для заполнения.

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

Такое ощущение, что он где-то принудительно устанавливается

Добрый день!

Попробуйте убрать обязательность с помощью кода, установить аттрибут "isRequired" в значение false

	{
		"operation": "merge",
		"name": "Category",
		"values": {
			"layout": {
				"column": 0,
				"row": 5,
				"colSpan": 12,
				"rowSpan": 1
			},
			"caption": {
				"bindTo": "Resources.Strings.CategoryCaption"
			},
			"textSize": "Default",
			"labelConfig": {
				"visible": true
			},
			"enabled": true,
			"isRequired": false
		}
	},

Есть еще вариант с бизнес правилами, их можно использовать для динамического скрытия/установки обязательности/управления доступностью контролов.
Это достаточно универсальный механизм

 
				//Category - название аттрибута на который мы хочем наложить бизнес-правило
				Category": {
					//название бизнес-правила
					"RequireCategoryFinalState": {
						ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
						//BusinessRuleModule.enums.Property.REQUIRED - тип бп
						property: BusinessRuleModule.enums.Property.REQUIRED,
						conditions: [{
							leftExpression: {
								type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
								attribute: "Status", //Колонка объекта Case, которая ссылаеться на справочник статусов CaseStatus
								attributePath: "IsFinal"  //Колонка в таблице Status, то есть Status.IsFinal (CaseStatus)
							},
							comparisonType: this.Terrasoft.ComparisonType.EQUAL,
							rightExpression: {
								type: BusinessRuleModule.enums.ValueType.CONSTANT,
								value: true //Тут может быть ИД, или любой другой тип данных
							}
						}]
					}
				}

Есть еще один рабочий вариант, если условие слишком сложное, и не может быть выполнено, используя бизнес правила, то можно забиндить метод/или свойство на атрибут контрола isRequired.

Так же надо повесить вызов соответствующих методов на событие init и на изменение одного из значений, которые участвуют в условии.
Простой кейс: при переводе обращение в статус “В работе”, делать обязательным поле Категория

Пример с методом:

 
/*
Указываем в контроле Category, метод, который будет 
определять обязательность для поля 
"isRequired": 
{
	"bindTo": 'isCategoryRequired'
}
 
 
В атрибутах надо прописать обработчик, который будет 
отрабатывать при изменении значение поля Статус
	*/
attributes: {
	"Status": {
		dependencies: [
			{
				columns: ["Status"],
				methodName: "onStatusItemChanged"
			}
		]
	}
},
/*Повесим вызов метод на init, чтобы при открытия 
карточки у нас отрабатывало условие*/
init: function() {
		 this.callParent(arguments);
		 this.isCategoryRequired();
	},
 
isCategoryRequired: function() {
		var statusId = this.get("Status").value;
		return statusId === CONSTANTA.CASESTATUS.ACTIVE;
},	
/*Повесим вызов метода при изменении статуса onStatusItemChanged, 
чтобы при изменении значения поля Статус
 у нас отрабатывала логика*/	 
 onStatusItemChanged: function() {
//Вызов метода/ов, в данном случае метода isCategoryRequired	 
		this.isCategoryRequired();
},

Пример со свойством, почти тоже самое, только обязятальность поля будет зависит от вартуального свойства:

init: function() {
 this.callParent(arguments);
 this.checkIfCategoryRequired();
},
 
checkIfCategoryRequired: function() {
	var isRequired,
	statusId = this.get("Status").value;
	isRequired = statusId === CONSTANTA.CASESTATUS.ACTIVE;
	this.set("isCategoryRequired", isRequired);
},	
 
onStatusItemChanged: function() {
	 this.checkIfCategoryRequired();
},

Да,я так и планирую использовать подобное бизнес-правило - сделать обязательность этой колонки в зависимости от параметров.
НО для того чтобы это использовать, нужно убрать принудительную обязательность поля Категория, которая непонятно где прописана в стандартной конфигурации

Код, приведенный в первом вашем сообщении, помогает лишь наполовину - убралась красная звездочка рядом с полем - признак обязательности его.
Но все равно остается требование обязательности данного поля - при сохранении карточки выдается сообщение, требующее заполнения поля; и при открытии карточки внизу под полем сообщение "необходимо указать значение"

Так а повесить бизнес-правило?
Атрибут "isRequired": false + правило и все работает.
Это чисто тестовый пример, при создании карточки не требует заполненного поля, но после - да.
И уберите значение по умолчанию, для поля Category, если оно не обязательно

"Category": {
	"RequiredTypeOnAdd": {
		ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
		property: BusinessRuleModule.enums.Property.REQUIRED,
		conditions: [{
			leftExpression: {
				type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
				attribute: "Operation"
			},
			comparisonType: this.Terrasoft.ComparisonType.NOT_EQUAL,
			rightExpression: {
				type: BusinessRuleModule.enums.ValueType.CONSTANT,
				value: Enums.CardStateV2.ADD
			}
		}]
	}
}

Спасибо!
Атрибут "isRequired": false + правило - заработало ( перекрыло какое-то бизнес-правило в стандартной конфигурации, которое требовало обязательность?)
В качестве бизнес-правило использовало другое правило, не из вашего примера.

Вопрос по вашем примеру
Enums.CardStateV2.ADD
ругается, что Enums is not defined.
Скажите, пожалуйста, что необходимо подключить в скрипт схемы, что он понимал, что такое Enums ?

Так, начнем того, что у нас используется модульный подход к разработке, соответственно, если в зависимостях нет нужных модулей, то работать не будет.
А зачем Вам мой пример?
У Вас все должно работать, если Вы правильновсе сделали.

define("CasePage", ["CasePageResources", "GeneralDetails", "BusinessRuleModule", "ConfigurationEnums"],
function(resources, GeneralDetails, BusinessRuleModule, Enums)

Да, пример, собственно, не нужен - просто про модуль спросила.

В общем-то, Атрибут "isRequired": false + бизнес- правило работает.
Хотя так и непонятно до конца, где же крылась обязательность данного поля в базовой конфигурации.
Ну да ладно- главное, что можно ее обойти.
Спасибо

Моя рекомендация, установите себе jetBraine WebStorm, файлы JS стоит выгружать по указанному пути

C:\inetpub\wwwroot\Название сайта\Terrasoft.WebApp\Resources\ui\Terrasoft\configuration\JS

Потом в web.config прописать

    <add key="CompilerSourcesTempFolderPath" value="C:\inetpub\wwwroot\Название сайта\Terrasoft.WebApp\Resources\ui\Terrasoft\configuration\JS" />

Дальше делаете поиск по файлам, там много можно разных примеров подсмотреть.

"Александр Зубков" написал:init: function() {
this.callParent(arguments);
this.checkIfCategoryRequired();
},

checkIfCategoryRequired: function() {
var isRequired,
statusId = this.get("Status").value;
isRequired = statusId === CONSTANTA.CASESTATUS.ACTIVE;
this.set("isCategoryRequired", isRequired);
},

onStatusItemChanged: function() {
this.checkIfCategoryRequired();
},

Александр, вы приводили такой пример.
в вашем примере есть CONSTANTA.CASESTATUS.ACTIVE
это определенное значение статуса ( в работе)
Скажите, пожалуйста, где задается подобная CONSTANTA.CASESTATUS.ACTIVE,
где ее необходимо определять?

Спасибо, нашла ответ на свой вопрос
это константа, определенная в модуле по типу

define("UsrConsts", [], function() {

var caseStatus = {
Close: "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
};

return {
CaseStatus: caseStatus
};

});

"Александр Зубков" написал:

Есть еще один рабочий вариант, если условие слишком сложное, и не может быть выполнено, используя бизнес правила, то можно забиндить метод/или свойство на атрибут контрола isRequired.

Так же надо повесить вызов соответствующих методов на событие init и на изменение одного из значений, которые участвуют в условии.

Простой кейс: при переводе обращение в статус “В работе”, делать обязательным поле Категория

Пример с методом:

       

/*

Указываем в контроле Category, метод, который будет

определять обязательность для поля

"isRequired":

{

        "bindTo": 'isCategoryRequired'

}





В атрибутах надо прописать обработчик, который будет

отрабатывать при изменении значение поля Статус

        */

attributes: {

        "Status": {

                dependencies: [

                        {

                                columns: ["Status"],

                                methodName: "onStatusItemChanged"

                        }

                ]

        }

},

/*Повесим вызов метод на init, чтобы при открытия

карточки у нас отрабатывало условие*/

init: function() {

                 this.callParent(arguments);

                 this.isCategoryRequired();

        },

               

isCategoryRequired: function() {

                var statusId = this.get("Status").value;

                return statusId === CONSTANTA.CASESTATUS.ACTIVE;

},     

/*Повесим вызов метода при изменении статуса onStatusItemChanged,

чтобы при изменении значения поля Статус

 у нас отрабатывала логика*/       

 onStatusItemChanged: function() {

//Вызов метода/ов, в данном случае метода isCategoryRequired     

                this.isCategoryRequired();

},

Пример со свойством, почти тоже самое, только обязятальность поля будет зависит от вартуального свойства:

init: function() {

 this.callParent(arguments);

 this.checkIfCategoryRequired();

},

                               

checkIfCategoryRequired: function() {

        var isRequired,

        statusId = this.get("Status").value;

        isRequired = statusId === CONSTANTA.CASESTATUS.ACTIVE;

        this.set("isCategoryRequired", isRequired);

},     



onStatusItemChanged: function() {

         this.checkIfCategoryRequired();

},


Приведённый пример не работает. Поле становиться обязательным независимо от условий.

Игорь, вопрос. Вы проводили отладку кода?
Также есть же другие способы реализации.
- http://www.community.terrasoft.ru/forum/topic/15340
- http://www.community.terrasoft.ru/forum/topic/12990

Единственным вариантом решения многоуровневого условия обязательности полей является применение валидации нужного поля.

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