assets(); if ($assets) { $assets->addStyle('/module/fx-rates/asset?file=fx-rates.css'); $assets->addScript('/module/fx-rates/asset?file=fx-rates.js', 'footer', true); } $settings = module_fn('fx-rates', 'settings'); $service = module_fn('fx-rates', 'service'); $preferredCurrencies = is_array($settings['preferred_currencies'] ?? null) ? $settings['preferred_currencies'] : []; $apiDescribeUrl = APP_API_BASE . '/fx-rates/v1/endpoints'; $notice = trim((string) ($_GET['notice'] ?? '')); $error = trim((string) ($_GET['error'] ?? '')); if ((string) ($_GET['refresh'] ?? '') === '1') { try { $force = !empty($_GET['force']); if ($force) { $result = $service->refreshLatestRates(null, (string) ($settings['default_base_currency'] ?? ''), 'manual'); } else { $result = $service->autoRefreshLatestRates( (string) ($settings['default_base_currency'] ?? ''), null, (int) ($settings['refresh_max_age_minutes'] ?? 60), 'manual' ); } $params = !empty($result['reused']) ? [ 'notice' => sprintf( 'Kein neuer API-Abruf. Der letzte gespeicherte Snapshot ist juenger als %d Minuten. Fuer einen erzwungenen Abruf bitte bestaetigen.', (int) ($settings['refresh_max_age_minutes'] ?? 60) ), ] : [ 'notice' => sprintf( 'Aktuelle Kurse gespeichert. %d Werte aktualisiert.', (int) ($result['updated_count'] ?? 0) ), ]; } catch (\Throwable $exception) { $params = ['error' => $exception->getMessage() !== '' ? $exception->getMessage() : 'Kurse konnten nicht aktualisiert werden.']; } redirect('/module/fx-rates?' . http_build_query($params)); } $latest = $service->latestStatus(); $recentFetches = $service->recentFetches(12); $pageData = json_encode([ 'settings' => $settings, 'latest' => $latest, 'preferred_currencies' => $preferredCurrencies, 'recent_fetches' => $recentFetches, ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); ?> = module_shell_header('fx-rates', [ 'title' => 'Waehrungskurse', 'actions' => [ ['label' => 'Setup', 'href' => '/modules/setup/fx-rates', 'variant' => 'secondary', 'size' => 'sm'], ['label' => 'Aktuelle Kurse abrufen', 'href' => '/module/fx-rates?refresh=1', 'variant' => 'secondary', 'size' => 'sm'], ], ]) ?>
API-Self-Describe-Endpoint: = e($apiDescribeUrl) ?>
Umrechnung auf Basis des letzten verfuegbaren Kurses zwischen den bevorzugten Waehrungen.
Letzter gespeicherter Snapshot, umgerechnet auf = e((string) ($settings['display_base_currency'] ?? $settings['default_base_currency'] ?? 'EUR')) ?>.
| Waehrung | Kurs |
|---|---|
| Noch keine Daten geladen. | |
Chronologischer Verlauf der bevorzugten Waehrungen relativ zur Anzeige-Basiswaehrung.
| Datum | Kurse |
|---|---|
| Noch keine Verlaufsdaten geladen. | |
| Datum | Basis | Provider | Ausloeser |
|---|---|---|---|
| Noch keine Abrufe vorhanden. | |||
| = e((string) ($fetch['fetched_at_display'] ?? $fetch['fetched_at'] ?? '')) ?> | = e((string) ($fetch['base_currency'] ?? '')) ?> | = e((string) ($fetch['provider'] ?? '')) ?> | = e((string) ($fetch['trigger_source_label'] ?? $fetch['trigger_source'] ?? '')) ?> |