瀏覽代碼

Ticket #5006 - Stripe Connect: Update integration.

AntonLV 1 年之前
父節點
當前提交
feeaeda6c7

+ 33 - 0
modules/boonex/russian/data/langs/bx_stripe_connect/ru.xml

@@ -13,10 +13,32 @@
     <string name="_bx_stripe_connect_option_pmode"><![CDATA[Режим обработки выплат]]></string>
     <string name="_bx_stripe_connect_option_pmode_direct"><![CDATA[Прямой]]></string>
     <string name="_bx_stripe_connect_option_pmode_platform"><![CDATA[Платформа]]></string>
+    <string name="_bx_stripe_connect_option_fee_single"><![CDATA[Единовременная оплата (фиксированная сумма, процент)]]></string>
+    <string name="_bx_stripe_connect_option_fee_recurring"><![CDATA[Оплата по подписке (процент)]]></string>
+
+    <!-- FORMS -->
+    <string name="_bx_stripe_connect_form_commissions_form"><![CDATA[Форма комиссий]]></string>
+    <string name="_bx_stripe_connect_form_commissions_display_add"><![CDATA[Добавить комиссию]]></string>
+    <string name="_bx_stripe_connect_form_commissions_display_edit"><![CDATA[Изменить комиссию]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_sys_name"><![CDATA[Имя]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_name"><![CDATA[Имя]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_name_err"><![CDATA[Это поле необходимо. Пожалуйста, заполните его, используя уникальное значение.]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_sys_acl_id"><![CDATA[Уровень членства]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_acl_id"><![CDATA[Уровень членства]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_acl_id_err"><![CDATA[Это поле обязательно. Пожалуйста, выберите значение.]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_sys_fee_single"><![CDATA[Единовременная оплата]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_fee_single"><![CDATA[Единовременная оплата (фиксированная сумма, процент)]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_sys_fee_recurring"><![CDATA[Оплата по подписке]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_fee_recurring"><![CDATA[Оплата по подписке (процент)]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_sys_submit"><![CDATA[Выполнить]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_submit"><![CDATA[Выполнить]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_sys_cancel"><![CDATA[Отменить]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_cancel"><![CDATA[Отменить]]></string>
 
     <!-- PAGES and BLOCKS -->
     <string name="_bx_stripe_connect_page_title_sys_connected_activity"><![CDATA[Активность подключенного аккаунта]]></string>
     <string name="_bx_stripe_connect_page_title_connected_activity"><![CDATA[Активность подключенного аккаунта]]></string>
+    <string name="_bx_stripe_connect_page_block_title_reporting_chart"><![CDATA[Отчетная диаграмма (в стадии разработки)]]></string>
     <string name="_bx_stripe_connect_page_block_title_payments"><![CDATA[Платежи]]></string>
     <string name="_bx_stripe_connect_page_block_title_balances"><![CDATA[Остатки]]></string>
     <string name="_bx_stripe_connect_page_block_title_notifications"><![CDATA[Уведомления]]></string>
@@ -37,6 +59,16 @@
     <string name="_bx_stripe_connect_grid_column_title_changed"><![CDATA[Изменен]]></string>
     <string name="_bx_stripe_connect_action_title_delete"><![CDATA[Удалить]]></string>
 
+    <string name="_bx_stripe_connect_grid_column_title_cms_name"><![CDATA[Имя]]></string>
+    <string name="_bx_stripe_connect_grid_column_title_cms_acl_id"><![CDATA[Членство]]></string>
+    <string name="_bx_stripe_connect_grid_column_title_cms_fee_single"><![CDATA[Единовременная оплата]]></string>
+    <string name="_bx_stripe_connect_grid_column_title_cms_fee_recurring"><![CDATA[Оплата по подписке]]></string>
+    <string name="_bx_stripe_connect_grid_action_title_cms_add"><![CDATA[Добавить]]></string>
+    <string name="_bx_stripe_connect_grid_action_title_cms_edit"><![CDATA[Изменить]]></string>
+    <string name="_bx_stripe_connect_grid_action_title_cms_delete"><![CDATA[Удалить]]></string>
+    <string name="_bx_stripe_connect_popup_title_cms_add"><![CDATA[Добавить комиссию]]></string>
+    <string name="_bx_stripe_connect_popup_title_cms_edit"><![CDATA[Изменить комиссию]]></string>
+
     <!-- OTHER -->
     <string name="_bx_stripe_connect_btn_account_create"><![CDATA[Создать подключенную учетную запись]]></string>
     <string name="_bx_stripe_connect_btn_account_delete"><![CDATA[Удалить подключенную учетную запись]]></string>
@@ -44,5 +76,6 @@
     <string name="_bx_stripe_connect_msg_create_account"><![CDATA[Сначала вам необходимо <a href="{0}"><b>создать</b></a> подключенную учетную запись.]]></string>
     <string name="_bx_stripe_connect_err_delete"><![CDATA[Невозможно удалить аккаунт.]]></string>
     <string name="_bx_stripe_connect_err_perform"><![CDATA[Не удается выполнить действие. Пожалуйста сообщите.]]></string>
+    <string name="_bx_stripe_connect_err_non_unique_acl"><![CDATA[Комиссия для выбранного уровеня членства уже существует.]]></string>
     <string name="_bx_stripe_connect_log"><![CDATA[Stripe Connect]]></string>
 </resources>

+ 5 - 0
modules/boonex/stripe_connect/classes/BxStripeConnectApi.php

@@ -157,6 +157,11 @@ class BxStripeConnectApi extends BxDol
                             'capture_payments' => true,
                         ],
                     ],
+                    /*
+                    'reporting_chart' => [
+                        'enabled' => true
+                    ],
+                    */
                 ]
             ]);
         }

+ 51 - 7
modules/boonex/stripe_connect/classes/BxStripeConnectConfig.php

@@ -31,6 +31,7 @@ class BxStripeConnectConfig extends BxBaseModGeneralConfig
 
             // database tables
             'TABLE_ENTRIES' => $aModule['db_prefix'] . 'accounts',
+            'TABLE_COMMISSIONS' => $aModule['db_prefix'] . 'commissions',
 
             // database fields
             'FIELD_ID' => 'id',
@@ -42,6 +43,12 @@ class BxStripeConnectConfig extends BxBaseModGeneralConfig
             'FIELD_TEST_ACCOUNT_ID' => 'test_account_id',
             'FIELD_TEST_DETAILS' => 'test_details',
 
+            'FIELD_CMS_ID' => 'id',
+            'FIELD_CMS_NAME' => 'name',
+            'FIELD_CMS_ACL_ID' => 'acl_id',
+            'FIELD_CMS_FEE_SINGLE' => 'fee_single',
+            'FIELD_CMS_FEE_RECURRING' => 'fee_recurring',
+
             // page URIs
             'URL_API_AUTHORIZE' => 'https://connect.stripe.com/oauth/authorize',
             'URL_API_DEAUTHORIZE' => 'https://connect.stripe.com/oauth/deauthorize',
@@ -61,7 +68,11 @@ class BxStripeConnectConfig extends BxBaseModGeneralConfig
             'PARAM_FEE_RECURRING' => 'bx_stripe_connect_fee_recurring',
 
             // objects
+            'OBJECT_FORM_COMMISSIONS' => 'bx_stripe_connect_form_commissions',
+            'OBJECT_FORM_COMMISSIONS_DISPLAY_ADD' => 'bx_stripe_connect_form_commissions_add',
+            'OBJECT_FORM_COMMISSIONS_DISPLAY_EDIT' => 'bx_stripe_connect_form_commissions_edit',
             'OBJECT_GRID_ACCOUNTS' => 'bx_stripe_connect_accounts',
+            'OBJECT_GRID_COMMISSIONS' => 'bx_stripe_connect_commissions',
 
             // Related Stripe payment provider name in Payments module 
             'STRIPE' => 'stripe_connect',
@@ -82,6 +93,10 @@ class BxStripeConnectConfig extends BxBaseModGeneralConfig
             'balances' => $sPrefix . '-balances',
             'notification-banner' => $sPrefix . '-notification-banner',
             'payments' => $sPrefix . '-payments',
+            'reporting-chart' => $sPrefix . '-reporting-chart',
+
+            'commissions_form' => $sPrefix . '-commissions-form-',
+            'commissions_popup' => $sPrefix . '-commissions-popup-',
         ];
 
         $this->_sAccountType = 'standard'; //'express'
