Quelltext des aktuellen Standes
-- ============================================================
-- Lizenzen: wer belegt welchen Platz
-- ============================================================
-- Bisher war die Belegung einer Lizenz eine gepflegte Zahl (`seats_used`) ohne
-- Bezug dazu, wer die Plätze tatsächlich hält. Diese Tabelle stellt den Bezug
-- her: je Zuordnung ein Gerät oder eine Person aus dem Verzeichnis.
--
-- `seats_used` bleibt bewusst unangetastet:
-- * Bei Lizenzen aus dem Microsoft-365-Abgleich gehört der Wert der Quelle
-- und wird bei jedem Lauf überschrieben.
-- * Bei selbst gepflegten Lizenzen steht dort ein über die Zeit gepflegter
-- Wert, der beim Update nicht stillschweigend auf null fallen soll.
-- Die Oberfläche stellt beide Zahlen nebeneinander und bietet bei selbst
-- gepflegten Lizenzen an, die gepflegte Zahl aus den Zuordnungen zu setzen.
CREATE TABLE IF NOT EXISTS `license_assignments` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`license_id` INT UNSIGNED NOT NULL,
`subject_type` ENUM('asset','person') NOT NULL COMMENT 'Gerät oder Verzeichnis-Person',
`subject_id` INT UNSIGNED NOT NULL,
`note` VARCHAR(255) NULL,
`assigned_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`assigned_by` INT UNSIGNED NULL,
-- Dieselbe Lizenz zweimal an dasselbe Ziel ergibt keinen zweiten Platz.
UNIQUE KEY `uq_license_subject` (`license_id`, `subject_type`, `subject_id`),
INDEX `idx_la_subject` (`subject_type`, `subject_id`),
CONSTRAINT `fk_la_license` FOREIGN KEY (`license_id`) REFERENCES `licenses`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;