Matriu de compliance — Claims Module
Estat: 2026-04-29. Vegeu el doc públic per al ciutadà a Reclamacions i Expedients.
GDPR / LOPDGDD
| Obligació | Article | Com s'implementa | Estat |
|---|---|---|---|
| Base legal — interès legítim | Art. 6.1.f GDPR | Moderació + verificació ownership documentada al doc públic | ✅ |
| Base legal — consentiment | Art. 6.1.a GDPR | Atestació versionada (claims.attestation-version=D3-v1-ca) acceptada al claim | ✅ |
| Categories especials | Art. 9 GDPR | Camp data_classification al model. Només STANDARD v1; ART9_SENSITIVE bloquejat per UI + missatge explícit al peticionari | ⚠️ Preparat, no actiu |
| Informació al titular | Art. 13 GDPR | Doc públic /docs/legal/claims-and-expedients enllaçat des del modal de claim | ✅ |
| Accés del titular | Art. 15 GDPR | GET /api/claims/me + /me/submissions/{id} mostren l'expedient sencer del peticionari | ✅ |
| Rectificació | Art. 16 GDPR | Per via missatges al cas (POST /api/claims/{id}/messages); admin pot esmenar dades durant la revisió | ✅ |
| Esborrat / dret a l'oblit | Art. 17 GDPR | Integració amb DataErasureService existent (pendent d'implementar específicament per a claims) | ⚠️ Pendent integració DataErasure |
| Limitació | Art. 18 GDPR | withdraw para temporalment el processament; admin pot deixar-ho a RESOLVED_REJECTED | ⚠️ Parcial |
| Portabilitat | Art. 20 GDPR | Exportació JSON via GET /api/users/me/data-export (existent al projecte) | ⚠️ Cal afegir claims a l'export |
| Seguretat — at-rest | Art. 32 GDPR | Storage local v1 amb permisos SO. S3+KMS plug-in deferit. Encriptació at-rest pendent quan obrim Art. 9 | ⚠️ Adequat per STANDARD; no per ART9 |
| Seguretat — audit log | Art. 32 GDPR | Taula claim_attachment_accesses registra cada DOWNLOAD/VIEW amb user, IP, UA. Endpoint admin GET /accesses per consultar | ✅ |
| Minimització | Art. 5.1.c GDPR | Storage keys opaques (UUID), sense info sensible al filesystem. Original filename només a BD | ✅ |
| Limitació de la conservació | Art. 5.1.e GDPR | Política de retenció: REJECTED → 12m; APPROVED → 7y post-revocació. Job @Scheduled automàtic (E11) | ✅ Implementat (purga automàtica) |
Edat i protecció de menors
| Obligació | Article | Com s'implementa | Estat |
|---|---|---|---|
| Edat mínima per tractament | Art. 7 LOPDGDD | Validació ≥ 18 al backend via UserProfile.dateOfBirth (config: claims.min-age-years=18) | ✅ |
| Atestació responsable | — | Checkbox versionat amb text legal vinculant al modal de claim | ✅ |
Validacions tècniques
| Aspecte | Implementació |
|---|---|
| MIME validation | Apache Tika 2.9.2 — magic bytes, no Content-Type |
| Mida màxima | 10 MB per fitxer + 12 MB per request multipart (Spring servlet config) |
| MIME types acceptats | PDF, JPEG, PNG, WebP. HEIC bloquejat (complexitat decode) |
| Path traversal | LocalStorageService.resolveSafe() valida que la key no surti del directori autoritzat |
| Checksum | SHA-256 calculat en pujar; comparable per detectar corrupció |
| Authorization download | Service-level: només case owner o admin; cada accés registrat |
Coexistència amb sistema legacy (ownership_requests)
Durant la transició (planificada fins fase E12, ~1-2 setmanes en producció):
- Endpoints legacy
/api/admin/ownership-requests/*segueixen vius ChoreographerClaimModaladmin segueix funcional- Les noves
claim_casestenenlegacy_ownership_request_idper traçabilitat - Cap dada legacy s'ha esborrat — només copiada al model nou
A E12 farem:
- Drop de
ownership_requests+ownership_request_evidences - Treure compatibility wrappers del
AdminOwnershipRequestController - Treure tab "Ownership requests (llegat)" d'
AdminConsolePage
Coses encara pendents (no compliance, però convindria)
- Implementació explícita de
DataErasureService.eraseClaimsForUser(userId) - Afegir claims a l'export
GET /api/users/me/data-export - Encriptació at-rest dels fitxers — necessari abans d'activar
ART9_SENSITIVE - Suport HEIC al MIME detector si arriba demanda real
- Refactor del
ChoreographerClaimModaladmin per usar el nou model
Referències al codi
- Schema:
backend/src/main/resources/db/migration/V93__create_claim_model.sql - Service:
backend/src/main/java/com/example/ldp/service/claim/ClaimCaseService.java - Storage:
backend/src/main/java/com/example/ldp/storage/ - Controllers:
backend/src/main/java/com/example/ldp/api/controller/{Claim,AdminClaim}Controller.java - Frontend:
frontend/src/{api,hooks,types,components,pages}/claims*ifrontend/src/components/claims/ - Pla del sprint:
.claude/plans/claims-expedients.md