OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

relution-sync.php

5 KB
<?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);
}