Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Records of processing

GDPR Art. 30 requires a controller to keep a record of its processing activities, and Art. 30(2) requires a shorter one from a processor acting on a controller’s behalf. Both records are the organisation’s, not the software’s. This page is a template for the part a FerroEHR deployment contributes: the activities the software performs by design, with the fields it can answer already filled and the fields only you can answer marked.

FerroEHR is software rather than a controller or a processor, so nothing here is a record on anyone’s behalf. It is a starting draft that saves you reading the source to find out what the server does with personal data.

How to use this

Copy the activity tables below into your own register and fill the three columns nobody but you can fill: the purpose your organisation processes for, the lawful basis it relies on, and the recipients it discloses to. Delete any activity your deployment has switched off. Activities 6 and 7 are off by default and only apply if you turned them on.

The identity fields Art. 30(1)(a) asks for are yours in every case:

FieldValue
Controller (name, contact)your organisation
Joint controllers, if anyyours
Representative in the Union, if applicableyours
Data protection officeryours
Processors engagedyours: the PostgreSQL operator, and any object store, message broker, terminology server or identity provider the deployment is configured against

1. Storing the clinical record

Art. 30 fieldWhat the software does
Purposeyours: the care or research purpose the repository serves
Categories of data subjectPatients and other record subjects; the health professionals recorded as composers, performers and participants
Categories of personal dataClinical content as the operational templates define it, in the ehr schema and its cold archival tier. Special-category health data under Art. 9. The subject appears as an opaque pseudonym once [privacy] subject_namespaces is declared
Recipientsyours: whoever the API is exposed to. The software discloses nothing on its own
Third-country transfersyours: wherever the deployment and its backups run
RetentionNo automatic expiry. Content leaves only by an administrator’s deletion; archiving moves it to the cold tier without expiring it
Security measuresLeast-privilege database roles per pseudonymisation domain; a data-minimisation pass over every write; FORCE ROW LEVEL SECURITY for tenant scoping; TLS; authentication and layered authorization

2. Versioning and change control

Art. 30 fieldWhat the software does
PurposeKeeping the clinical record attributable and reconstructible, which openEHR’s change-control model requires
Categories of data subjectAs activity 1, plus the committing user
Categories of personal dataOne contribution and one audit entry per commit, naming the committer, the change type and the commit instant; every prior version of every object
Recipientsyours
Third-country transfersyours
RetentionIndefinite by design. A version is superseded, never overwritten
Security measuresContribution and audit written in the same transaction as the content; a temporal version table rather than in-place update; optional version signing

3. Query

Art. 30 fieldWhat the software does
Purposeyours: the reporting, cohort or operational purpose queries serve
Categories of data subjectAs activity 1
Categories of personal dataWhatever the query projects out of stored clinical content
Recipientsyours
Third-country transfersyours
RetentionResults are not stored. Stored query definitions are, as AQL text
Security measuresQueries run on the clinical credential only, so no query can reach the demographic or linkage domain; the planning gate refuses constructs the active specification generation does not define; result caps and statement timeouts bound one query’s reach

Note

No threshold is applied to a result set. A query returning one row about one rare condition is served like any other. Small-cell suppression is designed alongside the cross-domain cohort query and is not built: #3159.

4. Identity and linkage

Art. 30 fieldWhat the software does
PurposeHolding who the record subjects are, and resolving a person to their record where a caller is entitled to
Categories of data subjectPatients, and the parties a record refers to
Categories of personal dataParties in the demographic schema with names, addresses and contacts as the template defines them; protected national identifiers sealed in national_identifier; the party-to-EHR map in linkage, which holds identifiers and a validity period and nothing else
Recipientsyours
Third-country transfersyours
RetentionParties leave only by an administrator’s deletion. A linkage mapping is never deleted: a merge or a split closes its period and opens a successor
Security measuresThree schemas under three roles, revoked from each other in both directions and checked at boot; AES-256-GCM sealing with a keyed HMAC-SHA-256 digest for lookup, under per-domain and per-tenant subkeys; the one crossing runs in the application over two pools and writes an access record

5. Access logging

Art. 30 fieldWhat the software does
PurposeRecording who reached what, which EHDS Annex II 3.2 requires of an EHR system and which NEN 7513 specifies the content of for Dutch deployments
Categories of data subjectThe record subject, and the person who accessed the record
Categories of personal dataPer access: the accessing person and organisation, the roles held, the object and its domain, the outcome, the declared purpose of use, the configured legal basis and the time. Refusals are recorded too, unattributed where no principal was established
Recipientsyours: the local repository, plus any syslog or FHIR-feed Audit Record Repository configured
Third-country transfersyours
Retention[audit.store] retention_days, 0 meaning forever, reaped hourly otherwise. Where an active identifier rule names a jurisdiction with a registered floor, a shorter value is refused at boot
Security measuresRecords are hash-chained and verifiable with audit.verify_audit_chain(); the runtime role may insert and stamp delivery and nothing else; the audit schema sits outside all three pseudonymisation domains; the syslog feed can run over RFC 5425 TLS with a client certificate

6. Change-event publication (off by default)

Art. 30 fieldWhat the software does
PurposeTelling downstream systems that a commit happened, when [events] is enabled
Categories of data subjectRecord subjects, indirectly
Categories of personal dataA PHI-free envelope: the contribution id, the EHR id, the commit instant, and per version the object id, kind, version number, change type and template. No clinical content
RecipientsThe configured AMQP broker, and whoever consumes from it
Third-country transfersyours: wherever the broker runs
RetentionPublished rows pruned after [events] retention_days, seven days by default
Security measuresWritten in the same transaction as the commit it announces, so there is no event without its commit; optional TLS to the broker; the envelope carries identifiers, so a consumer still has to authenticate to the API to read anything

7. The FHIR façade (off by default)

Art. 30 fieldWhat the software does
PurposeExchanging mapped resources with FHIR systems, when [fhir] is enabled
Categories of data subjectRecord subjects
Categories of personal dataWhatever the registered mappings project, which is clinical content and therefore Art. 9 data. Outbound emission is PHI-bearing, unlike the change-event envelope
RecipientsThe configured broker or FHIR peer
Third-country transfersyours
RetentionNothing is stored by the façade beyond the mappings themselves and an outbound cursor
Security measuresMappings are data an administrator registers, so what leaves is what someone configured rather than a default; the façade is a targeted surface with no free-text search and no _include; TLS to the peer

Fields no software can fill

The record is not complete until these are answered, and they are answered by the organisation:

  • The purpose of each activity and the lawful basis for it, which for health data means an Art. 9(2) condition beside the Art. 6 one.
  • The recipients, including every category of person inside the organisation who can reach the API.
  • Transfers to third countries and the safeguard relied on, which follows from where the database, the backups and every configured peer run.
  • Time limits for erasure per category, which the software will not apply for you: it deletes when an administrator asks.
  • The general description of security measures in Art. 30(1)(g), for which the technical half is the DPIA page and the threat model.

Next