Добавление валидации к полю страницы Активности

Здравствуйте.
Пробую настроить валидацию для поля Начало активности.
Делаю как описано тут: https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/dobavlenie-vali...

Вот по этому коду у меня получилось настроить поле чтобы Начало было пощдже чем дата создания

define("ActivityPageV2", [],
    function () {
        return {
            // Название схемы объекта страницы редактирования.
            entitySchemaName: "Activity",
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
            // Коллекция методов модели представления.
            methods: {
                // Метод-валидатор значения колонок [DueDate] и [CreatedOn].
                dueDateValidator: function () {
                    // Переменная для хранения сообщения об ошибке валидации.
                    var invalidMessage = "";
                    // Проверка значений колонок [DueDate] и [CreatedOn].
                    if (this.get("DueDate") this.get("CreatedOn")) {
                        // Если значение колонки [DueDate] меньше значения колонки [CreatedOn],
                        // в переменную invalidMessage помещается значение локализуемой строки с сообщением
                        // об ошибке валидации.
                        invalidMessage = this.get("Resources.Strings.CreatedOnLessDueDate");
                    }
                    // Объект, свойства которого содержат сообщения об ошибке валидации.
                    // Если валидация прошла успешна, в объекте возвращаются пустые строки.
                    return {
                        // Сообщение об ошибке валидации, которое отображается в информационном окне
                        // при сохранении страницы.
                        fullInvalidMessage: invalidMessage,
                        // Сообщение об ошибке валидации, которое отображается под элементом управления.
                        invalidMessage: invalidMessage
                    };
                },
                // Переопределение базовой функции, инициализирующей пользовательские валидаторы.
                setValidationConfig: function () {
                    // Вызывает инициализацию валидаторов родительской модели представления.
                    this.callParent(arguments);
                    // Для колонки [DueDate] добавляется метод-валидатор dueDateValidator.
                    this.addColumnValidator("DueDate", this.dueDateValidator);
                    //Для колонки [CreatedOn] добавляется метод-валидатор dueDateValidator.
                    this.addColumnValidator("CreatedOn", this.dueDateValidator);
                }
            }
        };
    });

Но мне еще нужно сделать так чтобы начало было не поздже чем через две недели после создания.
Я знаю что это нужно добавить в условие if, но не понимаю как написать...
Будет что-то такого типа?

