ソースを参照

Ticket #3714 - Credits: Add possibility for common users to Send their credits.

AntonLV 4 年 前
親
コミット
3cee08291d

+ 5 - 1
modules/boonex/credits/classes/BxCreditsConfig.php

@@ -69,6 +69,7 @@ class BxCreditsConfig extends BxBaseModGeneralConfig
             // objects
             'OBJECT_FORM_CREDIT' => 'bx_credits_credit',
             'OBJECT_FORM_CREDIT_DISPLAY_GRANT' => 'bx_credits_credit_grant',
+            'OBJECT_FORM_CREDIT_DISPLAY_SEND' => 'bx_credits_credit_send',
             'OBJECT_FORM_CREDIT_DISPLAY_WITHDRAW_REQUEST' => 'bx_credits_credit_withdraw_request',
             'OBJECT_FORM_CREDIT_DISPLAY_WITHDRAW_CONFIRM' => 'bx_credits_credit_withdraw_confirm',
             'OBJECT_FORM_BUNDLE' => 'bx_credits_bundle',
@@ -84,6 +85,7 @@ class BxCreditsConfig extends BxBaseModGeneralConfig
 
             // email templates
             'ETEMPLATE_GRANTED' => 'bx_credits_granted',
+            'ETEMPLATE_RECEIVED' => 'bx_credits_received',
             'ETEMPLATE_PURCHASED' => 'bx_credits_purchased',
             'ETEMPLATE_IN' => 'bx_credits_in',
             'ETEMPLATE_OUT' => 'bx_credits_out',
@@ -94,6 +96,7 @@ class BxCreditsConfig extends BxBaseModGeneralConfig
             'T' => array (
                 'txt_sample_single' => '_bx_credits_txt_sample_single',
                 'grant_popup' => '_bx_credits_grid_popup_title_htr_grant',
+                'send_popup' => '_bx_credits_grid_popup_title_htr_send',
                 'withdraw_request_popup' => '_bx_credits_grid_popup_title_htr_withdraw_request',
                 'withdraw_confirm_popup' => '_bx_credits_grid_popup_title_htr_withdraw_confirm',
             ),
@@ -118,6 +121,7 @@ class BxCreditsConfig extends BxBaseModGeneralConfig
             'add_bundle_popup' =>  $sPrefix . '-add-bundle-popup',
             'edit_bundle_popup' =>  $sPrefix . '-edit-bundle-popup',
 
+            'send_popup' =>  $sPrefix . '-send-popup',
             'grant_popup' =>  $sPrefix . '-grant-popup',
             'withdraw_request_popup' =>  $sPrefix . '-withdraw-request-popup',
             'withdraw_confirm_popup' =>  $sPrefix . '-withdraw-confirm-popup',
@@ -224,7 +228,7 @@ class BxCreditsConfig extends BxBaseModGeneralConfig
 
     public function getOrder($iLength = 16)
     {
-        return genRndPwd($iLength, false);
+        return strtoupper(genRndPwd($iLength, false));
     }
 
     /**

+ 6 - 2
modules/boonex/credits/classes/BxCreditsFormWithdraw.php → modules/boonex/credits/classes/BxCreditsFormCredit.php

@@ -10,9 +10,9 @@
  */
 
 /**
- * Withdraw form
+ * Credit form
  */
-class BxCreditsFormWithdraw extends BxTemplFormView
+class BxCreditsFormCredit extends BxTemplFormView
 {
     protected $_sModule;
     protected $_oModule;
@@ -37,6 +37,10 @@ class BxCreditsFormWithdraw extends BxTemplFormView
                     $sInfo .= 'g';
                     break;
 
+                case $CNF['OBJECT_FORM_CREDIT_DISPLAY_SEND']:
+                    $sInfo .= 's';
+                    break;
+
                 case $CNF['OBJECT_FORM_CREDIT_DISPLAY_WITHDRAW_REQUEST']:
                     $sInfo .= 'wr';
                     break;

+ 21 - 18
modules/boonex/credits/classes/BxCreditsGridHistoryAdministration.php

@@ -14,6 +14,7 @@ class BxCreditsGridHistoryAdministration extends BxTemplGrid
     protected $_sModule;
     protected $_oModule;
 
+    protected $_iUserId;
     protected $_bWithdraw;
 
     public function __construct ($aOptions, $oTemplate = false)
@@ -27,9 +28,11 @@ class BxCreditsGridHistoryAdministration extends BxTemplGrid
 
         $this->_sDefaultSortingOrder = 'DESC';
 
-        $iProfileId = bx_get_logged_profile_id();
-        if($iProfileId !== false)
-            $this->_aQueryAppend['profile_id'] = (int)$iProfileId;
+        $iUserId = bx_get_logged_profile_id();
+        if($iUserId !== false) {
+            $this->_iUserId = (int)$iUserId;
+            $this->_aQueryAppend['user_id'] = $this->_iUserId;
+        }
 
         $this->_bWithdraw = $this->_oModule->_oConfig->isWithdraw();
     }
