Timemanmobile 26.550.0–26.600.0: отдельная карточка отчёта и диагностика начала дня
В timemanmobile 26.550.0 и 26.600.0 рабочий отчёт открывается в приложении отдельной карточкой, а не страницей портала. Отчёт, отправленный после полуночи, больше не считает отметки за чужой день. А если форма начала дня не показалась, теперь видно почему: причину пишет диагностический журнал.
Новое
Открывайте отчёт в приложении
Ссылки на /timeman/work_report.php с фрагментом #user_id=…&report=… или #report=… открывают мобильную карточку отчёта, заголовок которой соответствует периоду. Если обработчик недоступен, откроется страница портала. При ошибке загрузки пользователь увидит «Не удалось открыть отчёт», и карточка закроется.
Из своего кода карточку открывает openReport() из timeman/work-reports/actions:
const { openReport } = require('timeman/work-reports/actions');
openReport({ reportId: 512, userId: 17, url: '/timeman/work_report.php#report=512' });
То же можно передать событием timemanbackground::report::open, строковые ID превратятся в числа. Нужен флаг WORK_REPORTS, AI-флаг не обязателен. Если WORK_REPORTS выключен или проверка упала, откроется переданный url, поэтому передавайте его всегда. Повторное открытие того же отчёта в течение 1000 мс игнорируется.
Данные отдаёт AJAX timemanmobile.FullReport.getReport: на вход reportId и необязательный userId, на выходе report и settings. Без userId владелец берётся из сохранённого отчёта. Права проверяет модуль timeman: переданный владелец должен совпасть с владельцем записи, а читателю нужно canReadWorktime. В мобильном коде ответ разбирает WorkReportsApi.getReport({ reportId, userId }), он возвращает { item, settings } и бросает исключение, если отчёта нет.
Если оценку отклонили с кодом ACCESS_DENIED, список и карточка вернут прежнюю оценку и покажут «Оценить отчёт может только руководитель». Распознать этот код в своих экранах поможет WorkReportsApi.isAccessDeniedError(response).
Отметки считаются за день отчёта
WorkReportsApi.getManualCheckInCount({ userId, timestamp }) спрашивает число отметок нужного сотрудника за нужный день через stafftrackmobile.v2.CheckIn.getManualCheckInCount, оба параметра необязательны. Список рабочих дней передаёт время начала записи, а DailyReportBox.openReport() принимает необязательный dayTimestamp, поэтому отчёт, отправленный после полуночи, считает отметки за свой день. Если счётчик не загрузился, ошибка уходит в журнал, checkInCount становится 0, а отчёт всё равно открывается.
Форма начала дня ждёт ответа сервера
Если на портале есть новый Feature.getCheckInRolloutVerdict(), вариант формы определяет он: enabled даёт форму V3, disabled базовую, а неизвестный ответ откладывает показ на 60 секунд. На старом API работает прежнее правило: isCheckInRolloutEnabled() === true включает новую форму, всё остальное выбирает базовую. Кеш решения теперь привязан к домену портала, так что другой пользователь или портал получат свежий ответ сервера.
Узнайте, почему форма не показалась
timemanmobile.WorkdayIntent.getWorkdayIntentBoxData получил refusalReason с первой причиной отказа и checkedAt со временем серверной проверки, а schedule.targetStartBasis подсказывает, откуда взято время начала. Если все проверки пройдены, но targetStartTimestamp === 0, придёт отказ noShift.
В диагностический журнал пишутся события timeman.workday-intent-box.shown и timeman.workday-intent-box.skipped с триггером launch, foreground или navigation. В shown есть вариант формы и isFallback, в skipped — причина и время следующей проверки. Журнал отличает занятый слот, уже открытую форму, незагруженный layout, ошибку запроса и неизвестный rollout. Расширение diagnostic-log подключается необязательно: если его нет, форма покажется, а повторная загрузка будет через 10 минут.