adasd
This commit is contained in:
@@ -30,7 +30,6 @@ $mm->registerFunction($moduleName, 'settings', static function (): array {
|
|||||||
$saved = modules()->settings('fx-rates');
|
$saved = modules()->settings('fx-rates');
|
||||||
$provider = trim((string) ($saved['provider'] ?? (getenv('FX_RATES_PROVIDER') ?: getenv('MINING_CHECKER_FX_PROVIDER') ?: 'currencyapi')));
|
$provider = trim((string) ($saved['provider'] ?? (getenv('FX_RATES_PROVIDER') ?: getenv('MINING_CHECKER_FX_PROVIDER') ?: 'currencyapi')));
|
||||||
$apiUrl = rtrim((string) ($saved['api_url'] ?? (getenv('FX_RATES_API_URL') ?: getenv('MINING_CHECKER_FX_URL') ?: 'https://currencyapi.net')), '/');
|
$apiUrl = rtrim((string) ($saved['api_url'] ?? (getenv('FX_RATES_API_URL') ?: getenv('MINING_CHECKER_FX_URL') ?: 'https://currencyapi.net')), '/');
|
||||||
$currenciesUrl = rtrim((string) ($saved['currencies_url'] ?? (getenv('FX_RATES_CURRENCIES_URL') ?: getenv('MINING_CHECKER_FX_CURRENCIES_URL') ?: getenv('MINING_CHECKER_FX_URL') ?: 'https://currencyapi.net')), '/');
|
|
||||||
$apiKey = trim((string) ($saved['api_key'] ?? (getenv('FX_RATES_API_KEY') ?: getenv('MINING_CHECKER_FX_API_KEY') ?: '')));
|
$apiKey = trim((string) ($saved['api_key'] ?? (getenv('FX_RATES_API_KEY') ?: getenv('MINING_CHECKER_FX_API_KEY') ?: '')));
|
||||||
$timeout = max(2, (int) ($saved['timeout_sec'] ?? (getenv('FX_RATES_TIMEOUT') ?: getenv('MINING_CHECKER_FX_TIMEOUT') ?: 10)));
|
$timeout = max(2, (int) ($saved['timeout_sec'] ?? (getenv('FX_RATES_TIMEOUT') ?: getenv('MINING_CHECKER_FX_TIMEOUT') ?: 10)));
|
||||||
$cacheTtl = max(60, (int) ($saved['cache_ttl_sec'] ?? (getenv('FX_RATES_CACHE_TTL') ?: getenv('MINING_CHECKER_FX_CACHE_TTL') ?: 21600)));
|
$cacheTtl = max(60, (int) ($saved['cache_ttl_sec'] ?? (getenv('FX_RATES_CACHE_TTL') ?: getenv('MINING_CHECKER_FX_CACHE_TTL') ?: 21600)));
|
||||||
@@ -44,16 +43,30 @@ $mm->registerFunction($moduleName, 'settings', static function (): array {
|
|||||||
is_array($preferredCurrencies) ? $preferredCurrencies : []
|
is_array($preferredCurrencies) ? $preferredCurrencies : []
|
||||||
), static fn (string $code): bool => $code !== '')));
|
), static fn (string $code): bool => $code !== '')));
|
||||||
|
|
||||||
|
$currencyCatalog = $saved['currency_catalog'] ?? [];
|
||||||
|
$currencyCatalog = array_values(array_filter(array_map(static function (mixed $item): ?array {
|
||||||
|
if (!is_array($item)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$code = strtoupper(trim((string) ($item['code'] ?? '')));
|
||||||
|
$name = trim((string) ($item['name'] ?? ''));
|
||||||
|
if ($code === '' || $name === '') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return ['code' => $code, 'name' => $name];
|
||||||
|
}, is_array($currencyCatalog) ? $currencyCatalog : [])));
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'provider' => $provider !== '' ? $provider : 'currencyapi',
|
'provider' => $provider !== '' ? $provider : 'currencyapi',
|
||||||
'api_url' => $apiUrl,
|
'api_url' => $apiUrl,
|
||||||
'currencies_url' => $currenciesUrl,
|
|
||||||
'api_key' => $apiKey,
|
'api_key' => $apiKey,
|
||||||
'timeout_sec' => $timeout,
|
'timeout_sec' => $timeout,
|
||||||
'cache_ttl_sec' => $cacheTtl,
|
'cache_ttl_sec' => $cacheTtl,
|
||||||
'default_base_currency' => strtoupper(trim((string) ($saved['default_base_currency'] ?? 'EUR'))) ?: 'EUR',
|
'default_base_currency' => strtoupper(trim((string) ($saved['default_base_currency'] ?? 'EUR'))) ?: 'EUR',
|
||||||
'display_base_currency' => strtoupper(trim((string) ($saved['display_base_currency'] ?? ($saved['default_base_currency'] ?? 'EUR')))) ?: 'EUR',
|
'display_base_currency' => strtoupper(trim((string) ($saved['display_base_currency'] ?? ($saved['default_base_currency'] ?? 'EUR')))) ?: 'EUR',
|
||||||
'preferred_currencies' => $preferredCurrencies,
|
'preferred_currencies' => $preferredCurrencies,
|
||||||
|
'currency_catalog' => $currencyCatalog,
|
||||||
|
'currency_catalog_synced_at' => trim((string) ($saved['currency_catalog_synced_at'] ?? '')),
|
||||||
'daily_refresh_enabled' => array_key_exists('daily_refresh_enabled', $saved) ? (bool) $saved['daily_refresh_enabled'] : true,
|
'daily_refresh_enabled' => array_key_exists('daily_refresh_enabled', $saved) ? (bool) $saved['daily_refresh_enabled'] : true,
|
||||||
'daily_refresh_hour' => max(0, min(23, (int) ($saved['daily_refresh_hour'] ?? 18))),
|
'daily_refresh_hour' => max(0, min(23, (int) ($saved['daily_refresh_hour'] ?? 18))),
|
||||||
'schedule_timezone' => trim((string) ($saved['schedule_timezone'] ?? 'Europe/Berlin')) ?: 'Europe/Berlin',
|
'schedule_timezone' => trim((string) ($saved['schedule_timezone'] ?? 'Europe/Berlin')) ?: 'Europe/Berlin',
|
||||||
@@ -81,6 +94,25 @@ $mm->registerFunction($moduleName, 'save_runtime_settings', static function (arr
|
|||||||
), static fn (string $code): bool => $code !== '')));
|
), static fn (string $code): bool => $code !== '')));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$catalogCodes = [];
|
||||||
|
foreach (($normalized['currency_catalog'] ?? []) as $currency) {
|
||||||
|
if (is_array($currency)) {
|
||||||
|
$code = strtoupper(trim((string) ($currency['code'] ?? '')));
|
||||||
|
if ($code !== '') {
|
||||||
|
$catalogCodes[$code] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($catalogCodes !== [] && !isset($catalogCodes[$normalized['display_base_currency']])) {
|
||||||
|
$normalized['display_base_currency'] = $normalized['default_base_currency'];
|
||||||
|
}
|
||||||
|
if ($catalogCodes !== []) {
|
||||||
|
$normalized['preferred_currencies'] = array_values(array_filter(
|
||||||
|
$normalized['preferred_currencies'],
|
||||||
|
static fn (string $code): bool => isset($catalogCodes[$code])
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
$toSave = array_merge($current, [
|
$toSave = array_merge($current, [
|
||||||
'default_base_currency' => $normalized['default_base_currency'],
|
'default_base_currency' => $normalized['default_base_currency'],
|
||||||
'display_base_currency' => $normalized['display_base_currency'],
|
'display_base_currency' => $normalized['display_base_currency'],
|
||||||
@@ -141,7 +173,14 @@ $mm->registerFunction($moduleName, 'setup_actions', static function (): array {
|
|||||||
|
|
||||||
$mm->registerFunction($moduleName, 'run_setup_action', static function (string $action): array {
|
$mm->registerFunction($moduleName, 'run_setup_action', static function (string $action): array {
|
||||||
return match ($action) {
|
return match ($action) {
|
||||||
'sync_currency_catalog' => module_fn('fx-rates', 'service')->refreshCurrencyCatalog(),
|
'sync_currency_catalog' => (static function (): array {
|
||||||
|
$result = module_fn('fx-rates', 'service')->refreshCurrencyCatalog();
|
||||||
|
$current = modules()->settings('fx-rates');
|
||||||
|
$current['currency_catalog'] = array_values(is_array($result['currencies'] ?? null) ? $result['currencies'] : []);
|
||||||
|
$current['currency_catalog_synced_at'] = gmdate('Y-m-d H:i:s');
|
||||||
|
modules()->saveSettings('fx-rates', $current);
|
||||||
|
return $result + ['message' => 'Waehrungskatalog synchronisiert. ' . (int) ($result['synced_count'] ?? 0) . ' Waehrungen verarbeitet.'];
|
||||||
|
})(),
|
||||||
default => throw new \RuntimeException('Unbekannte Setup-Aktion.'),
|
default => throw new \RuntimeException('Unbekannte Setup-Aktion.'),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"title": "Waehrungskurse",
|
"title": "Waehrungskurse",
|
||||||
"version": "0.1.1",
|
"version": "0.1.2",
|
||||||
"description": "Zentrales Modul fuer Waehrungskurse, Historie und API-Abrufe.",
|
"description": "Zentrales Modul fuer Waehrungskurse, Historie und API-Abrufe.",
|
||||||
"enabled_by_default": true,
|
"enabled_by_default": true,
|
||||||
"setup": {
|
"setup": {
|
||||||
@@ -15,13 +15,12 @@
|
|||||||
{ "name": "db.password", "label": "DB Passwort", "type": "password", "required": false },
|
{ "name": "db.password", "label": "DB Passwort", "type": "password", "required": false },
|
||||||
{ "name": "provider", "label": "FX Provider", "type": "text", "required": false, "help": "Unterstuetzt legacy currencyapi.net und currencyapi.com v3." },
|
{ "name": "provider", "label": "FX Provider", "type": "text", "required": false, "help": "Unterstuetzt legacy currencyapi.net und currencyapi.com v3." },
|
||||||
{ "name": "api_url", "label": "FX API URL", "type": "text", "required": false, "help": "Nur die Basis-URL eintragen, z.B. https://api.currencyapi.com oder https://currencyapi.net." },
|
{ "name": "api_url", "label": "FX API URL", "type": "text", "required": false, "help": "Nur die Basis-URL eintragen, z.B. https://api.currencyapi.com oder https://currencyapi.net." },
|
||||||
{ "name": "currencies_url", "label": "FX Currencies URL", "type": "text", "required": false, "help": "Nur die Basis-URL fuer den Waehrungskatalog, z.B. https://api.currencyapi.com." },
|
|
||||||
{ "name": "api_key", "label": "FX API Key", "type": "password", "required": false },
|
{ "name": "api_key", "label": "FX API Key", "type": "password", "required": false },
|
||||||
{ "name": "timeout_sec", "label": "Timeout (Sek.)", "type": "number", "required": false },
|
{ "name": "timeout_sec", "label": "Timeout (Sek.)", "type": "number", "required": false },
|
||||||
{ "name": "cache_ttl_sec", "label": "Datei-Cache TTL (Sek.)", "type": "number", "required": false },
|
{ "name": "cache_ttl_sec", "label": "Datei-Cache TTL (Sek.)", "type": "number", "required": false },
|
||||||
{ "name": "default_base_currency", "label": "Standard-Basiswaehrung", "type": "text", "required": false, "help": "Wird fuer taegliche Abrufe und Snapshot-Abfragen verwendet." },
|
{ "name": "default_base_currency", "label": "Standard-Basiswaehrung", "type": "text", "required": false, "help": "Wird fuer taegliche Abrufe und Snapshot-Abfragen verwendet." },
|
||||||
{ "name": "display_base_currency", "label": "Anzeige-Basiswaehrung", "type": "text", "required": false, "help": "Basis fuer die Anzeige der zuletzt gespeicherten Kurse im Modul." },
|
{ "name": "display_base_currency", "label": "Anzeige-Basiswaehrung", "type": "select", "required": false, "help": "Basis fuer die Anzeige der zuletzt gespeicherten Kurse im Modul." },
|
||||||
{ "name": "preferred_currencies", "label": "Bevorzugte Waehrungen", "type": "text", "required": false, "help": "Kommagetrennte Liste, z.B. EUR,USD,DOGE,BTC." },
|
{ "name": "preferred_currencies", "label": "Bevorzugte Waehrungen", "type": "multiselect", "required": false, "help": "Auswahl aus dem synchronisierten Waehrungskatalog." },
|
||||||
{ "name": "daily_refresh_enabled", "label": "Taeglichen Abruf aktivieren", "type": "checkbox", "required": false },
|
{ "name": "daily_refresh_enabled", "label": "Taeglichen Abruf aktivieren", "type": "checkbox", "required": false },
|
||||||
{ "name": "daily_refresh_hour", "label": "Taegliche Abrufstunde", "type": "number", "required": false, "help": "Lokale Stunde fuer den Scheduler, standardmaessig 18." },
|
{ "name": "daily_refresh_hour", "label": "Taegliche Abrufstunde", "type": "number", "required": false, "help": "Lokale Stunde fuer den Scheduler, standardmaessig 18." },
|
||||||
{ "name": "schedule_timezone", "label": "Scheduler-Zeitzone", "type": "text", "required": false, "help": "z.B. Europe/Berlin" }
|
{ "name": "schedule_timezone", "label": "Scheduler-Zeitzone", "type": "text", "required": false, "help": "z.B. Europe/Berlin" }
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ foreach ($fields as $field) {
|
|||||||
$fieldTypes[$fname] = (string)($field['type'] ?? 'text');
|
$fieldTypes[$fname] = (string)($field['type'] ?? 'text');
|
||||||
$fieldMeta[$fname] = $field;
|
$fieldMeta[$fname] = $field;
|
||||||
}
|
}
|
||||||
|
$isFxRatesSetup = $moduleName === 'fx-rates';
|
||||||
$current = modules()->settings($moduleName);
|
$current = modules()->settings($moduleName);
|
||||||
$intervalTaskStatuses = modules()->intervalTaskStatuses($moduleName);
|
$intervalTaskStatuses = modules()->intervalTaskStatuses($moduleName);
|
||||||
$setupActions = modules()->hasFunction($moduleName, 'setup_actions')
|
$setupActions = modules()->hasFunction($moduleName, 'setup_actions')
|
||||||
@@ -342,7 +343,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
if ($type === 'checkbox') {
|
if ($type === 'checkbox') {
|
||||||
$value = isset($_POST[$postKey]) ? '1' : '0';
|
$value = isset($_POST[$postKey]) ? '1' : '0';
|
||||||
}
|
}
|
||||||
if (is_array($value)) {
|
if (is_array($value) && $type === 'multiselect') {
|
||||||
|
$value = array_values(array_filter(array_map(
|
||||||
|
static fn (mixed $item): string => trim((string) $item),
|
||||||
|
$value
|
||||||
|
), static fn (string $item): bool => $item !== ''));
|
||||||
|
} elseif (is_array($value)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$value = is_string($value) ? trim($value) : $value;
|
$value = is_string($value) ? trim($value) : $value;
|
||||||
@@ -374,6 +380,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
$actionResult = module_fn($moduleName, 'run_setup_action', $postedSetupAction);
|
$actionResult = module_fn($moduleName, 'run_setup_action', $postedSetupAction);
|
||||||
|
$current = modules()->settings($moduleName);
|
||||||
$notice = 'Setup-Aktion ausgefuehrt.';
|
$notice = 'Setup-Aktion ausgefuehrt.';
|
||||||
if (is_array($actionResult)) {
|
if (is_array($actionResult)) {
|
||||||
if (isset($actionResult['message']) && is_string($actionResult['message']) && trim($actionResult['message']) !== '') {
|
if (isset($actionResult['message']) && is_string($actionResult['message']) && trim($actionResult['message']) !== '') {
|
||||||
@@ -444,6 +451,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
modules()->saveSettings($moduleName, $current);
|
modules()->saveSettings($moduleName, $current);
|
||||||
|
if ($isFxRatesSetup && modules()->hasFunction($moduleName, 'save_runtime_settings')) {
|
||||||
|
module_fn($moduleName, 'save_runtime_settings', $payload);
|
||||||
|
$current = modules()->settings($moduleName);
|
||||||
|
}
|
||||||
if (empty($payload['debug_enabled'])) {
|
if (empty($payload['debug_enabled'])) {
|
||||||
module_debug_clear($moduleName);
|
module_debug_clear($moduleName);
|
||||||
}
|
}
|
||||||
@@ -474,6 +485,250 @@ $activeDbGroup = $testGroup !== null && array_key_exists($testGroup, $dbGroups)
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<form method="post" class="setup-form">
|
<form method="post" class="setup-form">
|
||||||
|
<?php if ($isFxRatesSetup): ?>
|
||||||
|
<?php
|
||||||
|
$fxCatalog = is_array($current['currency_catalog'] ?? null) ? $current['currency_catalog'] : [];
|
||||||
|
$fxCatalogOptions = [];
|
||||||
|
foreach ($fxCatalog as $currency) {
|
||||||
|
if (!is_array($currency)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$code = strtoupper(trim((string) ($currency['code'] ?? '')));
|
||||||
|
$name = trim((string) ($currency['name'] ?? ''));
|
||||||
|
if ($code === '' || $name === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$fxCatalogOptions[$code] = $name;
|
||||||
|
}
|
||||||
|
ksort($fxCatalogOptions);
|
||||||
|
$fxCatalogAvailable = $fxCatalogOptions !== [];
|
||||||
|
$fxPreferred = is_array($current['preferred_currencies'] ?? null) ? $current['preferred_currencies'] : [];
|
||||||
|
$fxUseSeparateDb = !empty($current['use_separate_db']);
|
||||||
|
?>
|
||||||
|
<section class="setup-panel">
|
||||||
|
<div class="setup-panel__head">
|
||||||
|
<div>
|
||||||
|
<span class="pill">API</span>
|
||||||
|
<h2>Provider und Abruf</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="setup-grid">
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>FX Provider</span>
|
||||||
|
<input type="text" name="provider" value="<?= e((string) ($current['provider'] ?? 'currencyapi')) ?>">
|
||||||
|
<small class="muted">Unterstuetzt legacy currencyapi.net und currencyapi.com v3.</small>
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>FX API URL</span>
|
||||||
|
<input type="text" name="api_url" value="<?= e((string) ($current['api_url'] ?? 'https://currencyapi.net')) ?>">
|
||||||
|
<small class="muted">Nur die Basis-URL eintragen, z.B. https://currencyapi.net oder https://api.currencyapi.com.</small>
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>FX API Key</span>
|
||||||
|
<input type="password" name="api_key" value="<?= e((string) ($current['api_key'] ?? '')) ?>">
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>Timeout (Sek.)</span>
|
||||||
|
<input type="number" name="timeout_sec" value="<?= e((string) ($current['timeout_sec'] ?? 10)) ?>">
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>Datei-Cache TTL (Sek.)</span>
|
||||||
|
<input type="number" name="cache_ttl_sec" value="<?= e((string) ($current['cache_ttl_sec'] ?? 21600)) ?>">
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>Standard-Basiswaehrung</span>
|
||||||
|
<input type="text" name="default_base_currency" value="<?= e((string) ($current['default_base_currency'] ?? 'EUR')) ?>">
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="setup-panel">
|
||||||
|
<div class="setup-panel__head">
|
||||||
|
<div>
|
||||||
|
<span class="pill">Waehrungen</span>
|
||||||
|
<h2>Waehrungseinstellungen</h2>
|
||||||
|
<p class="muted">Die Auswahl wird erst verfuegbar, nachdem der Waehrungskatalog synchronisiert wurde.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php if (!$fxCatalogAvailable): ?>
|
||||||
|
<div class="setup-db-message setup-db-message--hint">
|
||||||
|
Noch kein Waehrungskatalog vorhanden. Fuehre zuerst unten die Modulaktion <strong>Waehrungskatalog synchronisieren</strong> aus.
|
||||||
|
</div>
|
||||||
|
<?php else: ?>
|
||||||
|
<div class="setup-grid">
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>Anzeige-Basiswaehrung</span>
|
||||||
|
<select name="display_base_currency">
|
||||||
|
<?php foreach ($fxCatalogOptions as $code => $name): ?>
|
||||||
|
<option value="<?= e($code) ?>" <?= (string) ($current['display_base_currency'] ?? '') === $code ? 'selected' : '' ?>>
|
||||||
|
<?= e($code . ' - ' . $name) ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>Bevorzugte Waehrungen</span>
|
||||||
|
<select name="preferred_currencies[]" multiple size="<?= e((string) min(12, max(6, count($fxCatalogOptions)))) ?>">
|
||||||
|
<?php foreach ($fxCatalogOptions as $code => $name): ?>
|
||||||
|
<option value="<?= e($code) ?>" <?= in_array($code, $fxPreferred, true) ? 'selected' : '' ?>>
|
||||||
|
<?= e($code . ' - ' . $name) ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
<small class="muted">Mehrfachauswahl mit Strg/Cmd oder Shift.</small>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="setup-panel">
|
||||||
|
<div class="setup-panel__head">
|
||||||
|
<div>
|
||||||
|
<span class="pill">Scheduler</span>
|
||||||
|
<h2>Taeglicher Abruf</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="setup-grid">
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>Taeglichen Abruf aktivieren</span>
|
||||||
|
<input type="checkbox" name="daily_refresh_enabled" value="1" <?= !empty($current['daily_refresh_enabled']) ? 'checked' : '' ?>>
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>Taegliche Abrufstunde</span>
|
||||||
|
<input type="number" name="daily_refresh_hour" min="0" max="23" value="<?= e((string) ($current['daily_refresh_hour'] ?? 18)) ?>">
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>Scheduler-Zeitzone</span>
|
||||||
|
<input type="text" name="schedule_timezone" value="<?= e((string) ($current['schedule_timezone'] ?? 'Europe/Berlin')) ?>">
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="setup-panel">
|
||||||
|
<div class="setup-panel__head">
|
||||||
|
<div>
|
||||||
|
<span class="pill">DB</span>
|
||||||
|
<h2>Datenbank</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="setup-grid">
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>Eigene Modul-DB nutzen</span>
|
||||||
|
<input type="checkbox" name="use_separate_db" value="1" <?= $fxUseSeparateDb ? 'checked' : '' ?> data-fx-db-toggle>
|
||||||
|
<small class="muted">Wenn aktiv, werden die folgenden DB-Daten verwendet. Sonst wird die Nexus-Base-DB genutzt.</small>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div data-fx-db-section <?= $fxUseSeparateDb ? '' : 'hidden' ?>>
|
||||||
|
<div class="setup-grid" style="margin-top:16px;">
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>DB Driver</span>
|
||||||
|
<select name="db_driver">
|
||||||
|
<option value="">Bitte waehlen</option>
|
||||||
|
<?php foreach ($driverOptions as $driver => $driverLabel): ?>
|
||||||
|
<option value="<?= e($driver) ?>" <?= (string) ($current['db']['driver'] ?? '') === $driver ? 'selected' : '' ?>><?= e($driverLabel) ?></option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>DB Host</span>
|
||||||
|
<input type="text" name="db_host" value="<?= e((string) ($current['db']['host'] ?? '')) ?>">
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>DB Port</span>
|
||||||
|
<input type="number" name="db_port" value="<?= e((string) ($current['db']['port'] ?? '')) ?>">
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>DB Name</span>
|
||||||
|
<input type="text" name="db_dbname" value="<?= e((string) ($current['db']['dbname'] ?? '')) ?>">
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>DB Schema</span>
|
||||||
|
<input type="text" name="db_schema" value="<?= e((string) ($current['db']['schema'] ?? '')) ?>">
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>DB User</span>
|
||||||
|
<input type="text" name="db_user" value="<?= e((string) ($current['db']['user'] ?? '')) ?>">
|
||||||
|
</label>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>DB Passwort</span>
|
||||||
|
<input type="password" name="db_password" value="<?= e((string) ($current['db']['password'] ?? '')) ?>">
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="setup-panel">
|
||||||
|
<div class="setup-panel__head">
|
||||||
|
<div>
|
||||||
|
<span class="pill">Aktionen</span>
|
||||||
|
<h2>Modulaktionen</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="setup-grid">
|
||||||
|
<div class="setup-field muted">
|
||||||
|
<span>Waehrungssynch</span>
|
||||||
|
<small class="muted">Laedt die verfuegbaren Waehrungen einmalig aus dem konfigurierten FX-Provider.</small>
|
||||||
|
<div class="setup-actions" style="justify-content:flex-start; margin-top:12px;">
|
||||||
|
<button class="nav-link" type="submit" name="module_setup_action" value="sync_currency_catalog" formnovalidate>
|
||||||
|
Waehrungskatalog synchronisieren
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<?php if (trim((string) ($current['currency_catalog_synced_at'] ?? '')) !== ''): ?>
|
||||||
|
<small class="muted">Letzter Sync: <?= e((string) $current['currency_catalog_synced_at']) ?></small>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
<label class="setup-field muted">
|
||||||
|
<span>Modul-Debug aktivieren</span>
|
||||||
|
<input type="checkbox" name="debug_enabled" value="1" <?= !empty($current['debug_enabled']) ? 'checked' : '' ?>>
|
||||||
|
<small class="muted">Wenn aktiv, darf das Modul Debug-Daten sammeln und den Debug-Bereich anzeigen.</small>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<?php if ($intervalTaskStatuses !== []): ?>
|
||||||
|
<section class="setup-panel">
|
||||||
|
<div class="setup-panel__head">
|
||||||
|
<div>
|
||||||
|
<span class="pill">Automationen</span>
|
||||||
|
<h2>Intervall-Aufgaben</h2>
|
||||||
|
<p class="muted">Diese Aufgaben werden beim ersten gueltigen Modulaufruf nach Ablauf des Intervalls automatisch ausgefuehrt.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="setup-grid">
|
||||||
|
<?php foreach ($intervalTaskStatuses as $task): ?>
|
||||||
|
<?php $state = is_array($task['state'] ?? null) ? $task['state'] : []; ?>
|
||||||
|
<div class="setup-field muted">
|
||||||
|
<span><?= e((string) ($task['label'] ?? $task['name'] ?? 'Intervall-Aufgabe')) ?></span>
|
||||||
|
<input type="text" readonly value="<?= e(!empty($task['enabled']) ? 'Aktiv' : 'Deaktiviert') ?>">
|
||||||
|
<small class="muted">Intervall: <?= e(number_format((float) ($task['interval_hours'] ?? 0), 2, ',', '')) ?> Stunden</small>
|
||||||
|
<small class="muted">Letzter Start: <?= e($formatRunTimestamp((string) ($state['last_started_at'] ?? ''))) ?></small>
|
||||||
|
<small class="muted">Letzter Erfolg: <?= e($formatRunTimestamp((string) ($state['last_success_at'] ?? ''))) ?></small>
|
||||||
|
<small class="muted">Naechster Lauf: <?= e($formatRunTimestamp((string) ($task['next_due_at'] ?? ''))) ?></small>
|
||||||
|
</div>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<div class="setup-actions">
|
||||||
|
<button class="cta-button" type="submit">Speichern</button>
|
||||||
|
<a class="nav-link" href="/modules/access/<?= e($moduleName) ?>">Zugriff verwalten</a>
|
||||||
|
<a class="nav-link" href="/modules">Zurück</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
(() => {
|
||||||
|
const toggle = document.querySelector('[data-fx-db-toggle]');
|
||||||
|
const section = document.querySelector('[data-fx-db-section]');
|
||||||
|
if (!toggle || !section) return;
|
||||||
|
const sync = () => {
|
||||||
|
section.hidden = !toggle.checked;
|
||||||
|
};
|
||||||
|
toggle.addEventListener('change', sync);
|
||||||
|
sync();
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
<?php else: ?>
|
||||||
<?php if ($generalFields !== []): ?>
|
<?php if ($generalFields !== []): ?>
|
||||||
<section class="setup-panel">
|
<section class="setup-panel">
|
||||||
<div class="setup-panel__head">
|
<div class="setup-panel__head">
|
||||||
@@ -656,5 +911,6 @@ $activeDbGroup = $testGroup !== null && array_key_exists($testGroup, $dbGroups)
|
|||||||
<a class="nav-link" href="/modules/access/<?= e($moduleName) ?>">Zugriff verwalten</a>
|
<a class="nav-link" href="/modules/access/<?= e($moduleName) ?>">Zugriff verwalten</a>
|
||||||
<a class="nav-link" href="/modules">Zurück</a>
|
<a class="nav-link" href="/modules">Zurück</a>
|
||||||
</div>
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user