BusinessRuleModule
Required
Технические вопросы
7.x

Сравнение двух дат в js

Возникла задача:

Необходимо установить признак обязательности поля UsrDeviationReason, если даты UsrDatePlan и UsrDateActual не равны друг другу и UsrDateActual заполнена:

Написали правило:

"UsrDeviationReason":{
        "BindParameterRequiredDeviationReason": {
        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
        "property": BusinessRuleModule.enums.Property.REQUIRED,
        "logical": Terrasoft.LogicalOperatorType.AND,
        "conditions": [
                {
                        "leftExpression": {
                                "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                "attribute": "UsrDatePlan"
                        },
                        "comparisonType": Terrasoft.ComparisonType.NOT_EQUAL,
                        "rightExpression": {
                                "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                "attribute": "UsrDateActual"
                        }
                },
                {
                        "leftExpression": {
                                "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                "attribute": "UsrDateActual"
                        },
                        "comparisonType": Terrasoft.ComparisonType.IS_NOT_NULL
                }
        ]
}

В итоге два вопроса:
1) По UsrDateActual IS_NOT_NULL работает (т.е., если поле UsrDateActual не заполнено, то признак обязательности не появляется).
Но при равенстве UsrDatePlan и UsrDateActual признак обязательности всё равно остаётся. Что указано не так?
2) Даже если признак обязательности исчезает, всё равно остаётся подсказка заполнить это поле и никак не исчезает.

Спасибо за помощь!

Нравится

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

Может, конечно, я тупость скажу, но условие "не равно" вроде бы без нижнего подчеркивания, просто NotEqual.
Информацию брал отсюда https://www.bpmonline.com/bpmonlinesdken/Terrasoft.Core~Terrasoft.Core…

Хотя и IsNotNull там тоже без нижних подчеркиваний написано, но у вас работает.

Владимир, добрый день!

Как вариант, данное поведение может возникать если у двух дат, с которыми происходит сравнение, разница, например, в миллисекундах. В приложении есть особенность, что даже если разница составляет миллисекунды, то приложение эти значения считает разными.
Проверьте, чтобы даты были абсолютно идентичными.

"Демьяник Алексей Олегович" написал:Проверьте, чтобы даты были абсолютно идентичными

Формат полей date, а не datetime, и в них нет времени.

"Сазанов Александр Владимирович" написал:Хотя и IsNotNull там тоже без нижних подчеркиваний написано, но у вас работает.

В логике карточек вижу, что с подчеркиваниями. и NOT_EQUAL тоже видел. А в процессах, кажется, без подчеркивания.

Владимир, добрый день!

Типы сравнений EQUAL и NOT_EQUAL не совсем корректно работают в случае сравнения дат, поскольку в JavaScript даты являются объектами, а два объекта никогда не будут равными друг другу, если это не один и тот же объект.

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

[javascript]
{
"operation": "insert",
"parentName": "Header",
"propertyName": "items",
"name": "UsrDeviationReason",
"values": {
"layout": {"column": 12, "row": 0},
"isRequired": {"bindTo": "IsUsrDeviationReasonRequired"}
}
}
[/javascript]

Инициализировать это свойство можно при инициализации страницы, а также при изменении полей плановой и фактической даты.

Поделюсь результатом:

[javascript]
IsUsrDeviationReasonRequired: function(columnName) {
var endDate = this.get("EndDate");
var deadline = this.get("Deadline");
var isRequired = false;
if ((endDate) && (deadline)) {
isRequired = (endDate.toDateString() !== deadline.toDateString());
}
var column = this.columns[columnName];
if (column) {
column.isRequired = isRequired;
this.validateColumn(columnName);
}
return isRequired;
}
[/javascript]

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