Your IP : 18.219.214.127


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/socialservices/lib/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/socialservices/lib/contact.php

<?php
namespace Bitrix\Socialservices;

use Bitrix\Main;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Entity;
use Bitrix\Main\Type\DateTime;

Loc::loadMessages(__FILE__);

/**
 * Class ContactTable
 *
 * Fields:
 * <ul>
 * <li> ID int mandatory
 * <li> TIMESTAMP_X datetime optional default 'CURRENT_TIMESTAMP'
 * <li> USER_ID int mandatory
 * <li> CONTACT_USER_ID int optional
 * <li> CONTACT_XML_ID int optional
 * <li> CONTACT_NAME string(255) optional
 * <li> CONTACT_LAST_NAME string(255) optional
 * <li> CONTACT_PHOTO string(255) optional
 * <li> NOTIFY bool optional default 'N'
 * </ul>
 *
 * @package Bitrix\Socialservices
 **/

class ContactTable extends Main\Entity\DataManager
{
	const NOTIFY = 'Y';
	const DONT_NOTIFY = 'N';

	const NOTIFY_CONTACT_COUNT = 3;
	const NOTIFY_POSSIBLE_COUNT = 3;

	const POSSIBLE_LAST_AUTHORIZE_LIMIT = '-1 weeks';
	const POSSIBLE_RESET_TIME = 2592000; // 86400 * 30
	const POSSIBLE_RESET_TIME_KEY = "_ts";

	protected static $notifyStack = array();

	/**
	 * Returns DB table name for entity.
	 *
	 * @return string
	 */
	public static function getTableName()
	{
		return 'b_socialservices_contact';
	}

	/**
	 * Returns entity map definition.
	 *
	 * @return array
	 */
	public static function getMap()
	{
		return array(
			'ID' => array(
				'data_type' => 'integer',
				'primary' => true,
				'autocomplete' => true,
			),
			'TIMESTAMP_X' => array(
				'data_type' => 'datetime',
			),
			'USER_ID' => array(
				'data_type' => 'integer',
				'required' => true,
			),
			'CONTACT_USER_ID' => array(
				'data_type' => 'integer',
			),
			'CONTACT_XML_ID' => array(
				'data_type' => 'integer',
			),
			'CONTACT_NAME' => array(
				'data_type' => 'string',
			),
			'CONTACT_LAST_NAME' => array(
				'data_type' => 'string',
			),
			'CONTACT_PHOTO' => array(
				'data_type' => 'string',
			),
			'LAST_AUTHORIZE' => array(
				'data_type' => 'datetime',
			),
			'NOTIFY' => array(
				'data_type' => 'boolean',
				'values' => array(static::DONT_NOTIFY, static::NOTIFY),
			),
			'USER' => array(
				'data_type' => 'Bitrix\Main\UserTable',
				'reference' => array('=this.USER_ID' => 'ref.ID'),
			),
			'CONTACT_USER' => array(
				'data_type' => 'Bitrix\Main\UserTable',
				'reference' => array('=this.CONTACT_USER_ID' => 'ref.ID'),
			),
		);
	}

	public static function onBeforeUpdate(Entity\Event $event)
	{
		$result = new Entity\EventResult();
		$data = $event->getParameter("fields");

		if(!isset($data['TIMESTAMP_X']))
		{
			$data['TIMESTAMP_X'] = new DateTime();
			$result->modifyFields($data);
		}
	}

	/**
	 * @deprecated
	 */
	public static function onUserLoginSocserv($params)
	{
		global $USER;

		if(
			$params['EXTERNAL_AUTH_ID'] === \CSocServBitrix24Net::ID
			&& \Bitrix\Main\ModuleManager::isModuleInstalled('bitrix24')
		)
		{
			$notificationOptions = \CUserOptions::getOption("socialservices", "notifications", array());

			$lastDate = 0;
			if(isset($notificationOptions["CONTACTS_NOTIFY_DATE"]))
			{
				$lastDate = $notificationOptions["CONTACTS_NOTIFY_DATE"];
			}

			if($lastDate < time() - 86400)
			{
				static::notifyPossible($USER->getId());

				$notificationOptions["CONTACTS_NOTIFY_DATE"] = time();
				\CUserOptions::setOption("socialservices", "notifications", $notificationOptions);
			}
		}
	}

