antragsideen-hagen/data/migrate.js

117 lines
3.5 KiB
JavaScript
Raw Permalink Normal View History

const Database = require('better-sqlite3');
const path = require('path');
const oldDb = new Database(path.join(__dirname, '../../antragsideen.db'), { readonly: true });
const newDb = new Database(path.join(__dirname, 'antragsideen.db'));
// Ausschuss-Normalisierung
const ausschussMap = {
'Umweltausschuss': 1,
'Infrastrukturausschuss': 2, 'Infrastruktur': 2,
'HFA': 3, 'Hauptausschuss': 3, 'Haupt- und Finanzausschuss': 3,
'Stadtentwicklungsausschuss': 4, 'Stadtentwicklung': 4,
'Sozialausschuss': 5, 'Soziales': 5,
'Wirtschaftsausschuss': 6, 'Wirtschaft': 6,
'Sport- und Freizeitausschuss': 7, 'Sport': 7,
'Schulausschuss': 8,
'Ausschuss für Bürgerbeteiligung': 9, 'Bürgerbeteiligung': 9
};
// Personen-Map
const personenMap = {
'Rüdiger Ludwig': 1,
'Heike Heuer': 2,
'Jörg Fritzsche': 3,
'Karin Köppen': 4,
'Daniel Adam': 5,
'Nicole Pfefferer': 6
};
// Priorität-Map
const prioMap = { 'Hoch': 1, 'Mittel': 2, 'Niedrig': 3, 'Abgeschlossen': 4 };
// Status-Map
const statusMap = {
'Ideenspeicher': 1, 'Recherche': 2, 'Entwurf': 3,
'Eingereicht': 4, 'Beschlossen': 5, 'Abgelehnt': 6, 'Abgeschlossen': 7
};
// Bereich-Map
const bereichMap = { 'Umwelt': 1, 'Infra': 2, 'HFA': 3, 'Soziales': 4, 'Stadt': 5, 'Wirtschaft': 6 };
// Anträge migrieren
const antraege = oldDb.prepare('SELECT * FROM antraege').all();
const insertAntrag = newDb.prepare(`
INSERT INTO antraege (id, titel, kurzbeschreibung, prioritaet_id, status_id, bereich_id,
dossier, antragstext, notizen, allris_referenzen, erstellt_am, aktualisiert_am)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`);
const insertAntragAusschuss = newDb.prepare(`
INSERT OR IGNORE INTO antrag_ausschuesse (antrag_id, ausschuss_id) VALUES (?, ?)
`);
const insertAntragPerson = newDb.prepare(`
INSERT OR IGNORE INTO antrag_personen (antrag_id, person_id) VALUES (?, ?)
`);
newDb.exec('BEGIN TRANSACTION');
for (const a of antraege) {
// Antrag einfügen
insertAntrag.run(
a.id,
a.titel,
a.kurzbeschreibung,
prioMap[a.prioritaet] || 2,
statusMap[a.status] || 1,
bereichMap[a.bereich] || 1,
a.dossier,
a.antragstext,
a.notizen,
a.allris_referenzen,
a.erstellt_am,
a.aktualisiert_am
);
// Ausschüsse verknüpfen
if (a.ausschuesse) {
try {
const ausschuesse = JSON.parse(a.ausschuesse);
for (const aus of ausschuesse) {
const ausId = ausschussMap[aus];
if (ausId) insertAntragAusschuss.run(a.id, ausId);
}
} catch (e) {}
}
// Personen verknüpfen
if (a.personen) {
try {
const personen = JSON.parse(a.personen);
for (const pers of personen) {
const persId = personenMap[pers];
if (persId) insertAntragPerson.run(a.id, persId);
}
} catch (e) {}
}
}
newDb.exec('COMMIT');
console.log(`${antraege.length} Anträge migriert`);
// Statistik
const stats = newDb.prepare(`
SELECT
(SELECT COUNT(*) FROM antraege) as antraege,
(SELECT COUNT(*) FROM antrag_ausschuesse) as ausschuss_links,
(SELECT COUNT(*) FROM antrag_personen) as personen_links
`).get();
console.log(`${stats.ausschuss_links} Ausschuss-Verknüpfungen`);
console.log(`${stats.personen_links} Personen-Verknüpfungen`);
oldDb.close();
newDb.close();