diff --git a/services/domain/Big.Api/Program.cs b/services/domain/Big.Api/Program.cs index b6ee497..ac83c22 100644 --- a/services/domain/Big.Api/Program.cs +++ b/services/domain/Big.Api/Program.cs @@ -48,7 +48,12 @@ app.MapGet("/health", () => "Healthy"); // a location to read the registration's progress (ADR-0009, eventual consistency). app.MapPost("/registrations", async (SubmitRegistrationRequest body, SubmitRegistration submit, CancellationToken ct) => { - var id = await submit.HandleAsync(new SubmitRegistrationCommand(body.Bsn), ct); + // Diploma origin defaults to domestic; a foreign (eIDAS) submission passes "Buitenlands" so the + // workflow's DMN routes it through CBGV-advies (S-13). An unknown value is a bad request. + if (!Enum.TryParse(body.DiplomaOrigin, ignoreCase: true, out var origin) && body.DiplomaOrigin is not null) + return Results.BadRequest(new { error = $"Unknown diplomaOrigin '{body.DiplomaOrigin}'. Expected 'Binnenlands' or 'Buitenlands'." }); + + var id = await submit.HandleAsync(new SubmitRegistrationCommand(body.Bsn, origin), ct); return Results.Accepted($"/registrations/{id}", new RegistrationResponse(id.ToString(), RegistrationStatus.Ingediend.ToString(), null)); }); @@ -117,7 +122,7 @@ app.MapGet("/registrations/{id}", async (string id, IRegistrationStore store, Ca await app.RunAsync(); -public sealed record SubmitRegistrationRequest(string Bsn); +public sealed record SubmitRegistrationRequest(string Bsn, string? DiplomaOrigin = null); public sealed record DecideRequest(string Besluit); diff --git a/services/domain/Big.Infrastructure/FlowableWorkflowClient.cs b/services/domain/Big.Infrastructure/FlowableWorkflowClient.cs index 1d825c8..edf379c 100644 --- a/services/domain/Big.Infrastructure/FlowableWorkflowClient.cs +++ b/services/domain/Big.Infrastructure/FlowableWorkflowClient.cs @@ -24,6 +24,7 @@ public sealed class FlowableWorkflowClient(HttpClient http, FlowableOptions opti private const string BehandelaarGroup = "behandelaar"; private const string TeamleadGroup = "teamlead"; private const string RegistrationIdVariable = "registrationId"; + private const string DiplomaOriginVariable = "diplomaOrigin"; private const string ZaakUrlVariable = "zaakUrl"; private const string BesluitVariable = "besluit"; private const string IngetrokkenMessage = "RegistratieIngetrokken"; @@ -33,7 +34,10 @@ public sealed class FlowableWorkflowClient(HttpClient http, FlowableOptions opti { var request = new StartProcessRequest( ProcessDefinitionKey, - [new Variable(RegistrationIdVariable, "string", registrationId.ToString())]); + [ + new Variable(RegistrationIdVariable, "string", registrationId.ToString()), + new Variable(DiplomaOriginVariable, "string", diplomaOrigin.ToString()), + ]); var created = await PostAsync( "service/runtime/process-instances", request, ct) diff --git a/services/domain/Big.Tests/RegistrationTests.cs b/services/domain/Big.Tests/RegistrationTests.cs index 48ef524..b166831 100644 --- a/services/domain/Big.Tests/RegistrationTests.cs +++ b/services/domain/Big.Tests/RegistrationTests.cs @@ -16,6 +16,15 @@ public class RegistrationTests Assert.Null(registration.ProcessInstanceId); } + [Fact] + public void A_registration_defaults_to_a_domestic_diploma() + => Assert.Equal(DiplomaOrigin.Binnenlands, Registration.Submit("123456782").DiplomaOrigin); + + [Fact] + public void A_foreign_diploma_submission_records_its_origin() + => Assert.Equal(DiplomaOrigin.Buitenlands, + Registration.Submit("123456782", DiplomaOrigin.Buitenlands).DiplomaOrigin); + [Theory] [InlineData("")] [InlineData(" ")] diff --git a/services/domain/Big.Tests/SubmitRegistrationTests.cs b/services/domain/Big.Tests/SubmitRegistrationTests.cs index 29974bf..bdcc2df 100644 --- a/services/domain/Big.Tests/SubmitRegistrationTests.cs +++ b/services/domain/Big.Tests/SubmitRegistrationTests.cs @@ -25,6 +25,19 @@ public class SubmitRegistrationTests Assert.Equal(2, store.SaveCount); } + [Fact] + public async Task Submitting_a_foreign_diploma_carries_its_origin_to_the_process() + { + var store = new FakeRegistrationStore(); + var workflow = new FakeWorkflowClient(); + var handler = new SubmitRegistration(store, workflow); + + var id = await handler.HandleAsync(new SubmitRegistrationCommand("123456782", DiplomaOrigin.Buitenlands)); + + Assert.Equal(DiplomaOrigin.Buitenlands, (await store.GetAsync(id))!.DiplomaOrigin); + Assert.Equal(DiplomaOrigin.Buitenlands, workflow.StartedWithOrigin); + } + [Fact] public async Task Rejects_a_null_command_without_touching_the_store_or_workflow() {