Timeman 26.350.0: план дня пишется в нужную запись, блоки БП возвращают Saved
В timeman 26.350.0 для коробочного Битрикс24 блоки «Сохранить план на день» и «Сохранить отчёт сотрудника за день» из нового конструктора бизнес-процессов научились писать в заданную запись рабочего дня, оставлять Markdown как есть и сообщать, сохранилось ли (у отчёта новые настройки в конструкторе, судя по коду, пока не сохраняются). ID записи теперь принимает и публичная команда UpsertPlanCommand, а старые шаблоны БП работают как раньше. Разбор для тех, кто строит процессы вокруг учёта времени или пишет планы дня из своего кода. Предыдущий разбор: timeman 26.300.0.
Новое
Пишите план в нужную запись дня из своего кода
У Bitrix\Timeman\V2\Public\Command\Report\UpsertPlanCommand появился последний аргумент int $recordId = 0. При 0 план, как и раньше, уходит в текущую запись сотрудника, при recordId > 0 команда берёт запись по ID. Дальше команда по-прежнему сверяет владельца записи, сохраняет план и шлёт сотруднику pull-событие day_plan_ready с recordId и userId. Тип плана — AI_DAY_PLAN или ROBOT_DAY_PLAN из RecordReportType, на любой другой вернётся ошибка.
<?php declare(strict_types=1);
use Bitrix\Main\Loader;
use Bitrix\Main\Result;
use Bitrix\Timeman\V2\Public\Command\Report\UpsertPlanCommand;
use Bitrix\Timeman\V2\Public\Dto\Report\RecordReportType;
function savePlanToRecord(int $userId, int $recordId, string $planText): Result
{
Loader::requireModule('timeman');
return (new UpsertPlanCommand(
userId: $userId,
planText: $planText,
planType: RecordReportType::ROBOT_DAY_PLAN,
recordId: $recordId,
))->run();
}
$userId = 15;
$recordId = 4210;
$result = savePlanToRecord($userId, $recordId, "Созвон с заказчиком\nРевью задачи 1580");
if (!$result->isSuccess()) {
// запись чужая или не найдена, текст пустой, тип плана не из getPlanValues()
throw new \RuntimeException(implode('; ', $result->getErrorMessages()));
}
Markdown команда не трогает, в BB-код его переводит только блок «Сохранить план на день».
Права текущего пользователя она тоже не смотрит, проверяет лишь, что запись принадлежит userId. Если вызываете команду из своего контроллера, доступ проверяйте сами.
Ветвите процесс по Saved
Оба блока теперь возвращают Saved (да/нет). «Да» значит, что план или отчёт сохранён без ошибок. Раньше при неудаче блок писал ошибку в журнал, и проверить результат в шаблоне было нечем.
После «Сохранить отчёт сотрудника за день» поставьте условие по Saved и на «нет» отправьте уведомление руководителю. Подставить RECORD_ID из триггера «Завершён рабочий день» в поле «Идентификатор записи рабочего дня» этого блока, судя по коду, не выйдет: значение из настроек не сохраняется (см. «Мелочи»). В «Сохранить план на день» поле сохраняется. Сотрудник там должен быть владельцем записи, иначе Saved останется «нет».
Выключите Markdown, если текст уже в BB-кодах
Свойство «Преобразовывать Markdown в BB-код» (ConvertMarkdown) включено по умолчанию, так блоки работали и до обновления. Выключите его, и текст сохранится без прохода через MarkdownToBBCodeTranslationService из модуля ai. Это нужно, когда план или отчёт собирает ваш код и разметка в тексте уже готовая. У «Сохранить отчёт сотрудника за день» переключатель, судя по коду, не сохраняется (см. «Мелочи»).
Не ждите RECORD_ID от старта дня до обновления bizproc
Триггер «Запущен рабочий день» получил возвращаемое поле RECORD_ID, но на эталоне с bizproc 26.1400.0 оно всегда пустое.
Timeman передаёт поле, только если в Bitrix\Bizproc\Public\Activity\Trigger\ContextFields\TimemanStartWorktimeTrigger объявлена константа FIELD_RECORD_ID. В этой версии bizproc её нет, и поле начнёт заполняться, когда она появится. Если вы уже подставили RECORD_ID в RecordId блока «Сохранить план на день», ничего не сломается: пустое значение становится нулём, и блок пишет план в текущую запись сотрудника. У «Завершён рабочий день» RECORD_ID уже работает, его поля контекста описаны в самом timeman.
Мелочи и находки
- Похоже на баг в «Сохранить отчёт сотрудника за день». По коду выходит, что
getPropertiesDialogValues()после чтения формы перезаписываетRecordIdиConvertMarkdownпо спискуgetAiPassthroughSettingNames()значениями, которые уже лежат в шаблоне. Конструктор кладёт эти значения в блок сразу при добавлении из каталога (0иtrueиз.description.php), поэтому поменять два поля в настройках нельзя совсем, даже у нового блока. У «Сохранить план на день» такой перезаписи нет. На портале это не проверялось: после сохранения откройте настройки ещё раз и сверьте значения. - У «Сохранить план на день»
Savedв конструкторе подписан латиницей, без перевода.