Обучаю битриксу программистов, интеграторов. Подробнee ⇒

Сделки, Лиды - crm api коробка



список полей сделок  https://dev.1c-bitrix.ru/rest_help/crm/cdeals/crm_deal_fields.php  
список полей лида https://dev.1c-bitrix.ru/rest_help/crm/leads/crm_lead_fields.php
подключить модуль по-старому
CModule::IncludeModule('crm');
подключить модуль d7
\Bitrix\Main\Loader::includeModule("crm");

системные константы
CCrmOwnerType::Lead; //1
CCrmOwnerType::Deal; //2
CCrmOwnerType::Contact;
CCrmOwnerType::Company;
CCrmOwnerType::Invoice;
CCrmOwnerType::Quote;
CCrmOwnerType::Requisite;

добавить сделку
$arFields =[
        "TITLE" => $_POST["name_deal"], 
        "TYPE_ID" => "SALE", 
        "STAGE_ID" => "NEW",                
        "COMPANY_ID" => $companyId,                        
        "OPENED" => "Y", 
        "ASSIGNED_BY_ID" => $managerId, 
        "CREATED_BY_ID" =>$userId,                         
       "UF_CRM_PROP" =>$propValue, 
];

$options = ['CURRENT_USER'=>1]; //из под админа
$deal = new CCrmDeal(false);
$dealId = $deal->Add($arFields,true,$options);

if($dealId > 0){                    
   CModule::IncludeModule('bizproc'); //запускаем робота для текущей стадии сделки
   $arErrors = [];                  
   CBPDocument::StartWorkflow(
         $bpId,  //ID робота, смотреть через таблицы
         ["crm","CCrmDocumentDeal","DEAL_".$dealId], 
        ["TargetUser" => "user_1"],
         $arErrorsTmp
   );                  
}

обновить сделку
Важно!
Если Вы изменяете-добавляете сделку / лид (или переводите на др стадию) через api, то роботов надо запускать тоже через api
Если у вас есть обязательные поля для этапа, то сначала их заполняете, сохраняете, а  потом изменяете на нужную стадию.
вариант 1
$deal = new CCrmDeal(false); //false - не учитывать права
global $DB; 
$DB->StartTransaction();              
$arUpdateData = ["STAGE_ID" => $stage];  //поля которые обновляем
$arOptions = [
  "CURRENT_USER"=> $arTaskCopy["CREATED_BY"] //из под кого обновляем
];              
if($deal->Update(
    $dealId,
    $arUpdateData,
    true,
    true,
    $arOptions                   
)){               
   $DB->Commit(); 
   CModule::IncludeModule('bizproc'); //запускаем робота для текущей стадии сделки
   $arErrors = Array();                  
   CBPDocument::StartWorkflow(
       $bpId, //ID робота, смотреть через таблицы
       ["crm","CCrmDocumentDeal","DEAL_". $dealId],
       array(),
       $arErrorsTmp
    );                    
}
else{                  
    $DB->Rollback();
}

вариант 2
$deal  =  new  \CCrmDeal( false );  //false - не учитывать права
 
$arUpdateData = array(); //поля которые обновляем
$arOptions = array("CURRENT_USER"=> $arTaskCopy["CREATED_BY"]); //из под кого обновляем
 
//сначала заполняем поля
$upRes = $deal->Update($dealId, $arUpdateData, true, true, $arOptions);                                       

//потом переходим на этап, если раньше то ругается, что обязательные поля для следующего этапа не заполнены
$arUpdateData = array("STAGE_ID" => 4);   
$upRes = $deal->Update($dealId, $arUpdateData, true, true, $arOptions);

//запускаем роботов для сделки (по сути это бизнес-процесс), если изменили стадию через api, то сами роботы не запустятся                          
CModule::IncludeModule('bizproc');            
CBPDocument::StartWorkflow(
   $bpId,
   array("crm","CCrmDocumentDeal","DEAL_".$dealId),
   array("TargetUser" => "user_".$userId),
   $arErrorsTmp
); 
 
получить сделки
$arFilter = array(
   "ID"=>$dealId, //выбираем определенную сделку по ID
   "CHECK_PERMISSIONS"=>"N" //не проверять права доступа текущего пользователя
);            
$arSelect = array(
   "ID",
   "TITLE",
   "COMPANY_ID",    
   UF_CRM_PROGRAMMER, //пользовательское свойство   
   "STAGE_ID"
);            
$res = CCrmDeal::GetList(Array(), $arFilter, $arSelect);
if($row = $res->Fetch()){
   //
}   

