38451-vm/includes/exchange.php
2026-02-22 07:25:27 +00:00

141 lines
5.2 KiB
PHP

<?php
/**
* Simple Exchange Rate Helper
* Fetches real-time exchange rates from a public API and caches them locally.
*/
function get_exchange_rates() {
if (!function_exists('db')) {
require_once __DIR__ . '/../db/config.php';
}
$cache_file = __DIR__ . '/../db/exchange_rates.json';
$cache_time = 60; // Cache for 1 minute for better precision
// Try to load from cache first
if (file_exists($cache_file) && (time() - filemtime($cache_file) < $cache_time)) {
return json_decode(file_get_contents($cache_file), true);
}
$rates = null;
// Use a more reliable free public API
$api_url = 'https://open.er-api.com/v6/latest/USD';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
curl_close($ch);
if ($response) {
$data = json_decode($response, true);
if ($data && isset($data['rates'])) {
$rates = $data['rates'];
}
}
// Fallback rates if API fails or returns incomplete data
// Updated to more realistic 2024/2025 values
$fallbacks = [
'USD' => 1.0,
'EUR' => 0.92,
'GBP' => 0.79,
'CNY' => 7.25,
'JPY' => 151.0,
'HKD' => 7.83,
'TWD' => 32.2,
'KRW' => 1350.0,
'MYR' => 4.78,
'THB' => 36.5,
'VND' => 25000.0,
'SGD' => 1.35,
'PHP' => 56.5,
'IDR' => 16000.0,
'AUD' => 1.54,
'CAD' => 1.36,
'CHF' => 0.90,
'BRL' => 5.10,
'RUB' => 93.0,
'INR' => 83.4,
'TRY' => 32.8,
'AED' => 3.67,
];
if (!$rates) {
$rates = $fallbacks;
} else {
// Merge with fallbacks to ensure all required currencies exist
foreach ($fallbacks as $code => $rate) {
if (!isset($rates[$code])) {
$rates[$code] = $rate;
}
}
}
// Apply manual overrides from database (e.g., rate_MYR = 4.5)
try {
$stmt = db()->query("SELECT setting_key, setting_value FROM system_settings WHERE setting_key LIKE 'rate_%'");
$overrides = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
foreach ($overrides as $key => $val) {
$currency = strtoupper(str_replace('rate_', '', $key));
if ($val > 0) {
$rates[$currency] = (float)$val;
}
}
} catch (Exception $e) {
// Ignore DB errors during rate fetching
}
file_put_contents($cache_file, json_encode($rates));
return $rates;
}
function get_rate($currency) {
$rates = get_exchange_rates();
return $rates[$currency] ?? 1.0;
}
function get_global_currencies() {
return [
'USD' => ['name' => __('usd_name'), 'flag' => '๐Ÿ‡บ๐Ÿ‡ธ'],
'EUR' => ['name' => __('eur_name'), 'flag' => '๐Ÿ‡ช๐Ÿ‡บ'],
'GBP' => ['name' => __('gbp_name'), 'flag' => '๐Ÿ‡ฌ๐Ÿ‡ง'],
'JPY' => ['name' => __('jpy_name'), 'flag' => '๐Ÿ‡ฏ๐Ÿ‡ต'],
'CNY' => ['name' => __('cny_name'), 'flag' => '๐Ÿ‡จ๐Ÿ‡ณ'],
'HKD' => ['name' => __('hkd_name'), 'flag' => '๐Ÿ‡ญ๐Ÿ‡ฐ'],
'TWD' => ['name' => __('twd_name'), 'flag' => '๐Ÿ‡น๐Ÿ‡ผ'],
'KRW' => ['name' => __('krw_name'), 'flag' => '๐Ÿ‡ฐ๐Ÿ‡ท'],
'SGD' => ['name' => __('sgd_name'), 'flag' => '๐Ÿ‡ธ๐Ÿ‡ฌ'],
'MYR' => ['name' => __('myr_name'), 'flag' => '๐Ÿ‡ฒ๐Ÿ‡พ'],
'THB' => ['name' => __('thb_name'), 'flag' => '๐Ÿ‡น๐Ÿ‡ญ'],
'VND' => ['name' => __('vnd_name'), 'flag' => '๐Ÿ‡ป๐Ÿ‡ณ'],
'PHP' => ['name' => __('php_name'), 'flag' => '๐Ÿ‡ต๐Ÿ‡ญ'],
'IDR' => ['name' => __('idr_name'), 'flag' => '๐Ÿ‡ฎ๐Ÿ‡ฉ'],
'AUD' => ['name' => __('aud_name'), 'flag' => '๐Ÿ‡ฆ๐Ÿ‡บ'],
'CAD' => ['name' => __('cad_name'), 'flag' => '๐Ÿ‡จ๐Ÿ‡ฆ'],
'CHF' => ['name' => __('chf_name'), 'flag' => '๐Ÿ‡จ๐Ÿ‡ญ'],
'BRL' => ['name' => __('brl_name'), 'flag' => '๐Ÿ‡ง๐Ÿ‡ท'],
'RUB' => ['name' => __('rub_name'), 'flag' => '๐Ÿ‡ท๐Ÿ‡บ'],
'INR' => ['name' => __('inr_name'), 'flag' => '๐Ÿ‡ฎ๐Ÿ‡ณ'],
'ZAR' => ['name' => __('zar_name'), 'flag' => '๐Ÿ‡ฟ๐Ÿ‡ฆ'],
'TRY' => ['name' => __('try_name'), 'flag' => '๐Ÿ‡น๐Ÿ‡ท'],
'AED' => ['name' => __('aed_name'), 'flag' => '๐Ÿ‡ฆ๐Ÿ‡ช'],
'SAR' => ['name' => __('sar_name'), 'flag' => '๐Ÿ‡ธ๐Ÿ‡ฆ'],
'MXN' => ['name' => __('mxn_name'), 'flag' => '๐Ÿ‡ฒ๐Ÿ‡ฝ'],
'NZD' => ['name' => 'NZD', 'flag' => '๐Ÿ‡ณ๐Ÿ‡ฟ'],
'SEK' => ['name' => 'SEK', 'flag' => '๐Ÿ‡ธ๐Ÿ‡ช'],
'NOK' => ['name' => 'NOK', 'flag' => '๐Ÿ‡ณ๐Ÿ‡ด'],
'DKK' => ['name' => 'DKK', 'flag' => '๐Ÿ‡ฉ๐Ÿ‡ฐ'],
'ILS' => ['name' => 'ILS', 'flag' => '๐Ÿ‡ฎ๐Ÿ‡ฑ'],
'PLN' => ['name' => 'PLN', 'flag' => '๐Ÿ‡ต๐Ÿ‡ฑ'],
'PKR' => ['name' => 'PKR', 'flag' => '๐Ÿ‡ต๐Ÿ‡ฐ'],
'EGP' => ['name' => 'EGP', 'flag' => '๐Ÿ‡ช๐Ÿ‡ฌ'],
'ARS' => ['name' => 'ARS', 'flag' => '๐Ÿ‡ฆ๐Ÿ‡ท'],
'CLP' => ['name' => 'CLP', 'flag' => '๐Ÿ‡จ๐Ÿ‡ฑ'],
'COP' => ['name' => 'COP', 'flag' => '๐Ÿ‡จ๐Ÿ‡ด'],
'PEN' => ['name' => 'PEN', 'flag' => '๐Ÿ‡ต๐Ÿ‡ช'],
'KWD' => ['name' => 'KWD', 'flag' => '๐Ÿ‡ฐ๐Ÿ‡ผ'],
'QAR' => ['name' => 'QAR', 'flag' => '๐Ÿ‡ถ๐Ÿ‡ฆ'],
];
}