@@ -123,21 +138,30 @@ class BxStripeConnectConfig extends BxBaseModGeneralConfig
         return $this->_sPayMode;
     }
 
-    public function getFee($sType, $fAmount = 0)
+    public function getFee($sType, $iVendorId, $fAmount = 0)
     {
         $iResult = 0;
 
+        $aVendorCms = [];
+        if(($aVendorAcl = BxDolAcl::getInstance()->getMemberMembershipInfo($iVendorId)) && is_array($aVendorAcl))
+            $aVendorCms = $this->_oDb->getCommissions(['type' => 'acl_id', 'acl_id' => (int)$aVendorAcl['id']]);
+        $bVendorCms = !empty($aVendorCms) && is_array($aVendorCms);
+
         switch($sType) {
             case BX_PAYMENT_TYPE_SINGLE:
-                $mixedValue = getParam($this->CNF['PARAM_FEE_SINGLE']);
-                if(is_numeric($mixedValue))
-                    $iResult = (int)(100 * (float)$mixedValue);
-                else if(strpos($mixedValue, '%') !== false)
-                    $iResult = (int)round($fAmount * (int)trim($mixedValue, '%') / 100);
+                if($bVendorCms && !empty($aVendorCms['fee_single']))
+                    $iResult = $this->_getFeeSingle($aVendorCms['fee_single'], $fAmount);
+
+                if(!$iResult && ($mixedFee = getParam($this->CNF['PARAM_FEE_SINGLE'])))
+                    $iResult = $this->_getFeeSingle($mixedFee, $fAmount);
                 break;
 
             case BX_PAYMENT_TYPE_RECURRING:
-                $iResult = (int)trim(getParam($this->CNF['PARAM_FEE_RECURRING']), '%');
+                if($bVendorCms && !empty($aVendorCms['fee_recurring']))
+                    $iResult = $this->_getFeeRecurring($aVendorCms['fee_recurring']);
+
+                if(!$iResult && ($mixedFee = getParam($this->CNF['PARAM_FEE_RECURRING'])))
+                    $iResult = $this->_getFeeRecurring($mixedFee);
                 break;
         }
 
@@ -151,6 +175,26 @@ class BxStripeConnectConfig extends BxBaseModGeneralConfig
 
         return isset($this->_aHtmlIds[$sKey]) ? $this->_aHtmlIds[$sKey] : '';
     }
+
+    protected function _getFeeSingle($mixedFee, $fAmount = false)
+    {
+        $iResult = 0;
+
+        if(strpos($mixedFee, '%') !== false) {
+            $iResult = (int)trim($mixedFee, '%');
+            if($fAmount !== false)
+                $iResult = (int)round($fAmount * $iResult / 100);
+        }
+        else if(is_numeric($mixedFee))
+            $iResult = (int)(100 * (float)$mixedFee);
+
+        return $iResult;
+    }
+
+    protected function _getFeeRecurring($mixedFee)
+    {
+        return (int)trim($mixedFee, '%');
+    }
 }
 
 /** @} */

+ 54 - 0
modules/boonex/stripe_connect/classes/BxStripeConnectDb.php

@@ -107,6 +107,60 @@ class BxStripeConnectDb extends BxBaseModConnectDb
             'profile_id' => $iProfileId,
     	]) > 0;
     }
