Quelltext des aktuellen Standes
<?php
// Cron-Script: Relution MDM Sync
//
// Dieses Script sollte regelmaessig per Cron ausgefuehrt werden (z.B. alle 30 Minuten):
// */30 * * * * /usr/bin/php /pfad/zu/bin/relution-sync.php >> /pfad/zu/storage/logs/relution-sync.log 2>&1
require_once __DIR__ . '/../vendor/autoload.php';
require_once __DIR__ . '/../bootstrap.php';
use OpenNIT\Core\Database;
use OpenNIT\Services\MdmConnectionManager;
use OpenNIT\Services\RelutionSyncRunner;
$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));
$dotenv->load();
$dbConfig = require __DIR__ . '/../config/database.php';
$runtimeConfig = [];
$runtimeFile = __DIR__ . '/../config/runtime.php';
if (file_exists($runtimeFile)) {
$runtimeConfig = include $runtimeFile;
}
$config = $runtimeConfig;
$db = new Database($dbConfig);
$auditLogger = new \OpenNIT\Audit\AuditLogger($db, null);
// Zeitzone aus Konfiguration setzen
$timezone = $config['app']['timezone'] ?? 'Europe/Berlin';
date_default_timezone_set($timezone);
// Cron-Lauf tracken
$runId = null;
try {
$runId = (int)$db->insert('cronjob_runs', [
'job_name' => 'relution_sync',
'started_at' => date('Y-m-d H:i:s'),
'status' => 'running',
]);
} catch (\Throwable) {}
// Alle eingeschalteten Instanzen. Seit der Umstellung auf mehrere Instanzen
// stehen Adresse und Token nicht mehr einzeln in `system_settings`, sondern je
// Instanz in `mdm_connections`; die Migration hat die frühere übernommen.
$appKey = (string)($config['app']['key'] ?? ($_ENV['APP_KEY'] ?? ''));
$instanzen = (new MdmConnectionManager($db, $appKey))->enabled();
if ($instanzen === []) {
$msg = 'Keine Relution-Instanz eingerichtet oder eingeschaltet – abgebrochen.';
echo '[' . date('Y-m-d H:i:s') . '] ' . $msg . PHP_EOL;
if ($runId) {
try {
$db->update('cronjob_runs', [
'finished_at' => date('Y-m-d H:i:s'),
'status' => 'success',
'message' => $msg,
'items_processed' => 0,
], 'id = ?', [$runId]);
} catch (\Throwable) {}
}
exit(0);
}
echo '[' . date('Y-m-d H:i:s') . '] Starte Relution MDM Sync über '
. count($instanzen) . ' Instanz(en)…' . PHP_EOL;
try {
$lauf = (new RelutionSyncRunner($db, $auditLogger, $appKey))->run();
$ok = $lauf['ok'];
$created = $lauf['created'];
$updated = $lauf['updated'];
$linked = $lauf['linked'];
$decommissioned = $lauf['decommissioned'];
$errors = $lauf['errors'];
foreach ($lauf['results'] as $einzeln) {
echo '[' . date('Y-m-d H:i:s') . '] ' . $einzeln['name'] . ': ' . $einzeln['message'] . PHP_EOL;
}
$msg = "{$created} neu angelegt, {$updated} aktualisiert, {$linked} verknüpft, {$decommissioned} dekommissioniert."
. (count($errors) ? ' Fehler: ' . count($errors) : '');
echo '[' . date('Y-m-d H:i:s') . '] ' . $msg . PHP_EOL;
foreach ($errors as $err) {
echo '[' . date('Y-m-d H:i:s') . '] FEHLER: ' . $err . PHP_EOL;
}
// Letzten Sync-Zeitstempel in system_settings speichern
$result = [
'ok' => $ok,
'created' => $created,
'updated' => $updated,
'linked' => $linked,
'decommissioned' => $decommissioned,
'errors' => $errors,
'log' => array_merge(...(array_map(
fn (array $e): array => array_map(fn (string $z): string => $e['name'] . ': ' . $z, $e['log']),
$lauf['results']
) ?: [[]])),
'instances' => array_map(
fn (array $e): array => ['name' => $e['name'], 'ok' => $e['ok'], 'message' => $e['message']],
$lauf['results']
),
'synced_at' => date('d.m.Y H:i:s'),
];
foreach ([
'relution_last_sync' => date('Y-m-d H:i:s'),
'relution_last_result' => json_encode($result),
] as $key => $value) {
$db->execute(
"INSERT INTO system_settings (`key`, `value`) VALUES (?, ?)
ON DUPLICATE KEY UPDATE `value` = VALUES(`value`), updated_at = CURRENT_TIMESTAMP",
[$key, $value]
);
}
if ($runId) {
$db->update('cronjob_runs', [
'finished_at' => date('Y-m-d H:i:s'),
'status' => $ok ? 'success' : 'error',
'message' => $msg,
'items_processed' => $created + $updated,
], 'id = ?', [$runId]);
}
} catch (\Throwable $e) {
$msg = 'Exception: ' . $e->getMessage();
echo '[' . date('Y-m-d H:i:s') . '] ' . $msg . PHP_EOL;
if ($runId) {
$db->update('cronjob_runs', [
'finished_at' => date('Y-m-d H:i:s'),
'status' => 'error',
'message' => $msg,
], 'id = ?', [$runId]);
}
exit(1);
}