Блог веб-программиста

13Июн/180

Обновление курса валют в Битрикс

Для Битрикса есть популярное решение для обновление курса валют - https://marketplace.1c-bitrix.ru/solutions/asd.currencyrate/

Однако, решение не работает, если базовая валюта не рубли.

В моём случае, когда это фунты(GBP), решаю это вот таким куском гавнокода:

<?php

include __DIR__ . '/bitrix.php';


$contents = file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp');

$neededCurrency = 'GBP';

// Глупая проверка на то, что нам вернули что-то нормальное
if (stripos($contents,$neededCurrency) > 0) {
    $xml = simplexml_load_string($contents);

    $date = $xml->attributes()->Date;

    CModule::IncludeModule('currency');

    $format = "DD.MM.YYYY";
    // получим формат текущего сайта
    $new_format = CSite::GetDateFormat("SHORT");
    // переведем дату из одного формата в другой
    $new_date = $DB->FormatDate($date, $format, $new_format);


    // в результате получим дату в новом формате
    echo "Date $date - $new_date\n";

    $arFilter = [
        "CURRENCY" => "RUB",
        'DATE_RATE' => $new_date,
    ];
    $by = "date";
    $order = "desc";

    $row = CCurrencyRates::GetList($by, $order, $arFilter)->Fetch();
    if ($row === false) {
        foreach ($xml->Valute as $valute) {

            if (((string)$valute->CharCode) === $neededCurrency) {

                $value = (float)str_replace(',', '.', ((string)$valute->Value) ?? 0);
                if ($value > 0) {
                    $value = number_format(1 / $value * 1.05, 4, '.', '');

                    $arFields = [
                        "RATE" => $value,
                        "RATE_CNT" => 1,
                        "CURRENCY" => "RUB",
                        "DATE_RATE" => $new_date,
                    ];

                    if (!CCurrencyRates::Add($arFields)) {
                        echo "Ошибка добавления курса $date - $value\n";
                        echo $APPLICATION->GetException() . "\n\n";
                    } else {
                        echo "Обновили курс $date - $value\n";
                    }
                    return;
                }
            }
        }
    } else {
        echo "Курс на $date уже есть\n";
    }
}
Связано с категорией: Code Оставить комментарий
Комментарии (0) Пинги (0)

Пока нет комментариев.


Leave a comment

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Нет обратных ссылок на эту запись.