	public static function onNetworkBroadcast($data)
	{
		$contactsList = array();
		$possibleContactsList = array();

		if(isset($data["contact"]) && is_array($data["contact"]))
		{
			foreach($data["contact"] as $contact)
			{
				if(!isset($contactsList[$contact['CONTACT_OWNER']]))
				{
					$contactsList[$contact['CONTACT_OWNER']] = array();
				}

				$contactsList[$contact['CONTACT_OWNER']][] = $contact;
			}
		}

		if(isset($data["contact_possible"]) && is_array($data["contact_possible"]))
		{
			foreach($data["contact_possible"] as $contact)
			{
				if(!isset($possibleContactsList[$contact['CONTACT_OWNER']]))
				{
					$possibleContactsList[$contact['CONTACT_OWNER']] = array();
				}

				$possibleContactsList[$contact['CONTACT_OWNER']][] = $contact;
			}
		}

		$dbRes = UserTable::getList(array(
			'filter' => array(
				'=EXTERNAL_AUTH_ID' => \CSocServBitrix24Net::ID,
				'=XML_ID' => array_unique(
					array_merge(
						array_keys($contactsList),
						array_keys($possibleContactsList)
					)
				),
			),
			'select' => array('ID', 'USER_ID', 'XML_ID')
		));

		while($owner = $dbRes->fetch())
		{
			if(
				count($contactsList) > 0
				&& count($contactsList[$owner["XML_ID"]]) > 0
			)
			{
				static::processContacts($owner, $contactsList[$owner["XML_ID"]]);
			}

			if(
				count($possibleContactsList) > 0
				&& count($possibleContactsList[$owner["XML_ID"]]) > 0
			)
			{
				static::processPossibleContacts($owner, $possibleContactsList[$owner["XML_ID"]]);
			}
		}
	}

	protected static function processContacts($owner, array $contactsList)
	{
		if(!Main\Loader::includeModule('rest'))
		{
			return;
		}

		$existedContacts = array();
		$dbRes = ContactTable::getList(array(
			'filter' => array(
				'=USER_ID' => $owner["USER_ID"],
			),
			'select' => array('ID', 'CONTACT_XML_ID')
		));
		while($existedContact = $dbRes->fetch())
		{
			$existedContacts[$existedContact['CONTACT_XML_ID']] = $existedContact['ID'];
		}

		foreach($contactsList as $contact)
		{
			$contactFields = array(
				"USER_ID" => $owner["USER_ID"],
				"CONTACT_XML_ID" => $contact["CONTACT_ID"],
				"CONTACT_NAME" => $contact["NAME"],
				"CONTACT_LAST_NAME" => $contact["LAST_NAME"],
				"CONTACT_PHOTO" => $contact["PHOTO"],
				"NOTIFY" => $contact["NOTIFY"],
				"LAST_AUTHORIZE" => DateTime::createFromUserTime(\CRestUtil::unConvertDateTime($contact['LAST_AUTHORIZE'])),
			);

			$contactId = false;
			if(isset($existedContacts[$contactFields["CONTACT_XML_ID"]]))
			{
				$contactId = $existedContacts[$contactFields["CONTACT_XML_ID"]];
				$result = static::update($contactId, $contactFields);
				if(!$result->isSuccess())
				{
					AddMessage2Log($result->getErrorMessages());
				}
			}
			else
			{
				$result = static::add($contactFields);
				if($result->isSuccess())
				{
					$contactId = $result->getId();
				}
				else
				{
					AddMessage2Log($result->getErrorMessages());
				}
			}

			if(
				$contactId > 0
				&& isset($contact["profile"])
				&& count($contact["profile"]) > 0
			)
			{
				if(isset($existedContacts[$contactFields["CONTACT_XML_ID"]]))
				{
					ContactConnectTable::deleteByContact($contactId);
				}

				foreach($contact["profile"] as $profile)
				{
					$connectFields = array(
						'CONTACT_ID' => $contactId,
						'CONTACT_PROFILE_ID' => $profile['PROFILE_ID'],
						'CONTACT_PORTAL' => $profile['PORTAL'],
						'CONNECT_TYPE' => $profile['TYPE'],
						'LAST_AUTHORIZE' => DateTime::createFromUserTime(\CRestUtil::unConvertDateTime($profile['LAST_AUTHORIZE'])),
					);

					$r = ContactConnectTable::add($connectFields);
					if($r->isSuccess())
					{
						if(!isset($contactFields["CONNECT"]))
						{
							$contactFields["CONNECT"] = array($connectFields);
						}
						else
						{
							$contactFields["CONNECT"][] = $connectFields;
						}
					}
				}

				if(!isset($existedContacts[$contactFields["CONTACT_XML_ID"]]))
				{
					static::notifyJoin($contactId, $contactFields);
				}
			}
		}

		static::notifyJoinFinish($owner["USER_ID"]);
	}

