<?php
if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );
/**
* Модуль конвертера валют ЦБРФ для Virtuemart,
* основан на оригинальном convertECB.php
* Курс = курсу ЦБРФ на ТЕКУЩИЙ! день
* Модуль является полностью бесплатным, в случае его модификации
* не допускается его коммерческое использование.
* Последнюю версию можно найти по адресу:
* http://www.liveinternet.ru/users/csh/post197903834/
*
* Поблагодарить за труды Яндекс.Деньги: 41001164449086
*
* @version $Id: convertCBRF.php 2012-01-22 csh
* @package VirtueMart
* @subpackage classes
* @copyright Copyright (C) 2011 soeren - All rights reserved.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
* VirtueMart is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See /administrator/components/com_virtuemart/COPYRIGHT.php for copyright notices and details.
*
*
*/
class convertCBRF
{
var $archive = true;
var $last_updated = '';
var $document_address = 'http://www.cbr.ru/scripts/XML_daily.asp';
var $info_address = 'http://www.cbr.ru';
var $supplier = 'Центральный банк Российской Федерации';
/**
* Initializes the global currency converter array
*
* @return mixed
*/
function init() {
global $mosConfig_cachepath, $mosConfig_absolute_path,
$vendor_currency, $vmLogger;
if( !is_array($GLOBALS['converter_array']) && $GLOBALS['converter_array'] !== -1 ) {
setlocale(LC_TIME, "en-GB");
$chas_p = 4; // Время MSK: +4GMT
$now = time() + $chas_p*3600;
$weekday_now_local = date('w', $now); // день недели, неделя начинается с воскресенья (= 0) !!
$date_now_local = date('Ymd', $now);
$time_now_local = date('Hi', $now);
if( is_writable($mosConfig_cachepath) ) {
$store_path = $mosConfig_cachepath;
}
else {
$store_path = $mosConfig_absolute_path."/media";
}
$archivefile_name = $store_path.'/daily_CBRF.xml';
$cbrf_filename = $this->document_address;
$val = '';
//если файл существует и размер больше нуля
if(file_exists($archivefile_name) && filesize( $archivefile_name ) > 0 ) {
// штамп времени файла
$file_datestamp = date('Ymd', filemtime($archivefile_name) + $chas_p*3600);
// штамп времени файла не равен текущему (год-месяц-день), т.е. другой день
if( $file_datestamp != $date_now_local)
{
// тогда текущий файл равен файлу из интернета за текущий день
$curr_filename = $cbrf_filename.'?date_req='.date( 'd/m/Y', $now );
}
// если день НЕ рабочий, или текущая дата равна дате архивного файла
else
{
$curr_filename = $archivefile_name; // тогда текущий файл равен архивному
$this->last_updated = $file_datestamp; // последнее обновление равно времени архивного файла
$this->archive = false; // обновлять архивный файл? - нет
}
}
//если файл не существует
else {
// тогда текущий файл равен файлу из интернета за текущий день
$curr_filename = $cbrf_filename.'?date_req='.date( 'd/m/Y', $now );
}
// если нет разрешения на запись
if( !is_writable( $store_path )) {
$this->archive = false;
$vmLogger->debug( "The file $archivefile_name can't be created. The directory $store_path is not writable" );
}
// если текущий файл равен файлу из интернета
if( $curr_filename == $cbrf_filename )
{
// запрашиваем файл из интернета
require_once( CLASSPATH.'connectionTools.class.php');
// содержимое равно файлу из интернета
$contents = vmConnector::handleCommunication( $curr_filename );
$this->last_updated = date('Ymd', $now);
}
// в противном случае, содержимое равно архивному файлу
else
{
$contents = @file_get_contents( $curr_filename );
}
// если есть хоть какое-то содержимое, т.е. либо архивные либо из Интернет
if( $contents )
{
// если требуется обновление (по рабочим дням и есть разрешение на запись)
if( $this->archive ) {
// пишем новый файл
file_put_contents( $archivefile_name, $contents );
}
//добавочная строка о рубле, т.е. номинал одного рубля - 1 рубль
$add_str = '<Valute ID="xxx"><NumCode>yyy</NumCode><CharCode>RUB</CharCode><Nominal>1</Nominal><Name>Российский рубль</Name><Value>1</Value></Valute>';
$contents = str_replace ("</ValCurs>", "$add_str </ValCurs>", $contents); //дополняем базу информацией о рубле
// по регулярному выражению ищем 3 заглавных буквы валюты (напр/ USD)
preg_match_all ("/<CharCode>([A-Z]{3})<\/CharCode>/", $contents, $char_arr);
// по регулярному выражению ищем число возможно с запятой, номинал валюты
preg_match_all ("/<Nominal>(\d+\,?\d*)<\/Nominal>/", $contents, $nom_arr);
// по регулярному выражению ищем число возможно с запятой, курс валюты
// (т.е. за номинал тугриков можно купить столькото рублей)
preg_match_all ("/<Value>(\d+\,?\d*)<\/Value>/", $contents, $val_arr);
//формируем массив валют
for ($i = 0; $i < count($char_arr[1]); $i++)
{
//т.е. на 1 рубль можно купить = номинал валюты / курс валюты
$currency [$char_arr[1][$i]] = $nom_arr[1][$i]/(str_replace (',', '.', $val_arr[1][$i])); // преобразуем в числе запятую "," в точку "."
}
$GLOBALS['converter_array'] = $currency;
}
else
{
$GLOBALS['converter_array'] = -1;
$vmLogger->err( 'Failed to retrieve the Currency.');
$_SESSION['product_currency'] = $GLOBALS['product_currency'] = $vendor_currency;
return false;
}
}
return true;
}
/**
* Converts an amount from one currency into another using
* the rate conversion table from the European Central Bank
*
* @param float $amountA
* @param string $currA defaults to $vendor_currency
* @param string $currB defaults to $GLOBALS['product_currency'] (and that defaults to $vendor_currency)
* @return mixed The converted amount when successful, false on failure
*/
function convert( $amountA, $currA='', $currB='' )
{
global $vendor_currency;
// global $vendor_currency is DEFAULT!
if( !$currA ) {
$currA = $vendor_currency;
}
if( !$currB ) {
$currB = $GLOBALS['product_currency'];
}
// Если исходная валюта = выходной валюте, то ничего не делаем и возвращаем исходное значение
if( $currA == $currB ) {
return $amountA;
}
// Если курс валюты не найден
if( !$this->init()) {
$GLOBALS['product_currency'] = $vendor_currency;
return $amountA;
}
$valA = isset( $GLOBALS['converter_array'][$currA] ) ? $GLOBALS['converter_array'][$currA] : 1;
$valB = isset( $GLOBALS['converter_array'][$currB] ) ? $GLOBALS['converter_array'][$currB] : 1;
$val = $amountA * $valB / $valA;
// $amountA - Цена товара в родной валюте
// $valA - Курс для родной валюты тавара
// $valB - Курс валюты в какой хотим преобразовать
//$vmLogger->debug('Converted '.$amountA.' '.$currA.' to '.$val.' '.$currB);
return $val;
} // end function convertecb
}
?>