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.')

Datei anzeigen

@ -0,0 +1,386 @@
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 LKA NRW Organizational Structure...')
const now = new Date().toISOString()
// 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
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`).run(
id, code, name, type, level, parentId,
options.color || null,
options.orderIndex || 0,
options.hasFuehrungsstelle || 0,
options.fuehrungsstelleName || null,
1, now, now
)
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()
// Create Direktor
const direktorId = insertUnit('DIR', 'Direktor LKA NRW', 'direktion', 0, null, {
color: '#1e3a8a',
orderIndex: 0
})
// Create Leitungsstab
const leitungsstabId = insertUnit('LStab', 'Leitungsstab', 'stabsstelle', 1, direktorId, {
color: '#6b7280',
orderIndex: 1
})
// Leitungsstab Sub-units
insertUnit('LStab 1', 'Grundsatzangelegenheiten, Gremien, internationale polizeiliche Zusammenarbeit', 'sachgebiet', 2, leitungsstabId)
insertUnit('LStab 2', 'Strategische Steuerung, Qualitätsmanagement, Controlling', 'sachgebiet', 2, leitungsstabId)
insertUnit('LStab 3', 'Presse- und Öffentlichkeitsarbeit', 'sachgebiet', 2, leitungsstabId)
// Create Special Units (Beauftragte)
const personalratId = insertUnit('PR', 'Personalrat', 'sondereinheit', 1, direktorId, {
color: '#059669',
orderIndex: 2
})
const schwerbehindertenId = insertUnit('SBV', 'Schwerbehindertenvertretung', 'sondereinheit', 1, direktorId, {
color: '#059669',
orderIndex: 3
})
// Create Abteilungen with color gradients
const abteilungen = [
{ code: 'Abt 1', name: 'Organisierte Kriminalität', color: '#dc2626' },
{ code: 'Abt 2', name: 'Terrorismusbekämpfung und Staatsschutz', color: '#ea580c' },
{ code: 'Abt 3', name: 'Strategische Kriminalitätsbekämpfung', color: '#0891b2' },
{ code: 'Abt 4', name: 'Cybercrime (CCCC)', color: '#7c3aed' },
{ code: 'Abt 5', name: 'Kriminalwissenschaftliches und -technisches Institut', color: '#0d9488' },
{ code: 'Abt 6', name: 'Fachaufsicht und Ermittlungsunterstützung', color: '#be185d' },
{ code: 'ZA', name: 'Zentralabteilung', color: '#6b7280' }
]
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.code !== 'ZA' ? 1 : 0,
fuehrungsstelleName: abt.code !== 'ZA' ? `Führungsstelle ${abt.code}` : null
})
})
// Create Dezernate for Abteilung 1 (Organisierte Kriminalität)
const dezernate1 = [
{ code: '11', name: 'Ermittlungen OK, OK Rauschgift' },
{ code: '12', name: 'Wirtschaftskriminalität' },
{ code: '13', name: 'Finanzermittlungen' },
{ code: '14', name: 'Auswerte- und Analysestelle OK' },
{ code: '15', name: 'Korruption, Umweltkriminalität' },
{ code: '16', name: 'Finanzierung Organisierter Kriminalität und Terrorismus' }
]
dezernate1.forEach((dez, index) => {
const dezId = insertUnit(`Dezernat ${dez.code}`, dez.name, 'dezernat', 2, abteilungIds['Abt 1'], {
orderIndex: index
})
// Add sample Sachgebiete
if (dez.code === '11') {
insertUnit('SG 11.1', 'Grundsatzfragen/Koordination/Auswertung', 'sachgebiet', 3, dezId)
}
if (dez.code === '12') {
insertUnit('SG 12.1', 'Grundsatzfragen/Koordination/Auswertung', 'sachgebiet', 3, dezId)
}
if (dez.code === '13') {
insertUnit('SG 13.1', 'GFG 1', 'sachgebiet', 3, dezId)
insertUnit('SG 13.2', 'GFG 2', 'sachgebiet', 3, dezId)
insertUnit('SG 13.3', 'Verfahrensintegrierte Finanzermittlungen/Vermögensabschöpfung', 'sachgebiet', 3, dezId)
insertUnit('SG 13.4', 'Zentrale Informations- und Koordinierungsstelle Finanzermittlung', 'sachgebiet', 3, dezId)
}
if (dez.code === '14') {
insertUnit('TD 14.1', 'Operative Auswertung und Analyse', 'teildezernat', 3, dezId)
insertUnit('SG 14.2', 'Strategische Auswertung und Analyse', 'sachgebiet', 3, dezId)
insertUnit('SG 14.3', 'Technische Informationssysteme', 'sachgebiet', 3, dezId)
insertUnit('SG 14.4', 'Auswertung und Analyse Rockerkriminalität', 'sachgebiet', 3, dezId)
insertUnit('SG 14.5', 'Auswertung und Analyse Clankriminalität', 'sachgebiet', 3, dezId)
}
if (dez.code === '15') {
insertUnit('SG 15.1', 'Grundsatzangelegenheiten, Korruption', 'sachgebiet', 3, dezId)
insertUnit('SG 15.2', 'Vernetzungsstelle Umweltkriminalität', 'sachgebiet', 3, dezId)
}
if (dez.code === '16') {
insertUnit('SG 16.1', 'Grundsatzfragen/Auswertung/Analyse', 'sachgebiet', 3, dezId)
}
})
// Create Dezernate for Abteilung 2 (Terrorismusbekämpfung)
const dezernate2 = [
{ code: '21', name: 'Ermittlungen' },
{ code: '22', name: 'Auswertung/Analyse, ZMI, OSINT, Wissenschaftlicher Dienst PMK' },
{ code: '23', name: 'PMK Rechts und PMK SZ' },
{ code: '24', name: 'PMK Religiöse Ideologie' },
{ code: '25', name: 'PMK Links, Ausländische Ideologie, ZSÜ' }
]
dezernate2.forEach((dez, index) => {
const dezId = insertUnit(`Dezernat ${dez.code}`, dez.name, 'dezernat', 2, abteilungIds['Abt 2'], {
orderIndex: index
})
if (dez.code === '21') {
insertUnit('TD 21.1', 'Ermittlungskommissionen VSTGB', 'teildezernat', 3, dezId)
}
if (dez.code === '22') {
insertUnit('SG 22.1', 'Auswertung/Analyse, ZMI', 'sachgebiet', 3, dezId)
insertUnit('TD 22.2', 'Open Source Intelligence (OSINT)', 'teildezernat', 3, dezId)
insertUnit('TD 22.3', 'Wissenschaftlicher Dienst PMK', 'teildezernat', 3, dezId)
insertUnit('SG 22.4', 'PMK Meldedienste, KPMD', 'sachgebiet', 3, dezId)
}
if (dez.code === '23') {
insertUnit('SG 23.1', 'KoSt Gefährder, GETZ-Rechts', 'sachgebiet', 3, dezId)
insertUnit('SG 23.2', 'Prüffallbearbeitung, Gefahrensachverhalte', 'sachgebiet', 3, dezId)
insertUnit('TD 23.3', 'PMK SZ, Spionage', 'teildezernat', 3, dezId)
}
if (dez.code === '24') {
insertUnit('SG 24.1', 'KoST Gefährder, SiKo', 'sachgebiet', 3, dezId)
insertUnit('TD 24.2', 'Gemeinsames Terrorismusabwehrzentrum (GTAZ) NRW', 'teildezernat', 3, dezId)
insertUnit('SG 24.3', 'Prüffallbearbeitung, islamistisch-terroristisches Personenpotential', 'sachgebiet', 3, dezId)
}
if (dez.code === '25') {
insertUnit('SG 25.1', 'KoSt Gefährder Links', 'sachgebiet', 3, dezId)
insertUnit('SG 25.2', 'KoSt Gefährder Ausländische Ideologie', 'sachgebiet', 3, dezId)
insertUnit('SG 25.3', 'Zentrale Stelle NRW für ZSÜ', 'sachgebiet', 3, dezId)
}
})
// Create Dezernate for Abteilung 3 (Strategische Kriminalitätsbekämpfung)
const dezernate3 = [
{ code: '31', name: 'Kriminalitätsauswertung und Analyse' },
{ code: '32', name: 'Kriminalprävention, KKF, Evaluation' },
{ code: '33', name: 'Fahndung, Datenaustausch, Kriminalaktenhaltung' },
{ code: '34', name: 'Digitalstrategie, Polizeifachliche IT' },
{ code: '35', name: 'Verhaltensanalyse und Risikomanagement' }
]
dezernate3.forEach((dez, index) => {
const dezId = insertUnit(`Dezernat ${dez.code}`, dez.name, 'dezernat', 2, abteilungIds['Abt 3'], {
orderIndex: index
})
if (dez.code === '31') {
insertUnit('SG 31.1', 'Grundsatzangelegenheiten/KoST MAfEx', 'sachgebiet', 3, dezId)
insertUnit('SG 31.2', 'Auswertung und Analyse 1', 'sachgebiet', 3, dezId)
insertUnit('SG 31.3', 'Auswertung/Analyse 2', 'sachgebiet', 3, dezId)
insertUnit('SG 31.4', 'Polizeiliche Kriminalstatistik (PKS)', 'sachgebiet', 3, dezId)
}
if (dez.code === '32') {
insertUnit('SG 32.1', 'Kriminalprävention und Opferschutz', 'sachgebiet', 3, dezId)
insertUnit('TD 32.2', 'Kriminalistisch-Kriminologische Forschungsstelle (KKF)', 'teildezernat', 3, dezId)
insertUnit('SG 32.3', 'Zentralstelle Evaluation (ZEVA)', 'sachgebiet', 3, dezId)
}
if (dez.code === '33') {
insertUnit('SG 33.1', 'Datenstation, Polizeiliche Beobachtung', 'sachgebiet', 3, dezId)
insertUnit('SG 33.2', 'Datenaustausch Polizei/Justiz', 'sachgebiet', 3, dezId)
insertUnit('SG 33.3', 'Rechtshilfe, PNR, internationale Fahndung', 'sachgebiet', 3, dezId)
}
if (dez.code === '34') {
insertUnit('TD 34.1', 'Grundsatz, Gremien, Fachliche IT-Projekte', 'teildezernat', 3, dezId)
insertUnit('TD 34.2', 'Zentralstelle Polizei 2020', 'teildezernat', 3, dezId)
insertUnit('TD 34.3', 'IT FaKo Fachbereich Kriminalität', 'teildezernat', 3, dezId)
}
if (dez.code === '35') {
insertUnit('SG 35.1', 'Zentralstelle KURS NRW', 'sachgebiet', 3, dezId)
insertUnit('SG 35.2', 'Operative Fallanalyse (OFA/ViCLAS)', 'sachgebiet', 3, dezId)
insertUnit('SG 35.3', 'Zentralstelle PeRiskoP', 'sachgebiet', 3, dezId)
}
})
// Create Dezernate for Abteilung 4 (Cybercrime)
const dezernate4 = [
{ code: '41', name: 'Zentrale Ansprechstelle Cybercrime, Grundsatz, Digitale Forensik' },
{ code: '42', name: 'Cyber-Recherche- und Fahndungszentrum' },
{ code: '43', name: 'Zentrale Auswertungs- und Sammelstelle (ZASt)' },
{ code: '44', name: 'Telekommunikationsüberwachung (TKÜ)' }
]
dezernate4.forEach((dez, index) => {
const dezId = insertUnit(`Dezernat ${dez.code}`, dez.name, 'dezernat', 2, abteilungIds['Abt 4'], {
orderIndex: index
})
if (dez.code === '41') {
insertUnit('SG 41.1', 'Grundsatzangelegenheiten, Prävention', 'sachgebiet', 3, dezId)
insertUnit('TD 41.2', 'Software und KI-Entwicklung', 'teildezernat', 3, dezId)
insertUnit('SG 41.3', 'Forensik Desktop Strategie', 'sachgebiet', 3, dezId)
insertUnit('SG 41.4', 'Forensik Desktop Datenaufbereitung', 'sachgebiet', 3, dezId)
insertUnit('TD 41.5', 'Forensik Desktop Betrieb', 'teildezernat', 3, dezId)
}
if (dez.code === '42') {
insertUnit('SG 42.1', 'Personenorientierte Recherche in Datennetzen', 'sachgebiet', 3, dezId)
insertUnit('SG 42.2', 'Sachorientierte Recherche in Datennetzen', 'sachgebiet', 3, dezId)
insertUnit('TD 42.3', 'Interventionsteams Digitale Tatorte', 'teildezernat', 3, dezId)
}
if (dez.code === '43') {
insertUnit('SG 43.1', 'ZASt Grundsatz', 'sachgebiet', 3, dezId)
insertUnit('SG 43.2', 'ZASt NCMEC/Landeszentrale Bewertung 1', 'sachgebiet', 3, dezId)
insertUnit('SG 43.3', 'ZASt NCMEC/Landeszentrale Bewertung 2', 'sachgebiet', 3, dezId)
insertUnit('SG 43.4', 'ZASt NCMEC/Landeszentrale Bewertung 3', 'sachgebiet', 3, dezId)
}
if (dez.code === '44') {
insertUnit('SG 44.1', 'Grundsatzaufgaben, operative TKÜ', 'sachgebiet', 3, dezId)
insertUnit('SG 44.2', 'TKÜ Betrieb und Service', 'sachgebiet', 3, dezId)
insertUnit('TD 44.3', 'Digitale Forensik, IUK-Ermittlungsunterstützung', 'teildezernat', 3, dezId)
}
})
// Create Dezernate for Abteilung 5 (Kriminalwissenschaftliches Institut)
const dezernate5 = [
{ code: '51', name: 'Chemie, Physik' },
{ code: '52', name: 'Serologie, DNA-Analytik' },
{ code: '53', name: 'Biologie, Materialspuren, Urkunden' },
{ code: '54', name: 'Zentralstelle Kriminaltechnik, Forensische Medientechnik' },
{ code: '55', name: 'Waffen und Werkzeug, DNA-Analyse-Datei' },
{ code: '56', name: 'Daktyloskopie, Gesichts- und Sprechererkennung' }
]
dezernate5.forEach((dez, index) => {
const dezId = insertUnit(`Dezernat ${dez.code}`, dez.name, 'dezernat', 2, abteilungIds['Abt 5'], {
orderIndex: index
})
if (dez.code === '51') {
insertUnit('TD 51.1', 'Schussspuren, Explosivstoffe, Brand', 'teildezernat', 3, dezId)
insertUnit('TD 51.2', 'Betäubungsmittel', 'teildezernat', 3, dezId)
}
if (dez.code === '52') {
insertUnit('TD 52.1', 'DNA-Probenbearbeitung', 'teildezernat', 3, dezId)
insertUnit('TD 52.2', 'DNA-Spurenbearbeitung II', 'teildezernat', 3, dezId)
insertUnit('TD 52.3', 'DNA-Spurenbearbeitung III', 'teildezernat', 3, dezId)
insertUnit('TD 52.4', 'DNA-Spurenbearbeitung IV', 'teildezernat', 3, dezId)
}
if (dez.code === '53') {
insertUnit('TD 53.1', 'Forensische Textilkunde, Botanik', 'teildezernat', 3, dezId)
insertUnit('SG 53.2', 'Urkunden, Handschriften', 'sachgebiet', 3, dezId)
}
if (dez.code === '54') {
insertUnit('SG 54.1', 'Zentralstelle Kriminaltechnik', 'sachgebiet', 3, dezId)
insertUnit('SG 54.2', 'Tatortvermessung, Rekonstruktion und XR-Lab', 'sachgebiet', 3, dezId)
insertUnit('SG 54.3', 'Entschärfung von USBV', 'sachgebiet', 3, dezId)
}
if (dez.code === '55') {
insertUnit('SG 55.1', 'Waffen und Munition', 'sachgebiet', 3, dezId)
insertUnit('SG 55.2', 'Werkzeug-, Form-, Passspuren', 'sachgebiet', 3, dezId)
insertUnit('SG 55.3', 'DNA-Analyse-Datei', 'sachgebiet', 3, dezId)
}
if (dez.code === '56') {
insertUnit('SG 56.1', 'Daktyloskopisches Labor', 'sachgebiet', 3, dezId)
insertUnit('SG 56.2', 'AFIS I/Daktyloskopische Gutachten', 'sachgebiet', 3, dezId)
insertUnit('SG 56.3', 'AFIS II/Daktyloskopische Gutachten', 'sachgebiet', 3, dezId)
insertUnit('TD 56.4', 'Gesichts- und Sprechererkennung', 'teildezernat', 3, dezId)
}
})
// Create Dezernate for Abteilung 6 (Fachaufsicht)
const dezernate6 = [
{ code: '61', name: 'Kriminalitätsangelegenheiten der KPB, Fachcontrolling' },
{ code: '62', name: 'Fahndungsgruppe Staatsschutz' },
{ code: '63', name: 'Verdeckte Ermittlungen, Zeugenschutz' },
{ code: '64', name: 'Mobiles Einsatzkommando, TEG, Zielfahndung' }
]
dezernate6.forEach((dez, index) => {
const dezId = insertUnit(`Dezernat ${dez.code}`, dez.name, 'dezernat', 2, abteilungIds['Abt 6'], {
orderIndex: index
})
if (dez.code === '61') {
insertUnit('TD 61.1', 'Kriminalitätsangelegenheiten der KPB', 'teildezernat', 3, dezId)
insertUnit('SG 61.2', 'Lagedienst', 'sachgebiet', 3, dezId)
}
if (dez.code === '62') {
for (let i = 1; i <= 9; i++) {
if (i === 9) {
insertUnit(`SG 62.${i}`, 'Technische Gruppe', 'sachgebiet', 3, dezId)
} else {
insertUnit(`SG 62.${i}`, `Fahndungsgruppe ${i}`, 'sachgebiet', 3, dezId)
}
}
}
if (dez.code === '63') {
insertUnit('SG 63.1', 'Einsatz VE 1', 'sachgebiet', 3, dezId)
insertUnit('SG 63.2', 'Einsatz VE 2', 'sachgebiet', 3, dezId)
insertUnit('SG 63.3', 'Scheinkäufer, Logistik', 'sachgebiet', 3, dezId)
insertUnit('SG 63.4', 'VP-Führung, Koordinierung VP', 'sachgebiet', 3, dezId)
insertUnit('TD 63.5', 'Zeugenschutz, OpOS', 'teildezernat', 3, dezId)
}
if (dez.code === '64') {
insertUnit('SG 64.1', 'MEK 1', 'sachgebiet', 3, dezId)
insertUnit('SG 64.2', 'MEK 2', 'sachgebiet', 3, dezId)
insertUnit('SG 64.3', 'Technische Einsatzgruppe', 'sachgebiet', 3, dezId)
insertUnit('SG 64.4', 'Zielfahndung', 'sachgebiet', 3, dezId)
}
})
// Create Dezernate for Zentralabteilung
const dezernateZA = [
{ code: 'ZA 1', name: 'Haushalts-, Wirtschafts-, Liegenschaftsmanagement' },
{ code: 'ZA 2', name: 'Personalangelegenheiten, Gleichstellungsbeauftragte' },
{ code: 'ZA 3', name: 'Informationstechnik und Anwenderunterstützung' },
{ code: 'ZA 4', name: 'Vereins- und Waffenrecht, Innenrevision' },
{ code: 'ZA 5', name: 'Polizeiärztlicher Dienst' }
]
dezernateZA.forEach((dez, index) => {
const dezId = insertUnit(`Dezernat ${dez.code}`, dez.name, 'dezernat', 2, abteilungIds['ZA'], {
orderIndex: index
})
if (dez.code === 'ZA 1') {
insertUnit('SG ZA 1.1', 'Haushalts- und Wirtschaftsangelegenheiten', 'sachgebiet', 3, dezId)
insertUnit('SG ZA 1.2', 'Liegenschaftsmanagement', 'sachgebiet', 3, dezId)
insertUnit('SG ZA 1.3', 'Zentrale Vergabestelle', 'sachgebiet', 3, dezId)
}
if (dez.code === 'ZA 2') {
insertUnit('SG ZA 2.1', 'Personalentwicklung, Arbeitszeit', 'sachgebiet', 3, dezId)
insertUnit('SG ZA 2.2', 'Personalverwaltung Beamte', 'sachgebiet', 3, dezId)
insertUnit('TD ZA 2.3', 'Personalverwaltung Regierungsbeschäftigte', 'teildezernat', 3, dezId)
insertUnit('SG ZA 2.4', 'Fortbildung', 'sachgebiet', 3, dezId)
}
if (dez.code === 'ZA 3') {
insertUnit('SG ZA 3.1', 'IT-Grundsatz, Planung und Koordinierung', 'sachgebiet', 3, dezId)
insertUnit('SG ZA 3.2', 'Netzwerk/TK-Anlage', 'sachgebiet', 3, dezId)
insertUnit('SG ZA 3.3', 'Server/Client, Logistik', 'sachgebiet', 3, dezId)
insertUnit('SG ZA 3.4', 'Kfz-, Waffen- und Geräteangelegenheiten', 'sachgebiet', 3, dezId)
}
})
console.log('✅ LKA NRW Organizational Structure seeded successfully!')
// Close database
db.close()
console.log('🎉 Done! Run the backend to see the organizational structure.')