@@ -53,7 +56,7 @@ class BxCreditsGridHistoryAdministration extends BxTemplGrid
     public function performActionWithdrawConfirm()
     {
         if(!$this->_bWithdraw)
-            return echoJson(array());
+            return echoJson([]);
 
         $sAction = 'withdraw_confirm';
 
@@ -70,7 +73,7 @@ class BxCreditsGridHistoryAdministration extends BxTemplGrid
 
     protected function _getCellDirection($mixedValue, $sKey, $aField, $aRow)
     {
-        if(in_array($mixedValue, array(BX_CREDITS_DIRECTION_IN, BX_CREDITS_DIRECTION_OUT)))
+        if(in_array($mixedValue, [BX_CREDITS_DIRECTION_IN, BX_CREDITS_DIRECTION_OUT]))
             $mixedValue = _t('_bx_credits_txt_direction_' . $mixedValue);
 
         return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
@@ -110,7 +113,7 @@ class BxCreditsGridHistoryAdministration extends BxTemplGrid
         if(!$oProfile)
             return $mixedValue;
 
-        return $oProfile->getUnit(0, array('template' => array('name' => 'unit', 'size' => 'icon')));
+        return $oProfile->getUnit(0, ['template' => ['name' => 'unit', 'size' => 'icon']]);
     }
 
     protected function _performActionWithProfileAmount($sAction)
@@ -124,28 +127,28 @@ class BxCreditsGridHistoryAdministration extends BxTemplGrid
             $iProfile = (int)$oForm->getCleanValue('profile');
             $fAmount = (float)$oForm->getCleanValue('amount');
             $sMessage = $oForm->getCleanValue('message');
-            $aResult = $this->_oModule->{'process' . bx_gen_method_name($sAction)}($iProfile, $fAmount, $sMessage);
+            $aResult = $this->_oModule->{'process' . bx_gen_method_name($sAction)}($this->_iUserId, $iProfile, $fAmount, $sMessage);
 
             if((int)$aResult['code'] == 0)
-                $aRes = array('msg' => _t(!empty($aResult['msg']) ? $aResult['msg'] : '_bx_credits_msg_action_performed'));
+                $aRes = ['msg' => _t(!empty($aResult['msg']) ? $aResult['msg'] : '_bx_credits_msg_action_performed')];
             else
-                $aRes = array('msg' => _t(!empty($aResult['msg']) ? $aResult['msg'] : '_bx_credits_err_cannot_perform_action'));
+                $aRes = ['msg' => _t(!empty($aResult['msg']) ? $aResult['msg'] : '_bx_credits_err_cannot_perform_action')];
 
             echoJson($aRes);
         }
         else {
-            $sContent = BxTemplFunctions::getInstance()->popupBox($this->_oModule->_oConfig->getHtmlIds($sAction . '_popup'), _t($CNF['T'][$sAction . '_popup']), $this->_oModule->_oTemplate->parseHtmlByName('credit_form.html', array(
+            $sContent = BxTemplFunctions::getInstance()->popupBox($this->_oModule->_oConfig->getHtmlIds($sAction . '_popup'), _t($CNF['T'][$sAction . '_popup']), $this->_oModule->_oTemplate->parseHtmlByName('credit_form.html', [
                 'form_id' => $oForm->aFormAttrs['id'],
                 'form' => $oForm->getCode(true),
                 'object' => $this->_sObject,
                 'action' => $sAction
-            )));
+            ]));
 
-            echoJson(array('popup' => array('html' => $sContent, 'options' => array('closeOnOuterClick' => false))));
+            echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
         }
     }
 
-    protected function _getFormObject($sAction, $aBundle = array())
+    protected function _getFormObject($sAction)
     {
         $CNF = &$this->_oModule->_oConfig->CNF;
 
@@ -158,17 +161,17 @@ class BxCreditsGridHistoryAdministration extends BxTemplGrid
     protected function _addJsCss()
     {
         parent::_addJsCss();
-        $this->_oModule->_oTemplate->addJs(array(
+        $this->_oModule->_oTemplate->addJs([
             'jquery.form.min.js', 
             'withdraw.js'
-        ));
+        ]);
 
-        $this->_oModule->_oTemplate->addCss(array(
+        $this->_oModule->_oTemplate->addCss([
             'main.css',
             'withdraw.css'
-        ));
+        ]);
 
-        $oForm = new BxTemplFormView(array());
+        $oForm = new BxTemplFormView([]);
         $oForm->addCssJs();
     }
 }

+ 11 - 4
modules/boonex/credits/classes/BxCreditsGridHistoryCommon.php

