Обработчик событий для бизнес-процесса "отпуск", bitrix24
Если у вас в компании используется бизнес-процесс "отпуск", и вам хочется добавить некоторые ограничения и вывод ошибок при создании бизнес-процесса. В таком случае лучшим решение будет воспользоватся обработчиком событий и добавить свои условия и вывод текстовых ошибок на своё усмотрение. В данной задаче мне необходимо было решить такие вопросы:
- Если сотрудник работает менее 6-ти месяцев создание заявки не доступно
- Отпуск в Августе и Декабре в компании запрещён
Ниже будет приведён пример каким образом было сделано, а вы уже по своему усмотрению изменяйте код.
//Element Add
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", Array("BeforeElementAddAndtElemenUpdate", "OnBeforeIBlockElementAddHandler"));
class BeforeElementAddAndtElemenUpdate
{
function OnBeforeIBlockElementAddHandler(&$arFields)
{
if($arFields['IBLOCK_ID'] == 103)
{
global $USER, $APPLICATION;
$rsUser = CUser::GetByID($arFields['MODIFIED_BY']);
$arUser = $rsUser->Fetch();
//Check on the availability of holiday
if($arFields['PROPERTY_VALUES'][432] == 3147 || $arFields['PROPERTY_VALUES'][432] == 3182)
{
if($arUser['UF_WORK_DATE'] == "")
{
$APPLICATION->throwException("Ошибка. Создание заявки не доступно. В вашем профеле сотрудника не указана дата приёма на работу.");
return false;
}
else
{
$recruitment = strtotime($arUser['UF_WORK_DATE'])+15811200;
$recruitment2 = strtotime($arFields['PROPERTY_VALUES'][429]['n0']['VALUE']);
if($recruitment > $recruitment2)
{
$APPLICATION->throwException("Ошибка. Создание заявки не доступно, вы работаете меньше 6-ти месяцев.".$interval->m);
return false;
}
}
}
//Add position
if($arUser['UF_DOLJNOST']>0)
{
$res = CIBlockElement::GetList(Array("SORT"=>"ASC"), Array("ID"=>$arUser['UF_DOLJNOST'], "ACTIVE"=>"Y"), false, false, Array("ID", "NAME"));
while($ob = $res->GetNextElement())
{
$arFields2 = $ob->GetFields();
$arFields['PROPERTY_VALUES'][558]['n0']['VALUE'] = $arFields['PROPERTY_VALUES'][558]['n0']['VALUE'].' ('.$arFields2['NAME'].')';
}
}
$from_time = strtotime($arFields['PROPERTY_VALUES'][429]['n0']['VALUE']);
$to_time = strtotime($arFields['PROPERTY_VALUES'][428]['n0']['VALUE']);
$value_time = 0;
if($from_time>$to_time)
{
$APPLICATION->throwException("Ошибка. Дата начала и дата окончания отпуска указаны в обратном порядке, укажите правильно даты отпуска.");
return false;
}
else
{
$count_different = intval( (($to_time - $from_time)/86400)+1 );
for ($i=0; $i < $count_different; $i++)
{
$now_tiem = $from_time+(86400*$i);
$date_number = date('N', $now_tiem);
$month_number = date('n', $now_tiem);
//August, December
if( ($month_number==8 || $month_number==12) && ($arFields['PROPERTY_VALUES'][432] != 3149) )
{
$APPLICATION->AddHeadString('',true);
$APPLICATION->throwException("Отпуск в Августе и Декабре в компании запрещён.");
return false;
}
//Weekend
if($date_number!=6 && $date_number!=7)
{
$value_time++;
}
}
}
//Amount of days
$arFields['PROPERTY_VALUES'][606]['n0']['VALUE'] = $value_time;
//Add create user in field (607)
$arFields['PROPERTY_VALUES'][607]['n0']['VALUE'] = $arUser['ID'];
}
}
}