	protected static function processPossibleContacts($owner, array $contactsList)
	{
		if(!Main\Loader::includeModule('rest'))
		{
			return;
		}

		$existedContacts = array();
		$dbRes = UserLinkTable::getList(array(
			'filter' => array(
				'=SOCSERV_USER_ID' => $owner["ID"],
				'=SOCSERV_USER.EXTERNAL_AUTH_ID' => \CSocServBitrix24Net::ID,
			),
			'select' => array('ID', 'LINK_UID')
		));
		while($existedContact = $dbRes->fetch())
		{
			$existedContacts[$existedContact['LINK_UID']] = $existedContact['ID'];
		}

		foreach($contactsList as $contact)
		{
			$contactFields = array(
				"USER_ID" => $owner["USER_ID"],
				"SOCSERV_USER_ID" => $owner["ID"],
				"LINK_UID" => $contact["CONTACT_ID"],
				"LINK_NAME" => $contact["NAME"],
				"LINK_LAST_NAME" => $contact["LAST_NAME"],
				"LINK_PICTURE" => $contact["PHOTO"],
			);

			$linkId = false;
			if(isset($existedContacts[$contactFields["LINK_UID"]]))
			{
				$linkId = $existedContacts[$contactFields["LINK_UID"]];
				UserLinkTable::update($linkId, $contactFields);
			}
			else
			{
				$result = UserLinkTable::add($contactFields);
				if($result->isSuccess())
				{
					$linkId = $result->getId();
				}
			}

			if(
				$linkId !== false
				&& isset($contact["profile"])
				&& count($contact["profile"]) > 0
			)
			{
				if(isset($existedContacts[$contactFields["LINK_UID"]]))
				{
					ContactConnectTable::deleteByLink($linkId);
				}

				foreach($contact["profile"] as $profile)
				{
					$result = ContactConnectTable::add(array(
						'LINK_ID' => $linkId,
						'CONTACT_PROFILE_ID' => $profile['PROFILE_ID'],
						'CONTACT_PORTAL' => $profile['PORTAL'],
						'CONNECT_TYPE' => $profile['TYPE'],
						'LAST_AUTHORIZE' => DateTime::createFromUserTime(\CRestUtil::unConvertDateTime($profile['LAST_AUTHORIZE'])),
					));
				}
			}
		}
	}

	public static function getConnectId($connect)
	{
		return $connect["CONNECT_TYPE"].$connect["CONTACT_PROFILE_ID"];
	}

	protected static function notifyJoin($contactId, array $contactInfo = null)
	{
		$network = new Network();
		if($network->isOptionEnabled() && Main\Loader::includeModule('im'))
		{
			if($contactInfo === null)
			{
				$dbRes = static::getByPrimary($contactId);
				$contactInfo = $dbRes->fetch();
			}

			if(!$contactInfo)
			{
				return false;
			}

			if(!isset($contactInfo["CONNECT"]))
			{
				$contactInfo["CONNECT"] = array();
				$dbRes = ContactConnectTable::getList(array(
					"order" => array("LAST_AUTHORIZE" => "ASC"),
					"filter" => array(
						"=CONTACT_ID" => $contactInfo["ID"],
					),
					"limit" => 1,
					"select" => array(
						"CONTACT_PROFILE_ID", "CONNECT_TYPE"
					)
				));
				while($connect = $dbRes->fetch())
				{
					$contactInfo["CONNECT"][] = $connect;
				}
			}

			if(count($contactInfo["CONNECT"]) > 0)
			{
				if(isset($contactInfo["CONTACT_PHOTO_RESIZED"]))
				{
					$contactInfo["CONTACT_PHOTO"] = $contactInfo["CONTACT_PHOTO_RESIZED"];
				}

				if($contactInfo["NOTIFY"] == ContactTable::NOTIFY)
				{
					$attach = new \CIMMessageParamAttach(null, \CIMMessageParamAttach::NORMAL);

					$attachParams = array(
						"NAME" => \CUser::FormatName(\CSite::GetNameFormat(), array(
							"NAME" => $contactInfo["CONTACT_NAME"],
							"LAST_NAME" => $contactInfo["CONTACT_LAST_NAME"]
						), false, false),
					);
					if($contactInfo["CONTACT_PHOTO"])
					{
						$attachParams["AVATAR"] = $contactInfo["CONTACT_PHOTO"];
					}
					$attachParams["NETWORK_ID"] = static::getConnectId($contactInfo["CONNECT"][0]);

					$attach->AddUser($attachParams);

					$messageFields = array(
						"TO_USER_ID" => $contactInfo["USER_ID"],
						"FROM_USER_ID" => 0,
						"NOTIFY_TYPE" => IM_NOTIFY_SYSTEM,
						"NOTIFY_MODULE" => "socialservices",
						"NOTIFY_EVENT" => "contacts",
						"NOTIFY_MESSAGE" => Loc::getMessage("SS_JOIN_NOTIFY"),
						"NOTIFY_MESSAGE_OUT" => IM_MAIL_SKIP,
						"ATTACH" => array($attach),
					);

					return \CIMNotify::Add($messageFields);
				}
				else
				{
					static::$notifyStack[] = $contactInfo;
				}
			}
		}

		return false;
	}