@@ -18,10 +18,17 @@ class BxCreditsGridHistoryCommon extends BxCreditsGridHistoryAdministration
         parent::__construct ($aOptions, $oTemplate);
     }
 
+    public function performActionSend()
+    {
+        $sAction = 'send';
+
+        $this->_performActionWithProfileAmount($sAction);
+    }
+
     public function performActionWithdrawRequest()
     {
         if(!$this->_bWithdraw)
-            return echoJson(array());
+            return echoJson([]);
 
         $sAction = 'withdraw_request';
         
@@ -38,10 +45,10 @@ class BxCreditsGridHistoryCommon extends BxCreditsGridHistoryAdministration
 
     protected function _getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage)
     {
-        if(empty($this->_aQueryAppend['profile_id']))
-                return array();
+        if(empty($this->_iUserId))
+            return [];
 
-        $this->_aOptions['source'] .= $this->_oModule->_oDb->prepareAsString(" AND `first_pid`=?", $this->_aQueryAppend['profile_id']);
+        $this->_aOptions['source'] .= $this->_oModule->_oDb->prepareAsString(" AND `first_pid`=?", $this->_iUserId);
 
         return parent::_getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage);
     }

+ 11 - 7
modules/boonex/credits/classes/BxCreditsGridOrdersAdministration.php

@@ -14,6 +14,8 @@ class BxCreditsGridOrdersAdministration extends BxTemplGrid
     protected $_sModule;
     protected $_oModule;
 
+    protected $_iUserId;
+
     public function __construct ($aOptions, $oTemplate = false)
     {
     	$this->_sModule = 'bx_credits';
@@ -26,9 +28,11 @@ class BxCreditsGridOrdersAdministration extends BxTemplGrid
         $this->_sDefaultSortingOrder = 'DESC';
         $this->_aQueryReset = array($this->_aOptions['order_get_field'], $this->_aOptions['order_get_dir'], $this->_aOptions['paginate_get_start'], $this->_aOptions['paginate_get_per_page']);
 
-        $iProfileId = bx_get_logged_profile_id();
-        if($iProfileId !== false)
-            $this->_aQueryAppend['profile_id'] = (int)$iProfileId;
+        $iUserId = bx_get_logged_profile_id();
+        if($iUserId !== false) {
+            $this->_iUserId = (int)$iUserId;
+            $this->_aQueryAppend['user_id'] = $this->_iUserId;
+        }
     }
 
     protected function _getCellProfileId($mixedValue, $sKey, $aField, $aRow)
@@ -38,11 +42,11 @@ class BxCreditsGridOrdersAdministration extends BxTemplGrid
 
     protected function _getCellBundle($mixedValue, $sKey, $aField, $aRow)
     {
-        $mixedValue = $this->_oTemplate->parseHtmlByName('bundle_link.html', array(
-            'href' => $this->_oModule->_oConfig->getBundleUrl(array('id' => $aRow['bundle_id'])),
+        $mixedValue = $this->_oTemplate->parseHtmlByName('bundle_link.html', [
+            'href' => $this->_oModule->_oConfig->getBundleUrl(['id' => $aRow['bundle_id']]),
             'title' => bx_html_attribute($mixedValue),
             'content' => $mixedValue
-        ));
+        ]);
 
         return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
     }
@@ -70,7 +74,7 @@ class BxCreditsGridOrdersAdministration extends BxTemplGrid
         if(!$oProfile)
             return $mixedValue;
 
-        return $oProfile->getUnit(0, array('template' => array('name' => 'unit', 'size' => 'icon')));
+        return $oProfile->getUnit(0, ['template' => ['name' => 'unit', 'size' => 'icon']]);
     }
 }
 

+ 3 - 3
modules/boonex/credits/classes/BxCreditsGridOrdersCommon.php

@@ -20,10 +20,10 @@ class BxCreditsGridOrdersCommon extends BxCreditsGridOrdersAdministration
 
     protected function _getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage)
     {
-        if(empty($this->_aQueryAppend['profile_id']))
-                return array();
+        if(empty($this->_iUserId))
+            return [];
 
-        $this->_aOptions['source'] .= $this->_oModule->_oDb->prepareAsString(" AND `to`.`profile_id`=?", $this->_aQueryAppend['profile_id']);
+        $this->_aOptions['source'] .= $this->_oModule->_oDb->prepareAsString(" AND `to`.`profile_id`=?", $this->_iUserId);
 
         return parent::_getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage);
     }

+ 52 - 6
modules/boonex/credits/classes/BxCreditsModule.php

@@ -764,17 +764,17 @@ class BxCreditsModule extends BxBaseModGeneralModule
         return true;
     }
 
