From 94d5feb6e0e471d8527d613ce0aa2b511231017f Mon Sep 17 00:00:00 2001 From: Niek Otten Date: Wed, 15 Jul 2026 11:57:16 +0200 Subject: [PATCH] feat(domain): the beoordeling decision completes the Flowable Beoordelen task (refs #13) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After applying the decision, BeoordeelRegistratie finds the open Beoordelen task for the registration and completes it with the besluit so the workflow advances (ADR-0013). No open task → the decision still stands (completes nothing). DI already provides IUserTaskClient (S-12b). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../Big.Application/BeoordeelRegistratie.cs | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/services/domain/Big.Application/BeoordeelRegistratie.cs b/services/domain/Big.Application/BeoordeelRegistratie.cs index f0a384f..8ba8e3f 100644 --- a/services/domain/Big.Application/BeoordeelRegistratie.cs +++ b/services/domain/Big.Application/BeoordeelRegistratie.cs @@ -20,10 +20,12 @@ public sealed record BeoordeelRegistratieCommand(RegistrationId RegistrationId, /// sets the zaak's final status via the ACL (§8.1) and /// advances the aggregate to INGESCHREVEN; advances it to /// AFGEWEZEN in the domain (propagating a rejection to the zaak, so the openbaar projection reflects -/// it, is a later sub-slice of S-12). Both decisions are idempotent — a repeated or redelivered -/// decision that matches the current terminal state is a no-op, so the ACL is not called twice. +/// it, is a later sub-slice of S-12). After applying the decision it completes the Flowable +/// Beoordelen task (found by registrationId) so the workflow advances (ADR-0013). Both +/// decisions are idempotent — a repeated or redelivered decision that matches the current terminal +/// state is a no-op, so the ACL is not called and the task not completed twice. /// -public sealed class BeoordeelRegistratie(IRegistrationStore store, IAclClient acl) +public sealed class BeoordeelRegistratie(IRegistrationStore store, IAclClient acl, IUserTaskClient tasks) { public async Task HandleAsync(BeoordeelRegistratieCommand command, CancellationToken ct = default) { @@ -53,5 +55,17 @@ public sealed class BeoordeelRegistratie(IRegistrationStore store, IAclClient ac } await store.SaveAsync(registration, ct); + await CompleteWorkflowTaskAsync(command.RegistrationId, command.Besluit, ct); + } + + // Advance the workflow: complete the open Beoordelen task for this registration. If none is open + // (already completed, or the process hasn't parked yet) the decision still stands — we complete + // nothing rather than fail. + private async Task CompleteWorkflowTaskAsync(RegistrationId registrationId, BeoordelingsBesluit besluit, CancellationToken ct) + { + var open = await tasks.GetOpenBeoordelingenAsync(ct); + var task = open.FirstOrDefault(t => t.RegistrationId == registrationId); + if (task is not null) + await tasks.CompleteBeoordelingAsync(task.TaskId, besluit, ct); } }