8namespace Bitrix\Sender;
10use Bitrix\Main\DB\SqlExpression;
11use Bitrix\Main\Entity;
12use Bitrix\Main\Localization\Loc;
13use Bitrix\Main\ORM\Query\Query;
14use Bitrix\Main\Type as MainType;
16use Bitrix\Sender\Internals\Model;
18Loc::loadMessages(__FILE__);
27 return 'b_sender_mailing';
37 'data_type' =>
'integer',
39 'autocomplete' =>
true,
42 'data_type' =>
'string',
44 'title' => Loc::getMessage(
'SENDER_ENTITY_MAILING_FIELD_TITLE_NAME')
46 'DESCRIPTION' =>
array(
47 'data_type' =>
'string',
48 'title' => Loc::getMessage(
'SENDER_ENTITY_MAILING_FIELD_TITLE_DESCRIPTION'),
49 'validation' =>
array(__CLASS__,
'validateDescription'),
51 'DATE_INSERT' =>
array(
52 'data_type' =>
'datetime',
54 'default_value' =>
new MainType\
DateTime(),
57 'data_type' =>
'string',
58 'default_value' =>
'Y'
60 'TRACK_CLICK' =>
array(
61 'data_type' =>
'string',
62 'default_value' =>
'N',
65 'data_type' =>
'string',
66 'default_value' =>
'Y',
68 'IS_TRIGGER' =>
array(
69 'data_type' =>
'string',
71 'default_value' =>
'N',
74 'data_type' =>
'integer',
76 'default_value' => 100,
77 'title' => Loc::getMessage(
'SENDER_ENTITY_MAILING_FIELD_TITLE_SORT')
80 'data_type' =>
'string',
84 'TRIGGER_FIELDS' =>
array(
85 'data_type' =>
'text',
88 'EMAIL_FROM' =>
array(
89 'data_type' =>
'string',
91 'title' => Loc::getMessage(
'SENDER_ENTITY_MAILING_FIELD_TITLE_EMAIL_FROM'),
92 'validation' =>
array(
'Bitrix\Sender\MailingChainTable',
'validateEmailForm'),
95 'data_type' =>
'Bitrix\Sender\MailingChainTable',
96 'reference' =>
array(
'=this.ID' =>
'ref.MAILING_ID'),
99 'data_type' =>
'Bitrix\Sender\PostingTable',
100 'reference' =>
array(
'=this.ID' =>
'ref.MAILING_ID'),
102 'MAILING_GROUP' =>
array(
103 'data_type' =>
'Bitrix\Sender\MailingGroupTable',
104 'reference' =>
array(
'=this.ID' =>
'ref.MAILING_ID'),
106 'MAILING_SUBSCRIPTION' =>
array(
107 'data_type' =>
'Bitrix\Sender\MailingSubscriptionTable',
108 'reference' =>
array(
'=this.ID' =>
'ref.MAILING_ID'),
110 'SUBSCRIBER' =>
array(
111 'data_type' =>
'Bitrix\Sender\MailingSubscriptionTable',
112 'reference' =>
array(
'=this.ID' =>
'ref.MAILING_ID',
'ref.IS_UNSUB' =>
new SqlExpression(
'?',
'N')),
115 'data_type' =>
'Bitrix\Main\SiteTable',
116 'reference' =>
array(
'=this.SITE_ID' =>
'ref.LID'),
143 if(array_key_exists(
'ACTIVE',
$data[
'fields']))
145 if (
$data[
'fields'][
'ACTIVE'] ===
'Y')
147 $chain = (new \Bitrix\Sender\Entity\Chain())->load(
$data[
'primary'][
'ID']);
148 foreach ($chain->getList() as $letter)
150 if (!$letter->getState()->wasStartedSending())
160 if (array_key_exists(
'ACTIVE',
$data[
'fields']) || array_key_exists(
'TRIGGER_FIELDS',
$data[
'fields']))
162 static::updateChainTrigger(
$data[
'primary'][
'ID']);
177 $primary =
array(
'MAILING_ID' =>
$data[
'primary'][
'ID']);
192 $resultList =
array();
193 $event = new \Bitrix\Main\Event(
'sender',
'OnPresetMailingList');
196 foreach (
$event->getResults() as $eventResult)
198 if ($eventResult->getModuleId() ===
'sale')
203 if ($eventResult->getType() == \
Bitrix\
Main\EventResult::ERROR)
208 $eventResultParameters = $eventResult->getParameters();
210 if (!empty($eventResultParameters))
214 $eventResultParametersTmp =
array();
215 foreach($eventResultParameters as $preset)
217 if(
$params[
'CODE'] == $preset[
'CODE'])
219 $eventResultParametersTmp[] = $preset;
224 $eventResultParameters = $eventResultParametersTmp;
227 $resultList = array_merge($resultList, $eventResultParameters);
232 foreach($resultList as
$result)
234 if(empty(
$result[
'TRIGGER'][
'START'][
'ENDPOINT'][
'CODE']))
237 $trigger = Trigger\Manager::getOnce(
$result[
'TRIGGER'][
'START'][
'ENDPOINT']);
241 $result[
'TRIGGER'][
'START'][
'ENDPOINT'][
'NAME'] = $trigger->getName();
242 if(!empty(
$result[
'TRIGGER'][
'START'][
'ENDPOINT'][
'CODE']))
244 $trigger = Trigger\Manager::getOnce(
$result[
'TRIGGER'][
'END'][
'ENDPOINT']);
246 $result[
'TRIGGER'][
'END'][
'ENDPOINT'][
'NAME'] = $trigger->getName();
253 return $resultListTmp;
259 $errorList =
array();
260 $errorCurrentNumber = 0;
264 $errorCurrentNumber++;
266 $chainFields =
array(
267 'MAILING_ID' => ($id ? $id : 1),
271 'EMAIL_FROM' => $item[
'EMAIL_FROM'],
272 'SUBJECT' => $item[
'SUBJECT'],
273 'MESSAGE' => $item[
'MESSAGE'],
274 'TEMPLATE_TYPE' => $item[
'TEMPLATE_TYPE'],
275 'TEMPLATE_ID' => $item[
'TEMPLATE_ID'],
276 'TIME_SHIFT' => intval($item[
'TIME_SHIFT']),
280 if(!empty($item[
'ID']))
281 $chainId = $item[
'ID'];
288 $chainFields[
'STATUS'] = $chain[
'STATUS'];
292 if(empty($chainFields[
'STATUS']))
295 $chainFields[
'ID'] = $chainId;
299 if($resultItem->isSuccess())
305 $errorList[$errorCurrentNumber] = $resultItem->getErrors();
310 foreach($errorList as $number =>
$errors)
317 $delimiter . Loc::getMessage(
'SENDER_ENTITY_MAILING_CHAIN_ITEM_NUMBER') . $number .
': ' .
$error->getMessage(),
340 $parentChainId =
null;
341 $existChildIdList =
array();
342 foreach(
$fields as $chainFields)
344 $chainId = $chainFields[
'ID'];
345 unset($chainFields[
'ID']);
347 $chainFields[
'MAILING_ID'] = $id;
348 $chainFields[
'IS_TRIGGER'] =
'Y';
349 $chainFields[
'REITERATE'] =
'Y';
350 $chainFields[
'PARENT_ID'] = $parentChainId;
358 $chainFields[
'STATUS'] = $chain[
'STATUS'];
359 unset($chainFields[
'CREATED_BY']);
362 if(empty($chainFields[
'STATUS']))
369 $existChildIdList[] = $chainId;
371 $chainUpdateDb = Model\LetterTable::update($chainId, $chainFields);
372 if($chainUpdateDb->isSuccess())
378 $result->addErrors($chainUpdateDb->getErrors());
384 if($chainAddDb->isSuccess())
386 $chainId = $chainAddDb->getId();
387 $existChildIdList[] = $chainId;
391 $result->addErrors($chainAddDb->getErrors());
395 if(!empty($errorList))
break;
397 $parentChainId =
null;
398 if($chainId !==
null)
399 $parentChainId = $chainId;
403 'select' =>
array(
'ID'),
404 'filter' =>
array(
'MAILING_ID' => $id,
'!ID' => $existChildIdList),
406 while($deleteChain = $deleteChainDb->fetch())
408 Model\LetterTable::delete($deleteChain[
'ID']);
411 static::updateChainTrigger($id);
425 'ID',
'SUBJECT',
'EMAIL_FROM',
'MESSAGE',
'TIME_SHIFT',
'PARENT_ID',
426 'DATE_INSERT',
'PRIORITY',
'LINK_PARAMS',
'TEMPLATE_TYPE',
'TEMPLATE_ID',
427 'CREATED_BY',
'CREATED_BY_NAME' =>
'CREATED_BY_USER.NAME',
'CREATED_BY_LAST_NAME' =>
'CREATED_BY_USER.LAST_NAME'
429 'filter' =>
array(
'=MAILING_ID' => $id,
'=PARENT_ID' => $parentId),
433 while($chain = $chainDb->fetch())
437 $parentId = $chain[
'ID'];
441 }
while($parentId !==
null);
447 public static function updateChainTrigger($id)
451 'select' =>
array(
'ID',
'TRIGGER_FIELDS' =>
'MAILING.TRIGGER_FIELDS'),
452 'filter' =>
array(
'=MAILING_ID' => $id,
'=IS_TRIGGER' =>
'Y',
'=PARENT_ID' =>
null),
455 $chain = $chainDb->fetch();
457 $chainId = $chain[
'ID'];
460 $triggerFields = $chain[
'TRIGGER_FIELDS'];
461 if(!is_array($triggerFields))
462 $triggerFields =
array();
465 $settingsList =
array();
466 foreach($triggerFields as
$key => $point)
468 if(empty($point[
'CODE']))
continue;
470 $point[
'IS_EVENT_OCCUR'] =
true;
471 $point[
'IS_PREVENT_EMAIL'] =
false;
472 $point[
'SEND_INTERVAL_UNIT'] =
'M';
473 $point[
'IS_CLOSED_TRIGGER'] = ($point[
'IS_CLOSED_TRIGGER'] ==
'Y' ? true :
false);
478 $point[
'IS_TYPE_START'] =
false;
483 $point[
'IS_TYPE_START'] =
true;
486 $settingsList[] =
new Trigger\Settings($point);
491 $mailingTriggerList =
array();
495 $trigger = Trigger\Manager::getOnce(
$settings->getEndpoint());
498 $triggerFindId = $trigger->getFullEventType() .
"/" .((int)
$settings->isTypeStart());
499 $mailingTriggerList[$triggerFindId] =
array(
500 'IS_TYPE_START' =>
$settings->isTypeStart(),
501 'NAME' => $trigger->getName(),
502 'EVENT' => $trigger->getFullEventType(),
511 'select' =>
array(
'EVENT',
'MAILING_CHAIN_ID',
'IS_TYPE_START'),
512 'filter' =>
array(
'=MAILING_CHAIN_ID' => $chainId)
514 while($trigger = $triggerDb->fetch())
516 $triggerFindId = $trigger[
'EVENT'] .
"/" . ((int) $trigger[
'IS_TYPE_START']);
517 if(!isset($mailingTriggerList[$triggerFindId]))
524 unset($mailingTriggerList[$triggerFindId]);
528 foreach($mailingTriggerList as $triggerFindId =>
$settings)
531 $settings[
'MAILING_CHAIN_ID'] = $chainId;
535 Trigger\Manager::actualizeHandlerForChild();
540 $state = (bool) $state ==
true ?
'Y' :
'N';
541 $mailing = static::getRowById($id);
547 $triggerFields = $mailing[
'TRIGGER_FIELDS'];
548 if(!is_array($triggerFields))
553 if(!isset($triggerFields[
'START']))
558 $triggerFields[
'START'][
'WAS_RUN_FOR_OLD_DATA'] = $state;
559 $updateDb = static::update($id,
array(
'TRIGGER_FIELDS' => $triggerFields));
560 if($updateDb->isSuccess())
562 static::updateChainTrigger($id);
573 'CONNECTOR_ENDPOINT' =>
'GROUP.GROUP_CONNECTOR.ENDPOINT',
580 'order' =>
array(
'GROUP_ID' =>
'ASC')
582 while($groupConnector = $groupConnectorDb->fetch())
585 if(is_array($groupConnector[
'CONNECTOR_ENDPOINT']))
606 'select' =>
array(
'ID',
'TRIGGER_FIELDS'),
609 '=IS_TRIGGER' =>
'Y',
613 if(!$mailing = $mailingDb->fetch())
616 $triggerFields = $mailing[
'TRIGGER_FIELDS'];
617 if(!is_array($triggerFields))
618 $triggerFields =
array();
620 $settingsList =
array();
621 foreach($triggerFields as
$key => $point)
623 if(empty($point[
'CODE']))
continue;
625 $point[
'IS_EVENT_OCCUR'] =
true;
626 $point[
'IS_PREVENT_EMAIL'] =
false;
627 $point[
'SEND_INTERVAL_UNIT'] =
'M';
632 $point[
'IS_TYPE_START'] =
false;
637 $point[
'IS_TYPE_START'] =
true;
649 $trigger = Trigger\Manager::getOnce(
$settings->getEndpoint());
662 if (!$cache || !($cache[$mailingId] ??
false))
665 $cache[$mailingId] = $mailing[
'SITE_ID'];
668 return $cache[$mailingId];
683 \CTimeZone::disable();
685 'DELETE FROM %s WHERE %s',
690 \CTimeZone::enable();
704 return 'b_sender_mailing_group';
713 'MAILING_ID' =>
array(
714 'data_type' =>
'integer',
718 'data_type' =>
'integer',
722 'data_type' =>
'boolean',
723 'values' =>
array(
false,
true),
727 'data_type' =>
'Bitrix\Sender\MailingTable',
728 'reference' =>
array(
'=this.MAILING_ID' =>
'ref.ID'),
731 'data_type' =>
'Bitrix\Sender\GroupTable',
732 'reference' =>
array(
'=this.GROUP_ID' =>
'ref.ID'),
749 \CTimeZone::disable();
751 'DELETE FROM %s WHERE %s',
756 \CTimeZone::enable();
785 return 'b_sender_mailing_subscription';
794 'MAILING_ID' =>
array(
795 'data_type' =>
'integer',
798 'CONTACT_ID' =>
array(
799 'data_type' =>
'integer',
802 'DATE_INSERT' =>
array(
803 'data_type' =>
'datetime',
804 'default_value' =>
new MainType\
DateTime(),
807 'data_type' =>
'string',
810 'data_type' =>
'Bitrix\Sender\MailingTable',
811 'reference' =>
array(
'=this.MAILING_ID' =>
'ref.ID'),
814 'data_type' =>
'Bitrix\Sender\ContactTable',
815 'reference' =>
array(
'=this.CONTACT_ID' =>
'ref.ID'),
828 $parameters[
'filter'] =
array(
'=IS_UNSUB' =>
'N') + (!isset($parameters[
'filter']) ?
array() : $parameters[
'filter']);
829 return parent::getList($parameters);
840 $parameters[
'filter'] =
array(
'=IS_UNSUB' =>
'Y') + (!isset($parameters[
'filter']) ?
array() : $parameters[
'filter']);
841 return parent::getList($parameters);
853 $primary =
array(
'MAILING_ID' => $parameters[
'MAILING_ID'],
'CONTACT_ID' => $parameters[
'CONTACT_ID']);
855 $row = static::getRowById($primary);
858 $result = static::update($primary,
array(
'IS_UNSUB' =>
'N'));
876 $primary =
array(
'MAILING_ID' => $parameters[
'MAILING_ID'],
'CONTACT_ID' => $parameters[
'CONTACT_ID']);
878 $row = static::getRowById($primary);
904 \CTimeZone::disable();
906 'DELETE FROM %s WHERE %s',
911 \CTimeZone::enable();
static getRowById($id, array $parameters=[])
static getList(array $parameters=array())
static checkFields(Result $result, $primary, array $data)
static update($primary, array $data)
static getConnector(array $endpoint)
static onSenderTriggerCampaignPreset()
static deleteList(array $filter)
static deleteList(array $filter)
static addUnSubscription(array $parameters=array())
static getSubscriptionList(array $parameters=array())
static deleteList(array $filter)
static addSubscription(array $parameters=array())
static getUnSubscriptionList(array $parameters=array())
static getPersonalizeList($id)
static updateChain($id, array $fields)
static deleteList(array $filter)
static validateDescription()
static getMailingSiteId($mailingId)
static getPresetMailingList(array $params=null)
static setWasRunForOldData($id, $state)
static onAfterUpdate(Entity\Event $event)
static checkFieldsChain(Entity\Result $result, $primary, array $fields)
static onAfterDelete(Entity\Event $event)
static getChainPersonalizeList($id)
static deleteList(array $filter)
static actualizeByCampaignId($campaignId)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(empty($signedUserToken)) $key
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']