-    public function processGrant($iProfileId, $fAmount, $sMessage = '')
+    public function processGrant($iUserId, $iProfileId, $fAmount, $sMessage = '')
     {
         $CNF = &$this->_oConfig->CNF;
         
         $oProfile = BxDolProfile::getInstance($iProfileId);
         if(!$oProfile)
-            return array('code' => 1, 'msg' => '_bx_credits_err_profile_not_found');
+            return ['code' => 2, 'msg' => '_bx_credits_err_profile_not_found'];
 
         $sInfo = '_bx_credits_txt_history_info_grant';
         if(!$this->updateProfileBalance($iProfileId, 0, $fAmount, '', $sInfo))
-            return array('code' => 2, 'msg' => '_bx_credits_err_cannot_update_balance');
+            return ['code' => 3, 'msg' => '_bx_credits_err_cannot_update_balance'];
 
         sendMailTemplate($CNF['ETEMPLATE_GRANTED'], 0, $iProfileId, array(
             'amount' => $fAmount,
@@ -789,7 +789,52 @@ class BxCreditsModule extends BxBaseModGeneralModule
         return array('code' => 0);
     }
 
-    public function processWithdrawRequest($iProfileId, $fAmount, $sMessage = '')
+    public function processSend($iUserId, $iProfileId, $fAmount, $sMessage = '')
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $fAmountAvail = $this->getProfileBalance($iUserId);
+        if($fAmount > $fAmountAvail)
+            return ['code' => 1, 'msg' => '_bx_credits_err_low_balance'];
+
+        $oProfile = BxDolProfile::getInstance($iProfileId);
+        if(!$oProfile)
+            return ['code' => 2, 'msg' => '_bx_credits_err_profile_not_found'];
+
+        $sOrder = $this->_oConfig->getOrder();
+        $sInfo = !empty($sMessage) ? $sMessage : '_bx_credits_txt_history_info_send';
+
+        if(!$this->updateProfileBalance($iUserId, $iProfileId, -$fAmount, $sOrder, $sInfo))
+            return ['code' => 3, 'msg' => '_bx_credits_err_cannot_update_balance'];
+        
+        if(!$this->updateProfileBalance($iProfileId, $iUserId, $fAmount, $sOrder, $sInfo)) {
+            $sInfo = '_bx_credits_txt_history_info_cancellation';
+            $this->updateProfileBalance($iUserId, $iProfileId, $fAmount, $sOrder, $sInfo);
+
+            return ['code' => 3, 'msg' => '_bx_credits_err_cannot_update_balance'];
+        }
+
+        $oUser = BxDolProfile::getInstance($iUserId);
+        sendMailTemplate($CNF['ETEMPLATE_RECEIVED'], 0, $iProfileId, [
+            'performer_id' => $iUserId,
+            'performer_name' => $oUser->getDisplayName(),
+            'performer_link' => $oUser->getUrl(),
+            'amount' => $fAmount,
+            'order' => $sOrder,
+            'message' => $sMessage
+        ]);
+
+        bx_alert($this->getName(), 'sent', 0, $iUserId, [
+            'performer' => $iUserId,
+            'profile' => $iProfileId,
+            'amount' => $fAmount,
+            'order' => $sOrder,
+        ]);
+
+        return ['code' => 0];
+    }
+
+    public function processWithdrawRequest($iUserId, $iProfileId, $fAmount, $sMessage = '')
     {
         $CNF = &$this->_oConfig->CNF;
 
@@ -840,7 +885,7 @@ class BxCreditsModule extends BxBaseModGeneralModule
         return array('code' => 0);
     }
 
-    public function processWithdrawConfirm($iProfileId, $fAmount, $sMessage = '')
+    public function processWithdrawConfirm($iUserId, $iProfileId, $fAmount, $sMessage = '')
     {
         $CNF = &$this->_oConfig->CNF;
         
@@ -861,7 +906,8 @@ class BxCreditsModule extends BxBaseModGeneralModule
             'message' => $sMessage
         ));
 
