Руслан

Руслан

С нами с 24 января 2020; Место в рейтинге пользователей: #155
Руслан
02 марта 2021, 17:23
0
и в самом компоненте есть небольшая недоработка по работе с заказом в админке(этот функционал не был изначально в задумке, но позже на скорую руку добавил) так как реализована работа с монетами авторизованного пользователя то при записи заказа в админке используются монеты авторизованного в админке, там всего несколько строк изменений, но я выкатить это не могу так как среда разработки была на винде, а сейчас я на маке и тупо нет возможности плюс не приобрел ещё лицензию на PHPSTORM на котором реализовывал компонент.
здесь теперь реализовано от ИД пользователя из заказа
файл:

новое содержимое файла:
<?php

class msrpcMain {
    /** @var modX $modx */
    public $modx;
    /** @var array $config */
    public $config;

    public function __construct(&$modx, $config = array()) {
        $this->modx = &$modx;
        $this->config = array(
            'css_url' => $this->modx->getOption('msrpc_css_url', null, MODX_ASSETS_URL.'components/msreferralprogramcoin/styles/main.css'),
            'js_url' => $this->modx->getOption('msrpc_js_url', null, MODX_ASSETS_URL.'components/msreferralprogramcoin/js/web/msrpcincluder.js'),
            'connector_url' => $this->modx->getOption('msrpc_connector_url', null, MODX_ASSETS_URL.'components/msreferralprogramcoin/connector.php'),
            'name_coin' => trim($this->modx->getOption('msrpc_name_bonus_coin',null, 'Coin')),
            'default_pr_payroll' => (int)$this->modx->getOption('msrpc_default_pr_payroll_coins',null, 0),
            'pr_cart_paid' => (int)$this->modx->getOption('msrpc_max_pr_cart_paid_by_coins',null, 0),
            'statuses_for_inc' => $this->modx->getOption('msrpc_order_statuses_for_inc_coins',null, 0),
            'statuses_for_dec' => $this->modx->getOption('msrpc_order_statuses_for_dec_coins',null, 0),
            'ratio_of_coins' => (int)$this->modx->getOption('msrpc_ratio_of_coins',null, 1),
            'welcome_coins' => (int)$this->modx->getOption('msrpc_welcome_coins_for_registration',null, 0),
            'welcome_coins_if' => (int)$this->modx->getOption('msrpc_welcome_coins_if_promocode',null, 0)
        );
        $this->config = array_merge($this->config, $config);

        $this->config['css_url'] = str_replace('[[+cssBasePath]]', MODX_ASSETS_URL.'components/msreferralprogramcoin/styles/', $this->config['css_url']);
        $this->config['js_url'] = str_replace('[[+jsBasePath]]', MODX_ASSETS_URL.'components/msreferralprogramcoin/js/', $this->config['js_url']);
        $this->config['connector_url'] = str_replace('[[+assetsBasePath]]', MODX_ASSETS_URL.'components/msreferralprogramcoin/', $this->config['connector_url']);
        $this->config['name_coin'] = iconv_strlen($this->config['name_coin']) < 1 ? 'Coin' : $this->config['name_coin'];
        $this->config['promo_prefix'] = mb_strtoupper(iconv_substr($this->config['name_coin'], 0, 1));
        $this->config['promo_suffix'] = 'R';
        $this->config['ratio_of_coins'] = !$this->config['ratio_of_coins'] ? 1 : $this->config['ratio_of_coins'];
        $this->config['default_pr_payroll'] = !$this->config['default_pr_payroll'] ? 0 : $this->config['default_pr_payroll'];
        $this->config['pr_cart_paid'] = !$this->config['pr_cart_paid'] ? 0 : $this->config['pr_cart_paid'];
        $this->config['welcome_coins'] = !$this->config['welcome_coins'] ? 0 : $this->config['welcome_coins'];
        $this->config['welcome_coins_if'] = !$this->config['welcome_coins_if'] ? 0 : $this->config['welcome_coins_if'];

        $this->includeCssAndJs();

        $this->modx->addPackage('msreferralprogramcoin', MODX_CORE_PATH.'components/msreferralprogramcoin/model/');
    }

    public function includeCssAndJs() {
        if ($this->modx->context->key != 'mgr') {
            $this->modx->regClientCSS($this->config['css_url']);
            $this->modx->regClientScript($this->config['js_url']);
        }
    }

    public function loadLexicons() {
        $this->modx->lexicon->load('msreferralprogramcoin:default');
        if ($this->modx->context->key == 'mgr') {
            $this->modx->lexicon->load('msreferralprogramcoin:menu');
        }
    }

