Ga naar hoofdinhoud

Archival & Destruction Workflow

Standards

StandardDescription
GEMMA ArchiveringscomponentDutch municipal reference architecture for archival
Archiefwet 1995Dutch Archives Act governing retention and destruction
Selectielijst GemeentenMunicipal selection list defining retention categories
NEN-ISO 15489International standard for records management

Overview

OpenRegister provides a complete archival and destruction workflow for managing the lifecycle of registered objects. This includes selection lists that define retention categories, automated retention tracking per object, destruction list generation when retention periods expire, and a formal approval/rejection workflow before permanent deletion.

Status

Routes: NOT YET REGISTERED -- The ArchivalController class and all supporting code (entities, mappers, service, background job) exist in the codebase, but the routes have not been added to appinfo/routes.php. The archival API endpoints are therefore not yet accessible. The database migration (Version1Date20260325000000) also needs to be applied to create the selection_lists and destruction_lists tables.

Key Capabilities

Selection List Management

  • Full CRUD for selection list entries (category, retention years, action type)
  • Each selection list entry maps to an archival category from the Selectielijst Gemeenten
  • Configurable retention period in years
  • Action types: destroy, transfer, permanent (permanent preservation)

Retention Metadata

  • Per-object retention metadata stored in the object's retention JSON field
  • Tracks retention start date, category reference, and computed expiry
  • API to get and set retention metadata on individual objects

Destruction List Generation

  • Automated generation of destruction lists based on expired retention periods
  • Background job (DestructionCheckJob) runs daily to identify objects past retention
  • Destruction lists group objects for batch review

Approval Workflow

  • Formal approve/reject workflow for destruction lists
  • Approval triggers permanent deletion of listed objects
  • Rejection removes individual objects from a destruction list with reason tracking
  • Full audit trail via OpenRegister's standard audit logging

Architecture

Backend Files

FilePurpose
lib/Controller/ArchivalController.phpAPI controller with 11 endpoints
lib/Service/ArchivalService.phpBusiness logic for retention and destruction
lib/Db/SelectionList.phpSelection list entity
lib/Db/SelectionListMapper.phpSelection list database mapper
lib/Db/DestructionList.phpDestruction list entity
lib/Db/DestructionListMapper.phpDestruction list database mapper
lib/BackgroundJob/DestructionCheckJob.phpDaily cron job for retention expiry checks
lib/Migration/Version1Date20260325000000.phpDatabase migration for archival tables

API Endpoints (Planned)

MethodEndpointDescription
GET/api/archival/selection-listsList all selection list entries
GET/api/archival/selection-lists/{id}Get a single selection list entry
POST/api/archival/selection-listsCreate a selection list entry
PUT/api/archival/selection-lists/{id}Update a selection list entry
DELETE/api/archival/selection-lists/{id}Delete a selection list entry
GET/api/archival/objects/{id}/retentionGet retention metadata for an object
PUT/api/archival/objects/{id}/retentionSet retention metadata for an object
GET/api/archival/destruction-listsList all destruction lists
GET/api/archival/destruction-lists/{id}Get a single destruction list
POST/api/archival/destruction-lists/generateGenerate destruction list from expired retentions
POST/api/archival/destruction-lists/{id}/approveApprove and execute a destruction list
POST/api/archival/destruction-lists/{id}/rejectReject objects from a destruction list

API Test Results (2026-03-25)

All archival endpoints return HTTP 404 because routes are not yet registered in appinfo/routes.php. The controller code, entities, mappers, service layer, and background job are fully implemented but not wired up.

EndpointResult
GET /api/archival/selection-lists404 (route not registered)
POST /api/archival/selection-lists404 (route not registered)
GET /api/archival/destruction-lists404 (route not registered)