- Модуль: sender
- Путь к файлу: ~/bitrix/modules/sender/lib/subscription.php
- Класс: Bitrix\Sender\Subscription
- Вызов: Subscription::unsubscribeRecipient
static function unsubscribeRecipient($data)
{
if(isset($data['TEST']) && $data['TEST'] == 'Y')
{
return true;
}
if(!$data['RECIPIENT_ID'])
{
return true;
}
$data['ABUSE'] = isset($data['ABUSE']) ? (bool) $data['ABUSE'] : false;
$data['ABUSE_TEXT'] = isset($data['ABUSE_TEXT']) ? $data['ABUSE_TEXT'] : null;
$result = false;
$recipient = PostingRecipientTable::getRow([
'select' => [
'ID', 'CONTACT_ID', 'CONTACT_CODE' => 'CONTACT.CODE', 'CONTACT_TYPE_ID' => 'CONTACT.TYPE_ID',
'POSTING_ID', 'POSTING_MAILING_ID' => 'POSTING.MAILING_ID'
],
'filter' => ['=ID' => $data['RECIPIENT_ID']]
]);
$recipient = ((!$recipient && $data['CONTACT_ID'])? ContactTable::getRow([
'select' => [
'CONTACT_ID' => 'ID', 'CONTACT_TYPE_ID' => 'TYPE_ID', 'CONTACT_CODE' => 'CODE'
],
'filter' => ['=CONTACT_ID' => $data['CONTACT_ID']]
]) : $recipient);
if
(
!$recipient ||
!$recipient['CONTACT_ID'] ||
($data['CONTACT_ID']? $data['CONTACT_ID'] != $recipient['CONTACT_ID'] : false)
)
{
return true;
}
$contactId = $recipient['CONTACT_ID'];
$mailingDb = MailingTable::getList(array(
'select' => array('ID'),
'filter' => array(
'=ID' => $data['UNSUBSCRIBE_LIST'],
)
));
while($mailing = $mailingDb->fetch())
{
$primary = null;
if(
isset($recipient['POSTING_MAILING_ID'],$recipient['POSTING_ID'],$recipient['ID']) &&
$recipient['POSTING_MAILING_ID'] == $mailing['ID']
)
{
$primary = array(
'POSTING_ID' => $recipient['POSTING_ID'],
'RECIPIENT_ID' => $recipient['ID'],
);
}
else
{
$mailingPostingDb = PostingRecipientTable::getList(array(
'select' => array('RECIPIENT_ID' => 'ID', 'POSTING_ID'),
'filter' => array(
'=POSTING.MAILING_ID' => $mailing['ID'],
'=CONTACT_ID' => $contactId
)
));
if($mailingPosting = $mailingPostingDb->fetch())
{
$primary = $mailingPosting;
}
}
// add mark in statistic if there is no previous mark
if(!empty($primary))
{
$unsubExists = PostingUnsubTable::getRowById($primary);
if(!$unsubExists)
{
$unsubResult = PostingUnsubTable::add($primary);
if($unsubResult->isSuccess())
{
$eventData = array(
'ABUSE' => $data['ABUSE'],
'ABUSE_TEXT' => $data['ABUSE_TEXT'],
'MAILING_ID' => $mailing['ID'],
'RECIPIENT_ID' => $primary['RECIPIENT_ID'],
'CONTACT_ID' => $contactId,
'EMAIL' => $data['EMAIL'],
);
$event = new Event('sender', 'OnAfterRecipientUnsub', array($eventData));
$event->send();
if ($data['ABUSE'])
{
AbuseTable::add(array(
'TEXT' => $data['ABUSE_TEXT'],
'CONTACT_ID' => $contactId,
'CONTACT_CODE' => $recipient['CONTACT_CODE'],
'CONTACT_TYPE_ID' => $recipient['CONTACT_TYPE_ID'],
))->isSuccess();
}
Integration\EventHandler::onAfterPostingRecipientUnsubscribe($eventData);
}
}
$result = true;
}
MailingSubscriptionTable::addUnSubscription(array(
'MAILING_ID' => $mailing['ID'],
'CONTACT_ID' => $contactId
));
if ($contactId && $data['ABUSE'])
{
ContactTable::update($contactId, array('BLACKLISTED' => 'Y'));
}
}
return $result;
}