8namespace Bitrix\Sender;
10use Bitrix\Main\Entity;
11use Bitrix\Main\Application;
12use Bitrix\Main\Localization\Loc;
13use Bitrix\Main\ORM\Query\Query;
14use Bitrix\Main\Type as MainType;
15use Bitrix\Main\DB\SqlExpression;
16use Bitrix\Sender\Internals\Dto\UpdateContactDtoCollection;
17use Bitrix\Sender\Internals\Factory\UpdateContactDtoFactory;
18use Bitrix\Sender\Recipient;
19use Bitrix\Sender\Service\ContactListUpdateService;
20use Bitrix\Sender\Service\ContactUpdateService;
22Loc::loadMessages(__FILE__);
55 return 'b_sender_contact';
67 'data_type' =>
'integer',
69 'autocomplete' =>
true,
71 'DATE_INSERT' =>
array(
72 'data_type' =>
'datetime',
73 'default_value' =>
new MainType\
DateTime(),
76 'DATE_UPDATE' =>
array(
77 'data_type' =>
'datetime',
78 'default_value' =>
new MainType\
DateTime(),
81 'data_type' =>
'integer',
86 'data_type' =>
'string',
90 'data_type' =>
'string',
91 'save_data_modification' =>
array(
'\Bitrix\Main\Text\Emoji',
'getSaveModificator'),
92 'fetch_data_modification' =>
array(
'\Bitrix\Main\Text\Emoji',
'getFetchModificator'),
95 'data_type' =>
'integer',
97 'BLACKLISTED' =>
array(
98 'data_type' =>
'boolean',
99 'values' =>
array(
'N',
'Y'),
100 'default_value' =>
'N',
104 'data_type' =>
'boolean',
105 'values' =>
array(
'N',
'Y'),
106 'default_value' =>
'N',
110 'data_type' =>
'boolean',
111 'values' =>
array(
'N',
'Y'),
112 'default_value' =>
'N',
116 'data_type' =>
'boolean',
117 'values' =>
array(
'N',
'Y'),
118 'default_value' =>
'N',
121 'IS_SEND_SUCCESS' =>
array(
122 'data_type' =>
'boolean',
123 'values' =>
array(
'N',
'Y'),
124 'default_value' =>
'N',
127 'CONSENT_STATUS' =>
array(
128 'data_type' =>
'string',
129 'default_value' => static::CONSENT_STATUS_NEW,
132 'CONSENT_REQUEST' =>
array(
133 'data_type' =>
'integer',
138 'data_type' =>
'string',
141 'data_type' =>
'integer',
143 'CONTACT_LIST' =>
array(
144 'data_type' =>
'Bitrix\Sender\ContactListTable',
145 'reference' =>
array(
'=this.ID' =>
'ref.CONTACT_ID'),
147 'MAILING_SUBSCRIPTION' =>
array(
148 'data_type' =>
'Bitrix\Sender\MailingSubscriptionTable',
149 'reference' =>
array(
'=this.ID' =>
'ref.CONTACT_ID',
'ref.IS_UNSUB' =>
new SqlExpression(
'?',
'N')),
151 'MAILING_UNSUBSCRIPTION' =>
array(
152 'data_type' =>
'Bitrix\Sender\MailingSubscriptionTable',
153 'reference' =>
array(
'=this.ID' =>
'ref.CONTACT_ID',
'ref.IS_UNSUB' =>
new SqlExpression(
'?',
'Y')),
168 array(__CLASS__,
'checkEmail'),
187 return Loc::getMessage(
'SENDER_ENTITY_CONTACT_VALID_EMAIL');
201 if(isset(
$data[
'fields'][
'EMAIL']))
206 if(isset(
$data[
'fields'][
'CODE']))
208 $typeId =
$data[
'fields'][
'TYPE_ID'] ??
null;
236 if(isset(
$data[
'fields'][
'EMAIL']))
239 $modify +=
array(
'CONSENT_STATUS' =>
'N');
242 if(isset(
$data[
'fields'][
'CODE']))
244 $modify +=
array(
'CONSENT_STATUS' =>
'N' );
245 $typeId =
$data[
'fields'][
'TYPE_ID'] ??
null;
248 $row = static::getRowById(
$data[
'primary'][
'ID']);
249 $typeId = $row[
'TYPE_ID'];
261 $result->modifyFields($modify);
278 $primary =
array(
'CONTACT_ID' =>
$data[
'primary'][
'ID']);
297 \CTimeZone::disable();
299 'DELETE FROM %s WHERE %s',
304 \CTimeZone::enable();
317 'CONSENT_STATUS' => $contactStatus,
318 'DATE_UPDATE' =>
new MainType\
DateTime(),
337 if(array_key_exists(
'LIST_CODE',
$ar) && array_key_exists(
'LIST_NAME',
$ar))
340 unset(
$ar[
'LIST_CODE'],
$ar[
'LIST_NAME']);
343 $ar[
'EMAIL'] = mb_strtolower(
$ar[
'EMAIL']);
345 'select' =>
array(
'ID'),
347 '=CODE' =>
$ar[
'EMAIL'],
351 if($contact = $contactDb->fetch())
353 $id = $contact[
'ID'];
358 $ar[
'CODE'] =
$ar[
'EMAIL'];
361 $resultAdd = static::add(
$ar);
362 if($resultAdd->isSuccess())
363 $id = $resultAdd->getId();
382 $connectorList = Connector\Manager::getConnectorList();
402 $withoutNav = empty($pageNumber);
404 $onlyOneLoop =
false;
414 if($dataDb->resourceCDBResult)
416 $dataDb = $dataDb->resourceCDBResult;
420 $dataDb = new \CDBResult($dataDb->resource);
424 $dataDb = new \CDBResult();
425 $dataDb->initFromArray(
array());
428 if(!is_subclass_of($dataDb,
'CDBResultMysql'))
434 while($timeout==0 || microtime(
true)-
$startTime < $timeout)
438 $dataDb->navStart($rowsInPage,
false, $pageNumber);
439 $countAll = $dataDb->selectedRowsCount();
443 while ($row = $dataDb->fetch())
456 Loc::getMessage(
'CONTACT_PULL_LIST_PREFIX').$connector->getName()
462 'select' =>
array(
'ID'),
463 'filter' =>
array(
'EMAIL' => $row[
'EMAIL'])
465 if($contactRow = $contactDb->fetch())
467 $id = $contactRow[
'ID'];
472 $resultAdd = static::add(
array(
473 'NAME' => $row[
'NAME'],
474 'EMAIL' => $row[
'EMAIL'],
475 'USER_ID' => $row[
'USER_ID']
477 if ($resultAdd->isSuccess())
479 $id = $resultAdd->getId();
499 if ($dataDb->NavPageCount <= $pageNumber)
518 $countProgress = $countAll;
522 $countProgress = ($pageNumber-1) * $dataDb->NavPageSize;
523 if (!
$result || $countProgress > $countAll) $countProgress = $countAll;
528 'COUNT_ALL' => $countAll,
529 'COUNT_PROGRESS' => $countProgress,
530 'COUNT_PROCESSED' => $countProcessed,
531 'COUNT_NEW' => $countAdded,
532 'COUNT_ERROR' => $countError,
549 public static function upload(
array $list,
bool $isBlacklist =
false, ?
int $listId =
null)
553 foreach ($list as $item)
555 if (is_string($item))
557 $item = [
'CODE' => $item];
560 if (empty($item[
'CODE']))
564 $code = trim((
string)$item[
'CODE']);
566 $updateItem = $updateItemFactory->make(
$code, $item[
'NAME'] ??
null);
569 $updateCollection->append($updateItem);
574 if ($updateCollection->count() === 0)
579 $listHash = hash(
'sha256', serialize($updateCollection->all()));
580 $lockKey =
'b_sender_contact_' . $listHash;
582 if (!Application::getConnection()->lock($lockKey))
593 return $updateCollection->count();
609 Application::getConnection()->unlock($lockKey);
static getRowById($id, array $parameters=[])
static getList(array $parameters=array())
static getCount($filter=array(), array $cache=array())
static update($primary, array $data)
static addIfNotExist($code, $name)
static deleteList(array $filter)
static normalize($code, $typeId=Type::EMAIL)
static normalizeEmail($code)
static validate($code, $typeId=Type::EMAIL)
</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
check_email($email, $strict=false, $domainCheck=false)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)