Your IP : 18.191.174.125


Current Path : /home/bitrix/ext_www/easy-comfort.com.ua/bitrix/components/bitrix/sender.contact.import/
Upload File :
Current File : /home/bitrix/ext_www/easy-comfort.com.ua/bitrix/components/bitrix/sender.contact.import/ajax.php

<?php
define('STOP_STATISTICS', true);
define('BX_SECURITY_SHOW_MESSAGE', true);

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Application;
use Bitrix\Main\HttpRequest;
use Bitrix\Main\Text\Encoding as TextEncoding;
use Bitrix\Main\Type\DateTime;

use Bitrix\Sender\Internals\QueryController as Controller;
use Bitrix\Sender\Internals\SqlBatch;
use Bitrix\Sender\Recipient;
use Bitrix\Sender\ListTable;
use Bitrix\Sender\ContactTable;
use Bitrix\Sender\ContactListTable;
use Bitrix\Sender\Internals\PrettyDate;
use Bitrix\Sender\Security;

if (!Loader::includeModule('sender'))
{
	return;
}

Loc::loadMessages(__FILE__);

$actions = array();
$actions[] = Controller\Action::create('importList')->setHandler(
	function (HttpRequest $request, Controller\Response $response)
	{
		$content = $response->initContentJson();

		$listId = (int) $request->get('listId');
		$listName = TextEncoding::convertEncodingToCurrent(trim($request->get('listName')));
		$isBlacklist = $request->get('blacklist') === 'Y';
		$list = $request->get('list');
		$list = is_array($list) ? $list : array();

		if ($isBlacklist)
		{
			if (!Security\Access::current()->canModifyBlacklist())
			{
				Security\AccessChecker::addError($content->getErrorCollection(), Security\AccessChecker::ERR_CODE_EDIT);
				return;
			}
		}
		else
		{
			if (!Security\Access::current()->canModifySegments())
			{
				Security\AccessChecker::addError($content->getErrorCollection(), Security\AccessChecker::ERR_CODE_EDIT);
				return;
			}
		}

		$updateList = array();
		$sqlHelper = Application::getConnection()->getSqlHelper();
		$dateInsert = new DateTime();

		if (!$isBlacklist && !$listId)
		{
			$result = ListTable::add(array(
				'NAME' => $listName ?: Loc::getMessage(
					'SENDER_CONTACT_IMPORT_LIST_FROM1',
					array('%date%' => PrettyDate::formatDate())
				)
			));
			if (!$result->isSuccess())
			{
				$content->getErrorCollection()->add($result->getErrors());
				return;
			}

			$listId = $result->getId();
		}

		sort($list);
		foreach ($list as $index => $item)
		{
			$item = explode(';', $item);
			TrimArr($item);
			if (!$item[0])
			{
				continue;
			}

			$code = $item[0];
			$name = isset($item[1]) ? $item[1] : null;
			$name = is_string($name) ? trim($name) : null;
			$name = TextEncoding::convertEncodingToCurrent($name);

			$typeId = Recipient\Type::detect($code);
			if (!$typeId)
			{
				continue;
			}

			$code = Recipient\Normalizer::normalize($code, $typeId);
			if (!$code)
			{
				continue;
			}

			$updateItem = array(
				'TYPE_ID' => $typeId,
				'CODE' => $code,
				'NAME' => $name,
				'DATE_INSERT' => $dateInsert,
				'DATE_UPDATE' => $dateInsert,
			);
			if ($isBlacklist)
			{
				$updateItem['BLACKLISTED'] = $isBlacklist ? 'Y' : 'N';
			}
			$updateList[] = $updateItem;
		}


		// insert contacts
		if (count($updateList) === 0)
		{
			return;
		}

		$onDuplicateUpdateFields = array(
			'NAME',
			array(
				'NAME' => 'BLACKLISTED',
				'VALUE' => $isBlacklist ? "'Y'" : "'N'"
			),
			array(
				'NAME' => 'DATE_UPDATE',
				'VALUE' => $sqlHelper->convertToDbDateTime(new DateTime())
			)
		);
		foreach (SqlBatch::divide($updateList) as $list)
		{
			SqlBatch::insert(
				ContactTable::getTableName(),
				$list,
				$onDuplicateUpdateFields
			);
		}

		// insert contacts & lists
		if ($listId)
		{
			$codesByType = array();
			foreach ($updateList as $updateItem)
			{
				$typeId = $updateItem['TYPE_ID'];
				if (!is_array($codesByType[$typeId]))
				{
					$codesByType[$typeId] = array();
				}

				$codesByType[$typeId][] = $updateItem['CODE'];
			}
			foreach ($codesByType as $typeId => $allCodes)
			{
				$typeId = (int) $typeId;
				$listId = (int) $listId;
				$contactTableName = ContactTable::getTableName();
				$contactListTableName = ContactListTable::getTableName();
				foreach (SqlBatch::divide($allCodes) as $codes)
				{
					$codes = SqlBatch::getInString($codes);
					$sql = "INSERT IGNORE $contactListTableName ";
					$sql .="(CONTACT_ID, LIST_ID) ";
					$sql .="SELECT ID AS CONTACT_ID, $listId as LIST_ID ";
					$sql .="FROM $contactTableName ";
					$sql .="WHERE TYPE_ID=$typeId AND CODE in ($codes)";
					Application::getConnection()->query($sql);
				}
			}

			$row = ListTable::getRowById($listId);
			if ($row)
			{
				$row['COUNT'] = ContactListTable::getCount(array('=LIST_ID' => $listId));
				$content->add('data', $row);
			}
		}
	}
);

Controller\Listener::create()->setActions($actions)->run();