Скрипт ограничения значений параметров типа "Дата" и "Дата/время"
Описание скрипта
Скрипт предназначен для проверки корректности введенного значения в параметрах пользовательского действия типа "Дата" и "Дата/время" и фильтрации календаря.
Место настройки скрипта: форма добавления параметра пользовательского действия типа "Дата" или "Дата/время".
Когда выполняется скрипт
- При открытии формы, на которой расположен параметр.
- При изменении параметров, указанных в блоке инициализации.
Результат выполнения скрипта
Cкрипт возвращает карту предикатов и сообщений для поля:
[ (somePredicate1) : 'somMessage1', (somePredicate2) : 'somMessage2' ]
Переменные и их значения
Переменные контекста:
- subject — объект, к которому применяется действие. Присутствует только в интерфейсе оператора.
- attrCode — код параметра, в котором определен скрипт.
- changedAttributes — список кодов параметров, значения которых изменились при редактировании объекта (в данном случае всегда один).
- form — значения полей формы, на которой присутствует параметр.
Список доступных методов
- after(Date date, boolean useTime) — проверяет, что дата/время больше указанной;
- before(Date date, boolean useTime) — проверяет, что дата/время меньше указанной;
- between(Date from, Date to, boolean useTime) — проверяет, что дата/время находится в диапазоне между указанными;
- dayOfWeek(dayOfWeek) — проверяет соответствие дня недели (1 - воскресенье... 7 - суббота);
- equals(Date date, boolean useTime) — проверяет, что дата/время соответствует указанной;
- in(List<Date> dates, boolean useTime) — проверяет, что дата соответствует одной из указанных;
- inTime(Long from, Long to) — проверяет, что дата/время соответствует временному периоду, например, с 9:00 по 17:00
Для атрибутов типа "Дата" необходимо учитывать, что в языке программирования java дата часто представлена в виде ДД.ММ.ГГГГ 00:00:00. Для удобства в api предусмотрен дополнительный параметр useTime, позволяющий сформировать предикат без учета времени. Если параметр не указан, то формируется предикат не учитывающий время.
Значение параметра useTime:
- false (по умолчанию) — сформировать предикат не учитывающий время;
- true — сформировать предикат учитывающий время.
Все методы работы с датами описаны в разделе api.date Работа с датами.
Примеры скрипта
1. Скрипт для ограничения значения параметра типа "Дата" только значениями в будущем.
//ПАРАМЕТРЫ-------------------------------------- //Код параметра типа "Дата” def DATE_ATTR = 'paramCode' //БЛОК ИНИЦИАЛИЗАЦИИ ------------------------------------- if (!form) { return ['DATE_ATTR']; } //ОСНОВНОЙ БЛОК---------------------------------- def filter = api.date.filter(); return [(filter.after(new Date())) : 'Значением может быть только дата в будущем'];
2. Скрипты для возможности настроить ограничение в двух параметрах типа “Дата”, так чтобы один параметр был меньше или равен другому. В примере используются параметры типа “Дата”: “Дата начала" (beginDate) и "Дата окончания" (endDate).
Скрипт в настройках параметра "Дата начала" (beginDate):.
//ПАРАМЕТРЫ-------------------------------------- //Код параметра "Дата начала” def BEGIN_DATE = 'beginDate' //Код параметра "Дата окончания” def END_DATE = 'endDate' // БЛОК ИНИЦИАЛИЗАЦИИ -------------------------------------- if (!form) { return [BEGIN_DATE, END_DATE]; } //ОСНОВНОЙ БЛОК---------------------------------- def filter = api.date.filter(); return [(filter.before(subject.EndDate)) : "Значение не может быть больше значения параметра Дата окончания."];
Скрипт в настройках параметра "Дата окончания" (endDate):
//ПАРАМЕТРЫ-------------------------------------- //Код параметра типа "Дата начала” def BEGIN_DATE = 'beginDate' //Код параметра типа "Дата окончания” def END_DATE = 'EndDate' // БЛОК ИНИЦИАЛИЗАЦИИ -------------------------------------- if (!form) { return [BEGIN_DATE, END_DATE]; } //ОСНОВНОЙ БЛОК---------------------------------- def filter = api.date.filter(); return [(filter.after(subject.beginDate)) : "Значение не может быть меньше значения параметра Дата начала."]
3. Ограничение пользовательского параметра типа “Дата и время” выбором значения только в будущем и по определенным дням недели (пн, ср, пт).
//ПАРАМЕТРЫ-------------------------------------- //Код пользовательского параметра типа "Дата и время” def DATE_TIME_ATTR = 'paramCode' // БЛОК ИНИЦИАЛИЗАЦИИ -------------------------------------- if (!form) { return [DATE_TIME_ATTR]; } //ОСНОВНОЙ БЛОК---------------------------------- def filter = api.date.filter(); def predicate = filter.with { and(or(dayOfWeek(2), // понедельник dayOfWeek(4), // вторник dayOfWeek(6) // среда ), and(after(new Date()))) } return [(predicate): 'Допустимо выбирать только в пн, ср, пт.']