+
+    /*
+     * Commissions methods
+     */
+    public function getCommissions($aParams = [])
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+    	$aMethod = ['name' => 'getAll', 'params' => [0 => 'query']];
+
+        $sSelectClause = "`tc`.*";
+        $sWhereClause = $sOrderClause = "";
+        if(!empty($aParams['type']))
+            switch($aParams['type']) {
+                case 'max_order':
+                    $aMethod['name'] = 'getOne';
+                    $aMethod['params'][1] = [];
+
+                    $sSelectClause = "IFNULL(MAX(`tc`.`order`), 0)";
+                    break;
+
+                case 'id':
+                    $aMethod['name'] = 'getRow';
+                    $aMethod['params'][1] = [
+                        'id' => $aParams['id']
+                    ];
+
+                    $sWhereClause = " AND `tc`.`id`=:id";
+                    break;
+
+                case 'acl_id':
+                    $aMethod['name'] = 'getRow';
+                    $aMethod['params'][1] = [
+                        'acl_id' => $aParams['acl_id']
+                    ];
+
+                    $sWhereClause = " AND `tc`.`acl_id`=:acl_id";
+                    break;
+
+                case 'all':
+                    if(!empty($aParams['active'])) 
+                        $sWhereClause = " AND `tc`.`active`='1'";
+                    break;
+            }
+
+        if(!empty($sOrderClause))
+            $sOrderClause = " ORDER BY " . $sOrderClause;
+
+        $aMethod['params'][0] = "SELECT " . $sSelectClause . "
+            FROM `" . $CNF['TABLE_COMMISSIONS'] . "` AS `tc`
+            WHERE 1" . $sWhereClause . $sOrderClause;
+
+        return call_user_func_array([$this, $aMethod['name']], $aMethod['params']);
+    }
 }
 
 /** @} */

+ 41 - 0
modules/boonex/stripe_connect/classes/BxStripeConnectFormCommissions.php

@@ -0,0 +1,41 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    StripeConnect Stripe Connect
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxStripeConnectFormCommissions extends BxTemplStudioFormView
+{
+    protected $_sModule;
+    protected $_oModule;
+
+    function __construct($aInfo, $oTemplate = false)
+    {
+        parent::__construct($aInfo, $oTemplate);
+        
+        $this->_sModule = 'bx_stripe_connect';
+        $this->_oModule = BxDolModule::getInstance($this->_sModule);
+
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        if(($sKey = $CNF['FIELD_CMS_ACL_ID']) && isset($this->aInputs[$sKey])) {
+            $this->aInputs[$sKey]['values'] = [
+                ['key' => '0', 'value' => _t('_Select_one')]
+            ];
+
+            $aLevels = BxDolAcl::getInstance()->getMemberships(false, true, false, true);
+            foreach($aLevels as $iLevelId => $sLevelTitle)
+               $this->aInputs[$sKey]['values'][] = [
+                   'key' => $iLevelId, 
+                   'value' => _t($sLevelTitle)
+                ];
+        }
+    }
+}
+
+/** @} */

+ 157 - 0
modules/boonex/stripe_connect/classes/BxStripeConnectGridCommissions.php