	protected static function notifyJoinFinish($userId)
	{
		$network = new Network();
		if(
			$network->isOptionEnabled()
			&& count(static::$notifyStack) > 0
			&& Main\Loader::includeModule('im')
		)
		{
			$attach = new \CIMMessageParamAttach(null, \CIMMessageParamAttach::NORMAL);

			$count = 0;
			foreach(static::$notifyStack as $contactInfo)
			{
				if(++$count > static::NOTIFY_CONTACT_COUNT)
				{
					$attach->AddHtml('<a href="'.str_replace("#USER_ID#", $userId, Option::get("intranet", "path_user", "/company/persona/user/#USER_ID#/")).'">'.Loc::getMessage("SS_JOIN_NOTIFY_MORE", array("#NUM#" => count(static::$notifyStack)-$count+1)).'</a>');
					break;
				}
				else
				{
					$attachParams = array(
						"NAME" => \CUser::FormatName(\CSite::GetNameFormat(), array(
							"NAME" => $contactInfo["CONTACT_NAME"],
							"LAST_NAME" => $contactInfo["CONTACT_LAST_NAME"]
						), false, false),
					);
					if($contactInfo["CONTACT_PHOTO"])
					{
						$attachParams["AVATAR"] = $contactInfo["CONTACT_PHOTO"];
					}
					$attachParams["NETWORK_ID"] = static::getConnectId($contactInfo["CONNECT"][0]);

					$attach->AddUser($attachParams);
				}
			}

			$messageFields = array(
				"TO_USER_ID" => $userId,
				"FROM_USER_ID" => 0,
				"NOTIFY_TYPE" => IM_NOTIFY_SYSTEM,
				"NOTIFY_MODULE" => "socialservices",
				"NOTIFY_EVENT" => "multiple_contacts",
				"NOTIFY_MESSAGE" => Loc::getMessage("SS_JOIN_NOTIFY_MULTIPLE"),
				"NOTIFY_MESSAGE_OUT" => IM_MAIL_SKIP,
				"ATTACH" => array($attach),
			);

			\CIMNotify::Add($messageFields);

			static::$notifyStack = array();
		}
	}