    public function OnUserSave($uid) {
        if (!$uid || !$this->config['welcome_coins']) return;
        /** @var msrpcHandPayroll $handPayroll */
        $handPayroll = $this->modx->newObject('msrpcHandPayroll');
        $handPayroll->set('user_id', $uid);
        $handPayroll->set('payroll', $this->config['welcome_coins']);
        $handPayroll->set('createdby', $uid);
        $handPayroll->set('createdon', time());
        if (!$handPayroll->save()) {
            $this->modx->log(modX::LOG_LEVEL_ERROR, '[msrpcMain] - Not save welcome coins for user ID '.$uid);
        }
    }

    public function OnUserBeforeSave($promo) {
        $referrer_promocode = iconv_substr(trim($promo), 1);
        if (empty($referrer_promocode)) {
            return 0;
        }
        $timestamp_1 = stristr($referrer_promocode, 'R');
        $referrer_id = (int)trim(stristr($referrer_promocode, 'R', true));
        $timestamp_2 = trim(iconv_substr($timestamp_1, 1));
        if (!$timestamp_1 || !$referrer_id || !(int)$timestamp_2 || iconv_strlen($timestamp_2) !== 2) {
            return 0;
        }
        $query = $this->modx->newQuery('modUser', array('id' => $referrer_id));
        $query->select(array(
            'modUser.createdon as createdon'
        ));
        $query->prepare();
        $query->stmt->execute();

        /** @var array[] $Users */
        $users = $query->stmt->fetchAll(PDO::FETCH_ASSOC);

        if (!count($users) || $timestamp_2 !== substr($users[0]['createdon'],-2)) {
            return 0;
        }

        return (int)$referrer_id;
    }

    public function msOnBeforeSaveOrder(msOrder $msOrder, $payCoins)
    {
        $delivery_cost = $msOrder->get('delivery_cost');
        $oid = 0;
        if ($msOrder->id){
            $oid = $msOrder->id;
            $payCoins = $msOrder->msrpc_payroll_dec;
        }
        $products = $msOrder->getMany('Products');
        $payroll = 0;
        $total_cost = 0;
        $pr_payroll = $this->config['default_pr_payroll'];
        if ($this->modx->user->id) {
            $query = $this->modx->newQuery('modUser', array('id' => $msOrder->user_id));
            $query->select(array(
                'modUser.msrpc_pr_payroll as pr_payroll'
            ));
            $query->prepare();
            $query->stmt->execute();
            /** @var array[] $modUsers */
            $modUsers = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
            if (count($modUsers) && $modUsers[0]['pr_payroll']) {
                $pr_payroll = (int)$modUsers[0]['pr_payroll'];
            }
        }
        /** @var msOrderProduct $product */
        foreach ($products as $product) {
            $total_cost += $product->get('price') * $product->get('count');
            if (!$this->modx->getObject('modResource', $product->product_id)->msrpc_check) continue;
            $payroll += (($product->get('price') * $product->get('count')) / 100) * $pr_payroll;
        }
        $payroll = (int)round($payroll * $this->config['ratio_of_coins'],0);
        $msOrder->set('msrpc_payroll_inc', $payroll);
        if ($this->modx->user->id && $payCoins) {
            $balance = 0;
            $query = $this->modx->newQuery('msrpcHandPayroll', array('user_id' => $msOrder->user_id));
            $query->groupby('msrpcHandPayroll.user_id');
            $query->select(array(
                'SUM(msrpcHandPayroll.payroll) as payroll'
            ));
            $query->prepare();
            $query->stmt->execute();
            $rows = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
            foreach ($rows as $row) {
                $balance += (int)$row['payroll'];
            }
            $query = $this->modx->newQuery('msOrder', array(
                'id:!=' => $oid,
                'user_id' => $msOrder->user_id,
                'status:IN'=> explode(',', $this->modx->getOption('msrpc_order_statuses_for_inc_coins',null, 0))
            ));
            $query->groupby('msOrder.user_id');
            $query->select(array(
                'SUM(msOrder.msrpc_payroll_inc) as payroll'
            ));
            $query->prepare();
            $query->stmt->execute();
            $rows = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
            foreach ($rows as $row) {
                $balance += (int)$row['payroll'];
            }
            $query = $this->modx->newQuery('msOrder', array(
                'id:!=' => $oid,
                'user_id' => $msOrder->user_id,
                'status:IN'=> explode(',', $this->modx->getOption('msrpc_order_statuses_for_dec_coins',null, 0))
            ));
            $query->groupby('msOrder.user_id');
            $query->select(array(
                'SUM(msOrder.msrpc_payroll_dec) as payroll'
            ));
            $query->prepare();
            $query->stmt->execute();
            $rows = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
            foreach ($rows as $row) {
                $balance -= (int)$row['payroll'];
            }
            if (!$balance) return;
            $forPayCost = ($total_cost/100)*$this->config['pr_cart_paid'];
            $forPayCoins = (int)round($forPayCost * $this->config['ratio_of_coins'], 0);
            $forPayCostB = (int)round($balance / $this->config['ratio_of_coins'], 0);
            $msOrder->set('msrpc_payroll_dec', min($balance, $forPayCoins));
            $msOrder->set('cost', $total_cost-min($forPayCostB, $forPayCost)+$delivery_cost);
            $msOrder->set('cart_cost', $total_cost-min($forPayCostB, $forPayCost));
        }
    }

