Main update
All checks were successful
Deploy / deploy-staging (push) Successful in 25s
Deploy / deploy-production (push) Has been skipped

This commit is contained in:
2026-06-24 02:24:39 +02:00
parent 5ff4c3fb2b
commit d121f74bd0
34 changed files with 2548 additions and 67 deletions

View File

@@ -23,6 +23,84 @@ if ($normalized === 'v1/chart-data') {
return;
}
if ($normalized === 'v1/cron/refresh-quotes' && strtoupper((string) ($_SERVER['REQUEST_METHOD'] ?? 'GET')) === 'POST') {
header('Content-Type: application/json; charset=utf-8');
try {
$result = module_fn('boersenchecker', 'scheduled_refresh_quotes', [
'trigger_source' => 'cron',
]);
http_response_code(!empty($result['ok']) ? 200 : 500);
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
} catch (\Throwable $exception) {
http_response_code(500);
echo json_encode([
'ok' => false,
'message' => $exception->getMessage(),
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
return;
}
if ($normalized === 'v1/widget/refresh-quotes' && strtoupper((string) ($_SERVER['REQUEST_METHOD'] ?? 'GET')) === 'POST') {
header('Content-Type: application/json; charset=utf-8');
try {
$result = module_fn('boersenchecker', 'scheduled_refresh_quotes', [
'trigger_source' => 'widget',
]);
http_response_code(!empty($result['ok']) ? 200 : 500);
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
} catch (\Throwable $exception) {
http_response_code(500);
echo json_encode([
'ok' => false,
'message' => $exception->getMessage(),
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
return;
}
if ($normalized === 'v1/widget/status' && strtoupper((string) ($_SERVER['REQUEST_METHOD'] ?? 'GET')) === 'GET') {
header('Content-Type: application/json; charset=utf-8');
try {
$pdo = module_fn('boersenchecker', 'pdo');
$quoteTable = module_fn('boersenchecker', 'table', 'quotes');
$instrumentTable = module_fn('boersenchecker', 'table', 'instruments');
$positionTable = module_fn('boersenchecker', 'table', 'positions');
$settings = modules()->settings('boersenchecker');
$latestAt = $pdo->query('SELECT MAX(quoted_at) FROM ' . $quoteTable)->fetchColumn();
$countStmt = $pdo->query(
'SELECT COUNT(DISTINCT i.id)
FROM ' . $positionTable . ' p
INNER JOIN ' . $instrumentTable . ' i ON i.id = p.instrument_id
WHERE i.symbol IS NOT NULL
AND i.symbol <> \'\''
);
$trackedCount = (int) ($countStmt->fetchColumn() ?: 0);
$statusText = $latestAt
? 'Letzter Kursabruf: ' . date('d.m.Y H:i', strtotime((string) $latestAt)) . ' · ' . $trackedCount . ' Titel'
: 'Noch keine gespeicherten Kurse vorhanden.';
echo json_encode([
'ok' => true,
'data' => [
'status_text' => $statusText,
'latest_quoted_at' => $latestAt,
'tracked_instruments' => $trackedCount,
'report_currency' => (string) ($settings['report_currency'] ?? 'EUR'),
],
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
} catch (\Throwable $exception) {
http_response_code(500);
echo json_encode([
'ok' => false,
'message' => $exception->getMessage(),
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
return;
}
http_response_code(404);
header('Content-Type: application/json; charset=utf-8');
echo json_encode([

View File

@@ -3,6 +3,52 @@
"version": "0.2.0",
"description": "Depotverwaltung fuer Aktien, Kaufdaten, Kursverlauf und Waehrungsumrechnung.",
"enabled_by_default": true,
"app_scope": "module",
"installable": true,
"desktop": {
"available": true,
"show_on_desktop": true,
"show_in_start_menu": true
},
"widgets": [
{
"widget_id": "boersenchecker-refresh",
"title": "Boersenkurse",
"icon": "BC",
"zone": "sidebar",
"default_enabled": false,
"supports_public_home": false,
"summary": "Kurse fuer hinterlegte Depot-Positionen manuell nachziehen.",
"content": "Widget fuer Schnellabruf des letzten Kursstatus und manuellen Marktrefresh.",
"launch_app_id": "boersenchecker",
"action_label": "App oeffnen",
"widget_type": "action-panel",
"status_api": "/api/boersenchecker/index.php?path=v1/widget/status",
"actions": [
{
"action_id": "refresh-quotes",
"label": "Kurse abrufen",
"endpoint": "/api/boersenchecker/index.php?path=v1/widget/refresh-quotes",
"method": "POST"
}
]
}
],
"cron_jobs": [
{
"job_id": "refresh-quotes",
"label": "Boersenkurse aktualisieren",
"description": "Laedt fuer alle aktiven Depot-Positionen neue Alpha-Vantage-Kurse.",
"endpoint_path": "/api/boersenchecker/index.php?path=v1/cron/refresh-quotes",
"method": "POST",
"payload": {
"trigger_source": "cron"
},
"default_enabled": false,
"default_cron": "15 */6 * * 1-5",
"lock_minutes": 20
}
],
"setup": {
"fields": [
{ "name": "use_separate_db", "label": "Eigene Modul-DB nutzen", "type": "checkbox", "required": false, "help": "Wenn aktiv, werden die DB-Daten unten verwendet. Sonst wird die Nexus-Base-DB genutzt." },