467 Zeilen
22 KiB
JavaScript
467 Zeilen
22 KiB
JavaScript
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.') |