    public function OnMODXInit() {
        $this->modx->map['modResource']['fields']['msrpc_check'] = 0;
        $this->modx->map['modResource']['fieldMeta']['msrpc_check'] = array(
            'dbtype' => 'tinyint',
            'precision' => '1',
            'attributes' => 'unsigned',
            'phptype' => 'boolean',
            'null' => false,
            'default' => 0
        );
        $this->modx->loadClass('modUser');
        $this->modx->map['modUser']['fields']['msrpc_referrer_id'] = 0;
        $this->modx->map['modUser']['fieldMeta']['msrpc_referrer_id'] = array(
            'dbtype' => 'int',
            'precision' => 10,
            'attributes' => 'unsigned',
            'phptype' => 'integer',
            'null' => false,
            'default' => 0
        );
        $this->modx->map['modUser']['fields']['msrpc_pr_payroll'] = 0;
        $this->modx->map['modUser']['fieldMeta']['msrpc_pr_payroll'] = array(
            'dbtype' => 'tinyint',
            'precision' => '2',
            'attributes' => 'unsigned',
            'phptype' => 'integer',
            'null' => false,
            'default' => 0
        );
        $this->modx->loadClass('msOrder');
        $this->modx->map['msOrder']['fields']['msrpc_payroll_inc'] = 0;
        $this->modx->map['msOrder']['fieldMeta']['msrpc_payroll_inc'] = array(
            'dbtype' => 'int',
            'precision' => 10,
            'attributes' => 'unsigned',
            'phptype' => 'integer',
            'null' => false,
            'default' => 0
        );
        $this->modx->map['msOrder']['fields']['msrpc_payroll_dec'] = 0;
        $this->modx->map['msOrder']['fieldMeta']['msrpc_payroll_dec'] = array(
            'dbtype' => 'int',
            'precision' => 10,
            'attributes' => 'unsigned',
            'phptype' => 'integer',
            'null' => false,
            'default' => 0
        );
    }
}
Руслан
02 марта 2021, 16:55
0
Там много, что может быть, от ошибки при записи кеша админки до отсутствия какого-то модуля на php нужного для выполнения скрипта или вообще просто скрипты MODX в твоём браузере не хотят работать.
Стоит начать с того чтобы зайти через другой браузер попробовать.
Да, и лог ошибок можно посмотреть, может там что есть.
Руслан
02 марта 2021, 16:40
0
Кирилл, привет, только зашел сюда :)
без TV всё работает?
передал по твшкам спецу так как сам твшки не пользую я больше по бэку
Руслан
02 ноября 2020, 19:37
+1
кстати, допилил твой компонент для работы с разными аккаунтами црм, мне для системы франчайзинга понадобилось так как будет куча аккаунтов црм и в одном сеансе заказ раскидывать по франчам регионов придется
Руслан
08 октября 2020, 21:52
0
у меня в данный момент итак работы много в данный момент создаю систему франчайзинга в моей автоматизации включающей 1с, ритейлцрм и сайт hookah.pro (MODX выбрал для разработки клиент и мне пришлось за пару недель его до такой степени изучить, что даже создал им этот компонент оцененный специалистом по разработке компонентов в 120тр именно в моём исполнени основанном на моём 30ти летнем опыте программирования на разных языках)

