Rollback - PDF Import funzt so semi
Dieser Commit ist enthalten in:
467
backend/scripts/seed-lka-structure.js
Normale Datei
467
backend/scripts/seed-lka-structure.js
Normale Datei
@ -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.')
|
||||
386
backend/scripts/seed-organization.js
Normale Datei
386
backend/scripts/seed-organization.js
Normale Datei
@ -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.')
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren