Сервис использует входящий webhook Bitrix24 REST API. Реальный URL webhook не хранится в репозитории.
Webhook задаётся одним из способов:
- переменная окружения
BITRIX_WEBHOOK; - локальный файл
config.local.php, который игнорируется git.
Пример формата:
https://<portal>.bitrix24.ru/rest/<user-id>/<webhook-code>/
Все запросы выполняются POST-запросами с application/x-www-form-urlencoded.
Код использует curl, если расширение доступно, иначе fallback на file_get_contents() со stream context.
Если Bitrix возвращает QUERY_LIMIT_EXCEEDED, запрос повторяется с паузой. Массовые запросы идут через batch, по 50 команд в одном chunk.
Используется в четырёх местах:
- Отчёт «Закрытые часы» — фильтр по
>=CLOSED_DATE,<=CLOSED_DATE(окно ±2 месяца) иREAL_STATUS=REPORT_CLOSED_STATUSES(по умолчанию только5: «условно завершена» ждёт одобрения и в счёт не идёт). - Доска «Задачи» — фильтр по
RESPONSIBLE_ID(reportUserIds()) иREAL_STATUS:- вкладка «Активные задачи»: статусы 2 (ждёт выполнения), 3 (выполняется), 6 (отложена), без ограничения по датам;
- вкладка «Закрытые задачи»: статусы 4/5,
CLOSED_DATEвнутри выбранного месяца.
- Проверка задач —
CLOSED_DATEвнутри месяца, статусы 4/5. - KPI —
CREATED_DATEвнутри месяца, статусы 4/5, по всему порталу; группировка поCREATED_BY. Дополнительно выбираютсяDEADLINE,TAGSиDESCRIPTION.
Для доски дополнительно выбираются DEADLINE и GROUP_ID. Пагинация идёт через start, дополнительные страницы — через batch.
Используется для чтения результата завершённой задачи (отчёт и проверка задач). Главное правило: отчётный месяц определяется датой внутри результата задачи, а не датой закрытия задачи.
Используется для получения списанного времени по задаче (отчёт, проверка задач, KPI). Часы считаются только из MINUTES. Фильтр по пользователям не накладывается — берутся все списания по задаче, поэтому новые сотрудники попадают в отчёт автоматически.
Используется для отображения ФИО сотрудников по Bitrix user ID (отчёт и доска).
Используется для получения названия компании по ID из UF_CRM_TASK (отчёт и карточки доски).
Необязательный метод. Используется доской «Задачи» для названий проектов (рабочих групп) по GROUP_ID. Названия сначала берутся из объекта group, который отдаёт сам tasks.task.list, — на большинстве порталов этого достаточно. Если у webhook нет права на соцсеть/рабочие группы и названия взять неоткуда, колонки получают имена Проект #<id>, доска продолжает работать.
- Пользователь выбирает месяц и год.
- Сервис смотрит задачи, закрытые в окне ±2 месяца вокруг выбранного (
REPORT_CLOSED_WINDOW_MONTHS): работы могли сдать сильно позже или раньше закрытия. - Берутся только полностью завершённые задачи —
REAL_STATUS5 (REPORT_CLOSED_STATUSES). Статус 4 «условно завершена» ждёт одобрения и в отчёт не попадает. - Для каждой задачи читается результат.
- В отчёт попадает только задача, где дата в результате находится в выбранном месяце.
- По попавшим задачам читаются списания времени.
- Время относится к тому сотруднику, кто списал время (
USER_IDв elapsed item). - Итоги суммируются по сотрудникам и по задачам.
Подробный разбор шагов, разбор дат в результате и формулы KPI — в README.
Дашборд не ходит в Bitrix при открытии страницы — он читает сохранённый снимок data/dashboard-YYYY-MM.json. Снимок пересоздаётся из свежего отчёта:
- при каждой выгрузке Excel (
report.php); - при каждом создании учётов времени в УНФ (
unf_time.php); - вручную кнопкой «Обновить за этот месяц» (
dashboard_refresh.php, POST).
Файл создаётся без сторонних PHP-библиотек, напрямую как .xlsx ZIP-пакет с XML-частями.
Листы идут в таком порядке:
Свод;Все задачи— поля задачи заполняются в каждой строке, чтобы фильтры Excel работали по всем строкам списаний; задачи визуально отделяются рамками и чередующейся заливкой;- лист по каждому сотруднику.
Создание документов «Учет времени» и «Задание на работу» описано отдельно: docs/ODATA.md.