diff --git a/README.md b/README.md index 66270c5..29061ce 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,7 @@ Massenimporte gibt es zwei Wege: | Befehl | Zweck | |---|---| -| `npm run import-csv` | **Führender Weg:** DSE-Gesamtliste einlesen (`--dry-run`, `--prune`) | +| `npm run import-csv` | **Führender Weg:** DSE-Gesamtliste einlesen (`--dry-run`, `--prune`, `--no-json`) | | `npm run check-completeness` | Berichtet fehlende Pflichtangaben (`--list`) | | `npm run compare-csv-pdf` | Gesamtliste gegen die alten Merkblatt-PDFs abgleichen (`--detail`) | | `npm run import-policy -- data/policies/.json` | Einzelne Erklärung aus JSON importieren (`--update` überschreibt) | @@ -184,6 +184,12 @@ Zwei Angaben stehen nicht in der Liste und werden ergänzt: Werte wie „entfällt“ in der Spalte Datenquelle gelten als leer – sonst würde die Art.-14-Pflicht zu den Datenkategorien fälschlich ausgelöst. +Die Datenbank wird zuerst geschrieben, die JSON-Dateien danach. Sie dienen nur +der Nachvollziehbarkeit im Repository – schlägt das Schreiben fehl, etwa weil +das Verzeichnis im Container nicht beschreibbar ist, meldet der Lauf das und +der Import bleibt trotzdem vollständig. Mit `--no-json` lässt sich die Ablage +ganz abschalten; im Container ist das der Normalfall. + Der PDF-Import (`scripts/lib/pdf-policy.js`) bleibt für die alten Merkblätter erhalten und dient als Gegenprobe. diff --git a/scripts/import-csv.js b/scripts/import-csv.js index 44a4d2d..d9a6cfe 100644 --- a/scripts/import-csv.js +++ b/scripts/import-csv.js @@ -2,8 +2,9 @@ * Importiert die DSE-Gesamtliste des Amtes Leezen (Excel-Export, CSV). * * node scripts/import-csv.js --dry-run nur prüfen und berichten - * node scripts/import-csv.js JSON schreiben und importieren + * node scripts/import-csv.js importieren und JSON ablegen * node scripts/import-csv.js --prune zusätzlich verwaiste Datensätze löschen + * node scripts/import-csv.js --no-json nur in die Datenbank (z. B. im Container) * * Die Liste ist führend für die Angaben je Verarbeitungstätigkeit. Die für alle * Erklärungen gleichen Bausteine kommen aus den zentralen Standardtexten und @@ -114,6 +115,7 @@ function addressBlock(value) { async function main() { const dryRun = process.argv.includes("--dry-run") const prune = process.argv.includes("--prune") + const ohneJson = process.argv.includes("--no-json") if (!fs.existsSync(CSV)) { console.error(`Liste nicht gefunden: ${CSV}`) @@ -264,17 +266,26 @@ async function main() { return } - fs.mkdirSync(JSON_DIR, { recursive: true }) + // Die JSON-Ablage ist nur zur Nachvollziehbarkeit im Repository gedacht. + // Im Container liegt sie im Volume und ist je nach Einhängung nicht + // beschreibbar – das darf den eigentlichen Import nicht verhindern. + let jsonZiel = ohneJson ? null : JSON_DIR + if (jsonZiel) { + try { + fs.mkdirSync(jsonZiel, { recursive: true }) + } catch (error) { + console.warn(`Hinweis: ${jsonZiel} nicht anlegbar (${error.code}) – JSON-Ablage wird übersprungen.`) + jsonZiel = null + } + } + let neu = 0 let aktualisiert = 0 + let geschrieben = 0 + let jsonFehler = null for (const { nummer, daten, overrides, bestehend } of aufbereitet) { - fs.writeFileSync( - path.join(JSON_DIR, `${daten.slug}.json`), - JSON.stringify({ _quelle: `DSE_Gesamtliste_Amt_Leezen.CSV · ${nummer}`, _abweichungen: overrides, ...daten }, null, 2), - "utf8" - ) - + // Datenbank zuerst: Sie ist der Zweck des Laufs. if (bestehend) { await prisma.privacyPolicy.update({ where: { id: bestehend.id }, data: daten }) aktualisiert++ @@ -282,6 +293,21 @@ async function main() { await prisma.privacyPolicy.create({ data: daten }) neu++ } + + if (!jsonZiel) continue + + try { + fs.writeFileSync( + path.join(jsonZiel, `${daten.slug}.json`), + JSON.stringify({ _quelle: `DSE_Gesamtliste_Amt_Leezen.CSV · ${nummer}`, _abweichungen: overrides, ...daten }, null, 2), + "utf8" + ) + geschrieben++ + } catch (error) { + // Einmal melden, dann nicht weiter versuchen + jsonFehler = error + jsonZiel = null + } } console.log(`Neu angelegt: ${neu}`) @@ -296,7 +322,18 @@ async function main() { console.log(`Unberührt: ${verwaist.length} (mit --prune entfernen)`) } - console.log(`JSON-Dateien: data/policies/`) + if (ohneJson) { + console.log(`JSON-Ablage: übersprungen (--no-json)`) + } else if (jsonFehler) { + console.log(`JSON-Dateien: ${geschrieben} von ${aufbereitet.length} geschrieben`) + console.warn("") + console.warn(`WARNUNG: JSON-Ablage abgebrochen – ${jsonFehler.code} bei ${jsonFehler.path}`) + console.warn("Der Import in die Datenbank ist davon unberührt und vollständig.") + console.warn("Die JSON-Dateien dienen nur der Nachvollziehbarkeit im Repository;") + console.warn("im Container lassen sie sich mit --no-json ganz abschalten.") + } else { + console.log(`JSON-Dateien: ${geschrieben} in data/policies/`) + } } main()