me = new User(INTERNAL_USER_ID); $this->layout()->setTemplate(null); } public static function returnJson($data) { self::$capturedResult = $data; } } $apiParams = [ 'mod' => 'Preorder', 'action' => 'api', 'do' => 'getFilteredPreorders', 'filter' => [ 'preordercampaign_id' => 99 ] ]; new PreorderSyncWrapper($apiParams); $response = PreorderSyncWrapper::$capturedResult; if (!$response || !isset($response['status']) || $response['status'] !== 'OK') { die("Fehler beim Abrufen der Daten oder keine Daten erhalten.\n"); } $preorders = $response['result']['preorders'] ?? []; try { $dsn = "pgsql:host=$pgHost;port=$pgPort;dbname=$pgDb"; $pdo = new PDO($dsn, $pgUser, $pgPass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); } catch (PDOException $e) { die("Verbindung zu PostgreSQL fehlgeschlagen: " . $e->getMessage() . "\n"); } $pdo->exec("CREATE SCHEMA IF NOT EXISTS $targetSchema"); $createTableSql = <<exec($createTableSql); $pdo->exec("ALTER TABLE $targetSchema.\"$targetTable\" ADD COLUMN IF NOT EXISTS company VARCHAR(255)"); $pdo->exec("ALTER TABLE $targetSchema.\"$targetTable\" ADD COLUMN IF NOT EXISTS firstname VARCHAR(255)"); $pdo->exec("ALTER TABLE $targetSchema.\"$targetTable\" ADD COLUMN IF NOT EXISTS lastname VARCHAR(255)"); $pdo->exec("ALTER TABLE $targetSchema.\"$targetTable\" ADD COLUMN IF NOT EXISTS phone VARCHAR(100)"); $pdo->exec("ALTER TABLE $targetSchema.\"$targetTable\" ADD COLUMN IF NOT EXISTS email VARCHAR(255)"); $pdo->exec("ALTER TABLE $targetSchema.\"$targetTable\" ADD COLUMN IF NOT EXISTS status_code INTEGER"); $pdo->exec("ALTER TABLE $targetSchema.\"$targetTable\" ADD COLUMN IF NOT EXISTS status_id INTEGER"); $pdo->exec("ALTER TABLE $targetSchema.\"$targetTable\" ADD COLUMN IF NOT EXISTS oaid VARCHAR(255)"); $sqlUpsert = <<prepare($sqlUpsert); $processedIds = []; $countUpsert = 0; $countUnchanged = 0; $countSkipped = 0; $pdo->beginTransaction(); foreach ($preorders as $po) { $id = $po->id; $gps_lat = $po->gps_lat; $gps_long = $po->gps_long; if (empty($gps_lat) || empty($gps_long)) { $countSkipped++; continue; } $latVal = str_replace(',', '.', $gps_lat); $lonVal = str_replace(',', '.', $gps_long); $params = [ ':id' => $id, ':type' => $po->type, ':type_label' => $po->type_label, ':strasse' => $po->adb_strasse, ':hausnummer' => $po->adb_hausnummer, ':plz' => $po->adb_plz, ':ort' => $po->adb_ort, ':company' => $po->company, ':firstname' => $po->firstname, ':lastname' => $po->lastname, ':phone' => $po->phone, ':email' => $po->email, ':status_code' => $po->status_code, ':status_id' => $po->status_id, ':oaid' => $po->oaid, ':lat' => $latVal, ':lon' => $lonVal ]; $stmt->execute($params); $processedIds[] = $id; if ($stmt->rowCount() > 0) { $countUpsert++; } else { $countUnchanged++; } } $deletedCount = 0; if (!empty($processedIds)) { $inQuery = implode(',', array_map('intval', $processedIds)); $deleteSql = "DELETE FROM $targetSchema.\"$targetTable\" WHERE id NOT IN ($inQuery)"; $deletedCount = $pdo->exec($deleteSql); } else { if (count($preorders) == 0) { } } $pdo->commit(); //echo "Sync fertig.\n"; //echo "Neu erstellt oder aktualisiert: $countUpsert\n"; //echo "Unverändert (kein Update nötig): $countUnchanged\n"; //echo "Ohne Koordinaten (übersprungen): $countSkipped\n"; //echo "Gelöscht (nicht mehr in Quelle): $deletedCount\n";