chore: snapshot current working tree changes

Save all currently accumulated repository changes as a backup snapshot for Gitea so no local work is lost.
This commit is contained in:
Fedor
2026-03-26 14:19:01 +03:00
parent aec27abeb0
commit 01c4fe80b5
1557 changed files with 2090933 additions and 20934 deletions

View File

@@ -463,38 +463,77 @@ if(!function_exists('wf_days_between')) {
if(!function_exists('wf_getcourse')) {
function wf_getcourse($date, $ticker) {
// Сначала приведем дату к нужному формату: d.m.Y
$date = date('d.m.Y', strtotime($date));
$originalDate = date('d.m.Y', strtotime($date));
$currentDate = $originalDate;
// Потом вытащим страницу со всеми курсами валют на заданную дату
$url = "https://cbr.ru/currency_base/daily/?UniDbQuery.Posted=True&UniDbQuery.To=".$date;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$html = curl_exec($ch);
curl_close($ch);
$maxAttempts = 30; // Максимум 30 дней назад
$attempts = 0;
// А теперь получим структуру страницы
$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
// Логируем начало поиска
file_put_contents('logs/CurrencyRate.log', date('Y-m-d H:i:s').' wf_getcourse: Ищем курс валюты '.$ticker.' на дату '.$originalDate.PHP_EOL, FILE_APPEND);
// Находим строку таблицы с курсом доллара США
$rows = $xpath->query('//table[contains(@class, "data")]//tr');
foreach ($rows as $row) {
$cols = $row->getElementsByTagName('td');
if ($cols->length > 0 && trim($cols->item(1)->nodeValue) == $ticker) {
// Поднимаем курс искомой валюты
$course = floatval(str_replace(',', '.', trim($cols->item(4)->nodeValue)));
// Её кратность - цена указана за единицу, или за большее количество?
$multiplicity = intval(trim($cols->item(2)->nodeValue));
// Возвращаем с учетом кратности
return floatval($course / $multiplicity);
while ($attempts < $maxAttempts) {
$attempts++;
// Пробуем новый формат URL (date_req) и старый (UniDbQuery.To) для совместимости
$url = "https://cbr.ru/currency_base/daily/?date_req=".$currentDate;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
$html = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($html === false || $httpCode != 200) {
file_put_contents('logs/CurrencyRate.log', date('Y-m-d H:i:s').' wf_getcourse: Ошибка загрузки страницы для даты '.$currentDate.' (HTTP '.$httpCode.')'.PHP_EOL, FILE_APPEND);
// Крутим дату назад
$currentDate = date('d.m.Y', strtotime($currentDate . ' -1 day'));
continue;
}
// А теперь получим структуру страницы
$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
// Находим строку таблицы с курсом валюты
$rows = $xpath->query('//table[contains(@class, "data")]//tr');
foreach ($rows as $row) {
$cols = $row->getElementsByTagName('td');
if ($cols->length > 0 && trim($cols->item(1)->nodeValue) == $ticker) {
// Поднимаем курс искомой валюты
$course = floatval(str_replace(',', '.', trim($cols->item(4)->nodeValue)));
// Её кратность - цена указана за единицу, или за большее количество?
$multiplicity = intval(trim($cols->item(2)->nodeValue));
if ($multiplicity == 0) $multiplicity = 1; // Защита от деления на ноль
// Вычисляем курс с учетом кратности
$rate = floatval($course / $multiplicity);
// Логируем успешный результат
if ($currentDate != $originalDate) {
$daysBack = $attempts - 1;
file_put_contents('logs/CurrencyRate.log', date('Y-m-d H:i:s').' wf_getcourse: Курс найден на дату '.$currentDate.' ('.$daysBack.' дней назад от '.$originalDate.'), курс: '.$rate.PHP_EOL, FILE_APPEND);
} else {
file_put_contents('logs/CurrencyRate.log', date('Y-m-d H:i:s').' wf_getcourse: Курс найден на указанную дату '.$currentDate.', курс: '.$rate.PHP_EOL, FILE_APPEND);
}
return $rate;
}
}
// Курс не найден на эту дату, крутим назад
file_put_contents('logs/CurrencyRate.log', date('Y-m-d H:i:s').' wf_getcourse: Курс не найден на дату '.$currentDate.', пробуем предыдущую дату'.PHP_EOL, FILE_APPEND);
$currentDate = date('d.m.Y', strtotime($currentDate . ' -1 day'));
}
// Курс не найден за весь период
file_put_contents('logs/CurrencyRate.log', date('Y-m-d H:i:s').' wf_getcourse: ОШИБКА - Курс валюты '.$ticker.' не найден за период '.$maxAttempts.' дней назад от даты '.$originalDate.PHP_EOL, FILE_APPEND);
return -1; // В случае, если курс не найден
}
}