плюс ко всему мною созданная архитектура этой автоматизации работает полностью в реальном времени и более того в 1с уже все включая менеджеров лезут только за отчетами так как всё создается и пересоздается автоматически по данным црм(заказы, оплата, реализации… и из розничных точек из ТСД(терминал сбора данных)заказы летят через 1С в црм и дальше там обрабатываются и в реальном времени обновляются в 1С и на сайте(резервы и остатки напряую нативным кодом 1С практически в реальном времени по пакетному АПИ написанному мной для сайта плюс на сайте мной реализована проверка остатка по АПИ црм при создании заказа из корзины так как в црм чуть быстрее чем на сайте происходит обновление остатка за минусом резерва прилетевшего из црм заказа в 1с тут-же отражается в црм по нему 1Сный резерв!) так как создан мной вебсервис в 1С и 1С поднята как вебсервер принимая хуки изменения сразу из црм...) и даже заказы поставщикам и перемещения по складам моими обработками создаются по расписанию по уникальным алгоритмам вычисления потребности по каждой категории товаров
Руслан
08 октября 2020, 19:30
+1
за всё время 3 реальных покупки даже по 390р. так. что пускай уж бесплатно будет ;)
Руслан
25 сентября 2020, 12:16
0
Нет финансирования, занимаюсь более насущными задачами :)
Руслан
25 июля 2020, 11:56
0
Компонент не конфликтует с доугими компонентами бонусов и удачно их дополняет :)
Руслан
20 июля 2020, 15:03
+1
Сергей, привет, это снижение цены
Руслан
31 мая 2020, 14:30
0
у нас заказчик которому супер автоматизированный и завязанный со всеми необходимыми сервисами включая црм и 1С с созданием для этого быстрого пакетного АПИ… и модх был выбран не за бесплатность(так как до этого на платных движках полная х… была реализована), а именно за гибкость и именно рево!
Руслан
30 мая 2020, 21:02
0
Привет, заявка на вывод планируется в профессиональной версии компонента где будет реализована полноценная двухуровневая партнёрка, а здесь кешбэк монетой магазина именно на покупки магазина и привод клиентов увеличивает процент кешбэка ;)
Руслан
29 мая 2020, 18:54
0
очень странные вещи ты говоришь… например мой компонент msReferralProgramCoin по себестоимости разработки(почти месяц) обошелся в 90-120тр, а продаю всего за 3990 рублей, а с напарником (который не кодил, а продвигает и подкидывает идеи для доработок улучшающих юзабилити) получаем с продажи оплатив налоги и комиссию по 1300 рублей! и я затратил эти ресурсы не зная ту зе мун или в топку ;)
Руслан
28 мая 2020, 22:52
0
В версию 1.1.11 добавлен пересчет списываемых монет при оплате монетами и при удалении товара из корзины :)
Руслан
26 мая 2020, 16:35
0
Сергей, привет!
о каком заработке идет речь?
в компоненте реализованы как сниппеты самого механизма учета так и сниппеты вывода информации о текущем проценте кешбэка покупателя и количества его монет, а также количество и процент вы можете у каждого пользователя видеть и руками поменять в панели управления сайтом на странице самого компонента.
Руслан
23 мая 2020, 04:56
0
В новой версии 1.1.9 в контекстное меню списка товаров добавлены пункты массовой установки и снятия флага участия товара в бонусной программе у выбранных в этом списке товаров.
Руслан
21 мая 2020, 01:36
0
По просьбам пользователей в новой версии 1.1.8 добавлено:
  • Две настройки приветственного бонуса при регистрации:
    1. Само количество бонусных монет зачисляемых на баланс покупателя при регистрации (по умолчанию 0).
    2. Флаг зачисления приветственных бонусов только в том случае если введен валидный промокод пригласившего, что усилит мотивацию ввода промокода пригласившего!

  • Для простоты установки и контроля флаг участия товара в бонусной программе кешбэка добавлен в саму таблицу товаров в дополнение к чекбоксу на вкладке «Свойства товара».
  • Массовое ручное начисление/списание бонусных монет с баланса пользователей.
  • В компонент добавлен пересчет бонусов к начислению и списанию и соответственно пересчет общей суммы заказа с учетом списываемых бонусных монет и стоимости доставки при редактировании заказа в панели управления сайтом!
  • Добавлена настройка количественного отношения бонусной монеты к валюте магазина с показом пользователю сколько одной единице бонусной монеты будет приходиться частей(1, 0.1, ...) валюты магазина.
в версии 1.1.9 будет добавлено:
  • Регистрация по рефссылке в дополнение к регистрации по персональному промокоду пригласившего.
Руслан
18 мая 2020, 23:21
+1
По просьбам пользователей в версии 1.1.7 добавлено:
  • Две настройки приветственного бонуса при регистрации:
    1. Само количество бонусных монет зачисляемых на баланс покупателя при регистрации (по умолчанию 0).
    2. Флаг зачисления приветственных бонусов только в том случае если введен валидный промокод пригласившего, что усилит мотивацию ввода промокода пригласившего!