%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/lib/delivery/restrictions/ |
| Current File : //home/bitrix/www/bitrix/modules/sale/lib/delivery/restrictions/manager.php |
<?
namespace Bitrix\Sale\Delivery\Restrictions;
use Bitrix\Sale\Internals\ServiceRestrictionTable;
class Manager extends \Bitrix\Sale\Services\Base\RestrictionManager
{
protected static $classNames = null;
/**
* @return int
*/
protected static function getServiceType()
{
return self::SERVICE_TYPE_SHIPMENT;
}
/**
* @return array
*/
protected static function getBuildInRestrictions()
{
return array(
'\Bitrix\Sale\Delivery\Restrictions\BySite' => 'lib/delivery/restrictions/bysite.php',
'\Bitrix\Sale\Delivery\Restrictions\ByPrice' => 'lib/delivery/restrictions/byprice.php',
'\Bitrix\Sale\Delivery\Restrictions\ByWeight' => 'lib/delivery/restrictions/byweight.php',
'\Bitrix\Sale\Delivery\Restrictions\ByMaxSize' => 'lib/delivery/restrictions/bymaxsize.php',
'\Bitrix\Sale\Delivery\Restrictions\ByLocation' => 'lib/delivery/restrictions/bylocation.php',
// '\Bitrix\Sale\Delivery\Restrictions\PersonType' => 'lib/delivery/restrictions/bypersontype.php', //will be moved
'\Bitrix\Sale\Delivery\Restrictions\ByPaySystem' => 'lib/delivery/restrictions/bypaysystem.php',
'\Bitrix\Sale\Delivery\Restrictions\ByPersonType' => 'lib/delivery/restrictions/bypersontype.php',
'\Bitrix\Sale\Delivery\Restrictions\ByDimensions' => 'lib/delivery/restrictions/bydimensions.php',
'\Bitrix\Sale\Delivery\Restrictions\ByPublicMode' => 'lib/delivery/restrictions/bypublicmode.php',
'\Bitrix\Sale\Delivery\Restrictions\ByTradeBinding' => 'lib/delivery/restrictions/bytradebinding.php',
'\Bitrix\Sale\Delivery\Restrictions\ExcludeLocation' => 'lib/delivery/restrictions/excludelocation.php',
'\Bitrix\Sale\Delivery\Restrictions\ByProductCategory' => 'lib/delivery/restrictions/byproductcategory.php'
);
}
/**
* @return string
*/
public static function getEventName()
{
class_alias('Bitrix\Sale\Delivery\Restrictions\ByPersonType', 'Bitrix\Sale\Delivery\Restrictions\PersonType');
return 'onSaleDeliveryRestrictionsClassNamesBuildList';
}
/**
* @param int $deliveryId
* @param string $className
*/
public static function deleteByDeliveryIdClassName($deliveryId, $className)
{
$con = \Bitrix\Main\Application::getConnection();
$sqlHelper = $con->getSqlHelper();
$strSql = "DELETE FROM ".ServiceRestrictionTable::getTableName().
" WHERE SERVICE_ID=".$sqlHelper->forSql($deliveryId).
" AND SERVICE_TYPE=".$sqlHelper->forSql(Manager::SERVICE_TYPE_SHIPMENT).
" AND CLASS_NAME='".$sqlHelper->forSql($className)."'";
$con->queryExecute($strSql);
}
/**
* Returns services wich have restrictions, but successfully pass checks.
* @param \Bitrix\Sale\Shipment|null $shipment
* @param int $restrictionMode RestrictionManager::MODE_CLIENT | RestrictionManager::MODE_MANAGER
* @return int[]
* @throws \Bitrix\Main\ArgumentException
* @throws \Bitrix\Main\SystemException
*/
public static function getRestrictedIds(\Bitrix\Sale\Shipment $shipment = null, $restrictionMode)
{
$result = array();
static $dataPrepared = false;
static $idsGrouppedByRestrictions = array(); //performance
static $supportGroupFiltering = array(); //
if($dataPrepared === false)
{
self::init();
$filter = array(
'DELIVERY_SERVICE.ACTIVE' => 'Y'
);
$dbRes = ServiceRestrictionTable::getList(array(
'runtime' => array(
new \Bitrix\Main\Entity\ReferenceField(
'DELIVERY_SERVICE',
'\Bitrix\Sale\Delivery\Services\Table',
array(
'=this.SERVICE_ID' => 'ref.ID',
'=this.SERVICE_TYPE' => array('?', self::SERVICE_TYPE_SHIPMENT)
),
array('join_type' => 'inner')
)
),
'filter' => $filter,
'order' => array('SORT' =>'ASC')
));
$data = array();
$checkedGroupFiltering = array();
while($rstr = $dbRes->fetch())
{
if(!isset($data[$rstr["SERVICE_ID"]]))
$data[$rstr["SERVICE_ID"]] = array();
$data[$rstr["SERVICE_ID"]][$rstr['ID']] = $rstr;
if(!in_array($rstr['CLASS_NAME'], $checkedGroupFiltering))
{
$checkedGroupFiltering[] = $rstr['CLASS_NAME'];
if(method_exists($rstr['CLASS_NAME'], 'filterServicesArray'))
$supportGroupFiltering[] = $rstr['CLASS_NAME'];
}
if(in_array($rstr['CLASS_NAME'], $supportGroupFiltering))
{
if(!is_array($idsGrouppedByRestrictions[$rstr['CLASS_NAME']]))
$idsGrouppedByRestrictions[$rstr['CLASS_NAME']] = array();
if(!in_array($rstr["SERVICE_ID"], $idsGrouppedByRestrictions[$rstr['CLASS_NAME']]))
$idsGrouppedByRestrictions[$rstr['CLASS_NAME']][$rstr["SERVICE_ID"]] = $rstr;
}
}
self::prepareData(array_keys($data), $data);
$dataPrepared = true;
}
else
{
$data = self::getCache(0, self::getServiceType());
}
$filterResult = array();
foreach($supportGroupFiltering as $rstrClass)
{
$passedServicesIds = $rstrClass::filterServicesArray($shipment, $idsGrouppedByRestrictions[$rstrClass]);
$notPassed = array_diff_key($idsGrouppedByRestrictions[$rstrClass], array_flip($passedServicesIds));
if($restrictionMode == self::MODE_MANAGER)
foreach($notPassed as $srvId => $rstr)
$filterResult[$srvId] = $rstrClass::getSeverity($restrictionMode);
$data = array_diff_key($data, $notPassed);
}
foreach($data as $serviceId => $serviceRestrictions)
{
$srvRes = self::SEVERITY_NONE;
if($shipment != null)
{
foreach($serviceRestrictions as $restrictionId => $rstr)
{
if(in_array($rstr['CLASS_NAME'], $supportGroupFiltering))
continue;
if(!self::isClassValid($rstr['CLASS_NAME']))
continue;
if(!$rstr['PARAMS'])
$rstr['PARAMS'] = array();
$res = $rstr['CLASS_NAME']::checkByEntity(
$shipment,
$rstr['PARAMS'],
$restrictionMode,
$serviceId
);
if($res == self::SEVERITY_STRICT)
continue 2;
if($res == self::SEVERITY_SOFT && $restrictionMode == self::MODE_CLIENT)
continue 2;
if($res == self::SEVERITY_SOFT && $srvRes == self::SEVERITY_NONE)
$srvRes = self::SEVERITY_SOFT;
}
}
$result[$serviceId] = $srvRes;
}
return $filterResult + $result;
}
protected function isClassSupportGroupFiltering($className)
{
if(!self::isClassValid($className))
return false;
return method_exists($className, 'filterServicesArray');
}
protected static function isClassValid($className)
{
if(empty($className))
return false;
if(!class_exists($className))
return false;
if(!is_subclass_of($className, 'Bitrix\Sale\Delivery\Restrictions\Base'))
return false;
return true;
}
}