Группы пользователей в ограничения к платежным системам

Рейтинг: 3.0000  
На голосовании
Предложил Роман 11.07.2018 12:53:57

Группы пользователей в ограничения к платежным системам

Это очень логичный и нужный функционал хотя бы в том смысле, что пока добавится и отладится платежная система уходит много времени. Логично ограничить платежную систему только администраторами на это время. А то приходится из штанов выпрыгивать, если нет git


Рейтинг: 0  
Волков Алексей 12.07.2018 15:08:31
Не могу проголосовать(не активен плюсик), но скажу так идея нужная.

Поищите в инете, есть готовый пример добавления собственного ограничения как раз по пользователю. Не найдете, стучитесь в личку поищу в старых файлах, когда-то добавлял такое, может где завалялся код.
Рейтинг: 1  
Мягков Денис 02.12.2018 13:25:27
Как временную замену можно использовать своё кастомное решение: Показывать только для перечисленных групп пользователей. (тестировал только на 18 версии битрикса) (добавляет в выпадашку выбора ограничений новый пункт "custom: По группам пользователя"):

/bitrix/php_interface/init.php
/**
 * Добавляем ограничение на платёжную систему.
 */
Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'onSalePaySystemRestrictionsClassNamesBuildList',
    function () {
        return new \Bitrix\Main\EventResult(
            \Bitrix\Main\EventResult::SUCCESS,
            array(
                '\RsitePayRestrictionByUserGroup' => '/bitrix/php_interface/include/rsite_pay_restriction_by_user_group.php', // По группе пользователя.
            )
        );
    }
);

/bitrix/php_interface/include/rsite_pay_restriction_by_user_group.php
<?php

use Bitrix\Sale\Services\Base;
use Bitrix\Sale\Internals\Entity;
use Bitrix\Sale\Payment;

class RsitePayRestrictionByUserGroup extends Base\Restriction
{
    const ONLY_FOR_USER_GROUPS_STRING_IDENTIFIER = 'ONLY_FOR_USER_GROUPS';

    /**
     * Какая-то сортировка чего-то.
     *
     * @var int
     * 100 - lightweight - just compare with params
     * 200 - middleweight - may be use base queries
     * 300 - hardweight - use base, and/or hard calculations
     * */
    public static $easeSort = 100;

    /**
     * Типа заголовок ограничения. Отображается в выпадающем списке добавления ограничений и в других местах.
     *
     * @return string
     */
    public static function getClassTitle()
    {
        return 'custom: По группе пользователя'; // Желательно добавлять префикс 'custom: '  или типа того, чтобы потом было сразу понятно что это наша кастомная хрень.
    }

    /**
     * Описание ограничения.
     *
     * @return string
     */
    public static function getClassDescription()
    {
        return 'Для определённых групп пользователей.';
    }

    /**
     * Параметры (поля для заполнения) ограничения, которые будут показаны при создании ограничения.
     *
     * @param int $entityId
     * @return array
     */
    public static function getParamsStructure($entityId = 0)
    {
        // Получаем список всех групп пользователей с сайта.
        $allSiteUserGroups = array();
        $db = \CGroup::GetList($by = 'c_sort', $order = 'asc'); // Выбираем ВСЕ группы с сайта. // https://dev.1c-bitrix.ru/api_help/main/reference/cgroup/getlist.php
        while ($userGroupData = $db->Fetch()) {
            $allSiteUserGroups[$userGroupData['ID']] = $userGroupData['REFERENCE'];
        }

        return array(
            self::ONLY_FOR_USER_GROUPS_STRING_IDENTIFIER => array(
                'TYPE'     => 'ENUM',
                'MULTIPLE' => 'Y',
                'LABEL'    => 'Показывать только этим группам пользователей',
                'OPTIONS'  => $allSiteUserGroups,
            ),
        );
    }

    /**
     * Получение дополнительных параметров для ограничивалки при применении ограничения (например при оформлении заказа или в админке).
     *
     * @param Entity $entity
     * @return mixed
     */
    protected static function extractParams(Entity $entity)
    {
        // $orderPrice = null;
        // $paymentPrice = null;
        $orderUserId = null; // ID пользователя из заказа.

        if ($entity instanceof Payment) {
            /** @var \Bitrix\Sale\PaymentCollection $collection */
            $collection = $entity->getCollection();
            /** @var \Bitrix\Sale\Order $order */
            $order = $collection->getOrder();

            //$orderPrice = $order->getPrice();
            //$paymentPrice = $entity->getField('SUM');
            $orderUserId = $order->getUserId();
        }

        return array(
            // 'PRICE_PAYMENT' => $paymentPrice,
            // 'PRICE_ORDER'   => $orderPrice,
            'ORDER_USER_ID' => $orderUserId,
        );
    }

    /**
     * Процедура непосредственной проверки при применении ограничения (например при оформлении заказа).
     *
     * @param array $params            Данные из self::extractParams()
     * @param array $restrictionParams Данные из сохранённых настроек ограничения (то что админ установил в настройках данного ограничения)
     * @param int   $serviceId         ID этой платёжной системы (для которой применяется данное ограничение).
     * @return bool Смысл: true - показать платёжную систему; false - скрыть.
     */
    public static function check($params, array $restrictionParams, $serviceId = 0)
    {
        global $USER;

        $userId = $params['ORDER_USER_ID'];
        if ($userId) {
            if (count(array_intersect(CUser::GetUserGroup($userId), $restrictionParams[self::ONLY_FOR_USER_GROUPS_STRING_IDENTIFIER])) > 0) {
                return true;
            } else {
                return false;
            }
        }

        return false;
    }
}