aether-framework/sql/aether_police.sql
Jerrit Fritzsche e4b82dd685 Aether-Framework: Fachmodule, Admin-Panel und Docker-Datenbank
- aether-medical: Stationen/Belegung, Intensivstation, Blutbank, Fuhrpark,
  Nachrichten/Aushänge, Berichte und Textbausteine (server + NUI)
- aether-admin: vollständiges Server-Admin-Panel als echtes FiveM-Resource,
  an aether-core gekoppelt (Rechte über aether_users.admin_group), mit
  WebRTC-Live-Kameras (Bildschirmfreigabe) und separatem Media-Server (SFU)
- Prototypen admin/ vervollständigt
- SQL-Schema aether_admin.sql
- Docker-Compose mit MariaDB und idempotenter Auto-Migration (schema_migrations)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-27 18:55:32 +02:00

454 lines
22 KiB
SQL

-- =====================================================================
-- aether-police — Datenbankschema
--
-- Einspielen: mysql -u root -p aether < sql/aether_police.sql
--
-- Hinweis zum Grundprinzip: Keine dieser Tabellen enthaelt Automatismen.
-- Fristen (z. B. Haftzeit) werden nur MITGEFUEHRT, damit das System
-- erinnern kann. Ausgefuehrt wird ausschliesslich durch einen Beamten —
-- erkennbar an den Feldern `entlassen_von` / `entlassen_am`.
-- =====================================================================
USE `aether`;
-- ---------------------------------------------------------------------
-- Personal: Zugehoerigkeit, Rolle und individuelle Rechte
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_personal` (
`character` INT UNSIGNED NOT NULL COMMENT 'Charakter aus aether_characters',
`dienstnummer` VARCHAR(16) NOT NULL COMMENT 'Dienstnummer, z. B. LSPD-0421',
`rolle` VARCHAR(32) NOT NULL DEFAULT 'anwaerter',
`abteilung` VARCHAR(32) NOT NULL DEFAULT 'streife' COMMENT 'streife/kripo/verkehr/sek/leitstelle',
`rechte_extra` LONGTEXT DEFAULT NULL COMMENT 'Zusaetzlich gewaehrte Rechte als JSON-Array',
`rechte_entzug` LONGTEXT DEFAULT NULL COMMENT 'Einzeln entzogene Rechte als JSON-Array',
`eingestellt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`aktiv` TINYINT(1) NOT NULL DEFAULT 1,
`notiz` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`character`),
UNIQUE KEY `uniq_dienstnummer` (`dienstnummer`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Dienstzeiten (nur Protokoll, keine Auswertung zur Bewertung)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_dienst` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`character` INT UNSIGNED NOT NULL,
`beginn` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`ende` DATETIME DEFAULT NULL,
`sekunden` INT NOT NULL DEFAULT 0,
`abteilung` VARCHAR(32) NOT NULL DEFAULT 'streife',
PRIMARY KEY (`id`),
KEY `idx_character` (`character`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Personenakten — Stammdaten der Polizei zu einer Person
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_person` (
`character` INT UNSIGNED NOT NULL,
`lichtbild` LONGTEXT DEFAULT NULL COMMENT 'Bild-URL oder Data-URI',
`fingerabdruck` VARCHAR(64) DEFAULT NULL,
`dna` VARCHAR(64) DEFAULT NULL,
`warnhinweis` VARCHAR(255) DEFAULT NULL COMMENT 'z. B. gewaltbereit, bewaffnet',
`gefahrenstufe` TINYINT NOT NULL DEFAULT 0 COMMENT '0 = keine, 3 = hoch',
`aktualisiert` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`character`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Akten (Straf-, Ermittlungs-, Einsatz-, Unfallakte, Vernehmung ...)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_akte` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`aktenzeichen` VARCHAR(32) NOT NULL,
`typ` VARCHAR(24) NOT NULL COMMENT 'straf/ermittlung/einsatz/unfall/vernehmung/beschluss',
`titel` VARCHAR(160) NOT NULL,
`status` VARCHAR(24) NOT NULL DEFAULT 'offen' COMMENT 'offen/pruefung/geschlossen',
`inhalt` LONGTEXT DEFAULT NULL,
`erstellt_von` INT UNSIGNED NOT NULL,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`freigabe_von` INT UNSIGNED DEFAULT NULL COMMENT 'Wer hat freigegeben (nie automatisch)',
`freigabe_am` DATETIME DEFAULT NULL,
`version` INT NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_az` (`aktenzeichen`),
KEY `idx_typ` (`typ`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Versionshistorie jeder Akte (Dokumentenverwaltung)
CREATE TABLE IF NOT EXISTS `police_akte_version` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`akte` INT UNSIGNED NOT NULL,
`version` INT NOT NULL,
`inhalt` LONGTEXT DEFAULT NULL,
`geaendert_von` INT UNSIGNED NOT NULL,
`geaendert_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`grund` VARCHAR(255) DEFAULT NULL COMMENT 'Warum wurde geaendert',
PRIMARY KEY (`id`),
KEY `idx_akte` (`akte`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Verknuepfungen: Akte <-> Person / Fahrzeug / Beweis / Einsatz
CREATE TABLE IF NOT EXISTS `police_verknuepfung` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`akte` INT UNSIGNED NOT NULL,
`typ` VARCHAR(16) NOT NULL COMMENT 'person/fahrzeug/beweis/einsatz/bericht',
`ziel_id` VARCHAR(64) NOT NULL COMMENT 'ID oder Kennzeichen des Ziels',
`rolle` VARCHAR(32) DEFAULT NULL COMMENT 'beschuldigt/zeuge/geschaedigt/beteiligt',
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_akte` (`akte`),
KEY `idx_ziel` (`typ`, `ziel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Anzeigen — erfasste Delikte. Immer von einem Beamten bestaetigt.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_anzeige` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`akte` INT UNSIGNED DEFAULT NULL,
`beschuldigter` INT UNSIGNED NOT NULL,
`delikte` LONGTEXT NOT NULL COMMENT 'JSON: [{id,name,haft,geld,paragraph}]',
`haft_empfohlen` INT NOT NULL DEFAULT 0 COMMENT 'Vorschlag des Katalogs (Minuten)',
`geld_empfohlen` INT NOT NULL DEFAULT 0 COMMENT 'Vorschlag des Katalogs',
`haft_final` INT NOT NULL DEFAULT 0 COMMENT 'Vom Beamten festgelegt',
`geld_final` INT NOT NULL DEFAULT 0 COMMENT 'Vom Beamten festgelegt',
`begruendung` VARCHAR(512) DEFAULT NULL COMMENT 'Pflicht bei Abweichung vom Vorschlag',
`status` VARCHAR(16) NOT NULL DEFAULT 'entwurf' COMMENT 'entwurf/bestaetigt/verworfen',
`erstellt_von` INT UNSIGNED NOT NULL,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`bestaetigt_von` INT UNSIGNED DEFAULT NULL,
`bestaetigt_am` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_beschuldigter` (`beschuldigter`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Gewahrsam — reine Fristenverwaltung, KEINE automatische Entlassung
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_gewahrsam` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`character` INT UNSIGNED NOT NULL,
`anzeige` INT UNSIGNED DEFAULT NULL,
`haft_minuten` INT NOT NULL COMMENT 'Vom Beamten festgelegte Dauer',
`beginn` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`faellig_am` DATETIME NOT NULL COMMENT 'Ab hier erinnert das System nur',
`grund` VARCHAR(512) NOT NULL DEFAULT '',
`zelle` VARCHAR(32) DEFAULT NULL,
`eingewiesen_von` INT UNSIGNED NOT NULL,
-- Entlassung geschieht ausschliesslich manuell:
`entlassen_von` INT UNSIGNED DEFAULT NULL,
`entlassen_am` DATETIME DEFAULT NULL,
`entlass_grund` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_character` (`character`),
KEY `idx_offen` (`entlassen_am`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Einsaetze und Dispatch
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_einsatz` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`nummer` VARCHAR(24) NOT NULL COMMENT 'Einsatznummer',
`titel` VARCHAR(160) NOT NULL,
`kategorie` VARCHAR(32) NOT NULL DEFAULT 'sonstiges',
`prioritaet` TINYINT NOT NULL DEFAULT 3 COMMENT '1 = hoechste',
`ort` VARCHAR(160) DEFAULT NULL,
`pos_x` FLOAT DEFAULT NULL,
`pos_y` FLOAT DEFAULT NULL,
`pos_z` FLOAT DEFAULT NULL,
`beschreibung` TEXT DEFAULT NULL,
`status` VARCHAR(24) NOT NULL DEFAULT 'offen' COMMENT 'offen/zugewiesen/vorort/abgeschlossen',
`quelle` VARCHAR(32) NOT NULL DEFAULT 'manuell' COMMENT 'manuell/notruf/panik/extern',
`erstellt_von` INT UNSIGNED DEFAULT NULL COMMENT 'NULL bei eingehendem Notruf',
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`geschlossen_von` INT UNSIGNED DEFAULT NULL,
`geschlossen_am` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_nummer` (`nummer`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `police_einsatz_beamter` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`einsatz` INT UNSIGNED NOT NULL,
`character` INT UNSIGNED NOT NULL,
`beigetreten` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`verlassen` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_einsatz` (`einsatz`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `police_einsatz_notiz` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`einsatz` INT UNSIGNED NOT NULL,
`text` VARCHAR(1000) NOT NULL,
`von` INT UNSIGNED NOT NULL,
`am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_einsatz` (`einsatz`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Fahndungen — immer manuell angelegt
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_fahndung` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`typ` VARCHAR(16) NOT NULL DEFAULT 'person' COMMENT 'person/fahrzeug',
`ziel_id` VARCHAR(64) NOT NULL COMMENT 'Charakter-ID oder Kennzeichen',
`bezeichnung` VARCHAR(160) NOT NULL,
`grund` VARCHAR(512) NOT NULL,
`gefahr` VARCHAR(24) NOT NULL DEFAULT 'normal' COMMENT 'normal/bewaffnet/gefaehrlich',
`prioritaet` TINYINT NOT NULL DEFAULT 3,
`hinweise` TEXT DEFAULT NULL,
`bild` LONGTEXT DEFAULT NULL,
`aktiv` TINYINT(1) NOT NULL DEFAULT 1,
`erstellt_von` INT UNSIGNED NOT NULL,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`aufgehoben_von` INT UNSIGNED DEFAULT NULL,
`aufgehoben_am` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_ziel` (`typ`, `ziel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Beweise
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_beweis` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`kennung` VARCHAR(32) NOT NULL COMMENT 'Beweismittelnummer',
`akte` INT UNSIGNED DEFAULT NULL,
`art` VARCHAR(24) NOT NULL COMMENT 'foto/video/fingerabdruck/dna/huelse/dokument/aussage/gegenstand',
`bezeichnung` VARCHAR(160) NOT NULL,
`beschreibung` TEXT DEFAULT NULL,
`fundort` VARCHAR(160) DEFAULT NULL,
`gefunden_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`datei` LONGTEXT DEFAULT NULL COMMENT 'Bild-/Video-URL',
`erfasst_von` INT UNSIGNED NOT NULL,
`erfasst_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_kennung` (`kennung`),
KEY `idx_akte` (`akte`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Asservatenkammer
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_asservat` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`kennung` VARCHAR(32) NOT NULL,
`kategorie` VARCHAR(24) NOT NULL COMMENT 'waffe/drogen/bargeld/schmuck/datentraeger/dokument/sonstiges',
`bezeichnung` VARCHAR(160) NOT NULL,
`menge` VARCHAR(48) DEFAULT NULL,
`lagerort` VARCHAR(64) NOT NULL DEFAULT 'Asservatenkammer A',
`verantwortlich` INT UNSIGNED NOT NULL,
`akte` INT UNSIGNED DEFAULT NULL,
`beweis` INT UNSIGNED DEFAULT NULL,
`status` VARCHAR(24) NOT NULL DEFAULT 'eingelagert' COMMENT 'eingelagert/ausgegeben/vernichtet/zurueckgegeben',
`eingelagert_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_kennung` (`kennung`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `police_asservat_historie` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`asservat` INT UNSIGNED NOT NULL,
`aktion` VARCHAR(48) NOT NULL,
`von` INT UNSIGNED NOT NULL,
`am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`notiz` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_asservat` (`asservat`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Dienstfahrzeuge
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_fahrzeug` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`kennzeichen` VARCHAR(16) NOT NULL,
`modell` VARCHAR(48) NOT NULL,
`bezeichnung` VARCHAR(64) NOT NULL,
`abteilung` VARCHAR(32) NOT NULL DEFAULT 'streife',
`zugewiesen_an` INT UNSIGNED DEFAULT NULL COMMENT 'Manuell zugewiesen',
`letzter_fahrer` INT UNSIGNED DEFAULT NULL,
`tank` FLOAT NOT NULL DEFAULT 100,
`zustand` FLOAT NOT NULL DEFAULT 1000,
`wartung` VARCHAR(24) NOT NULL DEFAULT 'ok' COMMENT 'ok/faellig/werkstatt',
`status` VARCHAR(24) NOT NULL DEFAULT 'verfuegbar',
`pos_x` FLOAT DEFAULT NULL,
`pos_y` FLOAT DEFAULT NULL,
`pos_z` FLOAT DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_kennzeichen` (`kennzeichen`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Berichte
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_bericht` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`nummer` VARCHAR(32) NOT NULL,
`einsatz` INT UNSIGNED DEFAULT NULL,
`akte` INT UNSIGNED DEFAULT NULL,
`titel` VARCHAR(160) NOT NULL,
`beschreibung` LONGTEXT DEFAULT NULL,
`massnahmen` LONGTEXT DEFAULT NULL,
`beteiligte` LONGTEXT DEFAULT NULL COMMENT 'JSON',
`anlagen` LONGTEXT DEFAULT NULL COMMENT 'JSON',
`status` VARCHAR(24) NOT NULL DEFAULT 'entwurf' COMMENT 'entwurf/eingereicht/freigegeben',
`erstellt_von` INT UNSIGNED NOT NULL,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`unterschriften` LONGTEXT DEFAULT NULL COMMENT 'JSON: wer hat unterschrieben',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_nummer` (`nummer`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Interne Kommunikation
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_nachricht` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`absender` INT UNSIGNED NOT NULL,
`empfaenger` VARCHAR(64) NOT NULL COMMENT 'Charakter-ID, Abteilung oder "alle"',
`empf_typ` VARCHAR(16) NOT NULL DEFAULT 'person' COMMENT 'person/abteilung/rundmeldung',
`betreff` VARCHAR(160) DEFAULT NULL,
`text` TEXT NOT NULL,
`gelesen` TINYINT(1) NOT NULL DEFAULT 0,
`gesendet` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_empfaenger` (`empfaenger`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Benachrichtigungen (Hinweise, Erinnerungen, Fristen)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_hinweis` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`character` INT UNSIGNED DEFAULT NULL COMMENT 'NULL = an alle im Dienst',
`kategorie` VARCHAR(32) NOT NULL COMMENT 'einsatz/fahndung/gewahrsam/bericht/akte/beweis/system',
`prioritaet` VARCHAR(16) NOT NULL DEFAULT 'normal' COMMENT 'niedrig/normal/hoch/kritisch',
`titel` VARCHAR(160) NOT NULL,
`text` VARCHAR(512) DEFAULT NULL,
`ziel_typ` VARCHAR(24) DEFAULT NULL COMMENT 'Wohin springt ein Klick',
`ziel_id` VARCHAR(64) DEFAULT NULL,
`gelesen` TINYINT(1) NOT NULL DEFAULT 0,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_character` (`character`, `gelesen`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Protokollierung — wer, wann, was, warum
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_protokoll` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`character` INT UNSIGNED DEFAULT NULL,
`dienstnummer` VARCHAR(16) DEFAULT NULL,
`modul` VARCHAR(32) NOT NULL,
`aktion` VARCHAR(64) NOT NULL,
`ziel_typ` VARCHAR(24) DEFAULT NULL,
`ziel_id` VARCHAR(64) DEFAULT NULL,
`details` LONGTEXT DEFAULT NULL COMMENT 'JSON: was genau geaendert wurde',
`grund` VARCHAR(255) DEFAULT NULL,
`am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_modul` (`modul`),
KEY `idx_character` (`character`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Strafenkatalog — vom Administrator pflegbar
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_katalog` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`kennung` VARCHAR(24) NOT NULL,
`kategorie` VARCHAR(48) NOT NULL,
`bezeichnung` VARCHAR(160) NOT NULL,
`paragraph` VARCHAR(48) DEFAULT NULL COMMENT 'Gesetzliche Grundlage',
`haft` INT NOT NULL DEFAULT 0 COMMENT 'Empfehlung in Minuten',
`geld` INT NOT NULL DEFAULT 0 COMMENT 'Empfehlung in Euro',
`hinweis` VARCHAR(512) DEFAULT NULL,
`aktiv` TINYINT(1) NOT NULL DEFAULT 1,
`sortierung` INT NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_kennung` (`kennung`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Systemeinstellungen (aktive Module, Vorlagen, Kategorien)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_einstellung` (
`schluessel` VARCHAR(64) NOT NULL,
`wert` LONGTEXT DEFAULT NULL,
PRIMARY KEY (`schluessel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Notizen zu einer Person (kurze Vermerke ausserhalb einer Akte)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_person_notiz` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`character` INT UNSIGNED NOT NULL COMMENT 'Betroffene Person',
`text` VARCHAR(1000) NOT NULL,
`von` INT UNSIGNED NOT NULL COMMENT 'Verfassender Beamter',
`am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_character` (`character`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Lesestatus einer Nachricht je Empfaenger
-- Noetig, weil Abteilungs- und Rundmeldungen viele Empfaenger haben.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_nachricht_gelesen` (
`nachricht` INT UNSIGNED NOT NULL,
`character` INT UNSIGNED NOT NULL,
`gelesen_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`nachricht`, `character`),
CONSTRAINT `fk_nlesen_nachricht` FOREIGN KEY (`nachricht`)
REFERENCES `police_nachricht` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Aushaenge und Dienstanweisungen
-- Das System veroeffentlicht nichts von selbst und setzt nichts auf
-- gelesen — die Kenntnisnahme bestaetigt jeder Beamte eigenhaendig.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_aushang` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`titel` VARCHAR(160) NOT NULL,
`text` TEXT NOT NULL,
`kategorie` VARCHAR(24) NOT NULL DEFAULT 'information'
COMMENT 'anweisung/information/warnung',
`abteilung` VARCHAR(32) DEFAULT NULL COMMENT 'NULL = gesamte Behoerde',
`angeheftet` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Bleibt oben stehen',
`kenntnispflicht` TINYINT(1) NOT NULL DEFAULT 0
COMMENT 'Beamte sollen die Kenntnisnahme bestaetigen',
`frist` DATETIME DEFAULT NULL
COMMENT 'Bis wann erinnert das System an die Kenntnisnahme',
`erstellt_von` INT UNSIGNED NOT NULL,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- Archivierung geschieht ausschliesslich manuell:
`archiviert_von` INT UNSIGNED DEFAULT NULL,
`archiviert_am` DATETIME DEFAULT NULL,
`aktiv` TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
KEY `idx_aktiv` (`aktiv`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Bestaetigte Kenntnisnahmen zu einem Aushang
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `police_aushang_kenntnis` (
`aushang` INT UNSIGNED NOT NULL,
`character` INT UNSIGNED NOT NULL,
`bestaetigt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`aushang`, `character`),
CONSTRAINT `fk_kenntnis_aushang` FOREIGN KEY (`aushang`)
REFERENCES `police_aushang` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;