9namespace Bitrix\Sender\Trigger;
12use Bitrix\Main\EventManager;
13use Bitrix\Main\EventResult;
14use Bitrix\Main\Type\DateTime;
15use Bitrix\Main\Diag\Debug;
17use Bitrix\Sender\ContactTable;
18use Bitrix\Sender\Recipient;
19use Bitrix\Sender\Subscription;
20use Bitrix\Sender\MailEventHandler;
21use Bitrix\Sender\MailingTable;
22use Bitrix\Sender\MailingChainTable;
23use Bitrix\Sender\MailingTriggerTable;
24use Bitrix\Sender\PostingTable;
25use Bitrix\Sender\PostingRecipientTable;
26use Bitrix\Sender\Integration;
27use Bitrix\Sender\Internals\Model;
28use Bitrix\Sender\Transport\Adapter;
41 $args = func_get_args();
42 if (isset($args[0]) && $args[0] instanceof
Event)
47 $eventType =
$event->getEventType();
48 $eventData =
$event->getParameters();
52 global $BX_MODULE_EVENT_LAST;
53 $moduleId = $BX_MODULE_EVENT_LAST[
'FROM_MODULE_ID'];
54 $eventType = $BX_MODULE_EVENT_LAST[
'MESSAGE_ID'];
58 static::processEvent(
array(
60 'EVENT_TYPE' => $eventType,
61 'EVENT_DATA' => $eventData,
73 $eventType =
$params[
'EVENT_TYPE'];
74 $eventData =
$params[
'EVENT_DATA'];
77 '=MAILING_CHAIN.MAILING.ACTIVE' =>
'Y',
78 '=MAILING_CHAIN.IS_TRIGGER' =>
'Y',
90 'SITE_ID' =>
'MAILING_CHAIN.MAILING.SITE_ID',
91 'ID' =>
'MAILING_CHAIN.ID',
92 'MAILING_ID' =>
'MAILING_CHAIN.MAILING_ID',
93 'PARENT_ID' =>
'MAILING_CHAIN.PARENT_ID',
94 'POSTING_ID' =>
'MAILING_CHAIN.POSTING_ID',
95 'TIME_SHIFT' =>
'MAILING_CHAIN.TIME_SHIFT',
96 'STATUS' =>
'MAILING_CHAIN.STATUS',
97 'AUTO_SEND_TIME' =>
'MAILING_CHAIN.AUTO_SEND_TIME'
100 'order' =>
array(
'MAILING_CHAIN_ID' =>
'ASC',
'IS_TYPE_START' =>
'ASC')
102 while($chain = $chainDb->fetch())
105 $trigger = static::getOnce(
$settings->getEndpoint());
106 if(!$trigger)
continue;
108 $trigger->setSiteId($chain[
'SITE_ID']);
109 $trigger->setFields(
$settings->getFields());
110 $trigger->setParams(
array(
'CHAIN' => $chain,
'EVENT' => $eventData));
113 $runForOldData = ($trigger->canRunForOldData() &&
$settings->canRunForOldData() && !
$settings->wasRunForOldData());
114 $trigger->setRunForOldData($runForOldData);
117 if(!$trigger->filter())
continue;
120 static::$postingId =
null;
121 $recipientDb = $trigger->getRecipientResult();
122 while($recipient = $recipientDb->fetch())
126 static::addRecipient($chain,
$settings, $recipient);
130 static::stop($chain, $recipient,
true);
145 static::preventMailEvent($trigger->getMailEventToPrevent());
149 static::send($chain);
176 'select' =>
array(
'ID',
'ROOT_ID',
'POSTING_ID',
'STATUS',
'POSTING_STATUS' =>
'POSTING.STATUS'),
178 '=CONTACT.CODE' =>
$code,
179 '=CONTACT.TYPE_ID' => $typeId,
180 '=POSTING.MAILING_ID' => $chain[
'MAILING_ID'],
188 if($recipient = $recipientDb->fetch())
192 Model\Posting\RecipientTable::update($recipient[
'ID'], $updateFields);
198 'select' =>
array(
'POSTING_ID'),
200 '=POSTING_ID' => $recipient[
'POSTING_ID'],
208 if(!$recipientCountDb->fetch())
222 'select' =>
array(
'ID',
'DATE_DENY'),
224 '=CONTACT.CODE' =>
$code,
225 '=CONTACT.TYPE_ID' => $typeId,
226 '=POSTING.MAILING_ID' => $chain[
'MAILING_ID'],
231 'order' =>
array(
'DATE_SENT' =>
'DESC',
'ID' =>
'DESC'),
234 if($recipient = $recipientDb->fetch())
236 if(empty($recipient[
'DATE_DENY']))
238 Model\Posting\RecipientTable::update($recipient[
'ID'], [
'DATE_DENY' =>
new DateTime]);
247 protected static function send($chain)
250 if(empty($chain[
'ID']))
253 if(empty($chain[
'POSTING_ID']))
255 if(empty(static::$postingId))
260 $updateFields[
'POSTING_ID'] = static::$postingId;
263 $updateFields =
array();
267 $autoSendTime->
add($chain[
'TIME_SHIFT'] .
' minutes');
269 $updateFields[
'AUTO_SEND_TIME'] = $autoSendTime;
273 $updateFields[
'AUTO_SEND_TIME'] = $chain[
'AUTO_SEND_TIME'];
274 $updateFields[
'STATUS'] = $chain[
'STATUS'];
277 if(
count($updateFields) > 0)
279 Model\LetterTable::update($chain[
'ID'], $updateFields);
289 if(isset($emailEvent[
'EVENT_NAME']) && $emailEvent[
'EVENT_NAME'] <>
'')
291 if(!empty($emailEvent[
'FILTER']) && is_array($emailEvent[
'FILTER']))
322 if(!empty($chain[
'PARENT_ID']))
325 'select' =>
array(
'ID',
'STATUS'),
327 '=CONTACT.CODE' =>
$code,
328 '=CONTACT.TYPE_ID' => $typeId,
329 '=POSTING.MAILING_CHAIN_ID' => $chain[
'ID'],
334 while($recipient = $recipientDb->fetch())
347 if($statusNew !==
null)
349 Model\Posting\RecipientTable::update(
351 [
'STATUS' => $statusNew]
360 'select' =>
array(
'ID'),
362 '=CONTACT.CODE' =>
$code,
363 '=CONTACT.TYPE_ID' => $typeId,
364 '=POSTING.MAILING_ID' => $chain[
'MAILING_ID'],
372 if($recipientExistsDb->fetch())
377 if(static::$postingId)
384 'MAILING_ID' => $chain[
'MAILING_ID'],
385 'MAILING_CHAIN_ID' => $chain[
'ID'],
387 if(!$postingAddDb->isSuccess())
return;
395 '=TYPE_ID' => $typeId,
401 'TYPE_ID' => $typeId,
402 'NAME' => !empty(
$data[
'NAME']) ?
$data[
'NAME'] :
null,
403 'USER_ID' => !empty(
$data[
'USER_ID']) ?
$data[
'USER_ID'] :
null,
410 'CONTACT_ID' => $contact[
'ID'],
411 'FIELDS' => !empty(
$data[
'FIELDS']) ?
$data[
'FIELDS'] :
null,
412 'USER_ID' => !empty(
$data[
'USER_ID']) ?
$data[
'USER_ID'] :
null,
423 static::actualizeHandlerForChild($activate);
426 'select' =>
array(
'ENDPOINT',
'MAILING_CHAIN_ID'),
428 '=MAILING_CHAIN.IS_TRIGGER' =>
'Y',
429 '=MAILING_CHAIN.MAILING.ACTIVE' =>
'Y',
432 while($item = $itemDb->fetch())
434 if(!is_array($item[
'ENDPOINT']))
451 static::actualizeHandler(
467 $eventType =
$params[
'EVENT_TYPE'];
468 $calledBeforeChange =
$params[
'CALLED_BEFORE_CHANGE'];
470 if(
$params[
'IS_CLOSED_TRIGGER'])
476 if($activate ===
null)
481 if($calledBeforeChange)
487 'select' =>
array(
'MAILING_CHAIN_ID'),
490 '=MAILING_CHAIN.IS_TRIGGER' =>
'Y',
491 '=MAILING_CHAIN.MAILING.ACTIVE' =>
'Y',
494 'group' =>
array(
'MAILING_CHAIN_ID'),
498 while($existsDb->fetch()) $rowsCount++;
500 if($rowsCount > $minRowsCount)
513 $moduleId, $eventType,
'sender', __CLASS__,
'handleEvent'
519 $moduleId, $eventType,
'sender', __CLASS__,
'handleEvent'
530 $resultList =
array();
531 foreach($endpointList as $endpoint)
533 $resultList[$endpoint[
'MODULE_ID']][$endpoint[
'CODE']][] = $endpoint[
'FIELDS'];
545 $endpointList =
null;
546 $fieldsTmp =
array();
555 foreach($connectorSettings as $connectorCode => $connectorFields)
557 foreach($connectorFields as
$k =>
$fields)
567 foreach($fieldsTmp as
$moduleId => $connectorSettings)
570 foreach($connectorSettings as $connectorCode => $connectorFields)
572 foreach($connectorFields as
$fields)
576 $endpoint[
'CODE'] = $connectorCode;
578 $endpointList[] = $endpoint;
583 return $endpointList;
592 public static function getList(
array $endpointList =
null)
594 $triggerList =
array();
596 $classList = static::getClassList($endpointList);
597 foreach($classList as $classDescription)
600 $trigger =
new $classDescription[
'CLASS_NAME'];
601 $trigger->setModuleId($classDescription[
'MODULE_ID']);
602 $triggerList[] = $trigger;
614 public static function getOnce(
array $endpoint)
617 $triggerList = static::getList(
array($endpoint));
619 foreach($triggerList as $trigger)
635 $resultList =
array();
636 $moduleIdFilter =
null;
637 $moduleConnectorFilter =
null;
641 $moduleIdFilter =
array();
642 foreach($endpointList as $endpoint)
644 $moduleIdFilter[] = $endpoint[
'MODULE_ID'];
645 $moduleConnectorFilter[$endpoint[
'MODULE_ID']][] = $endpoint[
'CODE'];
653 foreach (
$event->getResults() as $eventResult)
655 if ($eventResult->getType() == EventResult::ERROR)
660 $eventResultParameters = $eventResult->getParameters();
662 if($eventResultParameters && array_key_exists(
'TRIGGER', $eventResultParameters))
664 $connectorClassNameList = $eventResultParameters[
'TRIGGER'];
665 if(!is_array($connectorClassNameList))
666 $connectorClassNameList =
array($connectorClassNameList);
668 foreach($connectorClassNameList as $connectorClassName)
670 if(!is_subclass_of($connectorClassName,
'\Bitrix\Sender\Trigger'))
677 if($moduleConnectorFilter && !in_array($connectorCode, $moduleConnectorFilter[$eventResult->getModuleId()]))
682 $isClosedTrigger =
false;
683 if(is_subclass_of($connectorClassName,
'\Bitrix\Sender\TriggerConnectorClosed'))
684 $isClosedTrigger =
true;
687 $connectorRequireConfigure =
$connector->requireConfigure();
688 $resultList[] =
array(
689 'MODULE_ID' => $eventResult->getModuleId(),
690 'CLASS_NAME' => $connectorClassName,
691 'CODE' => $connectorCode,
692 'NAME' => $connectorName,
693 'REQUIRE_CONFIGURE' => $connectorRequireConfigure,
694 'IS_CLOSED' => $isClosedTrigger,
700 if(!empty($resultList))
701 usort($resultList,
array(__CLASS__,
'sort'));
713 if (
$a[
'NAME'] == $b[
'NAME'])
716 return (
$a[
'NAME'] < $b[
'NAME']) ? -1 : 1;
739 return '\Bitrix\Sender\TriggerManager::fireClosedEventAgent("' .
$moduleId .
'","' . $eventType .
'","' . $chainId .
'");';
750 if(!empty(
$moduleId) && !empty($eventType) && !empty($chainId))
752 static::processEvent(
array(
754 'EVENT_TYPE' => $eventType,
755 'EVENT_DATA' =>
array(),
757 '=MAILING_CHAIN.ID' => $chainId
761 return static::getClosedEventAgentName(
$moduleId, $eventType, $chainId);
776 $eventHandlerList =
array(
779 'OnAfterMailingChainSend',
782 'onAfterMailingChainSend'
786 'OnAfterPostingSendRecipient',
789 'onAfterPostingSendRecipient'
793 if($activate ===
null)
796 'select' =>
array(
'ID'),
798 '!PARENT_ID' =>
null,
799 '=IS_TRIGGER' =>
'Y',
800 '=MAILING.ACTIVE' =>
'Y',
805 if($existsDb->fetch())
815 if($activate ===
true)
818 foreach($eventHandlerList as $h)
819 $eventManager->registerEventHandler($h[0],$h[1],$h[2],$h[3],$h[4]);
821 elseif($activate ===
false)
824 foreach($eventHandlerList as $h)
825 $eventManager->unRegisterEventHandler($h[0],$h[1],$h[2],$h[3],$h[4]);
837 if(!
$data || empty(
$data[
'MAILING_CHAIN'][
'ID']))
850 '=MAILING.ACTIVE' =>
'Y',
851 '=IS_TRIGGER' =>
'Y',
853 '=PARENT_ID' =>
$data[
'MAILING_CHAIN'][
'ID']
856 while($childChain = $childChainDb->fetch())
883 static::send($childChain);
898 if(!
$data || !
$data[
'SEND_RESULT'] || empty(
$data[
'POSTING'][
'MAILING_CHAIN_ID']))
901 $chainId =
$data[
'POSTING'][
'MAILING_CHAIN_ID'];
902 $dataRecipient =
$data[
'RECIPIENT'];
904 static $mailingParams =
array();
905 if(!isset($mailingParams[$chainId]))
907 $mailingParams[$chainId] =
array();
911 'ID',
'MAILING_ID',
'PARENT_ID',
'POSTING_ID'
914 '=MAILING.ACTIVE' =>
'Y',
915 '=IS_TRIGGER' =>
'Y',
917 '=PARENT_ID' => $chainId
920 while($childChain = $childChainDb->fetch())
924 'MAILING_ID' => $childChain[
'MAILING_ID'],
925 'MAILING_CHAIN_ID' => $childChain[
'ID'],
927 if(!$postingAddDb->isSuccess())
932 $mailingParams[$chainId][] =
array(
933 'POSTING_ID' => $postingAddDb->getId(),
934 'CHAIN' => $childChain,
939 if(empty($mailingParams[$chainId]))
944 foreach($mailingParams[$chainId] as $chainKey => $mailingParamsItem)
946 $postingId = $mailingParamsItem[
'POSTING_ID'];
947 $childChain = $mailingParamsItem[
'CHAIN'];
957 $recipient[
'CONTACT_ID'] = $dataRecipient[
'CONTACT_ID'];
958 if(!empty($dataRecipient[
'FIELDS']))
960 $recipient[
'FIELDS'] = $dataRecipient[
'FIELDS'];
963 if(!empty($dataRecipient[
'ROOT_ID']))
965 $recipient[
'ROOT_ID'] = $dataRecipient[
'ROOT_ID'];
969 $recipient[
'ROOT_ID'] = $dataRecipient[
'ID'];
972 if(!empty($dataRecipient[
'USER_ID']))
974 $recipient[
'USER_ID'] = $dataRecipient[
'USER_ID'];
979 if(empty($childChain[
'POSTING_ID']))
981 $chainUpdateDb = Model\LetterTable::update($childChain[
'ID'],
array(
'POSTING_ID' =>
$postingId));
982 if($chainUpdateDb->isSuccess())
984 $mailingParams[$chainId][$chainKey][
'CHAIN'][
'POSTING_ID'] =
$postingId;
1000 'RECIPIENT_ID' =>
$data[
'RECIPIENT_ID'],
1001 'CONTACT_ID' =>
$data[
'CONTACT_ID'],
static writeToFile($var, $varName="", $fileName="")
static getRow(array $parameters)
static getList(array $parameters=array())
static onTriggerList(array $data=[])
static prevent($eventName, array $filter)
static setWasRunForOldData($id, $state)
static actualizeHandlers($chainId, array $fieldsNew=null, array $fieldsOld=null)
const SEND_RESULT_SUCCESS
static addRecipient($ar, $checkDuplicate=false)
static normalize($code, $typeId=Type::EMAIL)
static detect($recipientCode, $isNormalized=false)
static isUnsubscibed($mailingId, $code, $typeId=Recipient\Type::EMAIL)
static fireClosedEventAgent($moduleId, $eventType, $chainId)
static onAfterPostingSendRecipient(Event $event)
static addRecipient($chain, $settings, $data)
static activateAllHandlers($activate=true)
static stop($chain, $data, $setGoal)
static actualizeHandlerForChild($activate=null)
static actualizeHandler(array $params, $activate=null)
static processEvent($params)
static getEndpointFromFields(array $fields)
static getFieldsFromEndpoint(array $endpointList)
static onAfterMailingChainSend(Event $event)
static onAfterRecipientUnsub($data)
static onTriggerList($data)
static getClassList(array $endpointList=null)
static preventMailEvent(array $emailEvent)
static getClosedEventAgentName($moduleId, $eventType, $chainId)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']