С одной стороны - задача печальная, руководитель должен контролировать что творится у него в компании. С другой стороны - руководитель не хочет получать вообще никакие уведомления на почту, он может все посмотреть в КП, когда ему захочется, для контроля рабочих отчетов у него есть зам., соответственно все рабочие отчеты должны уходить ему.
[spoiler]
Если первая задача (с почтой) решается более менее гладко, то вторая (с переносом уведомлений) только с модификацией ядра, хотя, я думаю, задача так или иначе распространенная и должна как то решаться в настройках модулей (типа чекбокс не отправлять руководителю отчеты, перенаправлять на такого то пользователя).
Решения:
1. Для того что бы конкретным пользователям не отправлялись на почту почтовые уведомления (для себя я определил 4 типа почтовых шаблонов), в init.php определим обработчик события:
2. Сразу оговорюсь, зам имеет админский доступ, рабочие отчеты видит и так, но без уведомлений (что будет без админской группы я не проверял, возможно будет достаточно группы "руководство". Для решения второй задачи я потратил пол дня... По большей части из за того, что начал искать "а как же добавляется отчет", не нашел и решил зайти с хвоста, поискать как генерируются уведомления и там я прозрел
Собственно за поиск "головы" отвечает метод GetUserManagers класса CTimeMan, но т.к. в нем событий нет, то придется модифицировать ядро:
Вот и все. Непутевые заметки, наверно по большей части для себя, что бы не забыть когда все сломается при обновлении
[spoiler]
Если первая задача (с почтой) решается более менее гладко, то вторая (с переносом уведомлений) только с модификацией ядра, хотя, я думаю, задача так или иначе распространенная и должна как то решаться в настройках модулей (типа чекбокс не отправлять руководителю отчеты, перенаправлять на такого то пользователя).
Решения:
1. Для того что бы конкретным пользователям не отправлялись на почту почтовые уведомления (для себя я определил 4 типа почтовых шаблонов), в init.php определим обработчик события:
AddEventHandler("main", "OnBeforeEventAdd", array("FormulaAddon", "OnBeforeEventAddHandler")); class FormulaAddon { function OnBeforeEventAddHandler(&$event, &$lid, &$arFields) { $arMail = array( //массив почтовых адресов, куда не отправляем уведомления ); //проверка типов и e-mail получателей if (($event == 'TASK_REMINDER' || $event == 'SONET_NEW_MESSAGE' || $event == 'IM_NEW_NOTIFY_GROUP' || $event == 'IM_NEW_NOTIFY') && false !== in_array($arFields['EMAIL_TO'], $arMail) || $event == 'SONET_INVITE_GROUP' && false !== in_array($arFields['USER_EMAIL'], $arMail)) { return false; } } } |
Собственно за поиск "головы" отвечает метод GetUserManagers класса CTimeMan, но т.к. в нем событий нет, то придется модифицировать ядро:
public static function GetUserManagers($USER_ID, $bCheckExistance = true) { $arStruct = CIntranetUtils::GetStructure(); $arHeads = array(); foreach ($arStruct['DATA'] as $dpt => $arDpt) { if (in_array($USER_ID, $arDpt['EMPLOYEES'])) { $arCurDpt = $arDpt; while ( ( !$arCurDpt['UF_HEAD'] || $arCurDpt['UF_HEAD'] == $USER_ID || ( $bCheckExistance && ( !($arUser = CUser::GetByID($arCurDpt['UF_HEAD'])->Fetch()) || $arUser['ACTIVE'] == 'N' ) ) ) && $arCurDpt['IBLOCK_SECTION_ID'] > 0 ) { $arCurDpt = $arStruct['DATA'][$arCurDpt['IBLOCK_SECTION_ID']]; } if ($arCurDpt['UF_HEAD']) { //проверяем ID, если это ID нашего директора, то меняем его на ID зама if ($arCurDpt['UF_HEAD'] == 5) $arCurDpt['UF_HEAD'] = 33; $arHeads[] = $arCurDpt['UF_HEAD']; } } } return $arHeads; } |