32Loc::loadMessages(__FILE__);
63 private $groupQueueService;
68 private $messageConfiguration;
95 $this->result = $result;
130 'MESSAGE_TYPE' =>
'MAILING_CHAIN.MESSAGE_CODE',
131 'WAITING_RECIPIENT' =>
'MAILING_CHAIN.WAITING_RECIPIENT',
132 'MAILING_STATUS' =>
'MAILING_CHAIN.STATUS',
133 'MESSAGE_ID' =>
'MAILING_CHAIN.MESSAGE_ID'
146 Model\LetterTable::update(
$postingData[
'MAILING_CHAIN_ID'], [
147 'WAITING_RECIPIENT' =>
'N'
153 $entityProcessed = $this->groupQueueService->isEntityProcessed(
170 $this->groupCount =
array();
174 $this->messageConfiguration =
189 $this->checkDuplicates =
false;
194 [
'filter' => [
'=MESSAGE_ID' =>
$postingData[
'MESSAGE_ID']]]
197 $personalizeFields = [];
201 $messageField[
'CODE'],
203 'MESSAGE_PERSONALIZE',
204 'SUBJECT_PERSONALIZE',
212 $personalizeFields[$messageField[
'CODE']] =
213 json_decode($messageField[
'VALUE'],
true)[1];
220 Model\LetterTable::update(
$postingData[
'MAILING_CHAIN_ID'], [
221 'WAITING_RECIPIENT' =>
'Y'
242 Model\PostingTable::update(
252 if ($group[
'GROUP_ID'] && !isset($usedGroups[$group[
'GROUP_ID']]))
256 $this->groupQueueService->releaseGroup(
261 $usedGroups[$group[
'GROUP_ID']] = $group[
'GROUP_ID'];
265 $this->postingData[
'WAITING_RECIPIENT'] =
'N';
266 Model\LetterTable::update($this->postingData[
'MAILING_CHAIN_ID'], [
267 'WAITING_RECIPIENT' => $this->postingData[
'WAITING_RECIPIENT']
286 $rebuild = $this->needsRebuildGroup($group);
287 if ($group[
'GROUP_ID'])
289 $this->groupQueueService
293 if ($rebuild && $group[
'GROUP_ID'])
310 $group[
'INCLUDE'] = (bool)$group[
'INCLUDE'];
319 if (
$a[
'INCLUDE'] == $b[
'INCLUDE'])
324 return (
$a[
'INCLUDE'] > $b[
'INCLUDE']) ? -1 : 1;
331 private function needsRebuildGroup($group)
334 $isReadyAndReleased =
335 isset($group[
'GROUP_ID'])
337 && $this->groupQueueService->isReleased($group[
'GROUP_ID']);
339 return $isNewOrDone || $isReadyAndReleased;
347 if (is_array($group[
'ENDPOINT']) && !(isset($group[
'CONNECTOR']) && $group[
'CONNECTOR'] instanceof
Connector\
Base))
352 if(empty($group[
'CONNECTOR']))
359 if (is_array($group[
'ENDPOINT'][
'FIELDS']))
362 $connector->setFieldValues($group[
'ENDPOINT'][
'FIELDS']);
368 $usedPersonalizeFields
378 Model\LetterTable::update($this->postingData[
'MAILING_CHAIN_ID'], [
379 'WAITING_RECIPIENT' => $this->postingData[
'MAILING_STATUS'] !==
Model\LetterTable::STATUS_END ?
'Y' :
'N'
388 Model\PostingTable::update(
391 'COUNT_SEND_ALL' => 0,
392 'COUNT_SEND_NONE' => 0,
393 'COUNT_SEND_ERROR' => 0,
394 'COUNT_SEND_SUCCESS' => 0,
409 'ENDPOINT' =>
array(
'FIELDS' =>
array(
'MAILING_ID' => $campaignId)),
417 'ENDPOINT' =>
array(
'FIELDS' =>
array(
'MAILING_ID' => $campaignId)),
434 return (!isset(
$data[$typeCode]) || !
$data[$typeCode])
436 isset(
$data[
'FIELDS'])
438 (int)
$data[
'FIELDS'][
'CRM_ENTITY_TYPE_ID'] === \CCrmOwnerType::Lead
439 || (
$data[
'FIELDS'][
'CRM_ENTITY_TYPE'] === \CCrmOwnerType::LeadName)
441 && !empty(
$data[
'FIELDS'][
'CRM_ENTITY_ID'])
452 'CONNECTOR_ENDPOINT' =>
'GROUP.GROUP_CONNECTOR.ENDPOINT',
456 '=MAILING_ID' => $campaignId,
458 'order' =>
array(
'INCLUDE' =>
'DESC',
'GROUP_ID' =>
'ASC')
460 while($group = $groupConnectorDb->fetch())
463 'INCLUDE' => $group[
'INCLUDE'],
464 'ENDPOINT' => $group[
'CONNECTOR_ENDPOINT'],
465 'GROUP_ID' => $group[
'GROUP_ID'],
476 $groupConnectors = Model\LetterSegmentTable::getList(
array(
479 'STATUS' =>
'SEGMENT.STATUS',
480 'FILTER_ID' =>
'SEGMENT.GROUP_CONNECTOR.FILTER_ID',
481 'CONNECTOR_ENDPOINT' =>
'SEGMENT.GROUP_CONNECTOR.ENDPOINT',
485 '=LETTER_ID' => $letterId,
487 'order' =>
array(
'INCLUDE' =>
'DESC',
'LETTER_ID' =>
'ASC')
489 while($group = $groupConnectors->fetch())
492 'INCLUDE' => $group[
'INCLUDE'],
493 'ENDPOINT' => $group[
'CONNECTOR_ENDPOINT'],
494 'GROUP_ID' => $group[
'SEGMENT_ID'],
495 'FILTER_ID' => $group[
'FILTER_ID'],
496 'STATUS' => $group[
'STATUS'],
504 private function isExcluded(
bool $include, $row): bool
508 $row[
'BLACKLISTED'] ===
'Y' ||
509 $row[
'IS_UNSUB'] ===
'Y' ||
510 $row[
'IS_MAILING_UNSUB'] ===
'Y' ||
512 $this->messageConfiguration->get(
'APPROVE_CONFIRMATION',
'N') ===
'Y' &&
514 $row[
'CONSENT_STATUS'],
515 $row[
'CONSENT_REQUEST'],
516 $this->postingData[
'MESSAGE_TYPE']
524 if (
count($dataList) === 0)
529 $codes = array_keys($dataList);
534 $contactCodeFilter = [];
537 $primariesString = SqlBatch::getInString($codes);
548 s.IS_UNSUB as IS_MAILING_UNSUB " .
549 "from $tableName c " .
550 "left join $subsTableName s on " .
551 "c.ID = s.CONTACT_ID " .
552 "and s.MAILING_ID=" . (
int) $this->postingData[
'MAILING_ID'] .
" " .
553 "where c.TYPE_ID = " . (
int) $this->typeId .
" and c.CODE in ($primariesString)"
555 while ($row = $recipientDb->fetch())
557 $existed[] = $row[
'CODE'];
558 $dataList[$row[
'CODE']][
'CONTACT_ID'] = $row[
'ID'];
559 $dataList[$row[
'CODE']][
'EXCLUDED'] = $this->isExcluded($include, $row);
561 $name = $dataList[$row[
'CODE']][
'NAME'] ??
null;
564 $contactCodeFilter[] = $row[
'CODE'];
578 $list = array_diff($codes, $existed);
581 $updateFieldsOnDuplicate = [
'DATE_UPDATE'];
582 foreach ($list as
$code)
587 'DATE_INSERT' => $insertDate,
588 'DATE_UPDATE' => $insertDate,
592 if (isset($dataList[
$key]) && $dataList[
$key])
595 if (!in_array(
$key, $updateFieldsOnDuplicate))
597 $updateFieldsOnDuplicate[] =
$key;
601 $batch[] = $batchItem;
611 "where TYPE_ID = " . (
int) $this->typeId .
" and CODE in ($primariesString)"
613 while ($row = $recipientDb->fetch())
615 $dataList[$row[
'CODE']][
'CONTACT_ID'] = $row[
'ID'];
619 protected function checkUsedFields($entityType, $ids, $usedPersonalizeFields, &$dataList)
622 foreach ($usedPersonalizeFields as $personalizeField)
624 foreach ($personalizeField as $usedField)
626 $usedFieldExploded = explode(
'.', $usedField);
628 $entityType == $usedFieldExploded[0] &&
631 $usedFieldExploded[1]
634 unset($usedFieldExploded[0]);
635 $usedFields[$usedField] = implode(
'.', $usedFieldExploded);
640 $entityType, $ids, $usedFields
652 foreach($dataList as &
$data)
656 &&
$data[
'FIELDS'][
'CRM_ENTITY_TYPE'] === $entityType
659 $data[
'FIELDS'] = array_merge(
676 if ($isIncrementally)
678 $segmentBuilder =
new SegmentDataBuilder($group[
'GROUP_ID'], $group[
'FILTER_ID'], $group[
'ENDPOINT']);
680 if (!$segmentBuilder->isBuildingCompleted())
686 $result = $isIncrementally
687 ? $segmentBuilder->getPreparedData()
695 while (
$data = $result->fetch())
702 if (!isset(
$data[$typeCode]) && ((
int)$this->typeId ===
Recipient\Type::CRM_LEAD_ID))
704 $data[$typeCode] =
$data[
'FIELDS'][
'CRM_ENTITY_ID'];
712 $dataList[$primary] =
$data;
723 if (
count($dataList) === 0)
729 if ($group[
'INCLUDE'])
732 if ($this->checkDuplicates)
734 $primariesString = SqlBatch::getInString(array_keys($dataList));
738 "from b_sender_posting_recipient pr, b_sender_contact r " .
739 "where pr.CONTACT_ID = r.ID " .
740 "and pr.POSTING_ID = " . (
int) $this->postingId .
" " .
741 "and r.TYPE_ID = " . (
int) $this->typeId .
" " .
742 "and r.CODE in ($primariesString)"
744 while ($row = $rowDb->fetch())
746 unset($dataList[$row[
'CODE']]);
750 if (empty($dataList))
756 count($usedPersonalizeFields) > 0
759 $preparedFields = [];
761 foreach($dataList as
$data)
763 if(!isset(
$data[
'FIELDS']))
768 $field =
$data[
'FIELDS'];
769 if(!isset($preparedFields[$field[
'CRM_ENTITY_TYPE']]))
771 $preparedFields[$field[
'CRM_ENTITY_TYPE']] = [];
773 $preparedFields[$field[
'CRM_ENTITY_TYPE']][] = $field[
'CRM_ENTITY_ID'];
776 foreach ($preparedFields as $entityType => $ids)
779 $entityType, $ids, $usedPersonalizeFields, $dataList
792 if (!$group[
'GROUP_ID'])
802 $primaries =
array();
805 if (!isset(
$data[
'CONTACT_ID']) || !
$data[
'CONTACT_ID'])
809 $primaries[] = (int)
$data[
'CONTACT_ID'];
812 if (
count($primaries) === 0)
818 $primariesString = implode(
',', $primaries);
821 "from b_sender_posting_recipient " .
822 "where POSTING_ID = " . (
int) $this->postingId .
" " .
823 "and CONTACT_ID in (" . $primariesString .
")"
830 foreach ($codeFilter as
$code)
832 if (!isset($list[
$code]))
837 $item = $list[
$code];
838 $fields[] = [
'ID' => $item[
'CONTACT_ID'],
'NAME' => $item[
'NAME']];
849 if (isset(
$data[
'EXCLUDED']) &&
$data[
'EXCLUDED'])
854 $recipientInsert =
array(
855 'CONTACT_ID' => (
int)
$data[
'CONTACT_ID'],
857 'POSTING_ID' => (
int) $this->postingId,
862 if (array_key_exists(
'USER_ID',
$data) && intval(
$data[
'USER_ID']) > 0)
864 $recipientInsert[
'USER_ID'] = intval(
$data[
'USER_ID']);
869 $recipientInsert[
'FIELDS'] = serialize(
$data[
'FIELDS']);
872 $dataList[] = $recipientInsert;
875 if(
count($dataList) == 0)
883 [
'USER_ID',
'FIELDS'],
895 if (array_key_exists($groupId, $this->groupCount))
897 $this->groupCount[$groupId] +=
$count;
901 $this->groupCount[$groupId] =
$count;
static getList(array $parameters=array())
static getCount($filter=array(), array $cache=array())
static getConnector(array $endpoint)
const STATUS_READY_TO_USE
static getData($entityType, $entityIds, $fields=[' *'])
static getInstance($code)
setRecipientIdentificators(array &$dataList, bool $include=true)
fill(Connector\Base $connector, $group, $usedPersonalizeFields=[])
__construct($postingId=null, $checkDuplicates=true)
getCampaignGroups($campaignId)
isCorrectData(array $data, ?string $typeCode)
incGroupCounters($groupId=null, $count=0)
updateContacts(array &$list, array $codeFilter)
getSubscriptionConnectors($campaignId)
removePostingRecipients(array &$list)
addPostingRecipients(array &$list)
stopRecipientListBuilding()
run($postingId, $checkDuplicates=true)
getLetterConnectors($letterId)
checkUsedFields($entityType, $ids, $usedPersonalizeFields, &$dataList)
runForRecipientType($usedPersonalizeFields=[], $groups=[])
static actualize(int $groupId, bool $rebuild=false)
static checkIsSegmentPrepared(int $groupId)
static getConflictFields()
static deleteList(array $filter)
static normalize($code, $typeId=Type::EMAIL)
static removeAgentFromDB(int $postingId)
static addEventAgent(int $postingId)
</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(empty($signedUserToken)) $key
</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."%"