Скрипт ограничения значений параметров типа "Дата" и "Дата/время"
Описание скрипта
Скрипт предназначен для проверки корректности введенного значения в параметрах пользовательского действия типа "Дата" и "Дата/время" и фильтрации календаря.
Место настройки скрипта: форма добавления параметра пользовательского действия типа "Дата" или "Дата/время".
Когда выполняется скрипт
- При открытии формы, на которой расположен параметр.
- При изменении параметров, указанных в блоке инициализации.
Результат выполнения скрипта
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): 'Допустимо выбирать только в пн, ср, пт.']