• Модуль: 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;
}