• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/internals/delivery_paysystem.php
  • Класс: BitrixSaleInternalsDeliveryPaySystemTable
  • Вызов: DeliveryPaySystemTable::actualizeDeliveriesRestrictionByPS
static function actualizeDeliveriesRestrictionByPS()
{
	$con = BitrixMainApplication::getConnection();
	$sqlHelper = $con->getSqlHelper();

	$restrictions = array();
	$dbR = BitrixSaleInternalsServiceRestrictionTable::getList(array(
		'filter' => array(
			'=CLASS_NAME' => 'BitrixSaleDeliveryRestrictionsByPaySystem'
		),
		'select' => array('SERVICE_ID')
	));

	while($restr = $dbR->fetch())
		$restrictions[] = $restr['SERVICE_ID'];

	$deliveryList = self::getEntityItemsFullList(self::ENTITY_TYPE_DELIVERY);
	$dLinkedToP = array();
	$deliveriesToPs = array();
	$linkedPS = array();

	$dbP2S = DeliveryPaySystemTable::getList();

	while($d2p = $dbP2S->fetch())
	{
		if($d2p["LINK_DIRECTION"] == self::LINK_DIRECTION_DELIVERY_PAYSYSTEM && !in_array($d2p["DELIVERY_ID"], $dLinkedToP))
			$dLinkedToP[] = $d2p["DELIVERY_ID"];

		if($d2p["LINK_DIRECTION"] == self::LINK_DIRECTION_PAYSYSTEM_DELIVERY )
		{
			if(!isset($deliveriesToPs[$d2p["DELIVERY_ID"]]))
				$deliveriesToPs[$d2p["DELIVERY_ID"]] = array();

			$linkedPS[] = $d2p["PAYSYSTEM_ID"];
			$deliveriesToPs[$d2p["DELIVERY_ID"]][] = $d2p["PAYSYSTEM_ID"];
		}
	}

	$notLinkedToPS = array_diff($deliveryList, $dLinkedToP);
	$existLinkedPs = !empty($linkedPS);
	$notNeedRestriction = array();
	$needRestriction = array();

	foreach($deliveryList as $id)
	{
		$need = true;

		//DS not linked to PS and (All PS having links linked to current DS
		if(in_array($id, $notLinkedToPS))
		{
			if(isset($deliveriesToPs[$id]))
				$diff = array_diff($linkedPS, $deliveriesToPs[$id]);
			else
				$diff = $linkedPS;

			if(!$existLinkedPs || empty($diff))
			{
				$notNeedRestriction[] = $id;
				$need = false;
			}
		}

		// DS linked to PS or exist linked PS but not linked to current DS
		if($need)
			$needRestriction[] = $id;
	}

	$notNeedRestriction = array_intersect($notNeedRestriction, $restrictions);

	if(!empty($notNeedRestriction))
	{
		$sql = "";

		foreach($notNeedRestriction as $deliveryId)
			$sql .= " ".($sql == "" ? "WHERE CLASS_NAME='".$sqlHelper->forSql('BitrixSaleDeliveryRestrictionsByPaySystem')."' AND (" : "OR " )."SERVICE_ID=".$sqlHelper->forSql($deliveryId)." AND SERVICE_TYPE=".RestrictionsManager::SERVICE_TYPE_SHIPMENT;

		$sql = "DELETE FROM ".BitrixSaleInternalsServiceRestrictionTable::getTableName().$sql.")";
		$con->queryExecute($sql);
	}

	$needRestriction = array_diff($needRestriction, $restrictions);

	//let's... add missing
	if(!empty($needRestriction))
	{
		$sql = "";

		foreach($needRestriction as $deliveryId)
			$sql .= ($sql == "" ? " " : ", ")."(".$sqlHelper->forSql($deliveryId).", '".$sqlHelper->forSql('BitrixSaleDeliveryRestrictionsByPaySystem')."', ".RestrictionsManager::SERVICE_TYPE_SHIPMENT.")";

		$sql = "INSERT INTO ".BitrixSaleInternalsServiceRestrictionTable::getTableName()."(SERVICE_ID, CLASS_NAME, SERVICE_TYPE) VALUES".$sql;
		$con->queryExecute($sql);
	}
}