Формулировка проблемы: необходима возможность получения списка пользователей со статусами в определенный промежуток времени.
Решение: необходимо реализовать 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": "Произошла внутренняя ошибка сервера"
}
действие не выполняется.