Формулировка проблемы: необходима возможность получения списка пользователей со статусами в определенный промежуток времени.
Решение: необходимо реализовать API метод, который возвращает список пользователей со статусами, которые полностью либо частично входят в определенный промежуток времени.
URL метода:
/rest/api/userchooser/getUserStatusInPeriod
Тип запроса: GET
.
Метод принимает следующие входные параметры:
start
- дата начала периода, в формате
YYYY-MM-DD
(обяз.);
finish
- дата завершения периода, в формате
YYYY-MM-DD
(обяз.);
type
- тип назначенного статуса,
соответствует полю type
справочника
"Назначение календаря" c кодом
calendar_types
(необяз.). Если задан данный
параметр, то возвращаются пользователи, тип периода которых
соответствует указанному значению;
locale
(не обяз.) - код локали (при
отсутствии параметра используется
язык
системы по умолчанию);
startRecord
- номер записи результатов,
начиная с которой будут возвращены записи (по умолчанию 0);
recordsCount
- количество результатов,
которое необходимо вернуть (по умолчанию 30). Максимальное
значение параметра 100;
sortByDate
- направление сортировки
результатов по выходному параметру дате начала периода
start
. Тип сортировки - дата. Принимает
следующие значения (необяз.):
asc
- записи отсортируются по
возрастанию;
desc
- записи отсортируются по убыванию.
По умолчанию параметр принимает значение asc
,
любое другое значение, несоответствующее ни одному из возможных
значений, будет интерпретировано как asc
.
Длина периода не может быть отрицательной и более 366 дней. Дата начала и дата завершения периода должны представлять собой корректную дату в указанном году (в том числе високосном) и месяце, т.е. даты типа 2016-05-51 и 2014-02-29 некорректны.
Метод возвращает список пользователей, назначенный период которых полностью или частично попадает в указанный промежуток времени.
В случае успешного выполнения метод возвращает массив объектов JSON, состоящий из следующих полей:
userID
- идентификатор пользователя;
start
- дата начала периода;
finish
- дата завершения периода;
type
- тип статуса;
title
- название статуса;
statusLabel
- название текущего статуса
сотрудника;
color
- цвет статуса;
busyStatus
- тип занятости в данный период.
Принимает следующие значения:
busy
- занят в каждый день периода,
standart
- обычное рабочее время,
free
- свободен в каждый день периода.
makeVacant
- признак занятости штатной
единицы. Принимает следующие значения:
0 - пользователь с таким статусом занимает штатную единицу на период действия статуса;
1 - пользователь с таким статусом не занимает штатную единицу на период действия статуса.
Примечание. Пользователь может возвращаться в списке результатов несколько раз, так как пользователю может быть назначено несколько статусов в разные периоды времени.
Пример запроса: /rest/api/userchooser/getUserStatusInPeriod?start=2016-02-13&finish=2016-04-01
Пример ответа:
[ { "userID": "8f85e270-ebf1-11e5-835c-525400bb7fc6", "start": "2016-02-05", "finish": "2016-02-25", "calendar_type": { "type": 0, "title": "Отпуск", "statusLabel": "В отпуске с {date.start} по {date.finish}", "color": "#5462ef", "busyStatus": "free", "makeVacant": 0 } }, { "userID": "59377550-ea78-11e5-835c-525400bb7fc6", "start": "2016-02-15", "finish": "2017-02-15", "calendar_type": { "type": 2, "title": "Декретный отпуск", "statusLabel": "В декретном отпуске с {date.start} по {date.finish}", "color": "#5462ef", "busyStatus": "free", "makeVacant": 1 } }, { "userID": "8f85e270-ebf1-11e5-835c-525400bb7fc6", "start": "2016-02-28", "finish": "2016-03-05", "calendar_type": { "type": 1, "title": "Командировка", "statusLabel": "В командировке с {date.start} по {date.finish}", "color": "#5462ef", "busyStatus": "busy", "makeVacant": 0 } }, { "userID": "08c164b0-e775-11e5-835c-525400bb7fc6", "start": "2016-03-17", "finish": "2016-03-23", "calendar_type": { "type": 1, "title": "Командировка", "statusLabel": "В командировке с {date.start} по {date.finish}", "color": "#5462ef", "busyStatus": "busy", "makeVacant": 0 } } ]
Альтернативные потоки событий.
Альтернативный поток №1. Не передан параметр
start
. Сервер возвращает ошибку HTTP 400 c
cообщением:
{ "errorCode": 13, "errorMessage": "Не передан параметр start" }
действие не выполняется.
Альтернативный поток №2. Не передан параметр
finish
. Сервер возвращает ошибку HTTP 400 c
cообщением:
{ "errorCode": 13, "errorMessage": "Не передан параметр finish" }
действие не выполняется.
Альтернативный поток №3. Передан период с некорректной длительностью - меньше нуля или больше 366. Сервер возвращает ошибку HTTP 400 с сообщением:
{ "errorCode": 13, "errorMessage": "Передано некорректное значение периода: отрицательное либо больше 366 дней" }
действие не выполняется.
Альтернативный поток №4. Передан некорректный параметр
start
: несуществующая дата, такой даты нет в
указанном году (в том числе високосном) или месяце. Сервер
возвращает ошибку HTTP 400 с сообщением:
{ "errorCode": 13, "errorMessage": "Передан некорректный параметр start" }
действие не выполняется.
Альтернативный поток №5. Передан некорректный параметр
finish
: несуществующая дата, такой даты нет в
указанном году (в том числе високосном) или месяце. Сервер
возвращает ошибку HTTP 400 с сообщением:
{ "errorCode": 13, "errorMessage": "Передан некорректный параметр finish" }
действие не выполняется.
Альтернативный поток №6. Передан несуществующий параметр
type
: в справочнике
calendar_types
в поле type
нет
такого значения. Сервер возвращает ошибку HTTP 400 с сообщением:
{ "errorCode": 13, "errorMessage": "Передан несуществующий параметр type: в справочнике calendar_types в поле type нет такого значения" }
действие не выполняется.
Альтернативный поток №7. Значение параметра
recordsCount
превышает максимальное значение.
Сервер возвращает ошибку HTTP 400 с сообщением:
{ "errorCode": 13, "errorMessage":"Значение параметра recordsCount превышает максимальное значение равное 100. Для просмотра дальнейших результатов воспользуйтесь параметром startRecord" }
действие не выполняется.
Альтернативный поток №8. На стороне сервера произошла ошибка. Сервер возвращает ошибку HTTP 500 с сообщением:
{ "errorCode": 13, "errorMessage": "Произошла внутренняя ошибка сервера" }
действие не выполняется.