if ((this.get("DueDate") this.get("CreatedOn"))&&((this.get("DueDate") > this.get("CreatedOn")+14))

Подскажите пожалуйстя этот момент.
Спасибо!

Нравится

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

Добрый день Николай!!!

вы не знаете как средствами JavaScript к числу прибавить 14 дней? вам это подсказать? или в чем у вас возникла трудность при написании валидации?

Да, именно в этом вопрос - как прибавить к дате 14 дней.

"Сергиенко Николай Петрович" написал:

Да, именно в этом вопрос - как прибавить к дате 14 дней.


http://stackoverflow.com/questions/563406/add-days-to-datetime

var today = new Date(),
     inFourteen = new Date();
inFourteen.setDate(today.getDate()+14);
alert("сегодня: "+today+" Через 14 дней: "+inFourteen);

вот пример прибавление к текущей дате 14 дней

"Власов Михаил Викторович" написал:вот пример прибавление к текущей дате 14 дней

А можно пример добавления 14 рабочих дней в bpm'online?

"Владимир Соколов" написал:А можно пример добавления 14 рабочих дней в bpm'online?

Владимир вам требуется пример на C# или JavaScript?

Здравствуйте.
Попробовал на демо Версии 7.8.0.1005 - код работает. И логика валидации работает.
Код:

define("ActivityPageV2", [],
    function () {
        return {
            // Название схемы объекта страницы редактирования.
            entitySchemaName: "Activity",
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
            // Коллекция методов модели представления.
            methods: {
                // Метод-валидатор значения колонок [DueDate] и [CreatedOn].
                dueDateValidator: function () {
                    // Переменная для хранения сообщения об ошибке валидации.
                    var invalidMessage = "";
                    var today = this.get("CreatedOn"),
                    inFourteen = new Date();
                    inFourteen.setDate(today.getDate()+14);
                    //alert("сегодня: "+today+" Через 14 дней: "+inFourteen+" StartDate: "+this.get("StartDate"));
                    //alert("сегодня: "+this.get("StartDate"));
                    // Проверка значений колонок [DueDate] и [CreatedOn].
                    if ((this.get("StartDate") < this.get("CreatedOn"))||(this.get("StartDate") > inFourteen)) {
                        // Если значение колонки [DueDate] меньше значения колонки [CreatedOn], 
                        // в переменную invalidMessage помещается значение локализуемой строки с сообщением
                        // об ошибке валидации.
                        invalidMessage = this.get("Resources.Strings.CreatedOnLessDueDate");
                    }
                    // Объект, свойства которого содержат сообщения об ошибке валидации.
                    // Если валидация прошла успешна, в объекте возвращаются пустые строки.
                    return {
                        // Сообщение об ошибке валидации, которое отображается в информационном окне
                        // при сохранении страницы.
                        fullInvalidMessage: invalidMessage,
                        // Сообщение об ошибке валидации, которое отображается под элементом управления.
                        invalidMessage: invalidMessage
                    };
                },
                // Переопределение базовой функции, инициализирующей пользовательские валидаторы.
                setValidationConfig: function () {
                    // Вызывает инициализацию валидаторов родительской модели представления.
                    this.callParent(arguments);
                    // Для колонки [DueDate] добавляется метод-валидатор dueDateValidator.
                    this.addColumnValidator("StartDate", this.dueDateValidator);
                    //Для колонки [CreatedOn] добавляется метод-валидатор dueDateValidator.
                    this.addColumnValidator("CreatedOn", this.dueDateValidator);
                }
            }
        };
    });

У нас стоит система bpm online sales commerce Версия 7.7.0.2875. Если я прописую этод код тут, то страница редактирования активности перестает загружаться и в консоли вижу ошибки:

С чем это может быть связано и как эти ошибки устранить. Спасибо.

"Сергиенко Николай Петрович" написал:var today = this.get("CreatedOn"),

Здесь синтаксическая ошибка. Заканчивается на "," а должна строка для интерпритатора заканчиваться ";". Это первое что увидел. Второе проверьте в Дебагере что возвращает или не возвращает строка  this.get("CreatedOn")

у вас ошибка Николай выходит на строчке

inFourteen.setDate(today.getDate()+14);

система в консоли говорит что не может получить метод  getDate() у переменной  today

Так запятая стоит потому что после переменной today идет еще переменная inFourteen - поэтому там запятая.
Я проверял alert-ом this.get("CreatedOn"). Там записывается дата создания.
Да и код этот работает в демо Версии 7.8.0.1005.

Я не понимаю почему не работает в версии 7.7.0.2875

"Сергиенко Николай Петрович" написал:Я проверял alert-ом this.get("CreatedOn"). Там записывается дата создания.

Проверяли Сергей в 7.7? я просто у себя проверил в 7.7 да на странице редактирование при получение реквизита "CreatedOn" доступен свободно метод "getDate()".

Проверял в 7.8. В 7.7 this.get("CreatedOn") тоже нормально работает.
Может в 7.7 нужно еще какие-то пакеты подлючать?
Реально проблема в строчке

inFourteen.setDate(today.getDate()+14);

Если ее закоментить работает, но мне нужно както передать в inFourteen дату через 14 дней.

Подскажите что можна тут поделать?

Если честно Николай магия да и только. пробовал ваш код применить на своей 7.7 конфигурации. У меня все работает без ошибок. Моя рекомендация все разделить на отдельные переменные как вариант и в Дебаггере протестировать что возвращается и какого типа возвращается. Такое ощущение у меня складывается что переменная "today" у вас не локальная а глобальная и где то она переопределяется, но это всего лишь предположение. Больше мысли в голову новые пока никакие не лезут. Пакеты подключать никакие новые не нужно, они никакого влияния не окажут. Поэтому только совет разделить задачу на очень мелкие кирпичики и в Дебагере смотреть, что пошло в одном из кирпичиков не по плану.

"Сергиенко Николай Петрович" написал:Подскажите что можна тут поделать?

Вот так получилось в 7.7, попробуйте:

addDays: function(date, days) {
	var result = new Date(date);
	result.setDate(result.getDate() + days);
	return result;
},
dueDateValidator: function() {
	var invalidMessage = "";
	var today = this.get("CreatedOn");
	var inFourteen = this.addDays(today, 14);
 
	if (this.get("StartDate") > inFourteen) {
		invalidMessage = "Дата начала не может быть больше чем 14 дней спустя даты оздания";
	}
		if (this.get("StartDate") < this.get("CreatedOn")) {
		invalidMessage = "Дата начала не может быть меньше даты создания.";
	}
 
	return {
		fullInvalidMessage: invalidMessage,
		invalidMessage: invalidMessage
	};
},
 
setValidationConfig: function() {
	this.callParent(arguments);
	this.addColumnValidator("StartDate", this.dueDateValidator);
	this.addColumnValidator("CreatedOn", this.dueDateValidator);
}

"Власов Михаил Викторович" написал:
Владимир Соколов пишет:

А можно пример добавления 14 рабочих дней в bpm'online?

Владимир вам требуется пример на C# или JavaScript?

В данном случае C#, но может быть и JavaScript

"Владимир Соколов" написал:
Власов Михаил Викторович пишет:

Владимир Соколов пишет:

А можно пример добавления 14 рабочих дней в bpm'online?

Владимир вам требуется пример на C# или JavaScript?

В данном случае C#, но может быть и JavaScript


С учётом праздников на 2017-2018 года.

public DateTime AddWorkDays(DateTime date, int workingDays)
{
    int direction = workingDays < 0 ? -1 : 1;
    DateTime newDate = date;
    while (workingDays != 0)
    {
        newDate = newDate.AddDays(direction);
        if (newDate.DayOfWeek != DayOfWeek.Saturday &&
        newDate.DayOfWeek != DayOfWeek.Sunday &&
        !IsHoliday(newDate) || newDate == new DateTime(2018,06,06))
        {
            workingDays -= direction;
     	}
    }
    return newDate;
}
 
public bool IsHoliday(DateTime date)
{
    DateTime[] holidays = new DateTime[] {
    	new DateTime(2017,05,01),
        new DateTime(2017,05,08),
        new DateTime(2017,05,09),
        new DateTime(2017,06,12),
        new DateTime(2017,11,06),
        new DateTime(2018,01,01),
        new DateTime(2018,01,02),
        new DateTime(2018,01,05),
        new DateTime(2018,01,06),
        new DateTime(2018,01,07),
        new DateTime(2018,01,08),
        new DateTime(2018,01,09),
        new DateTime(2018,02,23),
        new DateTime(2018,03,09),
        new DateTime(2018,05,01),
        new DateTime(2018,05,04),
        new DateTime(2018,05,11),
        new DateTime(2018,06,12),
        new DateTime(2018,11,04)
    };
    return holidays.Contains(date.Date);
}
Показать все комментарии