-        bx_alert($this->getName(), 'withdraw_sent', 0, false, array(
+        bx_alert($this->getName(), 'withdraw_sent', 0, $iUserId, array(
+            'performer' => $iUserId,
             'profile' => $iProfileId,
             'amount' => $fAmount,
         ));

+ 14 - 0
modules/boonex/credits/install/langs/en.xml

@@ -39,6 +39,7 @@
 
     <string name="_bx_credits_form_credit"><![CDATA[Credit]]></string>
     <string name="_bx_credits_form_credit_display_grant"><![CDATA[Grant]]></string>
+    <string name="_bx_credits_form_credit_display_send"><![CDATA[Send]]></string>
     <string name="_bx_credits_form_credit_display_withdraw_request"><![CDATA[Request Withdraw]]></string>
     <string name="_bx_credits_form_credit_display_withdraw_confirm"><![CDATA[Confirm withdraw]]></string>
     <string name="_bx_credits_form_credit_input_sys_balance"><![CDATA[Balance]]></string>
@@ -52,6 +53,7 @@
     <string name="_bx_credits_form_credit_input_sys_message"><![CDATA[Message]]></string>
     <string name="_bx_credits_form_credit_input_message"><![CDATA[Message]]></string>
     <string name="_bx_credits_form_credit_input_message_inf_g"><![CDATA[]]></string>
+    <string name="_bx_credits_form_credit_input_message_inf_s"><![CDATA[Indicate the purpose of sending to reflect it in history for future references]]></string>
     <string name="_bx_credits_form_credit_input_message_inf_wr"><![CDATA[Payment instructions and other notes]]></string>
     <string name="_bx_credits_form_credit_input_message_inf_wc"><![CDATA[Payment confirmation and other notes]]></string>
     <string name="_bx_credits_form_credit_input_profile"><![CDATA[Profile]]></string>
@@ -140,9 +142,11 @@
     <string name="_bx_credits_grid_column_title_htr_info"><![CDATA[Notice]]></string>
     <string name="_bx_credits_grid_column_title_htr_date"><![CDATA[Date]]></string>
     <string name="_bx_credits_grid_action_title_htr_grant"><![CDATA[Grant]]></string>
+    <string name="_bx_credits_grid_action_title_htr_send"><![CDATA[Send]]></string>
     <string name="_bx_credits_grid_action_title_htr_withdraw_confirm"><![CDATA[Confirm withdraw]]></string>
     <string name="_bx_credits_grid_action_title_htr_withdraw_request"><![CDATA[Request withdraw]]></string>
     <string name="_bx_credits_grid_popup_title_htr_grant"><![CDATA[Grant]]></string>
+    <string name="_bx_credits_grid_popup_title_htr_send"><![CDATA[Send]]></string>
     <string name="_bx_credits_grid_popup_title_htr_withdraw_confirm"><![CDATA[Confirm withdraw]]></string>
     <string name="_bx_credits_grid_popup_title_htr_withdraw_request"><![CDATA[Request withdraw]]></string>
 
@@ -163,6 +167,13 @@
 <p>Hello, {profile_name}.</p>
 <p>You're granted <b>{amount}</b> credits.</p>
 <p>{message}</p>
+{email_footer}]]></string>
+    <string name="_bx_credits_et_txt_name_received"><![CDATA[Credits received.]]></string>
+    <string name="_bx_credits_et_txt_subject_received"><![CDATA[You've received {amount} credits.]]></string>
+    <string name="_bx_credits_et_txt_body_received"><![CDATA[{email_header}
+<p>Hello, {profile_name}.</p>
+<p>You've received <b>{amount}</b> credits from <a href="{performer_link}">{performer_name}</a>.<br />The order is <b>{order}</b>.</p>
+<p>{message}</p>
 {email_footer}]]></string>
     <string name="_bx_credits_et_txt_name_purchased"><![CDATA[Credits purchased.]]></string>
     <string name="_bx_credits_et_txt_subject_purchased"><![CDATA[You've purchased {bundle_title} credits bundle.]]></string>
@@ -211,11 +222,14 @@
     <string name="_bx_credits_txt_direction_in"><![CDATA[got from]]></string>
     <string name="_bx_credits_txt_purchased_note"><![CDATA[Contact <a href="{0}">{1}</a> if you have any questions or need support.]]></string>
     <string name="_bx_credits_txt_history_info_grant"><![CDATA[Grant]]></string>
+    <string name="_bx_credits_txt_history_info_send"><![CDATA[Transfer]]></string>
     <string name="_bx_credits_txt_history_info_purchase"><![CDATA[Bundle purchase]]></string>
     <string name="_bx_credits_txt_history_info_checkout"><![CDATA[Profile to profile checkout]]></string>
     <string name="_bx_credits_txt_history_info_withdraw"><![CDATA[Withdraw by request]]></string>
     <string name="_bx_credits_txt_history_info_service"><![CDATA[Artificially initiated transfer]]></string>
     <string name="_bx_credits_txt_history_info_refund"><![CDATA[Refund]]></string>
+    <string name="_bx_credits_txt_history_info_cancellation"><![CDATA[Cancellation]]></string>
+
 
     <string name="_bx_credits_msg_empty_author"><![CDATA['Main seller' is empty. You need to mark some profile as 'Main seller' in Settings of currently active Payment app.]]></string>
     <string name="_bx_credits_msg_action_performed"><![CDATA[The action was performed successfully.]]></string>

+ 9 - 7
modules/boonex/credits/install/sql/enable.sql

@@ -90,7 +90,7 @@ INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `tit
 -- MENU: account dashboard
 SET @iAccountDashboardMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name`='sys_account_dashboard' LIMIT 1);
 INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `editable`, `order`) VALUES
-('sys_account_dashboard', 'bx_credits', 'credits-manage', '_bx_credits_menu_item_title_system_manage', '_bx_credits_menu_item_title_manage', 'page.php?i=credits-orders-common', '', '', 'copyright col-green3', '', '', 2147483646, 1, 0, 1, @iAccountDashboardMenuOrder + 1);
+('sys_account_dashboard', 'bx_credits', 'credits-manage', '_bx_credits_menu_item_title_system_manage', '_bx_credits_menu_item_title_manage', 'page.php?i=credits-history-common', '', '', 'copyright col-green3', '', '', 2147483646, 1, 0, 1, @iAccountDashboardMenuOrder + 1);
 
 -- MENU: module sub-menu
 INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
@@ -110,10 +110,10 @@ INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES
 ('bx_credits_manage_submenu', 'bx_credits', '_bx_credits_menu_set_title_manage_submenu', 0);
 
 INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `editable`, `order`) VALUES 
-('bx_credits_manage_submenu', 'bx_credits', 'credits-orders-administration', '_bx_credits_menu_item_title_system_orders_administration', '_bx_credits_menu_item_title_orders_administration', 'page.php?i=credits-orders-administration', '', '_self', '', '', '', 192, 1, 0, 1, 1),
-('bx_credits_manage_submenu', 'bx_credits', 'credits-orders-common', '_bx_credits_menu_item_title_system_orders_common', '_bx_credits_menu_item_title_orders_common', 'page.php?i=credits-orders-common', '', '_self', '', '', '', 2147483646, 1, 0, 1, 2),
-('bx_credits_manage_submenu', 'bx_credits', 'credits-history-administration', '_bx_credits_menu_item_title_system_history_administration', '_bx_credits_menu_item_title_history_administration', 'page.php?i=credits-history-administration', '', '_self', '', '', '', 192, 1, 0, 1, 3),
-('bx_credits_manage_submenu', 'bx_credits', 'credits-history-common', '_bx_credits_menu_item_title_system_history_common', '_bx_credits_menu_item_title_history_common', 'page.php?i=credits-history-common', '', '_self', '', '', '', 2147483646, 1, 0, 1, 4);
+('bx_credits_manage_submenu', 'bx_credits', 'credits-history-common', '_bx_credits_menu_item_title_system_history_common', '_bx_credits_menu_item_title_history_common', 'page.php?i=credits-history-common', '', '_self', '', '', '', 2147483646, 1, 0, 1, 1)
+('bx_credits_manage_submenu', 'bx_credits', 'credits-history-administration', '_bx_credits_menu_item_title_system_history_administration', '_bx_credits_menu_item_title_history_administration', 'page.php?i=credits-history-administration', '', '_self', '', '', '', 192, 1, 0, 1, 2),
+('bx_credits_manage_submenu', 'bx_credits', 'credits-orders-common', '_bx_credits_menu_item_title_system_orders_common', '_bx_credits_menu_item_title_orders_common', 'page.php?i=credits-orders-common', '', '_self', '', '', '', 2147483646, 1, 0, 1, 3),
+('bx_credits_manage_submenu', 'bx_credits', 'credits-orders-administration', '_bx_credits_menu_item_title_system_orders_administration', '_bx_credits_menu_item_title_orders_administration', 'page.php?i=credits-orders-administration', '', '_self', '', '', '', 192, 1, 0, 1, 4);
 
 -- MENU: dashboard manage tools
 SET @iManageMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name`='sys_account_dashboard_manage_tools' LIMIT 1);
@@ -183,9 +183,10 @@ INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable
 
 INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `order`) VALUES
 ('bx_credits_history_administration', 'independent', 'grant', '_bx_credits_grid_action_title_htr_grant', '', 0, 0, 1),
-('bx_credits_history_administration', 'independent', 'withdraw_confirm', '_bx_credits_grid_action_title_htr_withdraw_confirm', '', 0, 0, 1),
+('bx_credits_history_administration', 'independent', 'withdraw_confirm', '_bx_credits_grid_action_title_htr_withdraw_confirm', '', 0, 0, 2),
 
-('bx_credits_history_common', 'independent', 'withdraw_request', '_bx_credits_grid_action_title_htr_withdraw_request', '', 0, 0, 1);
+('bx_credits_history_common', 'independent', 'send', '_bx_credits_grid_action_title_htr_send', '', 0, 0, 1),
+('bx_credits_history_common', 'independent', 'withdraw_request', '_bx_credits_grid_action_title_htr_withdraw_request', '', 0, 0, 2);
 
 
 -- ALERTS
@@ -202,6 +203,7 @@ INSERT INTO `sys_alerts` (`unit`, `action`, `handler_id`) VALUES
 -- EMAIL TEMPLATES
 INSERT INTO `sys_email_templates` (`Module`, `NameSystem`, `Name`, `Subject`, `Body`) VALUES 
 ('bx_credits', '_bx_credits_et_txt_name_granted', 'bx_credits_granted', '_bx_credits_et_txt_subject_granted', '_bx_credits_et_txt_body_granted'),
+('bx_credits', '_bx_credits_et_txt_name_received', 'bx_credits_received', '_bx_credits_et_txt_subject_received', '_bx_credits_et_txt_body_received'),
 ('bx_credits', '_bx_credits_et_txt_name_purchased', 'bx_credits_purchased', '_bx_credits_et_txt_subject_purchased', '_bx_credits_et_txt_body_purchased'),
 ('bx_credits', '_bx_credits_et_txt_name_in', 'bx_credits_in', '_bx_credits_et_txt_subject_in', '_bx_credits_et_txt_body_in'),
 ('bx_credits', '_bx_credits_et_txt_name_out', 'bx_credits_out', '_bx_credits_et_txt_subject_out', '_bx_credits_et_txt_body_out'),

+ 9 - 1
modules/boonex/credits/install/sql/install.sql

@@ -71,9 +71,10 @@ CREATE TABLE IF NOT EXISTS `bx_credits_history` (
 
 -- FORMS: credit
 INSERT INTO `sys_objects_form`(`object`, `module`, `title`, `action`, `form_attrs`, `table`, `key`, `uri`, `uri_title`, `submit_name`, `params`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
-('bx_credits_credit', 'bx_credits', '_bx_credits_form_credit', '', 'a:1:{s:7:"enctype";s:19:"multipart/form-data";}', '', '', '', '', 'a:1:{i:0;s:9:"do_submit";}', '', 0, 1, 'BxCreditsFormWithdraw', 'modules/boonex/credits/classes/BxCreditsFormWithdraw.php');
+('bx_credits_credit', 'bx_credits', '_bx_credits_form_credit', '', 'a:1:{s:7:"enctype";s:19:"multipart/form-data";}', '', '', '', '', 'a:1:{i:0;s:9:"do_submit";}', '', 0, 1, 'BxCreditsFormCredit', 'modules/boonex/credits/classes/BxCreditsFormCredit.php');
 
 INSERT INTO `sys_form_displays`(`object`, `display_name`, `module`, `view_mode`, `title`) VALUES 
+('bx_credits_credit', 'bx_credits_credit_send', 'bx_credits', 0, '_bx_credits_form_credit_display_send'),
 ('bx_credits_credit', 'bx_credits_credit_grant', 'bx_credits', 0, '_bx_credits_form_credit_display_grant'),
 ('bx_credits_credit', 'bx_credits_credit_withdraw_request', 'bx_credits', 0, '_bx_credits_form_credit_display_withdraw_request'),
 ('bx_credits_credit', 'bx_credits_credit_withdraw_confirm', 'bx_credits', 0, '_bx_credits_form_credit_display_withdraw_confirm');
@@ -90,6 +91,13 @@ INSERT INTO `sys_form_inputs`(`object`, `module`, `name`, `value`, `values`, `ch
 ('bx_credits_credit', 'bx_credits', 'do_cancel', '_bx_credits_form_credit_input_do_cancel', '', 0, 'button', '_bx_credits_form_credit_input_sys_do_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";}', '', '', '', '', '', '', '', 1, 0);
 
 INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES 
+('bx_credits_credit_send', 'profile', 2147483647, 1, 1),
+('bx_credits_credit_send', 'amount', 2147483647, 1, 2),
+('bx_credits_credit_send', 'message', 2147483647, 1, 3),
+('bx_credits_credit_send', 'controls', 2147483647, 1, 4),
+('bx_credits_credit_send', 'do_submit', 2147483647, 1, 5),
+('bx_credits_credit_send', 'do_cancel', 2147483647, 1, 6),
+
 ('bx_credits_credit_grant', 'profile', 2147483647, 1, 1),
 ('bx_credits_credit_grant', 'amount', 2147483647, 1, 2),
 ('bx_credits_credit_grant', 'message', 2147483647, 1, 3),

+ 13 - 0
modules/boonex/russian/data/langs/bx_credits/ru.xml

@@ -39,6 +39,7 @@
 
     <string name="_bx_credits_form_credit"><![CDATA[Кредит]]></string>
     <string name="_bx_credits_form_credit_display_grant"><![CDATA[Дарить]]></string>
+    <string name="_bx_credits_form_credit_display_send"><![CDATA[Отправить]]></string>
     <string name="_bx_credits_form_credit_display_withdraw_request"><![CDATA[Запросить снятие]]></string>
     <string name="_bx_credits_form_credit_display_withdraw_confirm"><![CDATA[Подтвердить снятие]]></string>
     <string name="_bx_credits_form_credit_input_sys_balance"><![CDATA[Баланс]]></string>
@@ -52,6 +53,7 @@
     <string name="_bx_credits_form_credit_input_sys_message"><![CDATA[Сообщение]]></string>
     <string name="_bx_credits_form_credit_input_message"><![CDATA[Сообщение]]></string>
     <string name="_bx_credits_form_credit_input_message_inf_g"><![CDATA[]]></string>
+    <string name="_bx_credits_form_credit_input_message_inf_s"><![CDATA[Укажите цель отправки, чтобы отразить её в истории для дальнейшего использования]]></string>
     <string name="_bx_credits_form_credit_input_message_inf_wr"><![CDATA[Платежные инструкции и другие примечания]]></string>
     <string name="_bx_credits_form_credit_input_message_inf_wc"><![CDATA[Подтверждение оплаты и другие примечания]]></string>
     <string name="_bx_credits_form_credit_input_profile"><![CDATA[Профиль]]></string>
@@ -140,9 +142,11 @@
     <string name="_bx_credits_grid_column_title_htr_info"><![CDATA[Пометка]]></string>
     <string name="_bx_credits_grid_column_title_htr_date"><![CDATA[Дата]]></string>
     <string name="_bx_credits_grid_action_title_htr_grant"><![CDATA[Подарить]]></string>
+    <string name="_bx_credits_grid_action_title_htr_send"><![CDATA[Отправить]]></string>
     <string name="_bx_credits_grid_action_title_htr_withdraw_confirm"><![CDATA[Подтвердить снятие]]></string>
     <string name="_bx_credits_grid_action_title_htr_withdraw_request"><![CDATA[Запросить снятие]]></string>
     <string name="_bx_credits_grid_popup_title_htr_grant"><![CDATA[Подарить]]></string>
+    <string name="_bx_credits_grid_popup_title_htr_send"><![CDATA[Отправить]]></string>
     <string name="_bx_credits_grid_popup_title_htr_withdraw_confirm"><![CDATA[Подтвердить снятие]]></string>
     <string name="_bx_credits_grid_popup_title_htr_withdraw_request"><![CDATA[Запросить снятие]]></string>
 
@@ -163,6 +167,13 @@
 <p>Здравствуйте, {profile_name}.</p>
 <p>Вам подарили <b>{amount}</b> кредитов.</p>
 <p>{message}</p>
+{email_footer}]]></string>
+    <string name="_bx_credits_et_txt_name_received"><![CDATA[Кредиты получены.]]></string>
+    <string name="_bx_credits_et_txt_subject_received"><![CDATA[Вы получили {amount} кредитов.]]></string>
+    <string name="_bx_credits_et_txt_body_received"><![CDATA[{email_header}
+<p>Здравствуйте, {profile_name}.</p>
+<p>Вы получили <b>{amount}</b> кредитов от <a href="{performer_link}">{performer_name}</a>.<br />Ордер: <b>{order}</b>.</p>
+<p>{message}</p>
 {email_footer}]]></string>
     <string name="_bx_credits_et_txt_name_purchased"><![CDATA[Кредиты куплены.]]></string>
     <string name="_bx_credits_et_txt_subject_purchased"><![CDATA[Вы приобрели {bundle_title} пакет кредитов.]]></string>
