- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/internals/delivery_paysystem.php
- Класс: BitrixSaleInternalsDeliveryPaySystemTable
- Вызов: DeliveryPaySystemTable::actualizePaySystemRestrictionByDelivery
static function actualizePaySystemRestrictionByDelivery()
{
$con = BitrixMainApplication::getConnection();
$sqlHelper = $con->getSqlHelper();
$restrictions = array();
$dbR = BitrixSaleInternalsServiceRestrictionTable::getList(array(
'filter' => array(
'=CLASS_NAME' => '\'.BitrixSaleServicesPaySystemRestrictionsDelivery::class
),
'select' => array('SERVICE_ID')
));
while($restr = $dbR->fetch())
$restrictions[] = $restr['SERVICE_ID'];
$deliveryList = self::getEntityItemsFullList(self::ENTITY_TYPE_PAYSYSTEM);
$dLinkedToP = array();
$deliveriesToPs = array();
$linkedPS = array();
$dbP2S = DeliveryPaySystemTable::getList();
while($d2p = $dbP2S->fetch())
{
if($d2p["LINK_DIRECTION"] == self::LINK_DIRECTION_PAYSYSTEM_DELIVERY && !in_array($d2p["PAYSYSTEM_ID"], $dLinkedToP))
$dLinkedToP[] = $d2p["PAYSYSTEM_ID"];
if($d2p["LINK_DIRECTION"] == self::LINK_DIRECTION_DELIVERY_PAYSYSTEM)
{
if(!isset($deliveriesToPs[$d2p["PAYSYSTEM_ID"]]))
$deliveriesToPs[$d2p["PAYSYSTEM_ID"]] = array();
$linkedPS[] = $d2p["DELIVERY_ID"];
$deliveriesToPs[$d2p["PAYSYSTEM_ID"]][] = $d2p["DELIVERY_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('BitrixSaleServicesPaySystemRestrictionsDelivery')."' AND (" : "OR " )."SERVICE_ID=".$sqlHelper->forSql($deliveryId)." AND SERVICE_TYPE=".Manager::SERVICE_TYPE_PAYMENT;
$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('\'.BitrixSaleServicesPaySystemRestrictionsDelivery::class)."', ".Manager::SERVICE_TYPE_PAYMENT.")";
$sql = "INSERT INTO ".BitrixSaleInternalsServiceRestrictionTable::getTableName()."(SERVICE_ID, CLASS_NAME, SERVICE_TYPE) VALUES".$sql;
$con->queryExecute($sql);
}
}