Quelltext des aktuellen Standes
-- ============================================================
-- MDM: mehrere Relution-Instanzen nebeneinander
-- ============================================================
-- Server-Adresse und Zugriffstoken lagen einmalig in `system_settings`; damit
-- war genau eine Instanz möglich. Wer mehrere Kunden oder Mandanten betreut,
-- braucht mehrere nebeneinander – jede mit eigenen Zugangsdaten, eigenen
-- Filtern und erkennbarer Herkunft am Gerät.
--
-- Der heikle Punkt ist dieselbe Stelle wie beim Verzeichnis: Der Abgleich
-- mustert Geräte aus, die er nicht mehr sieht. Ohne Eingrenzung auf die
-- Instanz würde bei zwei Anbindungen jeder Lauf die Geräte der jeweils
-- anderen ausmustern – lautlos, denn der Lauf meldet Erfolg. Deshalb trägt
-- jedes Gerät die Instanz, aus der es stammt.
CREATE TABLE IF NOT EXISTS `mdm_connections` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(120) NOT NULL COMMENT 'Erkennbarer Name, erscheint am Geraet',
`type` ENUM('relution') NOT NULL DEFAULT 'relution',
`settings_json` TEXT NULL COMMENT 'Adresse, Filter und Kategorien; Token darin verschluesselt',
`enabled` TINYINT(1) NOT NULL DEFAULT 1,
`sort_order` INT NOT NULL DEFAULT 0,
`last_run_at` DATETIME NULL,
`last_status` ENUM('ok','error') NULL,
`last_message` VARCHAR(1000) NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `uq_mdmconn_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Herkunft am Geraet. NULL bleibt fuer alles, was nicht aus einer Relution-
-- Instanz stammt (von Hand angelegt, Intune, Inventaragent).
ALTER TABLE `assets`
ADD COLUMN `mdm_connection_id` INT UNSIGNED NULL DEFAULT NULL
COMMENT 'MDM-Instanz, aus der das Geraet stammt (NULL = keine)'
AFTER `mdm_source`;
ALTER TABLE `assets`
ADD INDEX `idx_assets_mdm_connection` (`mdm_connection_id`);
-- Die bestehende Instanz übernehmen. Anders als beim Verzeichnis stehen die
-- Einstellungen hier bereits in der Datenbank, die Übernahme läuft also
-- vollständig hier – ohne Zutun und ohne dass etwas neu einzutragen wäre.
-- Das Token wandert verschlüsselt mit, wie es ist.
--
-- `relution_platforms` und `relution_statuses` sind bereits JSON-Zeichenketten
-- und bleiben es: Der Abgleich liest sie unverändert weiter so.
INSERT IGNORE INTO `mdm_connections` (`name`, `type`, `enabled`, `sort_order`, `settings_json`)
SELECT 'Relution',
'relution',
CASE WHEN COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_sync_enabled'), '0') = '1'
THEN 1 ELSE 0 END,
1,
JSON_OBJECT(
'server_url', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_server_url'), ''),
'access_token', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_access_token'), ''),
'platforms', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_platforms'), '[]'),
'platforms_all', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_platforms_all'), '0'),
'statuses', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_statuses'), '[]'),
'default_category_id', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_default_category_id'), '0'),
'decommission_missing', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_decommission_missing'), '0'),
'category_smartphone', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_category_smartphone'), '0'),
'category_tablet', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_category_tablet'), '0'),
'category_other', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_category_other'), '0'),
'decommission_grace_days', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_decommission_grace_days'), '0'),
'decommission_max_percent', COALESCE((SELECT `value` FROM `system_settings` WHERE `key` = 'relution_decommission_max_percent'), '20')
)
FROM DUAL
WHERE EXISTS (
SELECT 1 FROM `system_settings`
WHERE `key` = 'relution_server_url' AND `value` <> ''
);
-- Vorhandene Geräte der übernommenen Instanz zuordnen. Wirkt nur auf Zeilen
-- ohne Zuordnung; zu diesem Zeitpunkt gibt es höchstens eine Instanz.
UPDATE `assets` a
JOIN `mdm_connections` c ON c.`type` = 'relution'
SET a.`mdm_connection_id` = c.`id`
WHERE a.`mdm_connection_id` IS NULL
AND a.`mdm_source` = 'relution';