Files
schulos/scripts/generate-ropa.mjs
T
2026-08-02 12:33:19 +02:00

206 lines
6.6 KiB
JavaScript

/**
* Generate Records of Processing Activities (Verzeichnis von Verarbeitungstätigkeiten)
* Compliant with GDPR Art. 30 requirements
* German legal document for school's DPO review
*/
import fs from "node:fs";
import path from "node:path";
const ropas = [
{
name: "Student Information Management",
purposes: [
"Student enrollment and record maintenance",
"Educational progress tracking",
"Communication with parents/guardians",
],
dataCategories: ["Name", "DOB", "Contact information", "Academic records"],
recipients: ["Teachers", "School administration", "Parents/guardians"],
retentionPeriod: "Duration of enrollment + 2 years",
legalBasis:
"GDPR Art. 6(1)(c) - Legal obligation under Schulgesetz (School Law)",
securityMeasures: [
"Role-based access control (RBAC)",
"Encryption at rest and in transit",
"Audit logging of all data access",
"Regular security audits",
],
},
{
name: "Learning Progress & Assessment",
purposes: [
"Track student learning outcomes",
"Generate report cards and grades",
"Identify learning support needs",
],
dataCategories: [
"Assessment scores",
"Teacher feedback",
"Learning competencies",
],
recipients: ["Teachers", "School administration", "Parents"],
retentionPeriod: "1-2 years per Bundesland regulations",
legalBasis:
"GDPR Art. 6(1)(a) - Consent + Art. 9(2)(h) - Educational necessity",
securityMeasures: [
"Pseudonymization of assessment data where possible",
"Teacher-student privacy boundaries",
"Parent-accessible portal with consent gates",
],
},
{
name: "AI Tutor Processing",
purposes: [
"Personalized learning recommendations",
"Adaptive tutoring content delivery",
"Learning analytics and reporting",
],
dataCategories: [
"Student interaction logs",
"Learning preferences",
"Performance metrics",
"AI model inputs/outputs",
],
recipients: ["AI service provider (if applicable)", "Teachers", "Students"],
retentionPeriod: "6-12 months after course completion",
legalBasis:
"GDPR Art. 6(1)(a) - Explicit consent + Art. 22 - Automated decision safeguards",
securityMeasures: [
"Data minimization: only essential features processed",
"Transparency logs for AI decisions",
"Human-in-the-loop review for grade-affecting recommendations",
"Right to explanation mechanism",
],
},
{
name: "Exam Monitoring & Integrity",
purposes: [
"Exam room monitoring for security",
"Incident logging (distress signals, technical issues)",
"Academic integrity verification",
],
dataCategories: [
"Exam room events",
"Student signals/requests",
"Technical logs",
"Audio/video (if applicable)",
],
recipients: ["Exam proctors", "School administration"],
retentionPeriod: "6-12 months (shorter if no incident)",
legalBasis:
"GDPR Art. 6(1)(a) - Consent + Art. 9(2)(h) - Exam security necessity",
securityMeasures: [
"Limited access to exam data (proctors only)",
"Video/audio encrypted and retained separately",
"Automated deletion of non-incident logs after retention period",
],
},
{
name: "Audit & Compliance Logging",
purposes: [
"Regulatory compliance (GDPR, Schulgesetz)",
"Data breach investigation",
"User accountability and audit trail",
],
dataCategories: ["User ID", "Action taken", "Timestamp", "Entity accessed"],
recipients: ["DPO", "School administration", "Schulträger (if requested)"],
retentionPeriod: "1-2 years",
legalBasis: "GDPR Art. 6(1)(c) - Legal obligation (compliance duty)",
securityMeasures: [
"Immutable audit logs",
"Restricted DPO-only access",
"Regular integrity verification",
"Automated flagging of suspicious access patterns",
],
},
];
function generateRopa(outputPath = "docs/legal") {
if (!fs.existsSync(outputPath)) {
fs.mkdirSync(outputPath, { recursive: true });
}
const lines = [
"# Verzeichnis von Verarbeitungstätigkeiten",
"# (Records of Processing Activities - Art. 30 GDPR)",
"",
"**Schulname**: [To be filled by school]",
"**DPO**: [To be filled by school]",
"**Schulträger**: [To be filled by school]",
"**Erstellungsdatum**: " + new Date().toISOString(),
"",
"---",
"",
"## Einleitung",
"",
"Dieses Verzeichnis dokumentiert alle Verarbeitungstätigkeiten personenbezogener Daten durch ExaMetra im Rahmen des deutschen Schulgesetzes (Schulgesetz/BDSG-SchulG) und der DSGVO.",
"",
"**HINWEIS**: Dies ist eine Vorlage. Ihre Schule muss dieses Dokument durch ihren Datenschutzbeauftragten überprüfen und finalisieren, bevor es als offizielle Dokumentation gilt.",
"",
"---",
"",
];
for (let i = 0; i < ropas.length; i++) {
const ropa = ropas[i];
lines.push(
`## Verarbeitungstätigkeit ${i + 1}: ${ropa.name}`,
"",
"### Zwecke der Verarbeitung",
...ropa.purposes.map((p) => `- ${p}`),
"",
"### Kategorien personenbezogener Daten",
...ropa.dataCategories.map((c) => `- ${c}`),
"",
"### Kategorien von Empfängern",
...ropa.recipients.map((r) => `- ${r}`),
"",
"### Speicherdauer",
`${ropa.retentionPeriod}`,
"",
"### Rechtsgrundlage",
`${ropa.legalBasis}`,
"",
"### Technische und organisatorische Maßnahmen",
...ropa.securityMeasures.map((m) => `- ${m}`),
""
);
}
lines.push(
"---",
"",
"## Betroffenenrechte (DSGVO Art. 12-22)",
"",
"Alle Personen haben das Recht auf:",
"- **Auskunft** (Art. 15): Zugang zu ihren Daten",
"- **Berichtigung** (Art. 16): Korrektur ungenauer Daten",
"- **Löschung** (Art. 17): Unter rechtlichen Bedingungen",
"- **Datenportabilität** (Art. 20): Export ihrer Daten",
"- **Widerspruch** (Art. 21): Gegen bestimmte Verarbeitungen",
"",
"Anträge richten Sie an den Datenschutzbeauftragten (DPO).",
"",
"## Datenschutzverletzungen",
"",
"Bei Verdacht auf eine Datenschutzverletzung kontaktieren Sie sofort den DPO und die zuständige Aufsichtsbehörde.",
"",
`**Generiert**: ${new Date().toISOString()}`,
"**Quelle**: ExaMetra Module L - Compliance Framework",
);
const filePath = path.join(
outputPath,
"verzeichnis-verarbeitungstaetigkeiten.md"
);
fs.writeFileSync(filePath, lines.join("\n"), "utf-8");
console.log(
`[v0] Generated RoPA (Verzeichnis) at ${filePath}`
);
}
if (require.main === module) {
generateRopa();
}