@@ -0,0 +1,157 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    StripeConnect Stripe Connect
+ * @ingroup     UnaModules
+ * 
+ * @{
+ */
+
+class BxStripeConnectGridCommissions extends BxTemplGrid
+{
+    protected $_sModule;
+    protected $_oModule;
+
+    protected $_aAclLevels;
+
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        $this->_sModule = 'bx_stripe_connect';
+        $this->_oModule = BxDolModule::getInstance($this->_sModule);
+
+        parent::__construct ($aOptions, $oTemplate);
+
+        $this->_aAclLevels = BxDolAcl::getInstance()->getMemberships(false, true, true, true);
+    }
+
+    public function performActionAdd()
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $sAction = 'add';
+
+        $oForm = $this->_getFormObject($sAction);
+        $oForm->initChecker();
+        if($oForm->isSubmittedAndValid()) {
+            $sFormMethod = $oForm->aFormAttrs['method'];
+
+            $sName = $oForm->getCleanValue($CNF['FIELD_CMS_NAME']);
+            $sName = uriGenerate(strtolower($sName), $CNF['TABLE_COMMISSIONS'], $CNF['FIELD_CMS_NAME']);
+
+            $iAclId = (int)$oForm->getCleanValue($CNF['FIELD_CMS_ACL_ID']);
+            $aCommissionByAcl = $this->_oModule->_oDb->getCommissions(['type' => 'acl_id', 'acl_id' => $iAclId]);
+            if(!empty($aCommissionByAcl) && is_array($aCommissionByAcl))
+                return echoJson(['msg' => _t('_bx_stripe_connect_err_non_unique_acl'), 'blink' => $aCommissionByAcl[$CNF['FIELD_CMS_ID']]]);
+
+            $aValsToAdd = [
+                'name' => $sName,
+                'active' => 1,
+                'order' => $this->_oModule->_oDb->getCommissions(['type' => 'max_order']) + 1
+            ];
+
+            if(($iId = $oForm->insert($aValsToAdd)) !== false)
+                $aRes = ['grid' => $this->getCode(false), 'blink' => $iId];
+            else
+                $aRes = ['msg' => _t('_bx_stripe_connect_err_perform')];
+
+            return echoJson($aRes);
+        }
+
+        $sId = $this->_oModule->_oConfig->getHtmlIds('commissions_popup') . $sAction;
+        $sTitle = _t('_bx_payment_popup_title_cms_' . $sAction);
+        $sContent = BxTemplFunctions::getInstance()->popupBox($sId, $sTitle, $this->_oModule->_oTemplate->parseHtmlByName('commissions_form.html', [
+            'form_id' => $oForm->aFormAttrs['id'],
+            'form' => $oForm->getCode(true),
+            'object' => $this->_sObject,
+            'action' => $sAction
+        ]));
+
+        echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
+    }
+
+    public function performActionEdit()
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $sAction = 'edit';
+
+        $iId = $this->_getId();
+        $aCommission = $this->_oModule->_oDb->getCommissions(['type' => 'id', 'id' => $iId]);
+        if(empty($aCommission) || !is_array($aCommission))
+            return echoJson([]);
+
+        $oForm = $this->_getFormObject($sAction, $iId);
+        $oForm->initChecker($aCommission);
+        if($oForm->isSubmittedAndValid()) {
+            $aValsToAdd = [];
+
+            $sName = $oForm->getCleanValue($CNF['FIELD_CMS_NAME']);
+            if(strcmp($sName, $aCommission[$CNF['FIELD_CMS_NAME']]) != 0)
+                $aValsToAdd[$CNF['FIELD_CMS_NAME']] = uriGenerate(strtolower($sName), $CNF['TABLE_COMMISSIONS'], $CNF['FIELD_CMS_NAME']);
+
+            $iAclId = (int)$oForm->getCleanValue($CNF['FIELD_CMS_ACL_ID']);
+            if($iAclId != (int)$aCommission[$CNF['FIELD_CMS_ACL_ID']]) {
+                $aCommissionByAcl = $this->_oModule->_oDb->getCommissions(['type' => 'acl_id', 'acl_id' => $iAclId]);
+                if(!empty($aCommissionByAcl) && is_array($aCommissionByAcl))
+                    return echoJson(['msg' => _t('_bx_stripe_connect_err_non_unique_acl'), 'blink' => $aCommissionByAcl[$CNF['FIELD_CMS_ID']]]);
+            }
+
+            if($oForm->update($iId, $aValsToAdd) !== false)
+                $aRes = ['grid' => $this->getCode(false), 'blink' => $iId];
+            else
+                $aRes = ['msg' => _t('_bx_payment_err_cannot_perform')];
+
+            return echoJson($aRes);
+        }
+
+        $sId = $this->_oModule->_oConfig->getHtmlIds('commissions_popup') . $sAction;
+        $sTitle = _t('_bx_payment_popup_title_cms_' . $sAction);
+        $sContent = BxTemplFunctions::getInstance()->popupBox($sId, $sTitle, $this->_oModule->_oTemplate->parseHtmlByName('commissions_form.html', [
+            'form_id' => $oForm->aFormAttrs['id'],
+            'form' => $oForm->getCode(true),
+            'object' => $this->_sObject,
+            'action' => $sAction
+        ]));
+
+        echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
+    }
+
+    protected function _getCellAclId($mixedValue, $sKey, $aField, $aRow)
+    {
+        $mixedValue = isset($this->_aAclLevels[$mixedValue]) > 0 ? $this->_aAclLevels[$mixedValue] : _t('_all');
+
+        return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
+    }
+
+    protected function _getFormObject($sAction, $iId = 0)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $aParams = ['o' => $this->_sObject, 'a' => $sAction];
+        if(!empty($iId))
+            $aParams['id'] = $iId;
+
+        $oForm = BxDolForm::getObjectInstance($CNF['OBJECT_FORM_COMMISSIONS'], $CNF['OBJECT_FORM_COMMISSIONS_DISPLAY_' . strtoupper($sAction)]);
+        $oForm->setId($this->_oModule->_oConfig->getHtmlIds('commissions_form') . $sAction);
+        $oForm->setAction(BX_DOL_URL_ROOT . bx_append_url_params('grid.php', $aParams));
+
+        return $oForm;
+    }
+
+    protected function _getId()
+    {
+        $aIds = bx_get('ids');
+        if(!empty($aIds) && is_array($aIds)) 
+            return (int)reset($aIds);
+
+        $iId = bx_get('id');
+        if($iId !== false) 
+            return (int)$iId;
+
+        return false;
+    }
+}
+
+/** @} */

+ 14 - 2
modules/boonex/stripe_connect/classes/BxStripeConnectModule.php

@@ -114,6 +114,18 @@ class BxStripeConnectModule extends BxBaseModGeneralModule
         return $this->_oTemplate->getBlockPayments();
     }
 
