Это статья про старое api cделок и лидов Есть статья про crm api d7 |
подключить модуль по-старому
CModule::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 робота, смотреть через таблицу b_bp_workflow_template
["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 робота, смотреть через таблицу b_bp_workflow_template
["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){
//
} |