@@ -211,11 +222,13 @@
     <string name="_bx_credits_txt_direction_in"><![CDATA[переведено]]></string>
     <string name="_bx_credits_txt_purchased_note"><![CDATA[Обращайтесь к <a href="{0}">{1}</a>, если у вас есть какие-либо вопросы или вам нужна поддержка.]]></string>
     <string name="_bx_credits_txt_history_info_grant"><![CDATA[Подарок]]></string>
+    <string name="_bx_credits_txt_history_info_send"><![CDATA[Перевод]]></string>
     <string name="_bx_credits_txt_history_info_purchase"><![CDATA[Покупка пакета]]></string>
     <string name="_bx_credits_txt_history_info_checkout"><![CDATA[Выплаты между профилями]]></string>
     <string name="_bx_credits_txt_history_info_withdraw"><![CDATA[Снятие по запросу]]></string>
     <string name="_bx_credits_txt_history_info_service"><![CDATA[Искусственно инициированный перевод]]></string>
     <string name="_bx_credits_txt_history_info_refund"><![CDATA[Возврат средств]]></string>
+    <string name="_bx_credits_txt_history_info_cancellation"><![CDATA[Отмена]]></string>
 
     <string name="_bx_credits_msg_empty_author"><![CDATA['Главный продавец' не задан. Вам необходимо пометить какой-либо профайл как 'Главный продавец' в настройках активного на данный момент платежного модуля.]]></string>
     <string name="_bx_credits_msg_action_performed"><![CDATA[Действие было успешно выполнено.]]></string>