или
$res = CCrmDeal::GetListEx(Array(), $arFilter, false,false, $arSelect); //возвращаются поля, которые могут не быть в CCrmDeal::GetList
while($row = $res->Fetch()){
     //
}
 

получить сделки api d7
use Bitrix\Crm\DealTable;

$arDeals = DealTable::getList([
   'order'=>['ID' => 'DESC'],
   'filter'=>$arFilter,
   'select'=>$arSelect,
   'cache' => ['ttl' => 3600]
])->fetchAll();

$deals=[];
foreach($arDeals as $deal){
    $deals[$deal['ID']]=$deal;
}
$dealFactory = \Bitrix\Crm\Service\Container::getInstance()->getFactory(2);
$deal  = $dealFactory->GetItem($dealId); //$dealId -число
$stageId = $deal->get('STAGE_ID');
$propValue = $deal->get('UF_CRM_5BFEB5B8E70C5');

удалить сделку
$arOptions = array("CURRENT_USER"=>1); //удаляем из-под админа. Если не указывать, то будет проверять права доступа текущего пользователя
CCrmDeal::Delete($dealId,$arOptions);


добавить наблюдателя в сделку
это код от ТП Битрикса (Но при таком добавлении наблюдателей в сделку, они не получают права на просмотр сделки и не видят ее в списке сделок. )
$arAdd = array(  
   'ENTITY_TYPE_ID' => 2, //CCrmOwnerType::Deal
   'ENTITY_ID' => $dealId,
   'USER_ID' => $userId,
   //'SORT' => '',
   'CREATED_TIME' => new Bitrix\Main\Type\DateTime(),
   'LAST_UPDATED_TIME' => new Bitrix\Main\Type\DateTime()
);
$oObserver = \Bitrix\Crm\Observer\Entity\ObserverTable::add($arAdd);
так правильно добавить наблюдателя в сделку
\CCrmDeal::AddObserverIDs($dealId,$arFields['USERS_IDS']);
удалить наблюдателя из сделки
\CCrmDeal::RemoveObserverIDs($dealId,$arFields['USERS_IDS']);
получить направление сделки
$categoryId = CCrmDeal::GetCategoryID($dealId);
$arCategory = \Bitrix\Crm\Category\DealCategory::get($arCategoryId);
список направлений сделок ( возвращает все, кроме дефолтной нулевой)
$res = \Bitrix\Crm\Category\DealCategory::getList(
 ["select"=>["*"],]
)->fetchAll();
print_r($res);
список стадий воронки сделки
STATUS_ID - статус, который в сделке,
ENTITY_ID - DEAL_STAGE - основная, DEAL_STAGE_#ID# - другие
$dbRow = CCrmStatus::GetList(['SORT'=>'asc'], ['ENTITY_ID'=>'DEAL_STAGE_1']);//arSelectа нет, выбирает все поля
while ($row = $dbRow->fetch()) {
  echo $row["STATUS_ID"]." ".$row["NAME"]."<br>";
}


Добавление комментария в таймлайн сделки
$settings = ['HAS_FILES' => !empty($attachments)? 'Y' : 'N'];

$entryId = \Bitrix\Crm\Timeline\CommentEntry::create([
        'TEXT' => $text,
        'FILES' => $attachments,
        'SETTINGS' => $settings,
        'AUTHOR_ID' => $userId,
        'BINDINGS' => [['ENTITY_TYPE_ID' => \CCrmOwnerType::Deal, 'ENTITY_ID' => $dealId]]
]);
добавить запись в историю компании (лида, сделки, контакта)
$CCrmEvent = new CCrmEvent();            
$CCrmEvent->Add(
   array(
      'ENTITY_TYPE'=> "DEAL", //LEAD, CONTACT, DEAL,COMPANY
      'ENTITY_ID' => $id,
      'EVENT_ID' => 'INFO',                  
      'EVENT_TEXT_1' => 'Просмотр карточки ais за '.date("d.m.Y", $date), //какой-то текст      
      //'FILES' => array(CFile::MakeFileArray('/bitrix/templates/bitrix24/images/template_sprite_21.png')),
      //'DATE_CREATE' => ConvertTimeStamp(time() + CTimeZone::GetOffset(), 'FULL', SITE_ID), //по умолчанию текущее время      
   )
);

