Просмотр исходного кода

Ticket #4090 - Payments: Add support for multi-currency.

AntonLV 4 лет назад
Родитель
Сommit
f4cd4a1703

+ 15 - 4
inc/classes/BxDolLanguages.php

@@ -268,11 +268,13 @@ class BxDolLanguages extends BxDolFactory implements iBxDolSingleton
         return date($sFormat, $iTime);
         return date($sFormat, $iTime);
     }
     }
 
 
-    function _t_format_currency ($fPrice, $iPrecision = 2, $bFormatThousands = true)
+    function _t_format_currency ($fPrice, $iPrecision = 2, $bFormatThousands = true, $sSign = '')
     {
     {
-        $sSign = BxDolPayments::getInstance()->getOption('default_currency_sign');
-        if(empty($sSign))
-            $sSign = getParam('currency_sign');
+        if(empty($sSign)) {
+            $sSign = BxDolPayments::getInstance()->getOption('default_currency_sign');
+            if(empty($sSign))
+                $sSign = getParam('currency_sign');
+        }
 
 
         if($bFormatThousands)
         if($bFormatThousands)
             $fPrice = number_format((float)$fPrice, $iPrecision);
             $fPrice = number_format((float)$fPrice, $iPrecision);
@@ -438,6 +440,15 @@ function _t_format_currency($fPrice, $iPrecision = 2, $bFormatThousands = true)
     return BxDolLanguages::getInstance()->_t_format_currency($fPrice, $iPrecision, $bFormatThousands);
     return BxDolLanguages::getInstance()->_t_format_currency($fPrice, $iPrecision, $bFormatThousands);
 }
 }
 
 
+function _t_format_currency_ext($fPrice, $aParams = [])
+{
+    $sSign = isset($aParams['sign']) ? $aParams['sign'] : '';
+    $iPrecision = isset($aParams['precision']) ? (int)$aParams['precision'] : 2;
+    $bFormatThousands = isset($aParams['format_thousands']) ? $aParams['format_thousands'] : true;
+
+    return BxDolLanguages::getInstance()->_t_format_currency($fPrice, $iPrecision, $bFormatThousands, $sSign);
+}
+
 function _t_format_extensions($mixedExtensions)
 function _t_format_extensions($mixedExtensions)
 {
 {
     return BxDolLanguages::getInstance()->_t_format_extensions($mixedExtensions);
     return BxDolLanguages::getInstance()->_t_format_extensions($mixedExtensions);

+ 28 - 1
inc/classes/BxDolPayments.php

@@ -77,10 +77,37 @@ class BxDolPayments extends BxDolFactory implements iBxDolSingleton
     	return bx_srv($this->_sActive, 'get_details_url', array(), 'Details');
     	return bx_srv($this->_sActive, 'get_details_url', array(), 'Details');
     }
     }
 
 
