geocrop-platform./apps/nextgen/docs/compliance/cyber-data-protection-act.md

19 KiB
Raw Permalink Blame History

Zimbabwe Cyber & Data Protection Act — Compliance Brief

NFR7 — Data Sovereignty for the Next Gen Learning school management system.

Document version 1.0 — 2026-07-28
Status Draft — pending client (Lesticom) sign-off
Owner Lesticom Development Team (fchin — review/merge owner)
Statute Cyber and Data Protection Act, 2021 (Zimbabwe) (Chapter 12:07)
Regulator Postal and Telecommunications Regulatory Authority of Zimbabwe (POTRAZ), Data Protection Authority (DPA) once constituted
Source artefacts Next Gen Learning SRS.pdf §3.2 NFR7; evidence/audit-2026-07-28.md §4.2 NFR7 row
Related docs docs/spec-deviations.md (NFR1, NFR5); docs/SYNC.md (offline-first data flow)

1. Executive summary

The Next Gen Learning system processes personal data of minors (students), their parents/guardians, and school staff. As a Zimbabwe-deployed service handling this data, it is subject to the Cyber and Data Protection Act, 2021 (CDPA), which:

  • Establishes a lawful basis requirement for processing personal data (§4);
  • Mandates specific consent for processing data of minors (§4(3));
  • Imposes data minimisation, accuracy, storage limitation, and integrity/confidentiality duties (§5§9);
  • Requires breach notification to the Authority and affected data subjects (§26);
  • Imposes cross-border transfer restrictions for personal data leaving Zimbabwe (§24);
  • Provides data subjects with rights of access, correction, and erasure (§12§17).

This brief documents how the system's design satisfies each of these obligations, and explicitly calls out the deviations and remaining gaps that need either client acceptance or future remediation.

Posture: the system is designed for an on-premise / in-country deployment by default. The cloud sync target (Supabase / api.next_gen.techarvest.co.zw) is hosted in Zimbabwe. No data is intended to leave the country. Where this differs from the SRS, the deviation is documented in §6.


2. Data inventory

A complete inventory of personal-data fields processed by the system. All PII is in the users table plus a handful of supporting tables.

2.1 Data subjects

Category Approx. count per school Source
Students 5002,000 Seeded by init.js + admin onboarding
Parents/guardians 5002,000 Linked via parent_students
Teachers 30100 Seeded by init.js
School admins / support staff 520 Seeded by init.js
Applicants / alumni (data subject erasure) variable offboarding table

2.2 Personal data fields

Field Table Sensitive? Lawful basis
first_name, last_name users PII Contract (enrolment / employment)
email users PII Contract; explicit consent (optional)
phone users PII Explicit consent (optional)
id_number (national ID) users Sensitive PII Contract + explicit consent
date_of_birth users Sensitive PII (minor status) Contract + explicit consent
address (line 1/2/city) users PII Contract
gender users Sensitive (SADC region) Optional; explicit consent
blood_type, allergies, medical_conditions medical_documents Special category (health) Explicit consent required
emergency_contact users PII (third party) Explicit consent (the third party must be informed)
academic_year, grades, attendance grades, attendance Behavioural Contract
disciplinary_records disciplinary_records Sensitive Contract + safeguarding obligation
payment_method, paynow_reference payments Financial Contract
salary, bank_account payroll Financial Contract

Special category data (health, biometrics) is processed only with explicit consent under CDPA §4(3) and only for the duration required to provide the service. The system does not collect biometric data today.

2.3 Children's data (CDPA §4(3))

The system processes the personal data of minors (students). The system implements:

  • Parental consent capture at registration (parent_students linkage + consent workflow in transfers.controller.jsPOST /api/xfer/consent).
  • No direct marketing to minors — the system has no marketing surface.
  • Limited third-party disclosure — third parties (e.g. receiving schools during a transfer) only receive a record package with explicit, signed consent (signature_hash on transfer_consents).

3. Lawful basis

CDPA §4(1) requires a lawful basis for every processing activity. The mapping:

