assets(); if ($assets) { $assets->addStyle('/module/fx-rates/asset?file=fx-rates.css'); $assets->addScript('/module/fx-rates/asset?file=fx-rates-currencies.js', 'footer', true); } $settings = module_fn('fx-rates', 'settings'); $service = module_fn('fx-rates', 'service'); $notice = trim((string) ($_GET['notice'] ?? '')); $error = trim((string) ($_GET['error'] ?? '')); if (strtoupper((string) ($_SERVER['REQUEST_METHOD'] ?? 'GET')) === 'POST') { try { $action = trim((string) ($_POST['fx_action'] ?? '')); if ($action === 'save_selection') { $payload = [ 'display_base_currency' => (string) ($_POST['display_base_currency'] ?? ''), 'preferred_currencies' => $_POST['preferred_currencies'] ?? [], ]; $saved = module_fn('fx-rates', 'save_runtime_settings', $payload); $params = ['notice' => 'Waehrungs-Auswahl gespeichert.']; if (is_array($saved) && !empty($saved['display_base_currency'])) { $params['base'] = (string) $saved['display_base_currency']; } redirect('/module/fx-rates/currencies?' . http_build_query($params)); } if ($action === 'sync_catalog') { $result = module_fn('fx-rates', 'run_setup_action', 'sync_currency_catalog'); redirect('/module/fx-rates/currencies?' . http_build_query([ 'notice' => sprintf('Waehrungskatalog synchronisiert. %d Waehrungen verarbeitet.', (int) ($result['synced_count'] ?? 0)), ])); } if ($action === 'refresh_rates') { $result = $service->refreshLatestRates(null, (string) ($settings['default_base_currency'] ?? ''), 'manual'); redirect('/module/fx-rates/currencies?' . http_build_query([ 'notice' => sprintf('Alle Wechselkurse aktualisiert. %d Werte gespeichert.', (int) ($result['updated_count'] ?? 0)), ])); } } catch (\Throwable $exception) { redirect('/module/fx-rates/currencies?' . http_build_query([ 'error' => $exception->getMessage() !== '' ? $exception->getMessage() : 'Aktion konnte nicht ausgefuehrt werden.', ])); } } $catalog = is_array($settings['currency_catalog'] ?? null) ? $settings['currency_catalog'] : []; $preferredCurrencies = is_array($settings['preferred_currencies'] ?? null) ? $settings['preferred_currencies'] : []; $displayBaseCurrency = strtoupper(trim((string) ($settings['display_base_currency'] ?? $settings['default_base_currency'] ?? 'EUR'))); $latest = $service->latestStatus(); $recentFetches = $service->recentFetches(15); $currencies = []; foreach ($catalog as $item) { if (!is_array($item)) { continue; } $code = strtoupper(trim((string) ($item['code'] ?? ''))); $name = trim((string) ($item['name'] ?? '')); if ($code === '' || $name === '') { continue; } $currencies[] = [ 'code' => $code, 'name' => $name, ]; } $cryptoCodes = array_fill_keys([ 'ADA', 'ARB', 'BNB', 'BTC', 'DAI', 'DOGE', 'DOT', 'ETH', 'LINK', 'LTC', 'SOL', 'USDC', 'USDT', 'XAG', 'XAU', 'XRP', ], true); $fiatCount = 0; $cryptoCount = 0; foreach ($currencies as $currency) { if (isset($cryptoCodes[$currency['code']])) { $cryptoCount++; } else { $fiatCount++; } } $currencyPageData = json_encode([ 'currencies' => $currencies, 'preferred_currencies' => array_values(array_unique(array_map(static fn (mixed $code): string => strtoupper(trim((string) $code)), $preferredCurrencies))), 'display_base_currency' => $displayBaseCurrency, ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $tabs = [ ['label' => 'Ueberblick', 'href' => '/module/fx-rates'], ['label' => 'Waehrungen', 'href' => '/module/fx-rates/currencies', 'active' => true], ]; ?> 'Waehrungskurse', 'tabs' => $tabs, 'actions' => [ ['label' => 'Setup', 'href' => '/modules/setup/fx-rates', 'variant' => 'secondary', 'size' => 'sm'], ], ]) ?>
'>

Waehrungs-Update

Auswahl wird in den FX-Rates-Einstellungen gespeichert und steht damit auf Handy und Desktop gleich zur Verfuegung.

Fiat
Waehrungen
Krypto
Waehrungen
Bevorzugte Waehrungen fuer Anzeige

Letzte 15 Kurs-Uploads

Zeigt die zuletzt gespeicherten Wechselkurse aus der Datenbank.

Anzeige-Basis:
Letzter Abruf:
snapshotByFetchId((int) ($fetch['id'] ?? 0), $displayBaseCurrency, $preferredCurrencies); $rates = is_array($snapshot['rates'] ?? null) ? $snapshot['rates'] : []; ?>
Zeit Stichtag Fetch-Basis Provider
Noch keine Abrufe vorhanden.