+    public function getCurrencyInfo($iVendorId = 0)
+    {
+    	if(empty($this->_sActive) || !BxDolRequest::serviceExists($this->_sActive, 'get_currency_info'))
+            return [];
+
+    	$aSrvParams = [$iVendorId];
+        return bx_srv($this->_sActive, 'get_currency_info', $aSrvParams);
+    }
+    
+    public function getCurrencyCode($iVendorId = 0)
+    {
+    	if(empty($this->_sActive) || !BxDolRequest::serviceExists($this->_sActive, 'get_currency_code'))
+            return '';
+
+    	$aSrvParams = [$iVendorId];
+        return bx_srv($this->_sActive, 'get_currency_code', $aSrvParams);
+    }
+
+    public function getCurrencySign($iVendorId = 0)
+    {
+    	if(empty($this->_sActive) || !BxDolRequest::serviceExists($this->_sActive, 'get_currency_sign'))
+            return '';
+
+    	$aSrvParams = [$iVendorId];
+        return bx_srv($this->_sActive, 'get_currency_sign', $aSrvParams);
+    }
+
     public function isAcceptingPayments($iVendorId, $sPaymentType = '')
     public function isAcceptingPayments($iVendorId, $sPaymentType = '')
     {
     {
     	if(empty($this->_sActive) || !BxDolRequest::serviceExists($this->_sActive, 'is_accepting_payments'))
     	if(empty($this->_sActive) || !BxDolRequest::serviceExists($this->_sActive, 'is_accepting_payments'))
-    		return false;
+            return false;
 
 
     	$aSrvParams = array($iVendorId, $sPaymentType);
     	$aSrvParams = array($iVendorId, $sPaymentType);
         return bx_srv($this->_sActive, 'is_accepting_payments', $aSrvParams);
         return bx_srv($this->_sActive, 'is_accepting_payments', $aSrvParams);

+ 22 - 9
modules/base/payment/classes/BxBaseModPaymentConfig.php

@@ -40,6 +40,8 @@ class BxBaseModPaymentConfig extends BxBaseModGeneralConfig
             // objects
             // objects
             'OBJECT_FORM_PRELISTS_CURRENCIES' => '',
             'OBJECT_FORM_PRELISTS_CURRENCIES' => '',
 
 
+            'PROVIDER_GENERIC' => 'generic',
+
             'KEY_SESSION_PENDING' => $this->_sName . '_pending_id',
             'KEY_SESSION_PENDING' => $this->_sName . '_pending_id',
             'KEY_REQUEST_PENDING' => $this->_sName . '_pending_id',
             'KEY_REQUEST_PENDING' => $this->_sName . '_pending_id',
 
 
@@ -99,9 +101,8 @@ class BxBaseModPaymentConfig extends BxBaseModGeneralConfig
 
 
         $sPrefix = $this->getPrefix('options');
         $sPrefix = $this->getPrefix('options');
 
 
-        $aCurrencies = BxDolForm::getDataItems($this->CNF['OBJECT_FORM_PRELISTS_CURRENCIES'], false, BX_DATA_VALUES_ADDITIONAL);
         $this->_sCurrencyCode = (string)$this->_oDb->getParam($sPrefix . 'default_currency_code');
         $this->_sCurrencyCode = (string)$this->_oDb->getParam($sPrefix . 'default_currency_code');
-        $this->_sCurrencySign = !empty($this->_sCurrencyCode) && isset($aCurrencies[$this->_sCurrencyCode]) ? $aCurrencies[$this->_sCurrencyCode] : '';
+        $this->_sCurrencySign = $this->retrieveCurrencySign($this->_sCurrencyCode);
 
 
         $this->_iSiteAdmin = (int)$this->_oDb->getParam($sPrefix . 'site_admin');
         $this->_iSiteAdmin = (int)$this->_oDb->getParam($sPrefix . 'site_admin');
         $this->_bSingleSeller = $this->_oDb->getParam($sPrefix . 'single_seller') == 'on';
         $this->_bSingleSeller = $this->_oDb->getParam($sPrefix . 'single_seller') == 'on';
@@ -164,14 +165,14 @@ class BxBaseModPaymentConfig extends BxBaseModGeneralConfig
 
 
     public function getUrl($sType, $aParams = array(), $bSsl = false)
     public function getUrl($sType, $aParams = array(), $bSsl = false)
     {
     {
-		$sResult = '';
-		if(empty($sType) || !isset($this->CNF[$sType]))
-			return $sResult;
+        $sResult = '';
+        if(empty($sType) || !isset($this->CNF[$sType]))
+            return $sResult;
 
 
-		if(strncmp($this->CNF[$sType], BX_DOL_URL_ROOT, strlen(BX_DOL_URL_ROOT)) === 0)
-			$sResult = bx_append_url_params($this->CNF[$sType], $aParams);
-		else
-			$sResult = bx_absolute_url(BxDolPermalinks::getInstance()->permalink($this->CNF[$sType], $aParams));
+        if(strncmp($this->CNF[$sType], BX_DOL_URL_ROOT, strlen(BX_DOL_URL_ROOT)) === 0)
+            $sResult = bx_append_url_params($this->CNF[$sType], $aParams);
+        else
+            $sResult = bx_absolute_url(BxDolPermalinks::getInstance()->permalink($this->CNF[$sType], $aParams));
 
 
     	return $bSsl ? $this->http2https($sResult) : $sResult;
     	return $bSsl ? $this->http2https($sResult) : $sResult;
     }
     }
@@ -242,6 +243,18 @@ class BxBaseModPaymentConfig extends BxBaseModGeneralConfig
     {
     {
         return gmdate($this->CNF['PARAM_CMSN_DATE_TIME_FORMAT'], $iTs);
         return gmdate($this->CNF['PARAM_CMSN_DATE_TIME_FORMAT'], $iTs);
     }
     }
+
+    public function retrieveCurrencySign($sCode)
+    {
+        if(empty($sCode))
+            return '';
+
+        $aCurrencies = BxDolForm::getDataItems($this->CNF['OBJECT_FORM_PRELISTS_CURRENCIES'], false, BX_DATA_VALUES_ADDITIONAL);
+        if(!isset($aCurrencies[$sCode]))
+            return '';
+
+        return $aCurrencies[$sCode];
+    }
 }
 }
 
 
 /** @} */
 /** @} */

+ 23 - 11
modules/base/payment/classes/BxBaseModPaymentGridCarts.php

