Продолжу тему поднял Долганин Антон Таймменеджер Битрикса, и чем он далек от реалий веб-студий (а может и от множества других реалий) . Давайте на практике посмотрим как можно улучшить работу с задачами.
Сейчас мы сделаем доработки КП для учета времени:
bitrix.mpbuilder ) для автоматического создания каркаса. Приме моего модуля (FixЗадач (db.fixtasks)) - в конце статьи.
Для задач есть следующие статусы задачи:
Для решения пункта 1 мы привяжемся к событию OnBeforeTaskUpdate
И к событию OnBeforeTMEntryUpdate - изменение в учете рабочего времени
PS: Аккуратно экспериментируйте - можно запросто все Ваши задачи перевести в статус работа. Потом замучаетесь приводить все в порядок.
Пункт 2 решается тривиально - создадим пользовательское свойство для задачи (/bitrix/admin/userfield_admin.php):

По пункту 3 - придется лезть в код. Файл /bitrix/modules/tasks/tools.php Нужна 602 строка
Я поменял строки
Итого:
Сейчас мы сделаем доработки КП для учета времени:
- Одновременно может быть запущена только одна задача у одного исполнителя в рабочее время.
* Запуск одной задачи ставит на паузу все другие задачи этого исполнителя.
* Окончание (пауза) рабочего дня останавливает задачи. - Разделить время (часы) на задачу – отдельное поле для постановщика - для задания количества часов которое планируется на задачу
- Посмотрим как объединить "отложенные" задачи (пауза) и группу задач из блока "в работе"
Для задач есть следующие статусы задачи:
/****************************************************************** STATUS "renew" : 1 - создана - не принята "accept" : 2 - принята (если сам себе - то сразу этот статус) "start" : 3 - в работе исполняется "close" : 4 - закрыта - требует контроля "close" : 5 - закрыта "defer" : 6 - приостановлена / отложена "decline" : 7 - отклонена /******************************************************************/ |
function OnBeforeTaskUpdate($ID, &$arFields) { /******************************************************* // проверяем что задачу перевели в исполнение // и все остальные задачи переводим в паузу ******************************************************/ if(isset($arFields['STATUS']) && $arFields['STATUS'] == 3){ CModule::IncludeModule("tasks"); $MODULE_ID = basename(dirname(__FILE__)); //define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"].'/log_'.$MODULE_ID.'.txt'); // выберем все задачи пользователя со статусом в работе, кроме текущей $res = CTasks::GetList( Array("TITLE" => "ASC"), Array( "RESPONSIBLE_ID" => $arFields['STATUS_CHANGED_BY'], '!ID' => $ID, 'STATUS' => 3 ), Array('ID', 'TITLE', 'STATUS') ); $obTask = new CTasks; while ($arTask = $res->GetNext()) { $arFieldsOld = array('STATUS' => 6); // переведем задачи в статус паузы $success = $obTask->Update($arTask['ID'], $arFieldsOld); } //AddMessage2Log(print_r(array($ID, $arFields), true), $MODULE_ID); } return true; } |
function OnBeforeTMEntryUpdate($arFields) { /******************************************************* // если закрыли или на паузу день поставили // все задачи отложились ******************************************************/ $MODULE_ID = basename(dirname(__FILE__)); //define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"].'/log_'.$MODULE_ID.'.txt'); if(isset($arField['PAUSED']) && $arField['PAUSED'] == 'Y' || !isset($arFields['ACTIVE']) ){ //AddMessage2Log(print_r(array($arFields), true), $MODULE_ID); CModule::IncludeModule("tasks"); $res = CTasks::GetList( Array("TITLE" => "ASC"), Array( "RESPONSIBLE_ID" => $arFields['USER_ID'], 'STATUS' => 3 ), Array('ID', 'TITLE', 'STATUS') ); $obTask = new CTasks; while ($arTask = $res->GetNext()) { $arFieldsOld = array('STATUS' => 6); $success = $obTask->Update($arTask['ID'], $arFieldsOld); } } return true; } |
Пункт 2 решается тривиально - создадим пользовательское свойство для задачи (/bitrix/admin/userfield_admin.php):
- Тип данных - Число
- Объект - TASKS_TASK
- XML_ID/Код поля - например - UF_DBFXTASK_TIME
- Точность (количество знаков после запятой) - 1
- Значение по умолчанию - 0.5
- Подпись в форме редактирования - Длительность задачи (ч)
- Помощь - Это поле содержит общее время на задачу в часах. Можно писать дробные числа


По пункту 3 - придется лезть в код. Файл /bitrix/modules/tasks/tools.php Нужна 602 строка
"STATUS" => array( array( array("TITLE" => GetMessage("TASKS_FILTER_ACTIVE"), "FILTER" => array("STATUS" => array(-2, -1, 1, 2, 3, 6)), "CLASS" => "open", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_NEW"), "FILTER" => array("STATUS" => array(-2, 1)), "CLASS" => "new", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_DELAYED"), "FILTER" => array("STATUS" => 6), "CLASS" => "new", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_IN_PROGRESS"), "FILTER" => array("STATUS" => 3), "CLASS" => "in-progress", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_ACCEPTED"), "FILTER" => array("STATUS" => 2), "CLASS" => "accepted", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_OVERDUE"), "FILTER" => array("STATUS" => -1), "CLASS" => "overdue", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_CLOSED"), "FILTER" => array("STATUS" => array(4, 5)), "CLASS" => "completed", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_ALL"), "FILTER" => array(), "CLASS" => "any", "COUNT" => "-") ), array( array("TITLE" => GetMessage("TASKS_FILTER_ACTIVE"), "FILTER" => array("STATUS" => array(-1, 1, 2, 3, 4, 7)), "CLASS" => "open", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_NOT_ACCEPTED"), "FILTER" => array("STATUS" => 1), "CLASS" => "new", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_IN_CONTROL"), "FILTER" => array("STATUS" => array(4, 7)), "CLASS" => "waiting", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_IN_PROGRESS"), "FILTER" => array("STATUS" => 3), "CLASS" => "in-progress", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_ACCEPTED"), "FILTER" => array("STATUS" => 2), "CLASS" => "accepted", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_OVERDUE"), "FILTER" => array("STATUS" => -1), "CLASS" => "overdue", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_DELAYED"), "FILTER" => array("STATUS" => 6), "CLASS" => "delayed", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_CLOSED"), "FILTER" => array("STATUS" => array(4, 5)), "CLASS" => "completed", "COUNT" => "-"), array("TITLE" => GetMessage("TASKS_FILTER_ALL"), "FILTER" => array(), "CLASS" => "any", "COUNT" => "-") ) ) |
- тут добавил дефолтный статус - 6
array("TITLE" => GetMessage("TASKS_FILTER_ACTIVE"), "FILTER" => array("STATUS" => array(-2, -1, 1, 2, 3, 6)), "CLASS" => "open", "COUNT" => "-"), |
- эту строку поднял выше и добавил свой класс
array("TITLE" => GetMessage("TASKS_FILTER_DELAYED"), "FILTER" => array("STATUS" => 6), "CLASS" => "delayed db-delayed", "COUNT" => "-"), |
- начало положено - мы меняем КП под свои нужды
- есть желание все свои правки оформить в виде модуля - чуть позже я доберусь до JS/CSS и там порезвимся - создадим расцветку для задач на паузе, удобную работу с полем времени
- планируется сделать итерацию по подсчету затраченного времени - теперь только одна задача может единовременно выполнятся и точно сть расчетов будет точнее ))