После обновления высылается письмо с результатами обновления по всем валютам ShopCMS:
1. Валюта XXX обновлена. Новый курс 12.3456. Старый курс 12.2345.
2. Валюта YYY не обновлена. Новый курс отличается от старого больше, чем на NN%.
3. Валюта ZZZ не обновлена. Не найдена в результате запроса.
Нет особой сложности в переделке дополнения и под любой другой банк.
Хорошо идет в комплекте с модулем MaestrO "Мультивалютные товары" - получаем ежедневное обновление цен в дефолтовой валюте (например, рублевых цен) для товаров, учет которых задан в другой валюте (например, в долларах).
Установка:
1. Сохраняем код в файл core/includes/autoupdate_currency.php
(имя файла должно начинаться на букву "а")
<?php
if(!defined('CONF_AUTOUPDATE_CURRENCY_DATE'))
db_query("INSERT ".SETTINGS_TABLE." SET
settings_groupID=9999,
settings_constant_name='CONF_AUTOUPDATE_CURRENCY_DATE',
settings_value='01.01.2001',
settings_title='Дата обновления курсов валют',
settings_description='Дата обновления курсов валют. Оно выполняется один раз в сутки.',
settings_html_function='setting_TEXT_BOX(0,',
sort_order=1");
$date = date('d.m.Y');
$prev_date = settingGetSetting('CONF_AUTOUPDATE_CURRENCY_DATE');
if ($prev_date['settings_value'] !== $date)
{
$addon = 1.03; // добавка к курсу. Курс в ShopCMS будет на 3% больше, чем курс ЦБРФ.
$max_delta = 0.1; // граница изменения курса. Если новый курс отличается от старого более, чем на 10% - обновления не будет. На всякий случай.
$CRLF = "\n";
$new_values = array();
$text = '';
$html = file_get_contents("http://www.cbr.ru/currency_base/daily.aspx?date_req=$date");
foreach (currGetAllCurrencies() as $curr)
{
if (preg_match('/<tr><td>\d{3}<\/td>.{2}<td>'.$curr['currency_iso_3'].'<\/td>.{2}<td>(\d{1,5})<\/td>.{2}<td>.+?<\/td>.{2}<td>(\d{2,3},\d{4})<\/td><\/tr>/s',$html,$matches))
{
$today = (float)str_replace(',','.',$matches[2])/$matches[1]*$addon;
$fromCMS = currGetCurrencyByID($curr['CID']);
$old = 1.0/(float)$fromCMS['currency_value'];
if (abs($today - $old)/$old < $max_delta)
{
$text .= "Курс ".$curr['currency_iso_3']." обновлен. Новый курс $today. Старый курс $old.$CRLF";
$new_values[$curr['CID']] = 1.0/$today;
}
else $text .= "Курс ".$curr['currency_iso_3']." не обновлен. Новый курс ($today) отличается от старого ($old) на ".round(100.0*($today - $old)/$old,2)."%$CRLF";
}
else $text .= "Курс ".$curr['currency_iso_3']." не обновлен. Не найден в результате запроса.$CRLF";
}
foreach ($new_values as $key => $val)
db_query( "UPDATE ".CURRENCY_TYPES_TABLE." SET currency_value=$val WHERE CID=$key");
# BEGIN MultiCurrencyProducts
#configUpdateProductsPrice();
# END MultiCurrencyProducts
_setSettingOptionValue('CONF_AUTOUPDATE_CURRENCY_DATE', $date );
xMailTxtHTML(CONF_GENERAL_EMAIL, "$date - завершено обновление курсов валют", $text);
}
?>