@@ -11,12 +11,15 @@
 
 
 class BxBaseModPaymentGridCarts extends BxTemplGrid
 class BxBaseModPaymentGridCarts extends BxTemplGrid
 {
 {
-	protected $MODULE;
+    protected $MODULE;
 
 
-	protected $_oModule;
-	protected $_oCart;
+    protected $_oModule;
+    protected $_oCart;
 
 
-	protected $_sCurrencySign;
+    protected $_bSingleSeller;
+    protected $_iSingleSeller;
+
+    protected $_sCurrencySign;
 
 
     public function __construct ($aOptions, $oTemplate = false)
     public function __construct ($aOptions, $oTemplate = false)
     {
     {
@@ -25,25 +28,34 @@ class BxBaseModPaymentGridCarts extends BxTemplGrid
         $this->_oModule = BxDolModule::getInstance($this->MODULE);
         $this->_oModule = BxDolModule::getInstance($this->MODULE);
         $this->_oCart = $this->_oModule->getObjectCart();
         $this->_oCart = $this->_oModule->getObjectCart();
 
 
+        $this->_iSingleSeller = 0;
+        if($this->_bSingleSeller)
+            $this->_iSingleSeller = $this->_oModule->_oConfig->getSiteAdmin();
+
         $this->_sCurrencySign = $this->_oModule->_oConfig->getDefaultCurrencySign();
         $this->_sCurrencySign = $this->_oModule->_oConfig->getDefaultCurrencySign();
 
 
         $this->_sDefaultSortingOrder = 'DESC';
         $this->_sDefaultSortingOrder = 'DESC';
 
 
-		$iClientId = bx_get('client_id');
+        $iClientId = bx_get('client_id');
         if($iClientId !== false)
         if($iClientId !== false)
             $this->_aQueryAppend['client_id'] = (int)$iClientId;
             $this->_aQueryAppend['client_id'] = (int)$iClientId;
 
 
-	    $iSellerId = bx_get('seller_id');
-        if($iSellerId !== false)
-            $this->_aQueryAppend['seller_id'] = (int)$iSellerId;
+        $iSellerId = bx_get('seller_id');
+        if($iSellerId !== false) {
+            $iSellerId = (int)$iSellerId;
+            $this->_aQueryAppend['seller_id'] = $iSellerId;
+
+            if(!$this->_bSingleSeller)
+                $this->_sCurrencySign = $this->_oModule->getVendorCurrencySign($iSellerId);
+        }
     }
     }
 
 
-	public function addQueryParam($sKey, $sValue)
+    public function addQueryParam($sKey, $sValue)
     {
     {
     	if(empty($sKey) || !isset($sValue))
     	if(empty($sKey) || !isset($sValue))
-    		return;
+            return;
 
 
-		$this->_aQueryAppend[$sKey] = $sValue;
+        $this->_aQueryAppend[$sKey] = $sValue;
     }
     }
 }
 }
 
 

+ 7 - 0
modules/base/payment/classes/BxBaseModPaymentGridInvoices.php

@@ -122,6 +122,13 @@ class BxBaseModPaymentGridInvoices extends BxTemplGrid
         return parent::_getCellDefault($this->_oModule->_oConfig->formatDate($mixedValue), $sKey, $aField, $aRow);
         return parent::_getCellDefault($this->_oModule->_oConfig->formatDate($mixedValue), $sKey, $aField, $aRow);
     }
     }
 
 
