%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sender/lib/integration/ |
| Current File : //home/bitrix/www/bitrix/modules/sender/lib/integration/eventhandler.php |
<?php
/**
* Bitrix Framework
* @package bitrix
* @subpackage sender
* @copyright 2001-2017 Bitrix
*/
namespace Bitrix\Sender\Integration;
use Bitrix\Main;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Loader;
use Bitrix\Main\ModuleManager;
use Bitrix\Main\Entity as MainEntity;
use Bitrix\Sender\ContactTable;
use Bitrix\Sender\Message;
use Bitrix\Sender\Entity;
use Bitrix\Sender\Dispatch;
use Bitrix\Sender\PostingTable;
use Bitrix\Sender\Templates;
use Bitrix\Sender\Internals\Model\LetterTable;
use Bitrix\Sender\PostingRecipientTable;
Loc::loadMessages(__FILE__);
/**
* Class EventHandler
* @package Bitrix\Sender\Integration\Crm
*/
class EventHandler
{
/**
* Handler of event sender/onSenderPresetList.
*
* @return array
*/
public static function onSenderPresetList()
{
$list = array();
if (ModuleManager::isModuleInstalled('crm'))
{
$list[] = 'Bitrix\Sender\Integration\Crm\Preset\Segment';
}
return $list;
}
/**
* Handler of event sender/onSenderPresetList.
*
* @return array
*/
public static function onSenderCompanyCard()
{
$list = array();
if (Loader::includeModule('crm'))
{
$list[] = Crm\CompanyCard::getArray();
}
return $list;
}
/**
* Handler of event sender/OnAfterPostingSendRecipient.
*
* @param array $eventData Event.
* @param Entity\Letter $letter Letter.
* @return void
*/
public static function onAfterPostingSendRecipient(array $eventData, Entity\Letter $letter)
{
if (ModuleManager::isModuleInstalled('crm'))
{
Crm\EventHandler::onAfterPostingSendRecipient($eventData, $letter);
}
if (Bitrix24\Service::isCloud() && $eventData['SEND_RESULT'] && $letter->getMessage()->getCode() === Message\iBase::CODE_MAIL)
{
Bitrix24\Limitation\DailyLimit::increment();
}
}
/**
* Handler of event sender/onAfterPostingRecipientUnsubscribe.
*
* @param array $eventData Event.
* @return void
*/
public static function onAfterPostingRecipientUnsubscribe(array $eventData)
{
if (Bitrix24\Service::isCloud() && is_array($eventData))
{
Bitrix24\Limitation\Rating::regulate();
}
}
/**
* Handler of event sender/onConstantList.
*
* @param string $className Class name.
* @return array
*/
public static function onConstantList($className)
{
// sale
if (Loader::includeModule('sale') && !Bitrix24\Service::isCloud())
{
if (Templates\Category::class === $className)
{
return Sale\Preset\TriggerCampaign::getTemplateCategories();
}
}
return [];
}
/**
* Handler of event sender/onTemplateList.
*
* @param string $messageType Message type.
* @return array
*/
public static function onTemplateList($messageType)
{
$list = [
Message\iBase::CODE_MAIL => []
];
// sale
if (Loader::includeModule('sale') && !Bitrix24\Service::isCloud())
{
foreach (Sale\Preset\TriggerCampaign::getAll() as $item)
{
foreach ($item['CHAIN'] as $letter)
{
$list[Message\iBase::CODE_MAIL][] = array(
'ID' => $letter['TEMPLATE_ID'],
'TYPE' => $letter['TEMPLATE_TYPE'],
'CATEGORY' => strtoupper($item['CODE']),
'MESSAGE_CODE' => Message\iBase::CODE_MAIL,
'VERSION' => 2,
'IS_TRIGGER' => true,
'HOT' => false,
'ICON' => false,
'NAME' => $letter['SUBJECT'],
'DESC' => '',
'FIELDS' => array(
'SUBJECT' => array(
'CODE' => 'SUBJECT',
'VALUE' => $letter['SUBJECT'],
),
'MESSAGE' => array(
'CODE' => 'MESSAGE',
'VALUE' => $letter['MESSAGE'],
'ON_DEMAND' => true
),
),
);
}
}
}
return isset($list[$messageType]) ? $list[$messageType] : [];
}
/**
* Handler of event sender/onConnectorList.
*
* @param array $data Data.
* @return array
*/
public static function onConnectorList(array $data = array())
{
// sender
$data['CONNECTOR'][] = 'Bitrix\Sender\Integration\Sender\Connectors\Recipient';
$data['CONNECTOR'][] = 'Bitrix\Sender\Integration\Sender\Connectors\Contact';
$data['CONNECTOR'][] = 'Bitrix\Sender\Integration\Sender\Connectors\UnSubscribers';
// crm
if (Loader::includeModule('crm'))
{
$data['CONNECTOR'][] = 'Bitrix\Sender\Integration\Crm\Connectors\Lead';
$data['CONNECTOR'][] = 'Bitrix\Sender\Integration\Crm\Connectors\Client';
}
return $data;
}
/**
* Handler of event sender/onTriggerList.
*
* @param array $data Data.
* @return array
*/
public static function onTriggerList(array $data = [])
{
$data['TRIGGER'] = [
'Bitrix\Sender\Integration\Main\Triggers\UserAuth',
'Bitrix\Sender\Integration\Main\Triggers\UserDontAuth',
];
return $data;
}
/**
* Handler of event sender/onSenderMessageList.
*
* @return array
*/
public static function onSenderMessageList()
{
$list = array();
// mail
$list[] = 'Bitrix\Sender\Integration\Sender\Mail\MessageMail';
// sms
if (MessageService\Sms\Service::canUse())
{
$list[] = 'Bitrix\Sender\Integration\MessageService\Sms\MessageSms';
}
// im
if (Im\Service::canUse())
{
$list[] = 'Bitrix\Sender\Integration\Im\MessageIm';
}
// call
if (VoxImplant\Service::canUse())
{
$list[] = 'Bitrix\Sender\Integration\VoxImplant\MessageCall';
}
// web_hook
//$list[] = 'Bitrix\Sender\Integration\Sender\WebHook\MessageWebHook';
// Ads
if (Seo\Ads\Service::canUse())
{
$adsList = array(
'Bitrix\Sender\Integration\Seo\Ads\MessageYa',
'Bitrix\Sender\Integration\Seo\Ads\MessageGa',
'Bitrix\Sender\Integration\Seo\Ads\MessageVk',
'Bitrix\Sender\Integration\Seo\Ads\MessageFb',
);
foreach ($adsList as $adsClass)
{
if (!Bitrix24\Service::isAdVisibleInRegion($adsClass::CODE))
{
continue;
}
$list[] = $adsClass;
}
}
// Return Customer
if (Crm\ReturnCustomer\Service::canUse())
{
$list[] = 'Bitrix\Sender\Integration\Crm\ReturnCustomer\MessageLead';
$list[] = 'Bitrix\Sender\Integration\Crm\ReturnCustomer\MessageDeal';
}
return $list;
}
/**
* Handler of event sender/OnPresetMailingList.
*
* @return array
*/
public static function onSenderTriggerCampaignPreset()
{
$list = [];
// sale
if (Loader::includeModule('sale') && !Bitrix24\Service::isCloud())
{
$list = array_merge($list, Sale\Preset\TriggerCampaign::getAll());
}
return $list;
}
/**
* Handler of event sender/onSenderTransportList.
*
* @return array
*/
public static function onSenderTransportList()
{
$list = array();
// mail
$list[] = 'Bitrix\Sender\Integration\Sender\Mail\TransportMail';
// sms
if (MessageService\Sms\Service::canUse())
{
$list[] = 'Bitrix\Sender\Integration\MessageService\Sms\TransportSms';
}
// im
if (Im\Service::canUse())
{
$list[] = 'Bitrix\Sender\Integration\Im\TransportIm';
}
// call
if (VoxImplant\Service::canUse())
{
$list[] = 'Bitrix\Sender\Integration\VoxImplant\TransportCall';
}
// web_hook
//$list[] = 'Bitrix\Sender\Integration\Sender\WebHook\TransportWebHook';
// Ads
if (Seo\Ads\Service::canUse())
{
$list[] = 'Bitrix\Sender\Integration\Seo\Ads\TransportYa';
$list[] = 'Bitrix\Sender\Integration\Seo\Ads\TransportGa';
$list[] = 'Bitrix\Sender\Integration\Seo\Ads\TransportVk';
$list[] = 'Bitrix\Sender\Integration\Seo\Ads\TransportFb';
}
// Return Customer
if (Crm\ReturnCustomer\Service::canUse())
{
$list[] = 'Bitrix\Sender\Integration\Crm\ReturnCustomer\TransportLead';
$list[] = 'Bitrix\Sender\Integration\Crm\ReturnCustomer\TransportDeal';
}
return $list;
}
/**
* On before update LetterTable.
*
* @param MainEntity\Event $event Event.
* @param MainEntity\EventResult $result Result.
* @return void
*/
public static function onBeforeUpdateLetterTable(MainEntity\Event $event, MainEntity\EventResult $result)
{
$data = $event->getParameters();
if (Bitrix24\Service::isCloud() && isset($data['fields']['STATUS']))
{
$oldRow = LetterTable::getRowById($data['primary']['ID']);
if ($oldRow['MESSAGE_CODE'] !== Message\iBase::CODE_MAIL)
{
return;
}
$isEmailBlocked = Bitrix24\Limitation\Rating::isBlocked();
if($isEmailBlocked && in_array($data['fields']['STATUS'], Dispatch\Semantics::getWorkStates()))
{
$result->addError(
new MainEntity\EntityError(
Bitrix24\Limitation\Rating::getNotifyText('blocked')
)
);
}
}
}
/**
* Handler of event main/onMailEventMailChangeStatus.
*
* @param Main\Mail\Callback\Result $result Callback result instance.
* @return void
*/
public static function onMailEventMailChangeStatus($result)
{
if (!$result->isBelongTo('sender', 'rcpt'))
{
return;
}
// return if status already updated
$row = PostingRecipientTable::getRow([
'select' => [
'STATUS', 'POSTING_ID', 'CONTACT_ID',
'CONTACT_IS_SEND_SUCCESS' => 'CONTACT.IS_SEND_SUCCESS'
],
'filter' => ['=ID' => $result->getEntityId()]
]);
if (!$row)
{
return;
}
if (!$result->isError())
{
// update contact send_success flag
if ($row['CONTACT_IS_SEND_SUCCESS'] !== 'Y')
{
ContactTable::update($row['CONTACT_ID'], ['IS_SEND_SUCCESS' => 'Y']);
}
}
elseif ($result->isPermanentError())
{
// return if status already updated
if ($row['STATUS'] === PostingRecipientTable::SEND_RESULT_ERROR)
{
return;
}
// update recipient status
PostingRecipientTable::update(
['ID' => $result->getEntityId()],
['STATUS' => PostingRecipientTable::SEND_RESULT_ERROR]
);
// update posting counters
PostingTable::update(
['ID' => $row['POSTING_ID']],
[
'COUNT_SEND_ERROR' => new Main\DB\SqlExpression('?# + 1', 'COUNT_SEND_ERROR'),
'COUNT_SEND_SUCCESS' => new Main\DB\SqlExpression('?# - 1', 'COUNT_SEND_SUCCESS')
]
);
// update daily limit counters
if (Bitrix24\Service::isCloud())
{
Bitrix24\Limitation\DailyLimit::incrementError();
}
}
}
}