+    /*
+     * Isn't supported with the current SDK. It's still in Beta mode.
+     * https://docs.stripe.com/connect/supported-embedded-components/reporting-chart
+     */
+    public function serviceGetBlockReportingChart()
+    {
+        if(!isLogged())
+            return '';
+
+        return $this->_oTemplate->getBlockReportingChart();
+    }
+
     public function serviceGetBlockBalances()
     {
         if(!isLogged())
@@ -310,7 +322,7 @@ class BxStripeConnectModule extends BxBaseModGeneralModule
                     foreach($aParams['session_params']['line_items'] as $aLineItem)
                         $fAmount += (float)$aLineItem['price_data']['unit_amount'] * (int)$aLineItem['quantity'];
 
-                    if($fAmount && ($fAmount = $this->_oConfig->getFee(BX_PAYMENT_TYPE_SINGLE, $fAmount))) {
+                    if($fAmount && ($fAmount = $this->_oConfig->getFee(BX_PAYMENT_TYPE_SINGLE, $iVendorId, $fAmount))) {
                         if(!isset($aParams['session_params']['payment_intent_data']))
                             $aParams['session_params']['payment_intent_data'] = [];
 
@@ -323,7 +335,7 @@ class BxStripeConnectModule extends BxBaseModGeneralModule
                     foreach($aParams['session_params']['line_items'] as $aLineItem)
                         $fAmount += (float)$aLineItem['price_data']['unit_amount'] * (int)$aLineItem['quantity'];
 
-                    if($fAmount && ($fAmount = $this->_oConfig->getFee(BX_PAYMENT_TYPE_RECURRING, $fAmount))) {
+                    if($fAmount && ($fAmount = $this->_oConfig->getFee(BX_PAYMENT_TYPE_RECURRING, $iVendorId, $fAmount))) {
                         if(!isset($aParams['session_params']['subscription_data']))
                             $aParams['session_params']['subscription_data'] = [];
 

+ 13 - 3
modules/boonex/stripe_connect/classes/BxStripeConnectStudioPage.php

@@ -9,8 +9,6 @@
  * @{
  */
 
-define('BX_DOL_STUDIO_MOD_TYPE_ACCOUNTS', 'accounts');
-
 class BxStripeConnectStudioPage extends BxTemplStudioModule
 {
     protected $_sModule;
@@ -23,7 +21,10 @@ class BxStripeConnectStudioPage extends BxTemplStudioModule
         $this->_sModule = 'bx_stripe_connect';
     	$this->_oModule = BxDolModule::getInstance($this->_sModule);
 
-        $this->aMenuItems[BX_DOL_STUDIO_MOD_TYPE_ACCOUNTS] = array('name' => BX_DOL_STUDIO_MOD_TYPE_ACCOUNTS, 'icon' => 'users', 'title' => '_bx_stripe_connect_menu_item_title_accounts');
+        $this->aMenuItems = array_merge($this->aMenuItems, [
+            'accounts' => ['name' => 'accounts', 'icon' => 'users', 'title' => '_bx_stripe_connect_menu_item_title_accounts'],
+            'commissions' => ['name' => 'commissions', 'icon' => 'percent', 'title' => '_bx_stripe_connect_menu_item_title_commissions']
+        ]);
     }
 
     protected function getAccounts()
@@ -34,6 +35,15 @@ class BxStripeConnectStudioPage extends BxTemplStudioModule
 
         return $oGrid->getCode();
     }
+
+    protected function getCommissions()
+    {
+        $oGrid = BxDolGrid::getObjectInstance($this->_oModule->_oConfig->CNF['OBJECT_GRID_COMMISSIONS'], BxDolStudioTemplate::getInstance());
+        if(!$oGrid)
+            return '';
+
+        return $oGrid->getCode();
+    }
 }
 
 /** @} */

+ 11 - 0
modules/boonex/stripe_connect/classes/BxStripeConnectTemplate.php

@@ -84,6 +84,17 @@ class BxStripeConnectTemplate extends BxBaseModGeneralTemplate
         ]);
     }
 
+    public function getBlockReportingChart()
+    {
+        $sEmbed = 'reporting-chart';
+
+        return $this->parseHtmlByName('embed_block.html', [
+            'js_object' => $this->_oConfig->getJsObject('embeds'),
+            'html_id' => $this->_oConfig->getHtmlIds($sEmbed),
+            'embed' => $sEmbed
+        ]);
+    }
+
     public function getBlockPayments()
     {
         $sEmbed = 'payments';

+ 34 - 2
modules/boonex/stripe_connect/install/langs/en.xml

@@ -13,12 +13,32 @@
     <string name="_bx_stripe_connect_option_pmode"><![CDATA[Payments processing mode]]></string>
     <string name="_bx_stripe_connect_option_pmode_direct"><![CDATA[Direct]]></string>
     <string name="_bx_stripe_connect_option_pmode_platform"><![CDATA[Platform]]></string>
-    <string name="_bx_stripe_connect_option_fee_single"><![CDATA[One-time fee (in cents, percent)]]></string>
-    <string name="_bx_stripe_connect_option_fee_recurring"><![CDATA[Subscription fee (percent only)]]></string>
+    <string name="_bx_stripe_connect_option_fee_single"><![CDATA[One-time fee (fixed amount, percent)]]></string>
+    <string name="_bx_stripe_connect_option_fee_recurring"><![CDATA[Subscription fee (percent)]]></string>
+
+    <!-- FORMS -->
+    <string name="_bx_stripe_connect_form_commissions_form"><![CDATA[Commissions Form]]></string>
+    <string name="_bx_stripe_connect_form_commissions_display_add"><![CDATA[Add Commission Display]]></string>
+    <string name="_bx_stripe_connect_form_commissions_display_edit"><![CDATA[Edit Commission Display]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_sys_name"><![CDATA[Name]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_name"><![CDATA[Name]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_name_err"><![CDATA[This field is essential. Please, fill it in with unique value.]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_sys_acl_id"><![CDATA[Membership Level]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_acl_id"><![CDATA[Membership Level]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_acl_id_err"><![CDATA[This field is essential. Please, select a value.]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_sys_fee_single"><![CDATA[One-time fee]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_fee_single"><![CDATA[One-time fee (fixed amount, percent)]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_sys_fee_recurring"><![CDATA[Subscription fee]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_fee_recurring"><![CDATA[Subscription fee (percent)]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_sys_submit"><![CDATA[Submit]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_submit"><![CDATA[Submit]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_sys_cancel"><![CDATA[Cancel]]></string>
+    <string name="_bx_stripe_connect_form_commissions_input_cancel"><![CDATA[Cancel]]></string>
 
     <!-- PAGES and BLOCKS -->
     <string name="_bx_stripe_connect_page_title_sys_connected_activity"><![CDATA[Connected Account Activity]]></string>
     <string name="_bx_stripe_connect_page_title_connected_activity"><![CDATA[Connected Account Activity]]></string>
+    <string name="_bx_stripe_connect_page_block_title_reporting_chart"><![CDATA[Reporting Chart (under development)]]></string>
     <string name="_bx_stripe_connect_page_block_title_payments"><![CDATA[Payments]]></string>
     <string name="_bx_stripe_connect_page_block_title_balances"><![CDATA[Balances]]></string>
     <string name="_bx_stripe_connect_page_block_title_notifications"><![CDATA[Notifications]]></string>
@@ -26,6 +46,7 @@
 
     <!-- MENUS -->
     <string name="_bx_stripe_connect_menu_item_title_accounts"><![CDATA[Accounts]]></string>
+    <string name="_bx_stripe_connect_menu_item_title_commissions"><![CDATA[Commissions]]></string>
     <string name="_bx_stripe_connect_menu_item_title_system_connected_activity"><![CDATA[Connected Activity]]></string>
     <string name="_bx_stripe_connect_menu_item_title_connected_activity"><![CDATA[Connected Activity]]></string>
                 
@@ -39,6 +60,16 @@
     <string name="_bx_stripe_connect_grid_column_title_changed"><![CDATA[Changed]]></string>
     <string name="_bx_stripe_connect_action_title_delete"><![CDATA[Delete]]></string>
 
+    <string name="_bx_stripe_connect_grid_column_title_cms_name"><![CDATA[Name]]></string>
+    <string name="_bx_stripe_connect_grid_column_title_cms_acl_id"><![CDATA[Membership]]></string>
+    <string name="_bx_stripe_connect_grid_column_title_cms_fee_single"><![CDATA[One-time fee]]></string>
+    <string name="_bx_stripe_connect_grid_column_title_cms_fee_recurring"><![CDATA[Subscription fee]]></string>
+    <string name="_bx_stripe_connect_grid_action_title_cms_add"><![CDATA[Add]]></string>
+    <string name="_bx_stripe_connect_grid_action_title_cms_edit"><![CDATA[Edit]]></string>
+    <string name="_bx_stripe_connect_grid_action_title_cms_delete"><![CDATA[Delete]]></string>
+    <string name="_bx_stripe_connect_popup_title_cms_add"><![CDATA[Add Commission]]></string>
+    <string name="_bx_stripe_connect_popup_title_cms_edit"><![CDATA[Edit Commission]]></string>
+
     <!-- OTHER -->
     <string name="_bx_stripe_connect_btn_account_create"><![CDATA[Create Connected Account]]></string>
     <string name="_bx_stripe_connect_btn_account_delete"><![CDATA[Delete Connected Account]]></string>
@@ -46,5 +77,6 @@
     <string name="_bx_stripe_connect_msg_create_account"><![CDATA[You need to <a href="{0}"><b>create</b></a> a connected account first.]]></string>
     <string name="_bx_stripe_connect_err_delete"><![CDATA[Cannot delete account.]]></string>
     <string name="_bx_stripe_connect_err_perform"><![CDATA[Cannot perform the action. Please report.]]></string>
+    <string name="_bx_stripe_connect_err_non_unique_acl"><![CDATA[Commission for selected membership level already exists.]]></string>
     <string name="_bx_stripe_connect_log"><![CDATA[Stripe Connect]]></string>
 </resources>

+ 3 - 3
modules/boonex/stripe_connect/install/sql/disable.sql

@@ -17,9 +17,9 @@ DELETE FROM `sys_menu_items` WHERE `module` = @sName; -- OR `set_name` IN();
 
 
 -- GRIDS
-DELETE FROM `sys_objects_grid` WHERE `object` IN ('bx_stripe_connect_accounts');
-DELETE FROM `sys_grid_fields` WHERE `object` IN ('bx_stripe_connect_accounts');
-DELETE FROM `sys_grid_actions` WHERE `object` IN ('bx_stripe_connect_accounts');
+DELETE FROM `sys_objects_grid` WHERE `object` IN ('bx_stripe_connect_accounts', 'bx_stripe_connect_commissions');
+DELETE FROM `sys_grid_fields` WHERE `object` IN ('bx_stripe_connect_accounts', 'bx_stripe_connect_commissions');
+DELETE FROM `sys_grid_actions` WHERE `object` IN ('bx_stripe_connect_accounts', 'bx_stripe_connect_commissions');
 
 
 -- ALERTS

+ 21 - 1
modules/boonex/stripe_connect/install/sql/enable.sql

@@ -27,6 +27,7 @@ INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module
 ('bx_stripe_connect_activity', 'connected-activity', '_bx_stripe_connect_page_title_sys_connected_activity', '_bx_stripe_connect_page_title_connected_activity', @sName, 12, 2147483647, 0, '', '', '', '', 0, 1, 0, 'BxStripeConnectPageActivity', 'modules/boonex/stripe_connect/classes/BxStripeConnectPageActivity.php');
 
 INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_stripe_connect_activity', 0, @sName, '_bx_stripe_connect_page_block_title_reporting_chart', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:17:"bx_stripe_connect";s:6:"method";s:25:"get_block_reporting_chart";}', 0, 0, 0, 1),
 ('bx_stripe_connect_activity', 2, @sName, '_bx_stripe_connect_page_block_title_payments', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:17:"bx_stripe_connect";s:6:"method";s:18:"get_block_payments";}', 0, 0, 1, 1),
 ('bx_stripe_connect_activity', 3, @sName, '_bx_stripe_connect_page_block_title_balances', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:17:"bx_stripe_connect";s:6:"method";s:18:"get_block_balances";}', 0, 0, 1, 1),
 ('bx_stripe_connect_activity', 3, @sName, '_bx_stripe_connect_page_block_title_notifications', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:17:"bx_stripe_connect";s:6:"method";s:23:"get_block_notifications";}', 0, 0, 1, 2);
@@ -38,7 +39,7 @@ INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `tit
 ('sys_account_dashboard', @sName, 'connected-activity', '_bx_stripe_connect_menu_item_title_system_connected_activity', '_bx_stripe_connect_menu_item_title_connected_activity', 'page.php?i=connected-activity', '', '', 'cc-stripe col-blue1', '', '', 2147483646, 1, 0, 1, @iAccountDashboardMenuOrder + 1);
 
 
--- GRIDS: Manage
+-- GRIDS: Manage accounts
 INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_mode`, `sorting_fields`, `visible_for_levels`, `override_class_name`, `override_class_file`) VALUES
 ('bx_stripe_connect_accounts', 'Sql', 'SELECT * FROM `bx_stripe_connect_accounts`', 'bx_stripe_connect_accounts', 'id', '', '', 20, NULL, 'start', '', 'live_account_id,test_account_id', 'auto', 'live_account_id,test_account_id', 128, 'BxStripeConnectGridAccounts', 'modules/boonex/stripe_connect/classes/BxStripeConnectGridAccounts.php');
 
@@ -58,6 +59,25 @@ INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon
 ('bx_stripe_connect_accounts', 'bulk', 'delete', '_bx_stripe_connect_action_title_delete', '', 0, 1, 1);
 
 
+-- GRIDS: Manage commissions
+INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `show_total_count`, `override_class_name`, `override_class_file`) VALUES
+('bx_stripe_connect_commissions', 'Sql', 'SELECT * FROM `bx_stripe_connect_commissions` WHERE 1 ', 'bx_stripe_connect_commissions', 'id', 'order', 'active', '', 100, NULL, 'start', '', 'name', '', 'auto', '', '', 192, 1, 'BxStripeConnectGridCommissions', 'modules/boonex/stripe_connect/classes/BxStripeConnectGridCommissions.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
+('bx_stripe_connect_commissions', 'order', '', '2%', 0, '0', '', 1),
+('bx_stripe_connect_commissions', 'switcher', '', '8%', 0, '0', '', 2),
+('bx_stripe_connect_commissions', 'name', '_bx_stripe_connect_grid_column_title_cms_name', '25%', 1, '16', '', 3),
+('bx_stripe_connect_commissions', 'acl_id', '_bx_stripe_connect_grid_column_title_cms_acl_id', '25%', 0, '16', '', 4),
+('bx_stripe_connect_commissions', 'fee_single', '_bx_stripe_connect_grid_column_title_cms_fee_single', '10%', 0, '0', '', 5),
+('bx_stripe_connect_commissions', 'fee_recurring', '_bx_stripe_connect_grid_column_title_cms_fee_recurring', '10%', 0, '0', '', 6),
+('bx_stripe_connect_commissions', 'actions', '', '20%', 0, '0', '', 7);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `order`) VALUES
+('bx_stripe_connect_commissions', 'independent', 'add', '_bx_stripe_connect_grid_action_title_cms_add', '', 0, 0, 1),
+('bx_stripe_connect_commissions', 'bulk', 'delete', '_bx_stripe_connect_grid_action_title_cms_delete', '', 0, 1, 1),
+('bx_stripe_connect_commissions', 'single', 'edit', '_bx_stripe_connect_grid_action_title_cms_edit', 'pencil-alt', 1, 0, 1),
+('bx_stripe_connect_commissions', 'single', 'delete', '_bx_stripe_connect_grid_action_title_cms_delete', 'remove', 1, 1, 2);
+
 -- ALERTS
 INSERT INTO `sys_alerts_handlers` (`name`, `class`, `file`, `service_call`) VALUES 
 (@sName, 'BxStripeConnectAlertsResponse', 'modules/boonex/stripe_connect/classes/BxStripeConnectAlertsResponse.php', '');

+ 50 - 1
modules/boonex/stripe_connect/install/sql/install.sql

@@ -15,10 +15,59 @@ CREATE TABLE IF NOT EXISTS `bx_stripe_connect_accounts` (
   UNIQUE KEY `profile_id` (`profile_id`)
 );
 
--- Logs Objects
+CREATE TABLE IF NOT EXISTS `bx_stripe_connect_commissions` (
+  `id` int(11) NOT NULL auto_increment,
+  `name` varchar(64) NOT NULL default '',
+  `acl_id` int(11) NOT NULL default '0',
+  `fee_single` varchar(8) NOT NULL default '',
+  `fee_recurring` varchar(8) NOT NULL default '',
+  `active` tinyint(4) NOT NULL default '0',
+  `order` tinyint(4) NOT NULL default '0',
+  PRIMARY KEY(`id`),
+  UNIQUE KEY `name`(`name`)
+);
+
+
+-- FORMS
+INSERT INTO `sys_objects_form` (`object`, `module`, `title`, `action`, `form_attrs`, `submit_name`, `table`, `key`, `uri`, `uri_title`, `params`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES
+('bx_stripe_connect_form_commissions', @sName, '_bx_stripe_connect_form_commissions_form', '', '', 'do_submit', 'bx_stripe_connect_commissions', 'id', '', '', '', 0, 1, 'BxPaymentFormCommissions', 'modules/boonex/payment/classes/BxPaymentFormCommissions.php');
+
+INSERT INTO `sys_form_displays` (`display_name`, `module`, `object`, `title`, `view_mode`) VALUES
+('bx_stripe_connect_form_commissions_add', @sName, 'bx_stripe_connect_form_commissions', '_bx_stripe_connect_form_commissions_display_add', 0),
+('bx_stripe_connect_form_commissions_edit', @sName, 'bx_stripe_connect_form_commissions', '_bx_stripe_connect_form_commissions_display_edit', 0);
+
+INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `checked`, `type`, `caption_system`, `caption`, `info`, `required`, `collapsed`, `html`, `attrs`, `attrs_tr`, `attrs_wrapper`, `checker_func`, `checker_params`, `checker_error`, `db_pass`, `db_params`, `editable`, `deletable`) VALUES
+('bx_stripe_connect_form_commissions', @sName, 'name', '0', '', 0, 'text', '_bx_stripe_connect_form_commissions_input_sys_name', '_bx_stripe_connect_form_commissions_input_name', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_stripe_connect_form_commissions_input_name_err', 'Xss', '', 0, 0),
+('bx_stripe_connect_form_commissions', @sName, 'acl_id', '0', '', 0, 'select', '_bx_stripe_connect_form_commissions_input_sys_acl_id', '_bx_stripe_connect_form_commissions_input_acl_id', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_stripe_connect_form_commissions_input_acl_id_err', 'Int', '', 0, 0),
+('bx_stripe_connect_form_commissions', @sName, 'fee_single', '0', '', 0, 'text', '_bx_stripe_connect_form_commissions_input_sys_fee_single', '_bx_stripe_connect_form_commissions_input_fee_single', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
+('bx_stripe_connect_form_commissions', @sName, 'fee_recurring', '0', '', 0, 'text', '_bx_stripe_connect_form_commissions_input_sys_fee_recurring', '_bx_stripe_connect_form_commissions_input_fee_recurring', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
+('bx_stripe_connect_form_commissions', @sName, 'controls', '', 'do_submit,do_cancel', 0, 'input_set', '', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
+('bx_stripe_connect_form_commissions', @sName, 'do_submit', '_bx_stripe_connect_form_commissions_input_submit', '', 0, 'submit', '_bx_stripe_connect_form_commissions_input_sys_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
+('bx_stripe_connect_form_commissions', @sName, 'do_cancel', '_bx_stripe_connect_form_commissions_input_cancel', '', 0, 'button', '_bx_stripe_connect_form_commissions_input_sys_cancel', '', '', 0, 0, 0, 'a:2:{s:7:"onclick";s:45:"$(''.bx-popup-applied:visible'').dolPopupHide()";s:5:"class";s:22:"bx-def-margin-sec-left";}', '', '', '', '', '', '', '', 0, 0);
+
+INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES
+('bx_stripe_connect_form_commissions_add', 'name', 2147483647, 1, 1),
+('bx_stripe_connect_form_commissions_add', 'acl_id', 2147483647, 1, 2),
+('bx_stripe_connect_form_commissions_add', 'fee_single', 2147483647, 1, 3),
+('bx_stripe_connect_form_commissions_add', 'fee_recurring', 2147483647, 1, 4),
+('bx_stripe_connect_form_commissions_add', 'controls', 2147483647, 1, 5),
+('bx_stripe_connect_form_commissions_add', 'do_submit', 2147483647, 1, 6),
+('bx_stripe_connect_form_commissions_add', 'do_cancel', 2147483647, 1, 7),
+
+('bx_stripe_connect_form_commissions_edit', 'name', 2147483647, 1, 1),
+('bx_stripe_connect_form_commissions_edit', 'acl_id', 2147483647, 1, 2),
+('bx_stripe_connect_form_commissions_edit', 'fee_single', 2147483647, 1, 3),
+('bx_stripe_connect_form_commissions_edit', 'fee_recurring', 2147483647, 1, 4),
+('bx_stripe_connect_form_commissions_edit', 'controls', 2147483647, 1, 6),
+('bx_stripe_connect_form_commissions_edit', 'do_submit', 2147483647, 1, 7),
+('bx_stripe_connect_form_commissions_edit', 'do_cancel', 2147483647, 1, 8);
+
+
+-- LOGS
 INSERT INTO `sys_objects_logs` (`object`, `module`, `logs_storage`, `title`, `active`, `class_name`, `class_file`) VALUES
 ('bx_stripe_connect', 'bx_stripe_connect', 'Auto', '_bx_stripe_connect_log', 1, '', '');
 
+
 -- Studio page and widget
 INSERT INTO `sys_std_pages`(`index`, `name`, `header`, `caption`, `icon`) VALUES
 (3, @sName, '_bx_stripe_connect', '_bx_stripe_connect', 'bx_stripe_connect@modules/boonex/stripe_connect/|std-icon.svg');

+ 9 - 3
modules/boonex/stripe_connect/install/sql/uninstall.sql

@@ -1,12 +1,18 @@
 SET @sName = 'bx_stripe_connect';
 
 -- TABLES
-DROP TABLE IF EXISTS `bx_stripe_connect_accounts`;
+DROP TABLE IF EXISTS `bx_stripe_connect_accounts`, `bx_stripe_connect_commissions`;
 
--- Logs Objects
+-- FORMS
+DELETE FROM `sys_form_display_inputs` WHERE `display_name` IN (SELECT `display_name` FROM `sys_form_displays` WHERE `module`=@sName);
+DELETE FROM `sys_form_inputs` WHERE `module`=@sName;
+DELETE FROM `sys_form_displays` WHERE `module`=@sName;
+DELETE FROM `sys_objects_form` WHERE `module`=@sName;
+
+-- LOGS
 DELETE FROM `sys_objects_logs` WHERE `module` = @sName;
 
 -- Studio page and widget
 DELETE FROM `tp`, `tw`, `twb`, `tpw` 
 USING `sys_std_pages` AS `tp` LEFT JOIN `sys_std_widgets` AS `tw` ON `tp`.`id` = `tw`.`page_id` LEFT JOIN `sys_std_widgets_bookmarks` AS `twb` ON `tw`.`id` = `twb`.`widget_id` LEFT JOIN `sys_std_pages_widgets` AS `tpw` ON `tw`.`id` = `tpw`.`widget_id`
-WHERE  `tp`.`name` = @sName;
+WHERE `tp`.`name` = @sName;

+ 19 - 0
modules/boonex/stripe_connect/template/commissions_form.html

@@ -0,0 +1,19 @@
+<div class="bx-sc-commissions-form">
+    <div class="bx-sc-commissions-form-cnt">
+        __form__
+        <script language="javascript">
+            $(document).ready(function () {
+                $("#__form_id__").ajaxForm({ 
+                    dataType: "json",
+                    beforeSubmit: function (formData, jqForm, options) {
+                        bx_loading($("#__form_id__"), true);
+                    },
+                    success: function (data) {
+                        $(".bx-popup-applied:visible").dolPopupHide();
+                        glGrids.__object__.processJson(data, '__action__');
+                    }
+                });
+            });
+        </script>
+    </div>
+</div>