Audit-trail-misattributie: webhook-acties toegewezen aan eerste admin alfabetisch #97

Closed
opened 2026-05-26 18:23:31 +00:00 by jesse-a · 1 comment
Owner

Severity: MEDIUM (audit-integriteit)

DocuSeal-webhook-handler en auto-finalize gebruikten prisma.user.findFirst({where:{role:'ADMIN'}}) — dat geeft alfabetisch de eerste admin terug. In een VOF met "J. van Mullem" en "G.A. van Mullem" werd ALLES toegekend aan G.A., ongeacht wie het écht had gedaan. Audit-trail dus onbetrouwbaar voor accountability/compliance.

Fix:

  1. Quote.createdById + Contract.createdById toegevoegd aan schema. Wordt gezet bij create-actions.
  2. Nieuwe helper resolveQuoteAuditor() / resolveContractAuditor() in src/lib/quote-auditor.ts met 3-laagse fallback: entity.createdById → laatste AuditLog op de entity → eerste actieve admin.
  3. finalizeAcceptedQuote, DocuSeal-webhook (beide Quote + Contract), publieke acceptQuoteByToken en rejectQuoteByToken gebruiken nu de helper.

Files: prisma/schema.prisma, src/lib/quote-auditor.ts, src/lib/quote-finalize.ts, src/app/actions/quotes.ts, src/app/actions/contracts.ts, src/app/api/webhooks/docuseal/route.ts

**Severity: MEDIUM** (audit-integriteit) DocuSeal-webhook-handler en auto-finalize gebruikten `prisma.user.findFirst({where:{role:'ADMIN'}})` — dat geeft alfabetisch de eerste admin terug. In een VOF met "J. van Mullem" en "G.A. van Mullem" werd ALLES toegekend aan G.A., ongeacht wie het écht had gedaan. Audit-trail dus onbetrouwbaar voor accountability/compliance. **Fix**: 1. `Quote.createdById` + `Contract.createdById` toegevoegd aan schema. Wordt gezet bij create-actions. 2. Nieuwe helper `resolveQuoteAuditor()` / `resolveContractAuditor()` in `src/lib/quote-auditor.ts` met 3-laagse fallback: entity.createdById → laatste AuditLog op de entity → eerste actieve admin. 3. `finalizeAcceptedQuote`, DocuSeal-webhook (beide Quote + Contract), publieke `acceptQuoteByToken` en `rejectQuoteByToken` gebruiken nu de helper. **Files**: prisma/schema.prisma, src/lib/quote-auditor.ts, src/lib/quote-finalize.ts, src/app/actions/quotes.ts, src/app/actions/contracts.ts, src/app/api/webhooks/docuseal/route.ts
Author
Owner

Opgelost in commit a39e777.

Opgelost in commit a39e777.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
jesse-a/OpenCRM#97
No description provided.