Скрипт ограничения значений параметров типа "Дата" и "Дата/время"

Описание скрипта

Скрипт предназначен для проверки корректности введенного значения в параметрах пользовательского действия типа "Дата" и "Дата/время" и фильтрации календаря.

Место настройки скрипта: форма добавления параметра пользовательского действия типа "Дата" или "Дата/время".

Когда выполняется скрипт

  • При открытии формы, на которой расположен параметр.
  • При изменении параметров, указанных в блоке инициализации.

Результат выполнения скрипта

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): 'Допустимо выбирать только в пн, ср, пт.']