Processing activity Lawful basis Notes
Operating the school's academic record (grades, attendance, behaviour) Contract with the parent / adult student Implied by enrolment; no separate consent needed.
Maintaining contact details for emergency & school communications Contract + legitimate interest (school safety) Phone & email are required for school operations.
Medical information (allergies, blood type) Explicit consent Required at registration; can be withdrawn but doing so means the school cannot safely admit the child.
Transfer of records to another institution (Form 1 placement, university) Explicit consent POST /api/xfer/consent workflow with SHA-256 signature hash; immutable audit trail.
Financial transactions (Paynow integration) Contract Necessary to perform the fee payment service.
Backup & disaster recovery Legitimate interest (continuity of service) Backups are encrypted and stored in the same legal jurisdiction.
Aggregate, anonymised reporting to the Ministry Legal obligation Required by the Education Act; data is anonymised before transmission.
Marketing, third-party advertising N/A — system does no marketing

4. Data subject rights

CDPA §12§17 grants data subjects the right to access, correct, and erase their personal data. The system's current support:

Right Status Endpoint / workflow
Right of access (§12) GET /api/users/me returns the data subject's own profile. Admins can pull a record for a parent/teacher on request.
Right to correction (§13) PATCH /api/users/:id (admin) or self-service profile edit in the client.
Right to erasure / "right to be forgotten" (§14) ⚠️ Partial — see §6.2. The offboarding service anonymises a user (is_deleted = 1 + cleared PII), but linked records (grades, attendance, payments) are preserved in aggregated form.
Right to data portability (§15) POST /api/xfer/graduation exports a self-contained JSON package (academic + attendance + disciplinary + financial clearance) for the receiving institution.
Right to object (§16) ⚠️ Documented but not yet a self-service UI flow. Admin-mediated.
Right not to be subject to automated decision-making (§17) The system performs no automated decision-making that produces legal or similarly significant effects on the data subject.

4.1 Erasure workflow (current state)

The system implements a soft-delete + anonymise pattern rather than a hard delete, to preserve the integrity of historical academic and financial records (which the school is legally required to retain — see §5). When a data subject invokes the right to erasure:

  1. Admin or HR marks the user for offboarding in the Offboarding workflow (/api/offboarding).
  2. The OffboardingService (see server/src/services/OffboardingService.js) runs:
    • Sets users.is_deleted = 1 and clears PII fields (first_name, last_name, email, phone, address).
    • Replaces PII with [REDACTED-<uid>] so historical references stay consistent.
    • Preserves users.uid so the audit trail remains intact.
    • Logs the erasure in audit_logs with the requesting user + timestamp.
  3. The data subject receives a confirmation record via the on-file email (if it was retained) or via the school admin.

5. Retention schedule

CDPA §5(2)(c) requires that personal data be kept "no longer than is necessary for the purposes for which it is being processed." The system enforces the following retention schedule:

Data category Retention Justification
Academic records (grades, reports) 7 years after the student leaves the school Education Act + ZIMSEC audit window
Attendance records 7 years Education Act
Disciplinary records 5 years after the student turns 18 Safeguarding + Education Act
Financial / payment records 7 years Zimbabwe Revenue Authority (ZIMRA) tax retention obligation
Payroll records (staff) 7 years after the staff member leaves ZIMRA + Labour Act
Medical records 2 years after the student leaves (or until consent is withdrawn) Practical minimum; not legally mandated for longer
User authentication data (passwords) Until account is closed Operational requirement
Audit logs Permanent (immutable) Required for compliance demonstration and dispute resolution
Sync queue / failure logs 90 days Operational; not personal data
Backups 1 year rolling Disaster recovery

Note: "deleted" users are retained as anonymised records to preserve referential integrity in audit logs. True hard-deletion is not performed because it would break the chain of evidence for academic and financial audits.


6. Cross-border data transfer (CDPA §24)

CDPA §24 restricts the transfer of personal data to a country outside Zimbabwe unless that country has adequate data-protection laws or the data subject has given explicit consent.

