| Задача: Запрет для сотрудников из некоторых департаментов переводить сделки из некоторых воронок в стадию "X", если сумма предоплаты (сумма значений 2х множественных полей ) меньше 50% от суммы товаров со значением "Батут" свойства "тип товара" . Причем, вперед нельзя, обратно можно. |
AddEventHandler("crm", "OnBeforeCrmDealUpdate", "CheckMinPO");
function CheckMinPO(&$arFields){
if(!empty($arFields["STAGE_ID"]) && !empty($arFields["MODIFY_BY_ID"])){
//сталии ДО
$arStartStages = [
"C3:NEW","C3:PREPARATION", "C3:PREPAYMENT_INVOICE","C3:EXECUTING",
"C1:NEW","C1:PREPARATION", "C1:PREPAYMENT_INVOICE","C1:EXECUTING",
"C5:NEW","C5:PREPARATION", "C5:PREPAYMENT_INVOICE","C5:EXECUTING",
"C7:NEW","C7:PREPARATION", "C7:PREPAYMENT_INVOICE","C7:EXECUTING",
"C133:NEW","C133:PREPARATION", "C133:PREPAYMENT_INVOICE","C133:EXECUTING",
];
$arFailStages = [];
$arCategoryIds = [1,3,5,7,133];
foreach ($arCategoryIds as $categoryId) {
$dbRow = CCrmStatus::GetList(['SORT'=>'asc'], ['ENTITY_ID'=>'DEAL_STAGE_'.$categoryId,"SEMANTICS"=>"F"]);
while ($row = $dbRow->fetch()) {
$arFailStages[] = $row["STATUS_ID"];
}
}
if(!in_array($arFields["STAGE_ID"], $arStartStages) && !in_array($arFields["STAGE_ID"], $arFailStages)){ //если не начальные стадии и не проигранные
$arFilter = array(
"ID"=>$arFields["ID"], //выбираем определенную сделку по ID
"CHECK_PERMISSIONS"=>"N" //не проверять права доступа текущего пользователя
);
$arSelect = array(
"ID",
"ASSIGNED_BY_ID",
"STAGE_ID",
"UF_CRM_1542789083",
"UF_CRM_1640203627"
);
$res = CCrmDeal::GetList(Array(), $arFilter, $arSelect);
if($arDeal = $res->Fetch()){
if(in_array($arDeal["STAGE_ID"],$arStartStages) && CModule::IncludeModule('intranet')&& CModule::IncludeModule('iblock')){//если было на начальных стадиях
$arUserDepartments = CIntranetUtils::GetUserDepartments($arFields["MODIFY_BY_ID"]);
if( //1242, 1292, 181, 183, 1609, 1610, 1611, 1612 если из ОП
in_array(1242,$arUserDepartments) ||
in_array(1292,$arUserDepartments) ||
in_array(181,$arUserDepartments) ||
in_array(183,$arUserDepartments) ||
in_array(1609,$arUserDepartments) ||
in_array(1610,$arUserDepartments) ||
in_array(1611,$arUserDepartments) ||
in_array(1612,$arUserDepartments)
){
//проверяем товары
$arFilter = array(
"OWNER_ID"=>$arFields["ID"], //ID сделки, лида, предложения
"CHECK_PERMISSIONS"=>"N" //не проверять права доступа текущего пользователя
);
$arSelect = array( "*");
$res = CCrmProductRow::GetList(['ID'=>'DESC'], $arFilter,false,false,$arSelect);
$arDealProducts = [];
$arProductIds = [];
while($arProduct = $res->Fetch()){
$arDealProducts[$arProduct["PRODUCT_ID"]] = $arProduct["PRICE"]*$arProduct["QUANTITY"];
$arProductIds[] = $arProduct["PRODUCT_ID"];
}
if(!empty($arProductIds)){
$arFilter = Array(
"ID"=>$arProductIds,
"IBLOCK_ID"=>28,
"PROPERTY_626" =>298 //батут
);
$arSelect = Array("ID");
$res = CIBlockElement::GetList(Array("sort"=>"asc"), $arFilter, false, Array("nPageSize"=>50,"iNumPage"=>1), $arSelect);
$sumBatut = 0;
while($arItem = $res->Fetch()){
$sumBatut = $sumBatut + $arDealProducts[$arItem["ID"]];
}
$minPO = $sumBatut*0.5;
$propPO1 = $arFields["UF_CRM_1542789083"]??$arDeal["UF_CRM_1542789083"];
$propPO2 = $arFields["UF_CRM_1640203627"]??$arDeal["UF_CRM_1640203627"];
$sumPO = 0;
foreach($propPO1 as $itemSum){
$sumPO = $sumPO + $itemSum;
}
foreach($propPO2 as $itemSum){
$sumPO = $sumPO + $itemSum;
}
if($sumPO < $minPO){
unset($arFields["STAGE_ID"]);
if(CModule::IncludeModule('im')){
$arFieldsIm = array(
"NOTIFY_TITLE" => "Сумма предоплаты меньше ".$minPO.'р.', //заголовок
"MESSAGE" => 'Нельзя изменить стадию. Cумма предоплаты '.$sumPO .'р. меньше '.$minPO.'р. - 50% от суммы товаров со свойством "Батут"',
"MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, // IM_MESSAGE_PRIVATE, IM_MESSAGE_CHAT, IM_MESSAGE_OPEN, IM_MESSAGE_SYSTEM, IM_MESSAGE_OPEN_LINE
"TO_USER_ID" => $arFields["MODIFY_BY_ID"],
"FROM_USER_ID" => $arFields["MODIFY_BY_ID"],
//"AUTHOR_ID" => $userIdOther, //может отличаться от FROM_USER_ID
"NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, // IM_NOTIFY_CONFIRM, IM_NOTIFY_SYSTEM, IM_NOTIFY_FROM
"NOTIFY_MODULE" => "main", // module id sender (ex: xmpp, main, etc)
"NOTIFY_EVENT" => "manage",
);
CIMMessenger::Add($arFieldsIm);
}
}
}
}
}
}
}
}
} |