Your IP : 3.145.182.183


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/sender/lib/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/sender/lib/mailingtrigger.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage sender
 * @copyright 2001-2012 Bitrix
 */
namespace Bitrix\Sender;

use Bitrix\Main\Entity;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Type;

Loc::loadMessages(__FILE__);

class MailingTriggerTable extends Entity\DataManager
{
	/**
	 * @return string
	 */
	public static function getTableName()
	{
		return 'b_sender_mailing_trigger';
	}

	/**
	 * @return array
	 */
	public static function getMap()
	{
		return array(

			'MAILING_CHAIN_ID' => array(
				'data_type' => 'integer',
				'primary' => true,
				'required' => true,
			),
			'NAME' => array(
				'data_type' => 'string',
			),
			'EVENT' => array(
				'data_type' => 'string',
				'primary' => true,
				'required' => true,
			),
			'IS_TYPE_START' => array(
				'data_type' => 'boolean',
				'values' => array(false, true),
				'primary' => true,
				'required' => true,
			),
			'ENDPOINT' => array(
				'data_type' => 'text',
				'serialized' => true,
				'required' => true,
			),
			'MAILING_CHAIN' => array(
				'data_type' => 'Bitrix\Sender\MailingChainTable',
				'reference' => array('=this.MAILING_CHAIN_ID' => 'ref.ID'),
			),
		);
	}


	/**
	 * @param Entity\Event $event
	 * @return Entity\EventResult
	 */
	public static function onAfterAdd(Entity\Event $event)
	{
		$result = new Entity\EventResult;
		$data = $event->getParameters();

		if(is_string($data['fields']['ENDPOINT']))
		{
			$data['fields']['ENDPOINT'] = unserialize($data['fields']['ENDPOINT']);
		}
		if(!is_array($data['fields']['ENDPOINT']))
		{
			$data['fields']['ENDPOINT'] = null;
		}
		static::actualizeHandlers($data['primary']['MAILING_CHAIN_ID'], $data['fields']['ENDPOINT'], null);

		return $result;
	}

	/**
	 * @param Entity\Event $event
	 * @return Entity\EventResult
	 */
	public static function onUpdate(Entity\Event $event)
	{
		$result = new Entity\EventResult;
		$data = $event->getParameters();

		$itemDb = static::getByPrimary($data['primary']);
		$item = $itemDb->fetch();

		if(!is_array($data['fields']['ENDPOINT']))
		{
			$data['fields']['ENDPOINT'] = null;
		}
		if(!$item || !is_array($item['ENDPOINT']))
		{
			$item['ENDPOINT'] = null;
		}
		static::actualizeHandlers($data['primary']['MAILING_CHAIN_ID'], $data['fields']['ENDPOINT'], $item['ENDPOINT']);

		return $result;
	}

	/**
	 * @param Entity\Event $event
	 * @return Entity\EventResult
	 */
	public static function onDelete(Entity\Event $event)
	{
		$result = new Entity\EventResult;
		$data = $event->getParameters();

		$itemDb = static::getByPrimary($data['primary']);
		while($item = $itemDb->fetch())
		{
			if(!is_array($item['ENDPOINT']))
			{
				$item['ENDPOINT'] = null;
			}

			static::actualizeHandlers($item['MAILING_CHAIN_ID'], null, $item['ENDPOINT']);
		}

		return $result;
	}

	public static function actualizeHandlers($chainId, array $fieldsNew = null, array $fieldsOld = null)
	{
		$settingsNew = null;
		$settingsOld = null;

		if($fieldsNew)
			$settingsNew = new TriggerSettings($fieldsNew);
		if($fieldsOld)
			$settingsOld = new TriggerSettings($fieldsOld);


		// if old item was closed trigger
		if($settingsOld && $settingsOld->isClosedTrigger())
		{
			// delete agent
			$agentName = TriggerManager::getClosedEventAgentName(
				$settingsOld->getEventModuleId(),
				$settingsOld->getEventType(),
				$chainId
			);

			$agent = new \CAgent;
			$agentListDb = $agent->GetList(array(), array('MODULE_ID' => 'sender', 'NAME' => $agentName));
			while($agentItem = $agentListDb->Fetch())
				$agent->Delete($agentItem['ID']);
		}


		// if new item is closed trigger
		if($settingsNew && $settingsNew->isClosedTrigger())
		{
			// check active state of mailing
			$chainDb = MailingChainTable::getList(array(
				'select' => array('ID'),
				'filter' => array('=ID' => $chainId, '=MAILING.ACTIVE' => 'Y')
			));
			if(!$chainDb->fetch())
				return;

			// add new agent
			$agentName = TriggerManager::getClosedEventAgentName(
				$settingsNew->getEventModuleId(),
				$settingsNew->getEventType(),
				$chainId
			);

			// set date of next exec
			$agentTime = $settingsNew->getClosedTriggerTime();
			$agentInterval = $settingsNew->getClosedTriggerInterval();
			if($agentInterval <= 0) $agentInterval = 1440;

			$agentTimeArray = explode(":", $agentTime);
			$agentDate = new \Bitrix\Main\Type\DateTime;
			$agentDate->setTime((int)$agentTimeArray[0], (int)$agentTimeArray[1]);

			// set next exec on next day if exec was today
			if($agentDate->getTimestamp() < time())
				$agentDate->add("1 days");

			// add agent
			$agent = new \CAgent;
			$agent->AddAgent($agentName, 'sender', 'N', $agentInterval*60, '', 'Y', $agentDate->toString());

			return;
		}

		// actualize deleted/changed event
		if($settingsOld && !$settingsOld->isClosedTrigger() && $settingsOld->getFullEventType())
		{
			// if delete operation(no the NEW)
			// or change operation(the NEW is not equal to the OLD)
			if(!$settingsNew || $settingsOld->getFullEventType() != $settingsNew->getFullEventType())
			{
				TriggerManager::actualizeHandler(array(
					'MODULE_ID' => $settingsOld->getEventModuleId(),
					'EVENT_TYPE' => $settingsOld->getEventType(),
					'CALLED_BEFORE_CHANGE' => true
				));
			}
		}

		// actualize new event
		if($settingsNew && $settingsNew->getFullEventType())
		{
			$calledBeforeChange = ($fieldsOld ?  false : true);
			TriggerManager::actualizeHandler(array(
				'MODULE_ID' => $settingsNew->getEventModuleId(),
				'EVENT_TYPE' => $settingsNew->getEventType(),
				'CALLED_BEFORE_CHANGE' => $calledBeforeChange
			));
		}
	}
}