	/**
	 * @deprecated
	 */
	protected static function notifyPossible($userId)
	{
		$network = new Network();
		if($network->isOptionEnabled() && Main\Loader::includeModule('im'))
		{
			$ts = time();
			$alreadyShown = \CUserOptions::GetOption("socialservices", "possible_contacts", null, $userId);

			if(
				!is_array($alreadyShown)
				|| $alreadyShown[static::POSSIBLE_RESET_TIME_KEY] < $ts - static::POSSIBLE_RESET_TIME
			)
			{
				$alreadyShown = array();
			}
			else
			{
				$ts = $alreadyShown[static::POSSIBLE_RESET_TIME_KEY];
				unset($alreadyShown[static::POSSIBLE_RESET_TIME_KEY]);
			}

			$dateLimit = new DateTime();
			$dateLimit->add(static::POSSIBLE_LAST_AUTHORIZE_LIMIT);

			$contactList = ContactConnectTable::getList(array(
				'order' => array('LAST_AUTHORIZE' => 'DESC'),
				'filter' => array(
					'!=LINK_ID' => '',
					'=CONNECT_TYPE' => ContactConnectTable::TYPE_PORTAL,
					'>=LAST_AUTHORIZE' => $dateLimit,
					'=LINK.USER_ID' => $userId,
					'!=LINK.ID' => $alreadyShown,
				),
				'count_total' => true,
				'group' => array('LINK_ID'),
				'limit' => static::NOTIFY_POSSIBLE_COUNT,
				'select' => array(
					'LINK_ID', 'LINK_NAME' => 'LINK.LINK_NAME', 'LINK_LAST_NAME' => 'LINK.LINK_LAST_NAME', 'LINK_PICTURE' => 'LINK.LINK_PICTURE',
				),
			));

			/*
			$contactList = UserLinkTable::getList(array(
				'order' => array("RND" => "ASC"),
				'filter' => array(
					'=USER_ID' => $userId,
					'!=ID' => $alreadyShown,
				),
				'limit' => static::NOTIFY_POSSIBLE_COUNT,
				'count_total' => true,
				'group' => array("CONNECT.CONTACT_ID"), // Mistake? CONNECT.LINK_ID should be here
				'runtime' => array(
					new Entity\ExpressionField('RND', 'RAND()'),
					new Entity\ReferenceField(
						"CONNECT",
						ContactConnectTable::getEntity(),
						array(
							"=ref.LINK_ID" => "this.ID",
							"=ref.CONNECT_TYPE" => new Main\DB\SqlExpression(
								'?', ContactConnectTable::TYPE_PORTAL
							)
						),
						array("join_type"=>"inner")
					),
				)
			));
			*/

			$count = $contactList->getCount();
			if($count > 0)
			{
				$attach = new \CIMMessageParamAttach(null, \CIMMessageParamAttach::NORMAL);

				while($contactInfo = $contactList->fetch())
				{
					$alreadyShown[] = $contactInfo["LINK_ID"];

					// get all link portals, authorized during last week
					$contactInfo["CONNECT"] = array();
					$dbRes = ContactConnectTable::getList(array(
						"order" => array("LAST_AUTHORIZE" => "DESC"),
						"filter" => array(
							"=LINK_ID" => $contactInfo["LINK_ID"],
							">=LAST_AUTHORIZE" => $dateLimit,
						),
						"limit" => 1,
						"select" => array(
							"CONTACT_PROFILE_ID", "CONNECT_TYPE"
						)
					));
					while($connect = $dbRes->fetch())
					{
						$contactInfo["CONNECT"][] = $connect;
					}

					if(count($contactInfo["CONNECT"]) > 0)
					{
						$attachParams = array(
							"NAME" => \CUser::FormatName(\CSite::GetNameFormat(), array(
								"NAME" => $contactInfo["LINK_NAME"],
								"LAST_NAME" => $contactInfo["LINK_LAST_NAME"]
							), false, false),
						);
						if($contactInfo["LINK_PICTURE"])
						{
							$attachParams["AVATAR"] = $contactInfo["LINK_PICTURE"];
						}
						$attachParams["NETWORK_ID"] = static::getConnectId($contactInfo["CONNECT"][0]);

						$attach->AddUser($attachParams);
					}
				}
/*
				if($count > static::NOTIFY_POSSIBLE_COUNT)
				{
					$attach->AddHtml('<a href="'.str_replace("#USER_ID#", $userId, Option::get("intranet", "path_user", "/company/persona/user/#USER_ID#/")).'">'.Loc::getMessage("SS_JOIN_NOTIFY_MORE", array("#NUM#" => $count - static::NOTIFY_POSSIBLE_COUNT)).'</a>');
				}
*/
				$messageFields = array(
					"TO_USER_ID" => $userId,
					"FROM_USER_ID" => 0,
					"NOTIFY_TYPE" => IM_NOTIFY_SYSTEM,
					"NOTIFY_MODULE" => "socialservices",
					"NOTIFY_EVENT" => "possible_contacts",
					"NOTIFY_MESSAGE" => Loc::getMessage("SS_JOIN_NOTIFY_POSSIBLE"),
					"NOTIFY_MESSAGE_OUT" => IM_MAIL_SKIP,
					"ATTACH" => $attach,
				);

				\CIMNotify::Add($messageFields);

			}

			$alreadyShown[static::POSSIBLE_RESET_TIME_KEY] = $ts;
			\CUserOptions::SetOption("socialservices", "possible_contacts", $alreadyShown, false, $userId);
		}
	}
}