События сделок
события CRM - старое апи
новые обработчики через подмену контейнера и Operation

  • OnAfterCrmDealAdd  - после добавления сделки.    CCrmDeal::Add
  • OnAfterCrmDealUpdate  -   после изменения сделки. CCrmDeal::Update
  • OnBeforeCrmDealDelete -  перед удалением сделки. CCrmDeal::Delete
  • OnBeforeCrmDealAdd - перед добавлением сделки.   CCrmDeal::Add
  • OnBeforeCrmDealUpdate -  перед изменением сделки.    CCrmDeal::Update
  • OnAfterCrmDealDelete  -  после удаления сделки.  CCrmDeal::Delete
  • OnAfterExternalCrmDealAdd  - после добавления внешней сделки.    CCrmDeal::Add
  • OnAfterCrmDealProductRowsSave -  после добавления товара в сделку.   CCrmDeal::SaveProductRows
  • OnBeforeCrmDealProductRowsSave - перед добавлением товара в сделку.  CCrmDeal::SaveProductRows
Свой обработчик события
AddEventHandler("crm", "OnAfterCrmDealUpdate", "MyOnAfterCrmDealUpdate");
function MyOnAfterCrmDealUpdate($arFields){
   //
}

Лиды
добавить лид
$lead = new CCrmLead; 

$arFields = Array(
    "TITLE" => "Заголовок",
    "COMPANY_TITLE" => "Название компании",
   "NAME" => "Имя",
   "LAST_NAME" => "Фамилия",
   SECOND_NAME" => "Отчество",
   "POST" => "Должность",
   "ADDRESS" => "Адрес",
   "COMMENTS" => "Комментарий",
        "SOURCE_DESCRIPTION" => "",
   "STATUS_DESCRIPTION" => "",
   //"OPPORTUNITY" => 123456,
   "CURRENCY_ID" => "RUB",
   //"PRODUCT_ID" => "PRODUCT_1",
       "SOURCE_ID" => "SELF",
       "STATUS_ID" => "NEW",
       "ASSIGNED_BY_ID" => $userId,  
       "UF_CRM_143192342342" => "", 
);
 
$leadId = $lead->Add($arFields);
обновить лид
$lead  =  new  \CCrmLead( false );         
$arUpdateData = array(
   "UF_CRM_1632338031" => $_REQUEST["additional_source"]
); 
$arOptions = array();       
$upRes = $lead->Update($_REQUEST['id'], $arUpdateData, true, true, $arOptions);
получить лид
$arFilter = array(
     "ID"=>$leadId, 
     "CHECK_PERMISSIONS"=>"N" //не проверять права доступа текущего пользователя
 );            
 $arSelect = array(
  "ID",     
   "UF_CRM_1632338031", 
     
 );            
 $res = CCrmLead::GetList(Array(), $arFilter, $arSelect);
if($row = $res->Fetch()){
 //
}
удалить лид
$arOptions = array("CURRENT_USER"=>1); //удаляем из-под админа. Если не указывать, то будет проверять права доступа текущего пользователя
CCrmLead::Delete($leadId,$arOptions);
получить статусы лида
$dbRow = CCrmStatus::GetList(['SORT'=>'asc'], ["ENTITY_ID"=>"STATUS"],['ENTITY_ID',"ID","STATUS_ID","NAME"]);   //DEAL_STAGE_1 - статус сделки 1- id воронки
while ($row = $dbRow->fetch()) {
   //поле STATUS_ID - статус в лиде
}
получить все контакты лида
$arContact = \Bitrix\Crm\Binding\LeadContactTable::getLeadBindings($leadId); //вернет массив контактов

События лидов
  • OnAfterCrmLeadAdd   после добавления лида.  CCrmLead::Add
  • OnAfterCrmLeadUpdate    после изменения лида.   CCrmLead::Update
  • OnBeforeCrmLeadDelete   перед удалением лида.   CCrmLead::Delete
  • OnBeforeCrmLeadAdd  перед добавлением лида. CCrmLead::Add
  • OnBeforeCrmLeadUpdate   перед изменением лида.  CCrmLead::Update
  • OnAfterCrmLeadDelete    после удалениея лида.   CCrmLead::Delete
  • OnAfterExternalCrmLeadAdd   после добавления внешнего лида. CCrmLead::Add
  • OnAfterCrmLeadProductRowsSave   после добавления товара в лид.  CCrmLead::SaveProductRows
Свой обработчик события
AddEventHandler("crm", "OnAfterCrmLeadUpdate", "MyOnAfterCrmLeadUpdate");
function MyOnAfterCrmLeadUpdate($arFields){
   //
}
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!