6.1 Current state

  • Sync target: https://api.next_gen.techarvest.co.zw — hosted in Zimbabwe. Adequate; no cross-border issue.
  • Payments: Paynow (Zimbabwean payment processor) — hosted in Zimbabwe.
  • Email / SMS providers: SMS and email are routed via providers selected by the deploying school. Deviation: the system does not currently enforce that the provider be Zimbabwe-hosted. This is a deployment-time decision, not a code-time one. The deployment manifest in docker-compose.yml should be configured to use a ZW-hosted SMTP and SMS provider. See §6.3 (action item).
  • Cloud backups: the system supports both local (same-host) and remote (S3-compatible) backup targets. Remote backups are an explicit opt-in by the deploying school; the default is local. When remote backups are enabled, the school must configure a ZW-hosted S3-compatible store (or accept the §24 risk via the school's own DPA filing).

6.2 No third-party sharing

The system does not sell or share personal data with third parties for marketing or any other commercial purpose. The only third-party data flows are:

  • Receiving institutions during a record transfer (with explicit consent — see transfers.controller.js).
  • Payment processors (Paynow) for fee collection.
  • Ministry reporting (anonymised aggregates, not personal data).

6.3 Action items

# Item Owner Status
6.3.1 Document the recommended ZW-hosted SMTP/SMS providers in docs/DEPLOY.md Lesticom open
6.3.2 Add a startup-time check that the configured SMTP/SMS endpoints are in-country (or at minimum: log a warning if the resolved IP geolocates outside ZW) Lesticom open
6.3.3 Add a deployment-time "data sovereignty" flag that disables remote backups unless explicitly enabled Lesticom open

7. Security controls

The system implements the following technical and organisational measures (CDPA §9 — security safeguards):

Control Implementation Evidence
Password hashing bcrypt, 10 rounds (configurable) server/src/utils/password.js
Authentication JWT (HS256), 7-day expiry server/src/config/index.jsjwtSecret
Authorisation (RBAC) Per-route role gates; full RBAC matrix sweep on every change server/src/middleware/requireRole.js + client/e2e/rbac-sweep.spec.ts (Phase 3, 152/152 passing)
Transport security TLS terminated at the reverse proxy (Nginx / Caddy) Out of scope of the app; deployment-time concern
Audit logging audit_logs table is append-only; every state change is recorded server/src/services/AuditService.js
Database encryption at rest Not enabled by default. Deviation — see §6.4
Backup encryption Backups are plaintext SQLite. Deviation — see §6.4
Rate limiting Express rate limit on /api/auth/login and /api/auth/register server/src/middleware/rateLimit.js
CSRF CORS is wide-open in dev (see AGENTS.md); production deployments must set ALLOWED_ORIGINS to the school domain server/src/config/index.jsallowedOrigins
Input validation JSON body limit 50 MB (configurable); multer file uploads capped at 5 MB server/src/index.js
Dependency hygiene No automated SCA today; manual review at PR time Open follow-up

7.1 Action items

# Item Owner Status
7.1.1 Add automated dependency scanning (npm audit + Dependabot or Renovate) Lesticom open
7.1.2 Add database encryption at rest via SQLCipher or filesystem-level encryption (LUKS / eCryptfs) Lesticom open
7.1.3 Add backup encryption (gpg / age) to the backup script Lesticom open

8. Breach notification (CDPA §26)

CDPA §26 requires notification to the Authority and to affected data subjects "as soon as reasonably possible" after discovery of a breach that is likely to result in significant harm.

8.1 Current incident response

  1. Detection: an anomaly in the audit log or a user report.
  2. Containment: the admin disables the affected account via PATCH /api/users/:id with is_active = 0.
  3. Investigation: the audit_logs table is reviewed (append-only).
  4. Notification: the school admin (acting as the data controller) is responsible for notifying the Authority and the data subjects. The system does not yet automate the external notification step.
  5. Post-mortem: documented in the project's evidence/ folder.

8.2 Action items

# Item Owner Status
8.2.1 Add a breach notification workflow to the admin dashboard that pre-fills the Authority's notification template with the affected user IDs, dates, and types of data Lesticom open
8.2.2 Document the incident response runbook in docs/RUNBOOK.md (who to call, what to capture, what to preserve) Lesticom open

9. Lawful basis register (record of processing)

CDPA §6 requires a record of processing activities. The full register is maintained by the school (data controller); the system supports it via the audit_logs table.

# Processing activity Categories of data Data subjects Recipients Retention Cross-border?
1 Enrolment & academic record Identity, academic, behavioural Students School staff, parents (self-access) 7 years post-departure No
2 Attendance tracking Identity, attendance Students, teachers School staff, parents (self-access) 7 years No
3 Behavioural & disciplinary Identity, behavioural Students School staff, parents (on request) 5 years post-18th birthday No
4 Fee collection (Paynow) Identity, financial Parents Paynow (payment processor) 7 years No (ZW)
5 Payroll Identity, financial Staff School admin, ZIMRA (on audit) 7 years post-employment No
6 Medical & safeguarding Health, identity Students School nurse, parents (on request) 2 years post-departure No
7 Record transfer to next institution Academic, attendance, disciplinary, financial Students Receiving institution (with consent) One-time No (within ZW)
8 Ministry reporting Anonymised aggregates N/A (anonymised) Ministry of Education Permanent (immutable) No
9 Backup & disaster recovery All above All Same-host (default) or school-configured S3 1 year rolling Depends on backup target
10 Authentication & session management Authentication tokens All None (local) Until account closure No

10. Data Protection Impact Assessment (DPIA)

CDPA §8 requires a DPIA for processing that is likely to result in significant harm. The following activities warrant a DPIA:

Activity DPIA required? Status
Routine academic record No (low risk; standard school operations)
Cross-school record transfer Yes (data leaves the school, even with consent) DPIA template drafted, sign-off pending
Ministry aggregate reporting No (anonymised)
Disciplinary records (special category) Yes (could affect child's future) DPIA template drafted, sign-off pending
Offboarding / right to erasure No (low risk; data subject's own request)
Medical records (special category) Yes DPIA template drafted, sign-off pending
Remote backup to S3-compatible store Conditional (depends on whether S3 endpoint is in ZW) Open

11. Deviations from the strict reading of the CDPA

The following items are technically deviations from the strict reading of the CDPA. Each is documented so the client can either accept the deviation or fund remediation.

# Deviation Reason Acceptance by
6.3.x SMTP / SMS providers are not enforced to be ZW-hosted at the application layer Provider choice is a deployment-time decision by the school School / Lesticom
7.1.2 Database encryption at rest is not enabled by default SQLite + SQLCipher integration is a follow-on engineering task School / Lesticom
7.1.3 Backups are not encrypted at rest Same reason as 7.1.2 School / Lesticom
7.1.1 No automated dependency scanning Engineering bandwidth; the team reviews deps manually at PR time Lesticom
8.2.x Breach notification is admin-mediated, not automated Requires integration with the Authority's notification API when published Lesticom
§10 DPIAs for cross-school transfer, disciplinary, and medical processing are drafted but not signed Requires Lesticom legal review + sign-off Lesticom + school

12. Acceptance & sign-off

This brief is intended to be reviewed and signed by:

  • Lesticom Development Lead (technical owner) — _________________________ Date: __________
  • Lesticom Delivery Manager (commercial owner) — _________________________ Date: __________
  • School Principal (data controller's representative) — _________________________ Date: __________
  • School IT Lead (operational owner) — _________________________ Date: __________

Sign-off indicates the school has reviewed the data flows, accepted the documented deviations, and agreed to the retention schedule. Material changes to the data flows (e.g. switching to a non-ZW sync target, adding a new third-party processor) require a re-issue of this brief.


13. Change log

Date Version Author Change
2026-07-28 1.0 Mavis (on behalf of fchin) Initial draft. Closes NFR7 from the SRS audit (evidence/audit-2026-07-28.md).