+    protected function _getCellAmount($mixedValue, $sKey, $aField, $aRow)
+    {
+        return parent::_getCellDefault(_t_format_currency_ext($mixedValue, [
+            'sign' => $this->_oModule->getVendorCurrencySign((int)$aRow['commissionaire_id'])
+        ]), $sKey, $aField, $aRow);
+    }
+
     protected function _getCellDateIssue($mixedValue, $sKey, $aField, $aRow)
     protected function _getCellDateIssue($mixedValue, $sKey, $aField, $aRow)
     {
     {
         return $this->_getCellDefaultDate($mixedValue, $sKey, $aField, $aRow);
         return $this->_getCellDefaultDate($mixedValue, $sKey, $aField, $aRow);

+ 12 - 3
modules/base/payment/classes/BxBaseModPaymentGridOrders.php

@@ -41,8 +41,13 @@ class BxBaseModPaymentGridOrders extends BxTemplGrid
         $this->_sDefaultSortingOrder = 'DESC';
         $this->_sDefaultSortingOrder = 'DESC';
 
 
         $iSellerId = bx_get('seller_id');
         $iSellerId = bx_get('seller_id');
-        if($iSellerId !== false)
-            $this->_aQueryAppend['seller_id'] = (int)$iSellerId;
+        if($iSellerId !== false) {
+            $iSellerId = (int)$iSellerId;
+            $this->_aQueryAppend['seller_id'] = $iSellerId;
+
+            if(!$this->_bSingleSeller)
+                $this->_sCurrencySign = $this->_oModule->getVendorCurrencySign($iSellerId);
+        }
 
 
         $iClientId = bx_get('client_id');
         $iClientId = bx_get('client_id');
         if($iClientId !== false)
         if($iClientId !== false)
@@ -148,7 +153,11 @@ class BxBaseModPaymentGridOrders extends BxTemplGrid
 
 
     protected function _getCellAmount($mixedValue, $sKey, $aField, $aRow)
     protected function _getCellAmount($mixedValue, $sKey, $aField, $aRow)
     {
     {
-        return parent::_getCellDefault($this->_sCurrencySign . $mixedValue, $sKey, $aField, $aRow);
+        $sSign = $this->_sCurrencySign;
+        if(!$this->_bSingleSeller)
+            $sSign = $this->_oModule->getVendorCurrencySign((int)$aRow['seller_id']);
+
+        return parent::_getCellDefault(_t_format_currency_ext($mixedValue, ['sign' => $sSign]), $sKey, $aField, $aRow);
     }
     }
 
 
     protected function _getCellDate($mixedValue, $sKey, $aField, $aRow)
     protected function _getCellDate($mixedValue, $sKey, $aField, $aRow)

+ 84 - 19
modules/base/payment/classes/BxBaseModPaymentModule.php

@@ -101,12 +101,36 @@ class BxBaseModPaymentModule extends BxBaseModGeneralModule
     /** 
     /** 
      * @ref bx_base_payment-get_currency_info "get_currency_info"
      * @ref bx_base_payment-get_currency_info "get_currency_info"
      */
      */
-    public function serviceGetCurrencyInfo()
+    public function serviceGetCurrencyInfo($iVendorId = 0)
     {
     {
-        return array(
+        if((int)$iVendorId != 0) {
+            $aVendorInfo = $this->getVendorInfo ($iVendorId);
+            return [
+                'sign' => $aVendorInfo['currency_sign'],
+                'code' => $aVendorInfo['currency_code']
+            ];
+        }
+
+        return [
             'sign' => $this->_oConfig->getDefaultCurrencySign(),
             'sign' => $this->_oConfig->getDefaultCurrencySign(),
             'code' => $this->_oConfig->getDefaultCurrencyCode()
             'code' => $this->_oConfig->getDefaultCurrencyCode()
-        );
+        ];
+    }
+
+    public function serviceGetCurrencyCode($iVendorId = 0)
+    {
+        if((int)$iVendorId != 0)
+            return $this->getVendorCurrencyCode($iVendorId);
+
+        return $this->_oConfig->getDefaultCurrencyCode();
+    }
+
+    public function serviceGetCurrencySign($iVendorId = 0)
+    {
+        if((int)$iVendorId != 0)
+            return $this->getVendorCurrencySign($iVendorId);
+
+        return $this->_oConfig->getDefaultCurrencySign();
     }
     }
 
 
     /**
     /**
@@ -131,7 +155,7 @@ class BxBaseModPaymentModule extends BxBaseModGeneralModule
     {
     {
     	$sMethod = 'get' . bx_gen_method_name($sOption);
     	$sMethod = 'get' . bx_gen_method_name($sOption);
     	if(method_exists($this->_oConfig, $sMethod))
     	if(method_exists($this->_oConfig, $sMethod))
-    		return $this->_oConfig->$sMethod();
+            return $this->_oConfig->$sMethod();
 
 
     	return $this->_oDb->getParam($this->_oConfig->getPrefix('options') . $sOption);
     	return $this->_oDb->getParam($this->_oConfig->getPrefix('options') . $sOption);
     }
     }
@@ -199,28 +223,69 @@ class BxBaseModPaymentModule extends BxBaseModGeneralModule
 
 
     public function getVendorInfo($iUserId)
     public function getVendorInfo($iUserId)
     {
     {
-        return array_merge($this->getProfileInfo($iUserId), array(
-            'currency_code' => $this->_oConfig->getDefaultCurrencyCode(),
-            'currency_sign' => $this->_oConfig->getDefaultCurrencySign()
-        ));
+        $CNF = &$this->_oConfig->CNF;
+
+        $sCode = $sSign = '';
+        if(!$this->_oConfig->isSingleSeller() && ($oProvider = $this->getObjectProvider($CNF['PROVIDER_GENERIC'], $iUserId)) !== false) {
+            $sCode = $oProvider->getOption('currency_code');
+            $sSign = $this->_oConfig->retrieveCurrencySign($sCode);            
+        }
+
+        if(empty($sCode) || empty($sSign)) {
+            $sCode = $this->_oConfig->getDefaultCurrencyCode();
+            $sSign = $this->_oConfig->getDefaultCurrencySign();
+        }
+
+        return array_merge($this->getProfileInfo($iUserId), [
+            'currency_code' => $sCode,
+            'currency_sign' => $sSign
+        ]);
+    }
+
+    public function getVendorCurrencyCode($iUserId)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $sCode = '';
+        if(!$this->_oConfig->isSingleSeller() && ($oProvider = $this->getObjectProvider($CNF['PROVIDER_GENERIC'], $iUserId)) !== false)
+            $sCode = $oProvider->getOption('currency_code');
+
+        if(empty($sCode))
+            $sCode = $this->_oConfig->getDefaultCurrencyCode();
+
+        return $sCode;
+    }
+    
+    public function getVendorCurrencySign($iUserId)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $sSign = '';
+        if(!$this->_oConfig->isSingleSeller() && ($oProvider = $this->getObjectProvider($CNF['PROVIDER_GENERIC'], $iUserId)) !== false)
+            $sSign = $this->_oConfig->retrieveCurrencySign($oProvider->getOption('currency_code'));
+
+        if(empty($sSign))
+            $sSign = $this->_oConfig->getDefaultCurrencySign();
+
+        return $sSign;
     }
     }
 
 
-	public function getObjectJoin()
+    public function getObjectJoin()
     {
     {
         $sClassName = $this->_oConfig->getClassPrefix() . 'Join';
         $sClassName = $this->_oConfig->getClassPrefix() . 'Join';
         if(!isset($GLOBALS['bxDolClasses'][$sClassName])) {
         if(!isset($GLOBALS['bxDolClasses'][$sClassName])) {
-        	bx_import('Join', $this->_aModule);
+            bx_import('Join', $this->_aModule);
             $GLOBALS['bxDolClasses'][$sClassName] = new $sClassName();
             $GLOBALS['bxDolClasses'][$sClassName] = new $sClassName();
         }
         }
 
 
         return $GLOBALS['bxDolClasses'][$sClassName];
         return $GLOBALS['bxDolClasses'][$sClassName];
     }
     }
 
 
-	public function getObjectCart()
+    public function getObjectCart()
     {
     {
         $sClassName = $this->_oConfig->getClassPrefix() . 'Cart';
         $sClassName = $this->_oConfig->getClassPrefix() . 'Cart';
         if(!isset($GLOBALS['bxDolClasses'][$sClassName])) {
         if(!isset($GLOBALS['bxDolClasses'][$sClassName])) {
-        	bx_import('Cart', $this->_aModule);
+            bx_import('Cart', $this->_aModule);
             $GLOBALS['bxDolClasses'][$sClassName] = new $sClassName();
             $GLOBALS['bxDolClasses'][$sClassName] = new $sClassName();
         }
         }
 
 
@@ -231,18 +296,18 @@ class BxBaseModPaymentModule extends BxBaseModGeneralModule
     {
     {
     	$sClassName = $this->_oConfig->getClassPrefix() . 'Orders';
     	$sClassName = $this->_oConfig->getClassPrefix() . 'Orders';
         if(!isset($GLOBALS['bxDolClasses'][$sClassName])) {
         if(!isset($GLOBALS['bxDolClasses'][$sClassName])) {
-        	bx_import('Orders', $this->_aModule);
+            bx_import('Orders', $this->_aModule);
             $GLOBALS['bxDolClasses'][$sClassName] = new $sClassName();
             $GLOBALS['bxDolClasses'][$sClassName] = new $sClassName();
         }
         }
 
 
         return $GLOBALS['bxDolClasses'][$sClassName];
         return $GLOBALS['bxDolClasses'][$sClassName];
     }
     }
 
 
-	public function getObjectDetails()
+    public function getObjectDetails()
     {
     {
     	$sClassName = $this->_oConfig->getClassPrefix() . 'Details';
     	$sClassName = $this->_oConfig->getClassPrefix() . 'Details';
         if(!isset($GLOBALS['bxDolClasses'][$sClassName])) {
         if(!isset($GLOBALS['bxDolClasses'][$sClassName])) {
-        	bx_import('Details', $this->_aModule);
+            bx_import('Details', $this->_aModule);
             $GLOBALS['bxDolClasses'][$sClassName] = new $sClassName();
             $GLOBALS['bxDolClasses'][$sClassName] = new $sClassName();
         }
         }
 
 
@@ -253,7 +318,7 @@ class BxBaseModPaymentModule extends BxBaseModGeneralModule
     {
     {
     	$sClassName = $this->_oConfig->getClassPrefix() . 'Subscriptions';
     	$sClassName = $this->_oConfig->getClassPrefix() . 'Subscriptions';
         if(!isset($GLOBALS['bxDolClasses'][$sClassName])) {
         if(!isset($GLOBALS['bxDolClasses'][$sClassName])) {
-        	bx_import('Subscriptions', $this->_aModule);
+            bx_import('Subscriptions', $this->_aModule);
             $GLOBALS['bxDolClasses'][$sClassName] = new $sClassName();
             $GLOBALS['bxDolClasses'][$sClassName] = new $sClassName();
         }
         }
 
 
@@ -294,10 +359,10 @@ class BxBaseModPaymentModule extends BxBaseModGeneralModule
     public function callGetPaymentData($mixedModule)
     public function callGetPaymentData($mixedModule)
     {
     {
     	$sMethod = 'get_payment_data';
     	$sMethod = 'get_payment_data';
-		if(!BxDolRequest::serviceExists($mixedModule, $sMethod)) 
-			return false;
+        if(!BxDolRequest::serviceExists($mixedModule, $sMethod)) 
+            return false;
 
 
-		return BxDolService::call($mixedModule, $sMethod);
+        return BxDolService::call($mixedModule, $sMethod);
     }
     }
 
 
     public function callGetCartItem($mixedModule, $aParams)
     public function callGetCartItem($mixedModule, $aParams)

+ 10 - 6
modules/boonex/payment/classes/BxPaymentFormDetails.php

@@ -105,12 +105,16 @@ class BxPaymentFormDetails extends BxTemplFormView
                     if(empty($aInput['extra']))
                     if(empty($aInput['extra']))
                        break;
                        break;
 
 
-                    $aAddon = array('values' => array());
-
-                    $aPairs = explode(',', $aInput['extra']);
-                    foreach($aPairs as $sPair) {
-                        $aPair = explode('|', $sPair);
-                        $aAddon['values'][] = array('key' => $aPair[0], 'value' => _t($aPair[1]));
+                    $aAddon = ['values' => []];
+
+                    if(BxDolService::isSerializedService($aInput['extra']))
+                        $aAddon['values'] = BxDolService::callSerialized($aInput['extra']);
+                    else {
+                        $aPairs = explode(',', $aInput['extra']);
+                        foreach($aPairs as $sPair) {
+                            $aPair = explode('|', $sPair);
+                            $aAddon['values'][] = ['key' => $aPair[0], 'value' => _t($aPair[1])];
+                        }
                     }
                     }
                     break;
                     break;
 
 

+ 2 - 2
modules/boonex/payment/classes/BxPaymentGridCart.php

@@ -59,9 +59,9 @@ class BxPaymentGridCart extends BxBaseModPaymentGridCarts
     	)), $sKey, $aField, $aRow);
     	)), $sKey, $aField, $aRow);
     }
     }
 
 
-	protected function _getCellPriceSingle($mixedValue, $sKey, $aField, $aRow)
+    protected function _getCellPriceSingle($mixedValue, $sKey, $aField, $aRow)
     {
     {
-        return parent::_getCellDefault($this->_sCurrencySign . $mixedValue, $sKey, $aField, $aRow);
+        return parent::_getCellDefault(_t_format_currency_ext($mixedValue, ['sign' => $this->_sCurrencySign]), $sKey, $aField, $aRow);
     }
     }
 
 
     protected function _getActionCheckout ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
     protected function _getActionCheckout ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())

+ 17 - 13
modules/boonex/payment/classes/BxPaymentGridCarts.php

@@ -19,26 +19,30 @@ class BxPaymentGridCarts extends BxBaseModPaymentGridCarts
         parent::__construct ($aOptions, $oTemplate);
         parent::__construct ($aOptions, $oTemplate);
     }
     }
 
 
-	protected function _getCellVendorId($mixedValue, $sKey, $aField, $aRow)
+    protected function _getCellVendorId($mixedValue, $sKey, $aField, $aRow)
     {
     {
     	return parent::_getCellDefault($this->_oModule->_oTemplate->displayProfileLink(array(
     	return parent::_getCellDefault($this->_oModule->_oTemplate->displayProfileLink(array(
-    		'id' => $mixedValue,
-    		'name' => $aRow['vendor_name'],
-    		'title' => _t('_bx_payment_txt_checkout_to', $aRow['vendor_name']),
-    		'link' => bx_append_url_params($this->_oModule->_oConfig->getUrl('URL_CART'), array('seller_id' => (int)$mixedValue))
+            'id' => $mixedValue,
+            'name' => $aRow['vendor_name'],
+            'title' => _t('_bx_payment_txt_checkout_to', $aRow['vendor_name']),
+            'link' => bx_append_url_params($this->_oModule->_oConfig->getUrl('URL_CART'), array('seller_id' => (int)$mixedValue))
     	)), $sKey, $aField, $aRow);
     	)), $sKey, $aField, $aRow);
     }
     }
 
 
-	protected function _getCellItemsPrice($mixedValue, $sKey, $aField, $aRow)
+    protected function _getCellItemsPrice($mixedValue, $sKey, $aField, $aRow)
     {
     {
-        return parent::_getCellDefault($this->_sCurrencySign . $mixedValue, $sKey, $aField, $aRow);
+        $sSign = $this->_sCurrencySign;
+        if(!$this->_bSingleSeller && !empty($aRow['vendor_currency_sign']))
+            $sSign = $aRow['vendor_currency_sign'];
+
+        return parent::_getCellDefault(_t_format_currency_ext($mixedValue, ['sign' => $sSign]), $sKey, $aField, $aRow);
     }
     }
 
 
     protected function _getActionContinue ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
     protected function _getActionContinue ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
     {
     {
     	unset($a['attr']['bx_grid_action_single']);
     	unset($a['attr']['bx_grid_action_single']);
     	$a['attr'] = array_merge($a['attr'], array(
     	$a['attr'] = array_merge($a['attr'], array(
-    		"onclick" => "window.open('" . bx_append_url_params($this->_oModule->_oConfig->getUrl('URL_CART'), array('seller_id' => $aRow['vendor_id'])) . "','_self');"
+            "onclick" => "window.open('" . bx_append_url_params($this->_oModule->_oConfig->getUrl('URL_CART'), array('seller_id' => $aRow['vendor_id'])) . "','_self');"
     	));
     	));
 
 
         return  parent::_getActionDefault($sType, $sKey, $a, false, $isDisabled, $aRow);
         return  parent::_getActionDefault($sType, $sKey, $a, false, $isDisabled, $aRow);
@@ -49,19 +53,19 @@ class BxPaymentGridCarts extends BxBaseModPaymentGridCarts
     	return '';
     	return '';
     }
     }
     
     
-	protected function _getDataArray($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage)
+    protected function _getDataArray($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage)
     {
     {
-		if(empty($this->_aQueryAppend['client_id']))
-			return array();
+        if(empty($this->_aQueryAppend['client_id']))
+            return array();
 
 
-		$this->_aOptions['source'] = $this->_oModule->getObjectCart()->getInfo(BX_PAYMENT_TYPE_SINGLE, $this->_aQueryAppend['client_id']);
+        $this->_aOptions['source'] = $this->_oModule->getObjectCart()->getInfo(BX_PAYMENT_TYPE_SINGLE, $this->_aQueryAppend['client_id']);
 
 
         return parent::_getDataArray($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage);
         return parent::_getDataArray($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage);
     }
     }
 
 
     protected function _delete($mixedId)
     protected function _delete($mixedId)
     {
     {
-		return $this->_oCart->serviceDeleteFromCart($mixedId);
+        return $this->_oCart->serviceDeleteFromCart($mixedId);
     }
     }
 }
 }
 
 

+ 8 - 0
modules/boonex/payment/classes/BxPaymentModule.php

@@ -381,6 +381,14 @@ class BxPaymentModule extends BxBaseModPaymentModule
         return $aResult;
         return $aResult;
     }
     }
 
 
+    public function serviceGetOptionsPersonalCurrencyCode()
+    {
+        return array_merge([[
+            'key' => '',
+            'value' => _t('_bx_payment_gc_currency_code_default')
+        ]], $this->serviceGetOptionsDefaultCurrencyCode());
+    }
+
     /**
     /**
      * @page service Service Calls
      * @page service Service Calls
      * @section bx_payment Payment
      * @section bx_payment Payment

+ 8 - 0
modules/boonex/payment/install/langs/en.xml

@@ -422,6 +422,14 @@
     <string name="_bx_payment_txt_invoice_description"><![CDATA[For a period between {0} and {1}]]></string>
     <string name="_bx_payment_txt_invoice_description"><![CDATA[For a period between {0} and {1}]]></string>
     <string name="_bx_payment_txt_payment_description"><![CDATA[Payment on {0} site.]]></string>
     <string name="_bx_payment_txt_payment_description"><![CDATA[Payment on {0} site.]]></string>
 
 
+    <!-- Generic payment provider -->
+    <string name="_bx_payment_gc_cpt"><![CDATA[Generic]]></string>
+    <string name="_bx_payment_gc_dsc"><![CDATA[Isn't used to process payments directly. Is needed to store personal settings for usage in the other providers.]]></string>
+    <string name="_bx_payment_gc_currency_code_cpt"><![CDATA[Currency]]></string>
+    <string name="_bx_payment_gc_currency_code_dsc"><![CDATA[Select your own currency instead the default one]]></string>
+    <string name="_bx_payment_gc_currency_code_default"><![CDATA[Default]]></string>
+    <string name="_bx_payment_gc_err_not_available"><![CDATA[Generic payment provider isn't available for payments.]]></string>
+
     <!-- Offline payment provider -->
     <!-- Offline payment provider -->
     <string name="_bx_payment_off_cpt"><![CDATA[Offline]]></string>
     <string name="_bx_payment_off_cpt"><![CDATA[Offline]]></string>
     <string name="_bx_payment_off_dsc"><![CDATA[For offline payments like cash, etransfer, etc.]]></string>
     <string name="_bx_payment_off_dsc"><![CDATA[For offline payments like cash, etransfer, etc.]]></string>

+ 11 - 3
modules/boonex/payment/install/sql/install.sql

@@ -162,9 +162,17 @@ CREATE TABLE IF NOT EXISTS `bx_payment_invoices` (
   UNIQUE KEY `name`(`name`)
   UNIQUE KEY `name`(`name`)
 );
 );
 
 
+-- Generic payment provider
+INSERT INTO `bx_payment_providers`(`name`, `caption`, `description`, `option_prefix`, `for_visitor`, `for_single`, `for_recurring`, `single_seller`, `time_tracker`, `active`, `order`, `class_name`) VALUES
+('generic', '_bx_payment_gc_cpt', '_bx_payment_gc_dsc', 'gc_', 0, 0, 0, 0, 0, 1, 0, 'BxPaymentProviderGeneric');
+SET @iProviderId = LAST_INSERT_ID();
+
+INSERT INTO `bx_payment_providers_options`(`provider_id`, `name`, `type`, `caption`, `description`, `extra`, `check_type`, `check_params`, `check_error`, `order`) VALUES
+(@iProviderId, 'gc_currency_code', 'select', '_bx_payment_gc_currency_code_cpt', '_bx_payment_gc_currency_code_dsc', 'a:2:{s:6:"module";s:10:"bx_payment";s:6:"method";s:34:"get_options_personal_currency_code";}', '', '', '', 1);
+
 -- Offline payment provider
 -- Offline payment provider
 INSERT INTO `bx_payment_providers`(`name`, `caption`, `description`, `option_prefix`, `for_visitor`, `for_single`, `for_recurring`, `single_seller`, `time_tracker`, `active`, `order`, `class_name`) VALUES
 INSERT INTO `bx_payment_providers`(`name`, `caption`, `description`, `option_prefix`, `for_visitor`, `for_single`, `for_recurring`, `single_seller`, `time_tracker`, `active`, `order`, `class_name`) VALUES
-('offline', '_bx_payment_off_cpt', '_bx_payment_off_dsc', 'off_', 0, 1, 0, 0, 0, 1, 0, 'BxPaymentProviderOffline');
+('offline', '_bx_payment_off_cpt', '_bx_payment_off_dsc', 'off_', 0, 1, 0, 0, 0, 1, 5, 'BxPaymentProviderOffline');
 SET @iProviderId = LAST_INSERT_ID();
 SET @iProviderId = LAST_INSERT_ID();
 
 
 INSERT INTO `bx_payment_providers_options`(`provider_id`, `name`, `type`, `caption`, `description`, `extra`, `check_type`, `check_params`, `check_error`, `order`) VALUES
 INSERT INTO `bx_payment_providers_options`(`provider_id`, `name`, `type`, `caption`, `description`, `extra`, `check_type`, `check_params`, `check_error`, `order`) VALUES
@@ -174,7 +182,7 @@ INSERT INTO `bx_payment_providers_options`(`provider_id`, `name`, `type`, `capti
 
 
 -- Credits payment provider
 -- Credits payment provider
 INSERT INTO `bx_payment_providers`(`name`, `caption`, `description`, `option_prefix`, `for_visitor`, `for_single`, `for_recurring`, `single_seller`, `time_tracker`, `active`, `order`, `class_name`) VALUES
 INSERT INTO `bx_payment_providers`(`name`, `caption`, `description`, `option_prefix`, `for_visitor`, `for_single`, `for_recurring`, `single_seller`, `time_tracker`, `active`, `order`, `class_name`) VALUES
-('credits', '_bx_payment_cdt_cpt', '_bx_payment_cdt_dsc', 'cdt_', 0, 1, 1, 1, 1, 1, 1, 'BxPaymentProviderCredits');
+('credits', '_bx_payment_cdt_cpt', '_bx_payment_cdt_dsc', 'cdt_', 0, 1, 1, 1, 1, 1, 6, 'BxPaymentProviderCredits');
 SET @iProviderId = LAST_INSERT_ID();
 SET @iProviderId = LAST_INSERT_ID();
 
 
 INSERT INTO `bx_payment_providers_options`(`provider_id`, `name`, `type`, `caption`, `description`, `extra`, `check_type`, `check_params`, `check_error`, `order`) VALUES
 INSERT INTO `bx_payment_providers_options`(`provider_id`, `name`, `type`, `caption`, `description`, `extra`, `check_type`, `check_params`, `check_error`, `order`) VALUES
@@ -304,7 +312,7 @@ INSERT INTO `bx_payment_providers_options`(`provider_id`, `name`, `type`, `capti
 
 
 -- GRIDS
 -- GRIDS
 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
 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_payment_grid_providers', 'Sql', 'SELECT * FROM `bx_payment_providers` WHERE 1 ', 'bx_payment_providers', 'id', 'order', 'active', '', 100, NULL, 'start', '', 'name', 'caption,description', 'auto', '', '', 192, 1, 'BxPaymentGridProviders', 'modules/boonex/payment/classes/BxPaymentGridProviders.php'),
+('bx_payment_grid_providers', 'Sql', 'SELECT * FROM `bx_payment_providers` WHERE 1 AND (`for_single` <> ''0'' OR `for_recurring` <> ''0'')', 'bx_payment_providers', 'id', 'order', 'active', '', 100, NULL, 'start', '', 'name', 'caption,description', 'auto', '', '', 192, 1, 'BxPaymentGridProviders', 'modules/boonex/payment/classes/BxPaymentGridProviders.php'),
 
 
 ('bx_payment_grid_carts', 'Array', '', '', 'vendor_id', '', '', '', 20, NULL, 'start', '', '', '', 'like', '', '', 2147483647, 1, 'BxPaymentGridCarts', 'modules/boonex/payment/classes/BxPaymentGridCarts.php'),
 ('bx_payment_grid_carts', 'Array', '', '', 'vendor_id', '', '', '', 20, NULL, 'start', '', '', '', 'like', '', '', 2147483647, 1, 'BxPaymentGridCarts', 'modules/boonex/payment/classes/BxPaymentGridCarts.php'),
 ('bx_payment_grid_cart', 'Array', '', '', 'descriptor', '', '', '', 20, NULL, 'start', '', 'title,description', '', 'like', '', '', 2147483647, 1, 'BxPaymentGridCart', 'modules/boonex/payment/classes/BxPaymentGridCart.php'),
 ('bx_payment_grid_cart', 'Array', '', '', 'descriptor', '', '', '', 20, NULL, 'start', '', 'title,description', '', 'like', '', '', 2147483647, 1, 'BxPaymentGridCart', 'modules/boonex/payment/classes/BxPaymentGridCart.php'),

+ 8 - 0
modules/boonex/russian/data/langs/bx_payment/ru.xml

@@ -424,6 +424,14 @@
     <string name="_bx_payment_txt_invoice_description"><![CDATA[За период между {0} и {1}]]></string>
     <string name="_bx_payment_txt_invoice_description"><![CDATA[За период между {0} и {1}]]></string>
     <string name="_bx_payment_txt_payment_description"><![CDATA[Выплата на сайте {0}.]]></string>
     <string name="_bx_payment_txt_payment_description"><![CDATA[Выплата на сайте {0}.]]></string>
 
 
+    <!-- Generic payment provider -->
+    <string name="_bx_payment_gc_cpt"><![CDATA[Общая]]></string>
+    <string name="_bx_payment_gc_dsc"><![CDATA[Не используется для обработки платежей напрямую. Требуется для хранения личных настроек для использования в других провайдерах.]]></string>
+    <string name="_bx_payment_gc_currency_code_cpt"><![CDATA[Валюта]]></string>
+    <string name="_bx_payment_gc_currency_code_dsc"><![CDATA[Выберите собственную валюту вместо валюты по умолчанию]]></string>
+    <string name="_bx_payment_gc_currency_code_default"><![CDATA[Значение по умолчанию]]></string>
+    <string name="_bx_payment_gc_err_not_available"><![CDATA[Платежная система 'Общая' не доступна для совершения платежей.]]></string>
+
     <!-- Offline payment provider -->
     <!-- Offline payment provider -->
     <string name="_bx_payment_off_cpt"><![CDATA[Офлайн]]></string>
     <string name="_bx_payment_off_cpt"><![CDATA[Офлайн]]></string>
     <string name="_bx_payment_off_dsc"><![CDATA[Для вне сетевых методов оплаты, таких как наличные, электронный перевод и тп.]]></string>
     <string name="_bx_payment_off_dsc"><![CDATA[Для вне сетевых методов оплаты, таких как наличные, электронный перевод и тп.]]></string>