From ecd7f3c0d1e29731b3bf3c0587824cbbce191126 Mon Sep 17 00:00:00 2001 From: emalfroy Date: Thu, 22 Aug 2024 10:15:34 +0200 Subject: [PATCH] feat: or-2189 laatste vertegenwoordiger mag niet verwijderd worden --- .../Resources/ExceptionMessages.Designer.cs | 9 +++++ .../Resources/ExceptionMessages.resx | 3 ++ .../Vereniging/Vereniging.cs | 2 + ...ertegenwoordigerKanNietVerwijderdWorden.cs | 16 ++++++++ .../With_One_Vertegenwoordiger.cs | 39 +++++++++++++++++++ ...streerdWithOneVertegenwoordigerScenario.cs | 34 ++++++++++++++++ 6 files changed, 103 insertions(+) create mode 100644 src/AssociationRegistry/Vereniging/Vertegenwoordigers/Exceptions/LaatsteVertegenwoordigerKanNietVerwijderdWorden.cs create mode 100644 test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_Removing_Vertegenwoordiger/CommandHandling/With_One_Vertegenwoordiger.cs create mode 100644 test/AssociationRegistry.Test.Admin.Api/Fixtures/Scenarios/CommandHandling/FeitelijkeVerenigingWerdGeregistreerdWithOneVertegenwoordigerScenario.cs diff --git a/src/AssociationRegistry/Resources/ExceptionMessages.Designer.cs b/src/AssociationRegistry/Resources/ExceptionMessages.Designer.cs index 5c149474e..c29009e1b 100644 --- a/src/AssociationRegistry/Resources/ExceptionMessages.Designer.cs +++ b/src/AssociationRegistry/Resources/ExceptionMessages.Designer.cs @@ -412,6 +412,15 @@ public static string LaatsteHoofdActiviteitKanNietVerwijderdWorden { } } + /// + /// Looks up a localized string similar to De vereniging moet minstens 1 vertegenwoordiger hebben. Je kan de laatste vertegenwoordiger niet verwijderen.. + /// + public static string LaatsteVertegenwoordigerKanNietVerwijderdWorden { + get { + return ResourceManager.GetString("LaatsteVertegenwoordigerKanNietVerwijderdWorden", resourceCulture); + } + } + /// /// Looks up a localized string similar to De maatschappelijke zetel volgens KBO kan niet verwijderd worden.. /// diff --git a/src/AssociationRegistry/Resources/ExceptionMessages.resx b/src/AssociationRegistry/Resources/ExceptionMessages.resx index 4e910f56b..4d8711231 100644 --- a/src/AssociationRegistry/Resources/ExceptionMessages.resx +++ b/src/AssociationRegistry/Resources/ExceptionMessages.resx @@ -229,4 +229,7 @@ De vereniging moet minstens 1 hoofdactiviteit hebben. Je kan de laatste hoofdactiviteit niet verwijderen. + + De vereniging moet minstens 1 vertegenwoordiger hebben. Je kan de laatste vertegenwoordiger niet verwijderen. + diff --git a/src/AssociationRegistry/Vereniging/Vereniging.cs b/src/AssociationRegistry/Vereniging/Vereniging.cs index 82d786843..17f6a074b 100644 --- a/src/AssociationRegistry/Vereniging/Vereniging.cs +++ b/src/AssociationRegistry/Vereniging/Vereniging.cs @@ -166,6 +166,8 @@ public void WijzigVertegenwoordiger( public void VerwijderVertegenwoordiger(int vertegenwoordigerId) { + Throw.If(State.Vertegenwoordigers.Count == 1); + var vertegenwoordiger = State.Vertegenwoordigers.Verwijder(vertegenwoordigerId); AddEvent(VertegenwoordigerWerdVerwijderd.With(vertegenwoordiger)); } diff --git a/src/AssociationRegistry/Vereniging/Vertegenwoordigers/Exceptions/LaatsteVertegenwoordigerKanNietVerwijderdWorden.cs b/src/AssociationRegistry/Vereniging/Vertegenwoordigers/Exceptions/LaatsteVertegenwoordigerKanNietVerwijderdWorden.cs new file mode 100644 index 000000000..16711525c --- /dev/null +++ b/src/AssociationRegistry/Vereniging/Vertegenwoordigers/Exceptions/LaatsteVertegenwoordigerKanNietVerwijderdWorden.cs @@ -0,0 +1,16 @@ +namespace AssociationRegistry.Vereniging.Exceptions; + +using Be.Vlaanderen.Basisregisters.AggregateSource; +using System.Runtime.Serialization; + +[Serializable] +public class LaatsteVertegenwoordigerKanNietVerwijderdWorden : DomainException +{ + public LaatsteVertegenwoordigerKanNietVerwijderdWorden() : base(ExceptionMessages.LaatsteVertegenwoordigerKanNietVerwijderdWorden) + { + } + + protected LaatsteVertegenwoordigerKanNietVerwijderdWorden(SerializationInfo info, StreamingContext context) : base(info, context) + { + } +} diff --git a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_Removing_Vertegenwoordiger/CommandHandling/With_One_Vertegenwoordiger.cs b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_Removing_Vertegenwoordiger/CommandHandling/With_One_Vertegenwoordiger.cs new file mode 100644 index 000000000..cd271a6bc --- /dev/null +++ b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_Removing_Vertegenwoordiger/CommandHandling/With_One_Vertegenwoordiger.cs @@ -0,0 +1,39 @@ +namespace AssociationRegistry.Test.Admin.Api.FeitelijkeVereniging.When_Removing_Vertegenwoordiger.CommandHandling; + +using Acties.VerwijderVertegenwoordiger; +using AssociationRegistry.Framework; +using AutoFixture; +using Fakes; +using Fixtures.Scenarios.CommandHandling; +using Framework; +using Vereniging; +using Vereniging.Exceptions; +using Xunit; +using Xunit.Categories; + +[UnitTest] +public class With_One_Vertegenwoordiger +{ + private readonly VerenigingRepositoryMock _verenigingRepositoryMock; + private readonly FeitelijkeVerenigingWerdGeregistreerdWithOneVertegenwoordigerScenario _scenario; + private readonly Fixture _fixture; + + public With_One_Vertegenwoordiger() + { + _scenario = new FeitelijkeVerenigingWerdGeregistreerdWithOneVertegenwoordigerScenario(); + _verenigingRepositoryMock = new VerenigingRepositoryMock(_scenario.GetVerenigingState()); + _fixture = new Fixture().CustomizeAdminApi(); + } + + [Fact] + public async Task Then_Throws_LaatsteVertegenwoordigerKanNietVerwijderdWordenException() + { + var command = new VerwijderVertegenwoordigerCommand(_scenario.VCode, _scenario.VertegenwoordigerId); + var commandMetadata = _fixture.Create(); + var commandHandler = new VerwijderVertegenwoordigerCommandHandler(_verenigingRepositoryMock); + await Assert.ThrowsAsync(async () => await commandHandler.Handle( + new CommandEnvelope( + command, commandMetadata), + CancellationToken.None)); + } +} diff --git a/test/AssociationRegistry.Test.Admin.Api/Fixtures/Scenarios/CommandHandling/FeitelijkeVerenigingWerdGeregistreerdWithOneVertegenwoordigerScenario.cs b/test/AssociationRegistry.Test.Admin.Api/Fixtures/Scenarios/CommandHandling/FeitelijkeVerenigingWerdGeregistreerdWithOneVertegenwoordigerScenario.cs new file mode 100644 index 000000000..166439319 --- /dev/null +++ b/test/AssociationRegistry.Test.Admin.Api/Fixtures/Scenarios/CommandHandling/FeitelijkeVerenigingWerdGeregistreerdWithOneVertegenwoordigerScenario.cs @@ -0,0 +1,34 @@ +namespace AssociationRegistry.Test.Admin.Api.Fixtures.Scenarios.CommandHandling; + +using AssociationRegistry.Framework; +using AutoFixture; +using Events; +using Framework; +using Vereniging; + +public class FeitelijkeVerenigingWerdGeregistreerdWithOneVertegenwoordigerScenario : CommandhandlerScenarioBase +{ + public FeitelijkeVerenigingWerdGeregistreerdWithOneVertegenwoordigerScenario() + { + var fixture = new Fixture().CustomizeAdminApi(); + VCode = fixture.Create(); + FeitelijkeVerenigingWerdGeregistreerd = fixture.Create() with + { + VCode = VCode, + Vertegenwoordigers = new []{fixture.Create()} + }; + + VertegenwoordigerId = FeitelijkeVerenigingWerdGeregistreerd.Vertegenwoordigers.First().VertegenwoordigerId; + } + + public override VCode VCode { get; } + public FeitelijkeVerenigingWerdGeregistreerd FeitelijkeVerenigingWerdGeregistreerd { get; } + public int VertegenwoordigerId { get; } + public override IEnumerable Events() + { + return new IEvent[] + { + FeitelijkeVerenigingWerdGeregistreerd, + }; + } +}