• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/subscription.php
  • Класс: Bitrix\Sender\Subscription
  • Вызов: Subscription::unsubscribe
static function unsubscribe($data)
{
	$result = false;

	if(isset($data['TEST']) && $data['TEST'] == 'Y')
		return true;

	$data['ABUSE'] = isset($data['ABUSE']) ? (bool) $data['ABUSE'] : false;
	$data['ABUSE_TEXT'] = isset($data['ABUSE_TEXT']) ? $data['ABUSE_TEXT'] : null;

	$posting = null;
	if($data['RECIPIENT_ID'])
	{
		$postingDb = PostingRecipientTable::getList(array(
			'select' => array('POSTING_ID', 'POSTING_MAILING_ID' => 'POSTING.MAILING_ID'),
			'filter' => array(
				'=ID' => $data['RECIPIENT_ID'],
				'=CONTACT.CODE' => $data['EMAIL'],
				'=CONTACT.TYPE_ID' => Recipient\Type::EMAIL,
			)
		));
		$posting = $postingDb->fetch();
	}

	$mailingDb = MailingTable::getList(array(
		'select' => array('ID'),
		'filter' => array(
			'=ID' => $data['UNSUBSCRIBE_LIST'],
		)
	));
	while($mailing = $mailingDb->fetch())
	{
		$unsub = null;

		if($posting && $posting['POSTING_MAILING_ID'] == $mailing['ID'])
		{
			$unsub = array(
				'POSTING_ID' => $posting['POSTING_ID'],
				'RECIPIENT_ID' => $data['RECIPIENT_ID'],
				'CONTACT_ID' => isset($data['CONTACT_ID']) ? (int) $data['CONTACT_ID'] : null,
			);
		}
		else
		{
			$mailingPostingDb = PostingRecipientTable::getList(array(
				'select' => array('RECIPIENT_ID' => 'ID', 'CONTACT_ID', 'POSTING_ID'),
				'filter' => array(
					'=POSTING.MAILING_ID' => $mailing['ID'],
					'=CONTACT.CODE' => $data['EMAIL'],
					'=CONTACT.TYPE_ID' => Recipient\Type::EMAIL,
				),
				'limit' => 1
			));
			if($mailingPosting = $mailingPostingDb->fetch())
			{
				$unsub = $mailingPosting;
			}
		}

		// add mark in statistic if there is no previous mark
		if(!empty($unsub))
		{
			if ($unsub['CONTACT_ID'] && $data['ABUSE'])
			{
				ContactTable::update($unsub['CONTACT_ID'], array('BLACKLISTED' => 'Y'));
			}

			$unsubExists = PostingUnsubTable::getRowById($unsub);
			if(!$unsubExists)
			{
				$unsubResult = PostingUnsubTable::add($unsub);
				if($unsubResult->isSuccess())
				{
					$eventData = array(
						'ABUSE' => $data['ABUSE'],
						'ABUSE_TEXT' => $data['ABUSE_TEXT'],
						'CAMPAIGN_ID' => $mailing['ID'],
						'MAILING_ID' => $mailing['ID'],
						'RECIPIENT_ID' => $unsub['RECIPIENT_ID'],
						'EMAIL' => $data['EMAIL'],
					);
					$event = new Event('sender', 'OnAfterRecipientUnsub', array($eventData));
					$event->send();

					if ($data['ABUSE'])
					{
						AbuseTable::add(array(
							'TEXT' => $data['ABUSE_TEXT'],
							'CONTACT_ID' => $unsub['CONTACT_ID'],
							'CONTACT_CODE' => $data['EMAIL'],
							'CONTACT_TYPE_ID' => Recipient\Type::EMAIL,
						));
					}

					Integration\EventHandler::onAfterPostingRecipientUnsubscribe($eventData);
				}
			}

			$result = true;
		}

		// add row to unsubscribe list
		$contactId = ContactTable::addIfNotExist(array('EMAIL' => $data['EMAIL']));
		if($contactId)
		{
			MailingSubscriptionTable::addUnSubscription(array('MAILING_ID' => $mailing['ID'], 'CONTACT_ID' => $contactId));
			$result = true;
		}
	}

	return $result;
}