Продолжу тему поднял Долганин Антон . Давайте на практике посмотрим как можно улучшить работу с задачами.
Сейчас мы сделаем доработки КП для учета времени:
Для задач есть следующие статусы задачи:
Для решения пункта 1 мы привяжемся к событию
И к событию 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 и там порезвимся - создадим расцветку для задач на паузе, удобную работу с полем времени
- планируется сделать итерацию по подсчету затраченного времени - теперь только одна задача может единовременно выполнятся и точно сть расчетов будет точнее ))