Index: branches/5.2.x/units/helpers/currency_rates.php =================================================================== --- branches/5.2.x/units/helpers/currency_rates.php (revision 15366) +++ branches/5.2.x/units/helpers/currency_rates.php (revision 15367) @@ -1,118 +1,153 @@ <?php /** * @version $Id$ * @package In-Commerce * @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved. * @license Commercial License * This software is protected by copyright law and international treaties. * Unauthorized reproduction or unlicensed usage of the code of this program, * or any portion of it may result in severe civil and criminal penalties, * and will be prosecuted to the maximum extent possible under the law * See http://www.in-portal.org/commercial-license for copyright notices and details. */ defined('FULL_PATH') or die('restricted access!'); class CurrencyRates extends kBase { var $RateSource; var $ExchangeRates = Array(); /** * Creates currency rate update class * * @access public */ public function __construct() { parent::__construct(); $this->GetRatesData(); } function GetRatesData() { $cache_key = 'currency_rates[%CurrSerial%]'; $rates = $this->Application->getCache($cache_key); $primary = $this->Application->GetPrimaryCurrency(); if ($rates === false) { $this->Conn->nextQueryCachable = true; $sql = 'SELECT ISO, RateToPrimary FROM ' . $this->Application->getUnitOption('curr', 'TableName') . ' WHERE Status = ' . STATUS_ACTIVE; $rates = $this->Conn->Query($sql); $this->Application->setCache($cache_key, $rates); } foreach ($rates as $rate) { $this->SetRate($primary, $rate['ISO'], $rate['RateToPrimary']); } } function GetRate($source_cur, $target_cur, $units = 1) { $source_cur = ($source_cur == 'PRIMARY') ? $this->Application->GetPrimaryCurrency() : $source_cur; $target_cur = ($target_cur == 'PRIMARY') ? $this->Application->GetPrimaryCurrency() : $target_cur; if($source_cur == $target_cur) { return 1; } if($this->ExchangeRates[$target_cur]['TARGET'] == $source_cur) { $rate = ($this->ExchangeRates[$target_cur]['RATE'] == 0) ? false : 1 / $this->ExchangeRates[$target_cur]['RATE']; } elseif($this->ExchangeRates[$source_cur]['TARGET'] == $target_cur) { $rate = $this->ExchangeRates[$source_cur]['RATE']; } else { $rate = ($this->ExchangeRates[$target_cur]['RATE'] == 0) ? false : $this->ExchangeRates[$source_cur]['RATE'] / $this->ExchangeRates[$target_cur]['RATE']; } $rate *= $units; return $rate; } function Convert($amount, $source_cur, $target_cur) { return $amount * $this->GetRate($source_cur, $target_cur); } + function AddCurrencySymbol($value, $iso, $decimal_tag = '') + { + static $decimal_separator = false; + + $cache_key = 'iso_masks[%CurrSerial%]'; + $iso_masks = $this->Application->getCache($cache_key); + + if ( $iso_masks === false ) { + $this->Conn->nextQueryCachable = true; + $symbol_sql = 'IF(COALESCE(Symbol, "") = "", CONCAT(ISO, " "), Symbol)'; + + $sql = 'SELECT IF(SymbolPosition = 0, CONCAT(' . $symbol_sql . ', "%s"), CONCAT("%s", ' . $symbol_sql . ')), LOWER(ISO) AS ISO + FROM ' . $this->Application->getUnitOption('curr', 'TableName') . ' + WHERE Status = ' . STATUS_ACTIVE; + $iso_masks = $this->Conn->GetCol($sql, 'ISO'); + $this->Application->setCache($cache_key, $iso_masks); + } + + if ( $decimal_tag ) { + if ( $decimal_separator === false ) { + $language = $this->Application->recallObject('lang.current'); + /* @var $language LanguagesItem */ + + $decimal_separator = $language->GetDBField('DecimalPoint'); + } + + list ($integer_part, $decimal_part) = explode($decimal_separator, $value); + $value = $integer_part . $decimal_separator . '<' . $decimal_tag . '>' . $decimal_part . '</' . $decimal_tag . '>'; + } + + $iso = strtolower($iso); + + return array_key_exists($iso, $iso_masks) ? sprintf($iso_masks[$iso], $value) : $value; + } + function SetRate($source_cur, $target_cur, $rate, $units = 1) { $this->ExchangeRates[$target_cur]['TARGET'] = $source_cur; $this->ExchangeRates[$target_cur]['ID'] = $target_cur; $this->ExchangeRates[$target_cur]['RATE'] = $rate; $this->ExchangeRates[$target_cur]['UNITS'] = $units; } function StoreRates($currencies=null) { $curr_object = $this->Application->recallObject('curr', null, Array ('skip_autoload' => true)); /* @var $curr_object kDBItem */ if ($currencies) { if (!is_array($currencies)) { $currencies = explode(',', $currencies); } } else { $currencies = array_keys($this->ExchangeRates); } foreach ($currencies as $id) { $rate = $this->GetRate($id, 'PRIMARY'); if ($rate) { $curr_object->Clear(); $curr_object->Load($id, 'ISO'); $curr_object->SetDBField('RateToPrimary', $rate); $curr_object->SetDBField('Modified_date', adodb_mktime()); $curr_object->SetDBField('Modified_time', adodb_mktime()); $curr_object->Update(); } } } }