Skip to main content

Matriu de compliance — Claims Module

Estat: 2026-04-29. Vegeu el doc públic per al ciutadà a Reclamacions i Expedients.

GDPR / LOPDGDD

ObligacióArticleCom s'implementaEstat
Base legal — interès legítimArt. 6.1.f GDPRModeració + verificació ownership documentada al doc públic
Base legal — consentimentArt. 6.1.a GDPRAtestació versionada (claims.attestation-version=D3-v1-ca) acceptada al claim
Categories especialsArt. 9 GDPRCamp data_classification al model. Només STANDARD v1; ART9_SENSITIVE bloquejat per UI + missatge explícit al peticionari⚠️ Preparat, no actiu
Informació al titularArt. 13 GDPRDoc públic /docs/legal/claims-and-expedients enllaçat des del modal de claim
Accés del titularArt. 15 GDPRGET /api/claims/me + /me/submissions/{id} mostren l'expedient sencer del peticionari
RectificacióArt. 16 GDPRPer via missatges al cas (POST /api/claims/{id}/messages); admin pot esmenar dades durant la revisió
Esborrat / dret a l'oblitArt. 17 GDPRIntegració amb DataErasureService existent (pendent d'implementar específicament per a claims)⚠️ Pendent integració DataErasure
LimitacióArt. 18 GDPRwithdraw para temporalment el processament; admin pot deixar-ho a RESOLVED_REJECTED⚠️ Parcial
PortabilitatArt. 20 GDPRExportació JSON via GET /api/users/me/data-export (existent al projecte)⚠️ Cal afegir claims a l'export
Seguretat — at-restArt. 32 GDPRStorage 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 logArt. 32 GDPRTaula claim_attachment_accesses registra cada DOWNLOAD/VIEW amb user, IP, UA. Endpoint admin GET /accesses per consultar
MinimitzacióArt. 5.1.c GDPRStorage keys opaques (UUID), sense info sensible al filesystem. Original filename només a BD
Limitació de la conservacióArt. 5.1.e GDPRPolítica de retenció: REJECTED → 12m; APPROVED → 7y post-revocació. Job @Scheduled automàtic (E11)✅ Implementat (purga automàtica)

Edat i protecció de menors

ObligacióArticleCom s'implementaEstat
Edat mínima per tractamentArt. 7 LOPDGDDValidació ≥ 18 al backend via UserProfile.dateOfBirth (config: claims.min-age-years=18)
Atestació responsableCheckbox versionat amb text legal vinculant al modal de claim

Validacions tècniques

AspecteImplementació
MIME validationApache Tika 2.9.2 — magic bytes, no Content-Type
Mida màxima10 MB per fitxer + 12 MB per request multipart (Spring servlet config)
MIME types acceptatsPDF, JPEG, PNG, WebP. HEIC bloquejat (complexitat decode)
Path traversalLocalStorageService.resolveSafe() valida que la key no surti del directori autoritzat
ChecksumSHA-256 calculat en pujar; comparable per detectar corrupció
Authorization downloadService-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
  • ChoreographerClaimModal admin segueix funcional
  • Les noves claim_cases tenen legacy_ownership_request_id per 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 ChoreographerClaimModal admin 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* i frontend/src/components/claims/
  • Pla del sprint: .claude/plans/claims-expedients.md