Rollback - PDF Import funzt so semi

Dieser Commit ist enthalten in:
Claude Project Manager
2025-09-23 22:40:37 +02:00
Ursprung 26f95d2e4a
Commit 2cabd4c0c6
27 geänderte Dateien mit 4455 neuen und 41 gelöschten Zeilen

Datei anzeigen

@ -0,0 +1,467 @@
const Database = require('better-sqlite3')
const path = require('path')
const { v4: uuidv4 } = require('uuid')
// Open database
const dbPath = path.join(__dirname, '..', 'skillmate.dev.encrypted.db')
const db = new Database(dbPath)
// Enable foreign keys
db.pragma('foreign_keys = ON')
console.log('🏢 Seeding Complete LKA NRW Organizational Structure...')
const now = new Date().toISOString()
// Store IDs for reference
const unitIds = {}
// Helper function to insert organizational unit
function insertUnit(code, name, type, level, parentId = null, options = {}) {
const id = uuidv4()
db.prepare(`
INSERT OR REPLACE INTO organizational_units (
id, code, name, type, level, parent_id,
color, order_index, has_fuehrungsstelle,
fuehrungsstelle_name, is_active, created_at, updated_at,
position_x, position_y
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`).run(
id, code, name, type, level, parentId,
options.color || null,
options.orderIndex || 0,
options.hasFuehrungsstelle || 0,
options.fuehrungsstelleName || null,
1, now, now,
options.positionX || null,
options.positionY || null
)
unitIds[code] = id
return id
}
// Clear existing data
console.log('Clearing existing organizational data...')
db.prepare('DELETE FROM deputy_delegations').run()
db.prepare('DELETE FROM deputy_assignments').run()
db.prepare('DELETE FROM special_positions').run()
db.prepare('DELETE FROM employee_unit_assignments').run()
db.prepare('DELETE FROM organizational_units').run()
// ========================================
// Level 0: Direktor
// ========================================
const direktorId = insertUnit('DIR', 'Direktor LKA NRW', 'direktion', 0, null, {
color: '#1e3a8a',
orderIndex: 0,
positionX: 400,
positionY: 50
})
// ========================================
// Level 1: Direct Reports to Direktor
// ========================================
// Leitungsstab - directly under Direktor
const leitungsstabId = insertUnit('LStab', 'Leitungsstab', 'stabsstelle', 1, direktorId, {
color: '#6b7280',
orderIndex: 1,
positionX: 200,
positionY: 150
})
// Leitungsstab Sub-units (Level 2)
insertUnit('LStab 1', 'Grundsatzangelegenheiten, Gremien, internationale polizeiliche Zusammenarbeit, Informations- und Vorgangssteuerung, Einsatz/BAO', 'sachgebiet', 2, leitungsstabId)
insertUnit('LStab 2', 'Strategische Steuerung, Qualitätsmanagement, Controlling, Wissenmanagement', 'sachgebiet', 2, leitungsstabId)
insertUnit('LStab 3', 'Presse- und Öffentlichkeitsarbeit', 'sachgebiet', 2, leitungsstabId)
// ========================================
// Sondereinheiten (Special Units) - Parallel to hierarchy
// ========================================
// These are NOT hierarchically under Direktor but parallel/advisory roles
const personalratId = insertUnit('PR', 'Personalrat', 'sondereinheit', 1, null, {
color: '#059669',
orderIndex: 100,
positionX: 50,
positionY: 250
})
const schwerbehindertenId = insertUnit('SBV', 'Schwerbehindertenvertretung', 'sondereinheit', 1, null, {
color: '#059669',
orderIndex: 101,
positionX: 50,
positionY: 300
})
// Individual Beauftragte (as separate units without hierarchy)
insertUnit('DSB', 'Datenschutzbeauftragter', 'sondereinheit', 1, null, {
color: '#0891b2',
orderIndex: 102,
positionX: 50,
positionY: 350
})
insertUnit('GSB', 'Gleichstellungsbeauftragte', 'sondereinheit', 1, null, {
color: '#0891b2',
orderIndex: 103,
positionX: 50,
positionY: 400
})
insertUnit('IKB', 'Inklusionsbeauftragter', 'sondereinheit', 1, null, {
color: '#0891b2',
orderIndex: 104,
positionX: 50,
positionY: 450
})
insertUnit('ISB', 'Informationssicherheitsbeauftragter', 'sondereinheit', 1, null, {
color: '#0891b2',
orderIndex: 105,
positionX: 50,
positionY: 500
})
insertUnit('GHSB', 'Geheimschutzbeauftragte', 'sondereinheit', 1, null, {
color: '#0891b2',
orderIndex: 106,
positionX: 50,
positionY: 550
})
insertUnit('EXB', 'Extremismusbeauftragter', 'sondereinheit', 1, null, {
color: '#dc2626',
orderIndex: 107,
positionX: 50,
positionY: 600
})
insertUnit('EXBV', 'Extremismusbeauftragter Vertreter', 'sondereinheit', 1, null, {
color: '#dc2626',
orderIndex: 108,
positionX: 50,
positionY: 650
})
// Innenrevision
insertUnit('IR', 'Innenrevision', 'sondereinheit', 1, null, {
color: '#7c3aed',
orderIndex: 109,
positionX: 50,
positionY: 700
})
// Fachkräfte für Arbeitssicherheit
insertUnit('FAS', 'Fachkräfte für Arbeitssicherheit', 'sondereinheit', 1, null, {
color: '#059669',
orderIndex: 110,
positionX: 50,
positionY: 750
})
// ========================================
// Abteilungen (Level 1 - Under Direktor)
// ========================================
const abteilungen = [
{
code: 'Abt 1',
name: 'Organisierte Kriminalität',
color: '#dc2626',
hasFuehrungsstelle: true,
positionX: 100,
positionY: 200
},
{
code: 'Abt 2',
name: 'Terrorismusbekämpfung und Staatsschutz',
color: '#ea580c',
hasFuehrungsstelle: true,
positionX: 250,
positionY: 200
},
{
code: 'Abt 3',
name: 'Strategische Kriminalitätsbekämpfung',
color: '#0891b2',
hasFuehrungsstelle: true,
positionX: 400,
positionY: 200
},
{
code: 'Abt 4',
name: 'Cybercrime (CCCC)',
color: '#7c3aed',
hasFuehrungsstelle: true,
positionX: 550,
positionY: 200
},
{
code: 'Abt 5',
name: 'Kriminalwissenschaftliches und -technisches Institut',
color: '#0d9488',
hasFuehrungsstelle: true,
positionX: 700,
positionY: 200
},
{
code: 'Abt 6',
name: 'Fachaufsicht und Ermittlungsunterstützung',
color: '#be185d',
hasFuehrungsstelle: true,
positionX: 850,
positionY: 200
},
{
code: 'ZA',
name: 'Zentralabteilung',
color: '#6b7280',
hasFuehrungsstelle: false,
positionX: 1000,
positionY: 200
}
]
const abteilungIds = {}
abteilungen.forEach((abt, index) => {
abteilungIds[abt.code] = insertUnit(abt.code, abt.name, 'abteilung', 1, direktorId, {
color: abt.color,
orderIndex: 10 + index * 10,
hasFuehrungsstelle: abt.hasFuehrungsstelle ? 1 : 0,
fuehrungsstelleName: abt.hasFuehrungsstelle ? `Führungsstelle ${abt.code}` : null,
positionX: abt.positionX,
positionY: abt.positionY
})
})
// ========================================
// Dezernate für Abteilung 1 (Organisierte Kriminalität)
// ========================================
const dez11 = insertUnit('Dez 11', 'Ermittlungen OK, OK Rauschgift', 'dezernat', 2, abteilungIds['Abt 1'])
insertUnit('SG 11.1', 'Grundsatzfragen/Koordination/Auswertung', 'sachgebiet', 3, dez11)
const dez12 = insertUnit('Dez 12', 'Wirtschaftskriminalität', 'dezernat', 2, abteilungIds['Abt 1'])
insertUnit('SG 12.1', 'Grundsatzfragen/Koordination/Auswertung', 'sachgebiet', 3, dez12)
const dez13 = insertUnit('Dez 13', 'Finanzermittlungen', 'dezernat', 2, abteilungIds['Abt 1'])
insertUnit('SG 13.1', 'GFG 1', 'sachgebiet', 3, dez13)
insertUnit('SG 13.2', 'GFG 2', 'sachgebiet', 3, dez13)
insertUnit('SG 13.3', 'Verfahrensintegrierte Finanzermittlungen/Vermögensabschöpfung', 'sachgebiet', 3, dez13)
insertUnit('SG 13.4', 'Zentrale Informations- und Koordinierungsstelle Finanzermittlung und Gewinnabschöpfung, Recherchestelle ZIVED', 'sachgebiet', 3, dez13)
const dez14 = insertUnit('Dez 14', 'Auswerte- und Analysestelle OK', 'dezernat', 2, abteilungIds['Abt 1'])
insertUnit('TD 14.1', 'Operative Auswertung und Analyse, kryptierte Täterkommunikation', 'teildezernat', 3, dez14)
insertUnit('SG 14.2', 'Strategische Auswertung und Analyse, Informationssteuerung', 'sachgebiet', 3, dez14)
insertUnit('SG 14.3', 'Technische Informationssysteme, Unterstützungsgruppe CASE/DAR', 'sachgebiet', 3, dez14)
insertUnit('SG 14.4', 'Auswertung und Analyse Rockerkriminalität', 'sachgebiet', 3, dez14)
insertUnit('SG 14.5', 'Auswertung und Analyse Clankriminalität', 'sachgebiet', 3, dez14)
const dez15 = insertUnit('Dez 15', 'Korruption, Umweltkriminalität', 'dezernat', 2, abteilungIds['Abt 1'])
insertUnit('SG 15.1', 'Grundsatzangelegenheiten, Korruption', 'sachgebiet', 3, dez15)
insertUnit('SG 15.2', 'Vernetzungsstelle Umweltkriminalität', 'sachgebiet', 3, dez15)
const dez16 = insertUnit('Dez 16', 'Finanzierung Organisierter Kriminalität und Terrorismus', 'dezernat', 2, abteilungIds['Abt 1'])
insertUnit('SG 16.1', 'Grundsatzfragen/Auswertung/Analyse', 'sachgebiet', 3, dez16)
// ========================================
// Dezernate für Abteilung 2 (Terrorismusbekämpfung)
// ========================================
const dez21 = insertUnit('Dez 21', 'Ermittlungen', 'dezernat', 2, abteilungIds['Abt 2'])
insertUnit('TD 21.1', 'Ermittlungskommissionen VSTGB, Ermittlungskommissionen PMK (alle Phänomenbereiche), VsnL', 'teildezernat', 3, dez21)
const dez22 = insertUnit('Dez 22', 'Auswertung/Analyse, ZMI, Open Source Intelligence (OSINT), Wissenschaftlicher Dienst PMK, KPMD-PMK', 'dezernat', 2, abteilungIds['Abt 2'])
insertUnit('SG 22.1', 'Auswertung/Analyse, ZMI', 'sachgebiet', 3, dez22)
insertUnit('TD 22.2', 'Open Source Intelligence (OSINT)', 'teildezernat', 3, dez22)
insertUnit('TD 22.3', 'Wissenschaftlicher Dienst PMK', 'teildezernat', 3, dez22)
insertUnit('SG 22.4', 'PMK Meldedienste, Kriminalpolizeilicher Meldedienst (KPMD)', 'sachgebiet', 3, dez22)
const dez23 = insertUnit('Dez 23', 'PMK Rechts und PMK SZ', 'dezernat', 2, abteilungIds['Abt 2'])
insertUnit('SG 23.1', 'KoSt Gefährder, Gemeinsames Extremismus- und Terrorismusabwehrzentrum (GETZ-) Rechts, Landesvertreter GETZ-Rechts Bund', 'sachgebiet', 3, dez23)
insertUnit('SG 23.2', 'Prüffallbearbeitung, Gefahrensachverhalte, Hasskriminalität, PMK rechts', 'sachgebiet', 3, dez23)
insertUnit('TD 23.3', 'PMK SZ, Spionage, Gefahrensachverhalte PMK SZ, Landesvertreter GETZ-SP', 'teildezernat', 3, dez23)
const dez24 = insertUnit('Dez 24', 'PMK Religiöse Ideologie', 'dezernat', 2, abteilungIds['Abt 2'])
insertUnit('SG 24.1', 'KoST Gefährder, SiKo', 'sachgebiet', 3, dez24)
insertUnit('TD 24.2', 'Gemeinsames Terrorismusabwehrzentrum (GTAZ) NRW, Landesvertreter GTAZ Bund, ATD/RED', 'teildezernat', 3, dez24)
insertUnit('SG 24.3', 'Prüffallbearbeitung, Gefahrensachverhalte, islamistisch-terroristisches Personenpotential', 'sachgebiet', 3, dez24)
const dez25 = insertUnit('Dez 25', 'PMK Links, Ausländische Ideologie, ZSÜ', 'dezernat', 2, abteilungIds['Abt 2'])
insertUnit('SG 25.1', 'KoSt Gefährder Links, GETZ-Links NRW, Landesvertreter GETZ-Links Bund, Prüffallsachbearbeitung, Gefahrensachverhalte', 'sachgebiet', 3, dez25)
insertUnit('SG 25.2', 'KoSt Gefährder Ausländische Ideologie (AI), Landesvertreter GETZ-AI Bund, Prüffallsachbearbeitung, Gefahrensachverhalte', 'sachgebiet', 3, dez25)
insertUnit('SG 25.3', 'Zentrale Stelle NRW für ZSÜ', 'sachgebiet', 3, dez25)
// ========================================
// Dezernate für Abteilung 3 (Strategische Kriminalitätsbekämpfung)
// ========================================
const dez31 = insertUnit('Dez 31', 'Kriminalitätsauswertung und Analyse, Polizeiliche Kriminalitätsstatistik', 'dezernat', 2, abteilungIds['Abt 3'])
insertUnit('SG 31.1', 'Grundsatzangelegenheiten / KoST MAfEx / KoSt MOTIV/MIT/aMIT', 'sachgebiet', 3, dez31)
insertUnit('SG 31.2', 'Auswertung und Analyse 1, Eigentums- und Vermögensdelikte, SÄM-ÜT, KoSt RTE', 'sachgebiet', 3, dez31)
insertUnit('SG 31.3', 'Auswertung/Analyse 2 Rauschgift-, Arzneimittel-, Menschenhandels-, Schleusungskriminalität, Dokumentenfälschungen, Gewaltdelikte', 'sachgebiet', 3, dez31)
insertUnit('SG 31.4', 'Polizeiliche Kriminalstatistik (PKS)', 'sachgebiet', 3, dez31)
const dez32 = insertUnit('Dez 32', 'Kriminalprävention, Kriminalistisch-Kriminologische Forschungsstelle, Evaluation', 'dezernat', 2, abteilungIds['Abt 3'])
insertUnit('SG 32.1', 'Kriminalprävention und Opferschutz', 'sachgebiet', 3, dez32)
insertUnit('TD 32.2', 'Kriminalistisch-Kriminologische Forschungsstelle (KKF)', 'teildezernat', 3, dez32)
insertUnit('SG 32.3', 'Zentralstelle Evaluation (ZEVA)', 'sachgebiet', 3, dez32)
const dez33 = insertUnit('Dez 33', 'Fahndung, Datenaustausch Polizei/Justiz, Kriminalaktenhaltung, Internationale Rechtshilfe', 'dezernat', 2, abteilungIds['Abt 3'])
insertUnit('SG 33.1', 'Datenstation, Polizeiliche Beobachtung, Grundsatz Fahndung, Fahndungsportal', 'sachgebiet', 3, dez33)
insertUnit('SG 33.2', 'Datenaustausch Polizei/Justiz, Kriminalaktenhaltung', 'sachgebiet', 3, dez33)
insertUnit('SG 33.3', 'Rechtshilfe, PNR, internationale Fahndung, Interpol- und Europolangelegenheiten, Vermisste', 'sachgebiet', 3, dez33)
const dez34 = insertUnit('Dez 34', 'Digitalstrategie, Polizeifachliche IT, Landeszentrale Qualitätssicherung', 'dezernat', 2, abteilungIds['Abt 3'])
insertUnit('TD 34.1', 'Grundsatz, Gremien, Fachliche IT-Projekte', 'teildezernat', 3, dez34)
insertUnit('TD 34.2', 'Zentralstelle Polizei 2020, PIAV, QS Verbundanwendungen, Europäisches Informationssystem (EIS)', 'teildezernat', 3, dez34)
insertUnit('TD 34.3', 'IT FaKo Fachbereich Kriminalität, Zentralstelle ViVA, QS, INPOL-Z, ViVA-Büro LKA', 'teildezernat', 3, dez34)
const dez35 = insertUnit('Dez 35', 'Verhaltensanalyse und Risikomanagement', 'dezernat', 2, abteilungIds['Abt 3'])
insertUnit('SG 35.1', 'Zentralstelle KURS NRW', 'sachgebiet', 3, dez35)
insertUnit('SG 35.2', 'Operative Fallanalyse (OFA/ViCLAS)', 'sachgebiet', 3, dez35)
insertUnit('SG 35.3', 'Zentralstelle PeRiskoP', 'sachgebiet', 3, dez35)
// ========================================
// Dezernate für Abteilung 4 (Cybercrime)
// ========================================
const dez41 = insertUnit('Dez 41', 'Zentrale Ansprechstelle Cybercrime, Grundsatz, Digitale Forensik, IT-Entwicklung', 'dezernat', 2, abteilungIds['Abt 4'])
insertUnit('SG 41.1', 'Grundsatzangelegenheiten, Prävention, Auswertung Cybercrime', 'sachgebiet', 3, dez41)
insertUnit('TD 41.2', 'Software und KI-Entwicklung, IT-Verfahrensbetreuung, Marktschau', 'teildezernat', 3, dez41)
insertUnit('SG 41.3', 'Forensik Desktop Strategie und Entwicklung - Hinweisportal NRW', 'sachgebiet', 3, dez41)
insertUnit('SG 41.4', 'Forensik Desktop Datenaufbereitung und Automatisierung', 'sachgebiet', 3, dez41)
insertUnit('TD 41.5', 'Forensik Desktop Betrieb', 'teildezernat', 3, dez41)
const dez42 = insertUnit('Dez 42', 'Cyber-Recherche- und Fahndungszentrum, Ermittlungen Cybercrime', 'dezernat', 2, abteilungIds['Abt 4'])
insertUnit('SG 42.1', 'Personenorientierte Recherche in Datennetzen', 'sachgebiet', 3, dez42)
insertUnit('SG 42.2', 'Sachorientierte Recherche in Datennetzen', 'sachgebiet', 3, dez42)
insertUnit('TD 42.3', 'Interventionsteams Digitale Tatorte IUK-Lageunterstützung Ermittlungskommissionen', 'teildezernat', 3, dez42)
const dez43 = insertUnit('Dez 43', 'Zentrale Auswertungs- und Sammelstelle (ZASt) für die Bekämpfung von Missbrauchsabbildungen von Kindern und Jugendlichen', 'dezernat', 2, abteilungIds['Abt 4'])
insertUnit('SG 43.1', 'ZASt Grundsatz, Identifizierungsverfahren, Bildvergleichssammlung, Schulfahndung, Berichtswesen, Meldedienste/Verbundverfahren, Gremien', 'sachgebiet', 3, dez43)
insertUnit('SG 43.2', 'ZASt NCMEC/ Landeszentrale Bewertung 1', 'sachgebiet', 3, dez43)
insertUnit('SG 43.3', 'ZASt NCMEC/ Landeszentrale Bewertung 2', 'sachgebiet', 3, dez43)
insertUnit('SG 43.4', 'ZASt NCMEC/ Landeszentrale Bewertung 3', 'sachgebiet', 3, dez43)
const dez44 = insertUnit('Dez 44', 'Telekommunikationsüberwachung (TKÜ)', 'dezernat', 2, abteilungIds['Abt 4'])
insertUnit('SG 44.1', 'Grundsatzaufgaben, operative TKÜ, AIT', 'sachgebiet', 3, dez44)
insertUnit('SG 44.2', 'TKÜ Betrieb und Service', 'sachgebiet', 3, dez44)
insertUnit('TD 44.3', 'Digitale Forensik, IUK-Ermittlungsunterstützung', 'teildezernat', 3, dez44)
// ========================================
// Dezernate für Abteilung 5 (Kriminalwissenschaftliches Institut)
// ========================================
const dez51 = insertUnit('Dez 51', 'Chemie, Physik', 'dezernat', 2, abteilungIds['Abt 5'])
insertUnit('TD 51.1', 'Schussspuren, Explosivstoffe, Brand, Elektrotechnik', 'teildezernat', 3, dez51)
insertUnit('TD 51.2', 'Betäubungsmittel', 'teildezernat', 3, dez51)
const dez52 = insertUnit('Dez 52', 'Serologie, DNA-Analytik', 'dezernat', 2, abteilungIds['Abt 5'])
insertUnit('TD 52.1', 'DNA-Probenbearbeitung, DNA-Spurenbearbeitung I', 'teildezernat', 3, dez52)
insertUnit('TD 52.2', 'DNA-Spurenbearbeitung II', 'teildezernat', 3, dez52)
insertUnit('TD 52.3', 'DNA-Spurenbearbeitung III', 'teildezernat', 3, dez52)
insertUnit('TD 52.4', 'DNA-Spurenbearbeitung IV DNA-Fremdvergabe', 'teildezernat', 3, dez52)
const dez53 = insertUnit('Dez 53', 'Biologie, Materialspuren, Urkunden, Handschriften', 'dezernat', 2, abteilungIds['Abt 5'])
insertUnit('TD 53.1', 'forensische Textilkunde, Botanik, Material-, Haar- und Erdspuren', 'teildezernat', 3, dez53)
insertUnit('SG 53.2', 'Urkunden, Handschriften', 'sachgebiet', 3, dez53)
const dez54 = insertUnit('Dez 54', 'Zentralstelle Kriminaltechnik, Forensische Medientechnik, USBV Entschärfung', 'dezernat', 2, abteilungIds['Abt 5'])
insertUnit('SG 54.1', 'Zentralstelle Kriminaltechnik', 'sachgebiet', 3, dez54)
insertUnit('SG 54.2', 'Tatortvermessung, Rekonstruktion und XR-Lab, Phantombilderstellung und visuelle Fahndungshilfe, Bild- und Videotechnik', 'sachgebiet', 3, dez54)
insertUnit('SG 54.3', 'Entschärfung von unkonventionellen Spreng- und Brandvorrichtungen (USBV) – Einsatz- und Ermittlungsunterstützung Explosivstoffe', 'sachgebiet', 3, dez54)
const dez55 = insertUnit('Dez 55', 'Waffen und Werkzeug DNA-Analyse-Datei', 'dezernat', 2, abteilungIds['Abt 5'])
insertUnit('SG 55.1', 'Waffen und Munition', 'sachgebiet', 3, dez55)
insertUnit('SG 55.2', 'Werkzeug-, Form-, Passspuren, Schließ- und Sicherungseinrichtungen', 'sachgebiet', 3, dez55)
insertUnit('SG 55.3', 'DNA-Analyse-Datei', 'sachgebiet', 3, dez55)
const dez56 = insertUnit('Dez 56', 'Daktyloskopie, Gesichts- und Sprechererkennung, Tonträgerauswertung', 'dezernat', 2, abteilungIds['Abt 5'])
insertUnit('SG 56.1', 'Daktyloskopisches Labor', 'sachgebiet', 3, dez56)
insertUnit('SG 56.2', 'AFIS I/Daktyloskopische Gutachten', 'sachgebiet', 3, dez56)
insertUnit('SG 56.3', 'AFIS II/Daktyloskopische Gutachten', 'sachgebiet', 3, dez56)
insertUnit('TD 56.4', 'Gesichts- und Sprechererkennung, Tonträgerauswertung', 'teildezernat', 3, dez56)
// ========================================
// Dezernate für Abteilung 6 (Fachaufsicht und Ermittlungsunterstützung)
// ========================================
const dez61 = insertUnit('Dez 61', 'Kriminalitätsangelegenheiten der KPB, Fachcontrolling, Koordination PUA, Lagedienst', 'dezernat', 2, abteilungIds['Abt 6'])
insertUnit('TD 61.1', 'Kriminalitätsangelegenheiten der KPB, Fachcontrolling, Koordination PUA', 'teildezernat', 3, dez61)
insertUnit('SG 61.2', 'Lagedienst', 'sachgebiet', 3, dez61)
const dez62 = insertUnit('Dez 62', 'Fahndungsgruppe Staatsschutz', 'dezernat', 2, abteilungIds['Abt 6'])
// Add Führungsgruppe for Dezernat 62
insertUnit('FüGr 62', 'Führungsgruppe', 'fuehrungsstelle', 3, dez62)
// Fahndungsgruppen 1-8
for (let i = 1; i <= 8; i++) {
insertUnit(`SG 62.${i}`, i === 8 ? 'Fahndungsgruppe 8' : `Fahndungsgruppe ${i}`, 'sachgebiet', 3, dez62)
}
insertUnit('SG 62.9', 'Technische Gruppe', 'sachgebiet', 3, dez62)
const dez63 = insertUnit('Dez 63', 'Verdeckte Ermittlungen, Zeugenschutz', 'dezernat', 2, abteilungIds['Abt 6'])
insertUnit('SG 63.1', 'Einsatz VE 1', 'sachgebiet', 3, dez63)
insertUnit('SG 63.2', 'Einsatz VE 2', 'sachgebiet', 3, dez63)
insertUnit('SG 63.3', 'Scheinkäufer, Logistik', 'sachgebiet', 3, dez63)
insertUnit('SG 63.4', 'VP-Führung, Koordinierung VP', 'sachgebiet', 3, dez63)
insertUnit('TD 63.5', 'Zeugenschutz, OpOS', 'teildezernat', 3, dez63)
const dez64 = insertUnit('Dez 64', 'Mobiles Einsatzkommando, Technische Einsatzgruppe, Zielfahndung', 'dezernat', 2, abteilungIds['Abt 6'])
insertUnit('FüGr 64', 'FüGr', 'fuehrungsstelle', 3, dez64)
insertUnit('SG 64.1', 'MEK 1', 'sachgebiet', 3, dez64)
insertUnit('SG 64.2', 'MEK 2', 'sachgebiet', 3, dez64)
insertUnit('SG 64.3', 'Technische Einsatzgruppe', 'sachgebiet', 3, dez64)
insertUnit('SG 64.4', 'Zielfahndung', 'sachgebiet', 3, dez64)
// ========================================
// Dezernate für Zentralabteilung
// ========================================
const dezZA1 = insertUnit('Dez ZA 1', 'Haushalts-, Wirtschafts-, Liegenschaftsmanagement, Zentrale Vergabestelle', 'dezernat', 2, abteilungIds['ZA'])
insertUnit('SG ZA 1.1', 'Haushalts- und Wirtschaftsangelegenheiten', 'sachgebiet', 3, dezZA1)
insertUnit('SG ZA 1.2', 'Liegenschaftsmanagement', 'sachgebiet', 3, dezZA1)
insertUnit('SG ZA 1.3', 'Zentrale Vergabestelle', 'sachgebiet', 3, dezZA1)
const dezZA2 = insertUnit('Dez ZA 2', 'Personalangelegenheiten, Gleichstellungsbeauftragte, Fortbildung', 'dezernat', 2, abteilungIds['ZA'])
insertUnit('SG ZA 2.1', 'Personalentwicklung, Arbeitszeit, BGM-POL; Stellenplan', 'sachgebiet', 3, dezZA2)
insertUnit('SG ZA 2.2', 'Personalverwaltung Beamte/ dienstrechtliche Angelegenheiten', 'sachgebiet', 3, dezZA2)
insertUnit('TD ZA 2.3', 'Personalverwaltung Regierungsbeschäftigte/ Personalgewinnung, tarif- und arbeitsrechtliche Angelegenheiten', 'teildezernat', 3, dezZA2)
insertUnit('SG ZA 2.4', 'Fortbildung', 'sachgebiet', 3, dezZA2)
const dezZA3 = insertUnit('Dez ZA 3', 'Informationstechnik und Anwenderunterstützung, Informationssicherheit, Kfz-, Waffen- und Geräteangelegenheiten', 'dezernat', 2, abteilungIds['ZA'])
insertUnit('SG ZA 3.1', 'IT-Grundsatz, Planung und Koordinierung, IT-Service Desk, Lizenzmanagement', 'sachgebiet', 3, dezZA3)
insertUnit('SG ZA 3.2', 'Netzwerk/ TK-Anlage', 'sachgebiet', 3, dezZA3)
insertUnit('SG ZA 3.3', 'Server/Client, Logistik', 'sachgebiet', 3, dezZA3)
insertUnit('SG ZA 3.4', 'Kfz-, Waffen- und Geräteangelegenheiten', 'sachgebiet', 3, dezZA3)
const dezZA4 = insertUnit('Dez ZA 4', 'Vereins- und Waffenrecht, Innenrevision, Sponsoring, Rechtsangelegenheiten, Datenschutz, Geheimschutz', 'dezernat', 2, abteilungIds['ZA'])
const dezZA5 = insertUnit('Dez ZA 5', 'Polizeiärztlicher Dienst', 'dezernat', 2, abteilungIds['ZA'])
insertUnit('PAD', 'Polizeiärztin', 'sachgebiet', 3, dezZA5)
console.log('✅ LKA NRW Organizational Structure seeded successfully!')
console.log(`📊 Created ${Object.keys(unitIds).length} organizational units`)
// Output some statistics
const stats = db.prepare(`
SELECT type, COUNT(*) as count
FROM organizational_units
GROUP BY type
`).all()
console.log('\n📈 Statistics:')
stats.forEach(stat => {
console.log(` ${stat.type}: ${stat.count} units`)
})
// Close database
db.close()
console.log('\n🎉 Done! The organization structure is ready to use.')
console.log(' Navigate to Admin Panel > Organigramm to manage the structure.')
console.log(' Users can view it in the main app using the 🏢 button.')