Сравнение двух дат в 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:

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

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

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

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;
}
Показать все комментарии