diff --git a/src/AssociationRegistry.Admin.ProjectionHost/Projections/PowerBiExport/PowerBiExportProjection.cs b/src/AssociationRegistry.Admin.ProjectionHost/Projections/PowerBiExport/PowerBiExportProjection.cs index 5b33fa610..81b958b41 100644 --- a/src/AssociationRegistry.Admin.ProjectionHost/Projections/PowerBiExport/PowerBiExportProjection.cs +++ b/src/AssociationRegistry.Admin.ProjectionHost/Projections/PowerBiExport/PowerBiExportProjection.cs @@ -17,6 +17,7 @@ namespace AssociationRegistry.Admin.ProjectionHost.Projections.PowerBiExport; using HoofdactiviteitVerenigingsloket = Schema.PowerBiExport.HoofdactiviteitVerenigingsloket; using IEvent = Marten.Events.IEvent; using Locatie = Schema.Detail.Locatie; +using Werkingsgebied = Schema.PowerBiExport.Werkingsgebied; public class PowerBiExportProjection : SingleStreamProjection { @@ -57,8 +58,17 @@ public PowerBiExportDocument Create(IEvent new Werkingsgebied() + { + Code = x.Code, + Naam = x.Naam, + }) + .ToArray() ?? [], Bron = feitelijkeVerenigingWerdGeregistreerd.Data.Bron, - DatumLaatsteAanpassing = feitelijkeVerenigingWerdGeregistreerd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(), + DatumLaatsteAanpassing = feitelijkeVerenigingWerdGeregistreerd.GetHeaderInstant(MetadataHeaderNames.Tijdstip) + .ConvertAndFormatToBelgianDate(), }; UpdateHistoriek(document, feitelijkeVerenigingWerdGeregistreerd); @@ -96,6 +106,7 @@ public PowerBiExportDocument Create( Contactgegevens = Array.Empty(), Locaties = Array.Empty(), HoofdactiviteitenVerenigingsloket = Array.Empty(), + Werkingsgebieden = Array.Empty(), Bron = verenigingMetRechtspersoonlijkheidWerdGeregistreerd.Data.Bron, KboNummer = verenigingMetRechtspersoonlijkheidWerdGeregistreerd.Data.KboNummer, DatumLaatsteAanpassing = verenigingMetRechtspersoonlijkheidWerdGeregistreerd.GetHeaderInstant(MetadataHeaderNames.Tijdstip) @@ -117,21 +128,30 @@ public void Apply(IEvent naamWerdGewijzigd, PowerBiExportDocu public void Apply(IEvent korteNaamWerdGewijzigd, PowerBiExportDocument document) { document.KorteNaam = korteNaamWerdGewijzigd.Data.KorteNaam; - document.DatumLaatsteAanpassing = korteNaamWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + + document.DatumLaatsteAanpassing = + korteNaamWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, korteNaamWerdGewijzigd); } public void Apply(IEvent roepnaamWerdGewijzigd, PowerBiExportDocument document) { document.Roepnaam = roepnaamWerdGewijzigd.Data.Roepnaam; - document.DatumLaatsteAanpassing = roepnaamWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + + document.DatumLaatsteAanpassing = + roepnaamWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, roepnaamWerdGewijzigd); } public void Apply(IEvent korteBeschrijvingWerdGewijzigd, PowerBiExportDocument document) { document.KorteBeschrijving = korteBeschrijvingWerdGewijzigd.Data.KorteBeschrijving; - document.DatumLaatsteAanpassing = korteBeschrijvingWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + + document.DatumLaatsteAanpassing = korteBeschrijvingWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip) + .ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, korteBeschrijvingWerdGewijzigd); } @@ -141,7 +161,9 @@ public void Apply(IEvent startdatumWerdGewijzigd, Power ? startdatumWerdGewijzigd.Data.Startdatum?.ToString(WellknownFormats.DateOnly) : null; - document.DatumLaatsteAanpassing = startdatumWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = + startdatumWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, startdatumWerdGewijzigd); } @@ -151,7 +173,9 @@ public void Apply(IEvent startdatumWerdGewijzigdIn ? startdatumWerdGewijzigdInKbo.Data.Startdatum?.ToString(WellknownFormats.DateOnly) : null; - document.DatumLaatsteAanpassing = startdatumWerdGewijzigdInKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = + startdatumWerdGewijzigdInKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, startdatumWerdGewijzigdInKbo); } @@ -164,7 +188,9 @@ public void Apply(IEvent doelgroepWerdGewijzigd, PowerBi Maximumleeftijd = doelgroepWerdGewijzigd.Data.Doelgroep.Maximumleeftijd, }; - document.DatumLaatsteAanpassing = doelgroepWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = + doelgroepWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, doelgroepWerdGewijzigd); } @@ -185,7 +211,9 @@ public void Apply(IEvent contactgegevenWerdToegevo .OrderBy(c => c.ContactgegevenId) .ToArray(); - document.DatumLaatsteAanpassing = contactgegevenWerdToegevoegd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = + contactgegevenWerdToegevoegd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, contactgegevenWerdToegevoegd); } @@ -203,7 +231,9 @@ public void Apply(IEvent contactgegevenWerdGewijzig .OrderBy(c => c.ContactgegevenId) .ToArray(); - document.DatumLaatsteAanpassing = contactgegevenWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = + contactgegevenWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, contactgegevenWerdGewijzigd); } @@ -215,7 +245,9 @@ public void Apply(IEvent contactgegevenWerdVerwijd .OrderBy(c => c.ContactgegevenId) .ToArray(); - document.DatumLaatsteAanpassing = contactgegevenWerdVerwijderd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = + contactgegevenWerdVerwijderd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, contactgegevenWerdVerwijderd); } @@ -241,7 +273,10 @@ public void Apply( PowerBiExportDocument document) { ++document.AantalVertegenwoordigers; - document.DatumLaatsteAanpassing = vertegenwoordigerWerdToegevoegd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + + document.DatumLaatsteAanpassing = vertegenwoordigerWerdToegevoegd.GetHeaderInstant(MetadataHeaderNames.Tijdstip) + .ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, vertegenwoordigerWerdToegevoegd); } @@ -250,7 +285,10 @@ public void Apply( PowerBiExportDocument document) { --document.AantalVertegenwoordigers; - document.DatumLaatsteAanpassing = vertegenwoordigerWerdVerwijderd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + + document.DatumLaatsteAanpassing = vertegenwoordigerWerdVerwijderd.GetHeaderInstant(MetadataHeaderNames.Tijdstip) + .ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, vertegenwoordigerWerdVerwijderd); } @@ -286,7 +324,9 @@ public void Apply(IEvent locatieWerdToegevoegd, PowerBiEx .OrderBy(l => l.LocatieId) .ToArray(); - document.DatumLaatsteAanpassing = locatieWerdToegevoegd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = + locatieWerdToegevoegd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, locatieWerdToegevoegd); } @@ -311,7 +351,9 @@ public void Apply(IEvent locatieWerdGewijzigd, PowerBiExpo .OrderBy(l => l.LocatieId) .ToArray(); - document.DatumLaatsteAanpassing = locatieWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = + locatieWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, locatieWerdGewijzigd); } @@ -322,7 +364,9 @@ public void Apply(IEvent locatieWerdVerwijderd, PowerBiEx .OrderBy(l => l.LocatieId) .ToArray(); - document.DatumLaatsteAanpassing = locatieWerdVerwijderd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = + locatieWerdVerwijderd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, locatieWerdVerwijderd); } @@ -382,7 +426,9 @@ public void Apply( .OrderBy(c => c.ContactgegevenId) .ToArray(); - document.DatumLaatsteAanpassing = contactgegevenWerdToegevoegd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = + contactgegevenWerdToegevoegd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, contactgegevenWerdToegevoegd); } @@ -401,7 +447,9 @@ public void Apply( ).OrderBy(c => c.ContactgegevenId) .ToArray(); - document.DatumLaatsteAanpassing = contactgegevenUitKboWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = contactgegevenUitKboWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip) + .ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, contactgegevenUitKboWerdGewijzigd); } @@ -409,7 +457,10 @@ public void Apply(IEvent verenigingWerdGestopt, PowerBiEx { document.Status = VerenigingStatus.Gestopt; document.Einddatum = verenigingWerdGestopt.Data.Einddatum.ToString(WellknownFormats.DateOnly); - document.DatumLaatsteAanpassing = verenigingWerdGestopt.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + + document.DatumLaatsteAanpassing = + verenigingWerdGestopt.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, verenigingWerdGestopt); } @@ -417,14 +468,20 @@ public void Apply(IEvent verenigingWerdGestoptInKbo, { document.Status = VerenigingStatus.Gestopt; document.Einddatum = verenigingWerdGestoptInKbo.Data.Einddatum.ToString(WellknownFormats.DateOnly); - document.DatumLaatsteAanpassing = verenigingWerdGestoptInKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + + document.DatumLaatsteAanpassing = + verenigingWerdGestoptInKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, verenigingWerdGestoptInKbo); } public void Apply(IEvent einddatumWerdGewijzigd, PowerBiExportDocument document) { document.Einddatum = einddatumWerdGewijzigd.Data.Einddatum.ToString(WellknownFormats.DateOnly); - document.DatumLaatsteAanpassing = einddatumWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + + document.DatumLaatsteAanpassing = + einddatumWerdGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, einddatumWerdGewijzigd); } @@ -443,14 +500,20 @@ public void Apply( public void Apply(IEvent naamWerdGewijzigdInKbo, PowerBiExportDocument document) { document.Naam = naamWerdGewijzigdInKbo.Data.Naam; - document.DatumLaatsteAanpassing = naamWerdGewijzigdInKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + + document.DatumLaatsteAanpassing = + naamWerdGewijzigdInKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, naamWerdGewijzigdInKbo); } public void Apply(IEvent korteNaamWerdGewijzigdInKbo, PowerBiExportDocument document) { document.KorteNaam = korteNaamWerdGewijzigdInKbo.Data.KorteNaam; - document.DatumLaatsteAanpassing = korteNaamWerdGewijzigdInKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + + document.DatumLaatsteAanpassing = + korteNaamWerdGewijzigdInKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, korteNaamWerdGewijzigdInKbo); } @@ -468,7 +531,9 @@ public void Apply( ).OrderBy(c => c.ContactgegevenId) .ToArray(); - document.DatumLaatsteAanpassing = contactgegevenWerdGewijzigdUitKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = contactgegevenWerdGewijzigdUitKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip) + .ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, contactgegevenWerdGewijzigdUitKbo); } @@ -482,7 +547,9 @@ public void Apply( .OrderBy(c => c.ContactgegevenId) .ToArray(); - document.DatumLaatsteAanpassing = contactgegevenWerdVerwijderdUitKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = contactgegevenWerdVerwijderdUitKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip) + .ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, contactgegevenWerdVerwijderdUitKbo); } @@ -615,7 +682,10 @@ public void Apply(IEvent rechtsvormWerdGewijzigdIn }; document.Rechtsvorm = rechtsvormWerdGewijzigdInKbo.Data.Rechtsvorm; - document.DatumLaatsteAanpassing = rechtsvormWerdGewijzigdInKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + + document.DatumLaatsteAanpassing = + rechtsvormWerdGewijzigdInKbo.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, rechtsvormWerdGewijzigdInKbo); } @@ -655,7 +725,9 @@ public void Apply( .OrderBy(l => l.LocatieId) .ToArray(); - document.DatumLaatsteAanpassing = adresNietUniekInAdressenregister.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + document.DatumLaatsteAanpassing = adresNietUniekInAdressenregister.GetHeaderInstant(MetadataHeaderNames.Tijdstip) + .ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, adresNietUniekInAdressenregister); } @@ -721,7 +793,27 @@ public void Apply( PowerBiExportDocument document) { document.Status = StatusVerwijderd; - document.DatumLaatsteAanpassing = verenigingWerdVerwijderd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + + document.DatumLaatsteAanpassing = + verenigingWerdVerwijderd.GetHeaderInstant(MetadataHeaderNames.Tijdstip).ConvertAndFormatToBelgianDate(); + UpdateHistoriek(document, verenigingWerdVerwijderd); } + + public void Apply( + IEvent werkingsgebiedenWerdenGewijzigd, + PowerBiExportDocument document) + { + document.Werkingsgebieden = werkingsgebiedenWerdenGewijzigd.Data.Werkingsgebieden + .Select(x => new Werkingsgebied() + { + Code = x.Code, + Naam = x.Naam, + }).ToArray(); + + document.DatumLaatsteAanpassing = werkingsgebiedenWerdenGewijzigd.GetHeaderInstant(MetadataHeaderNames.Tijdstip) + .ConvertAndFormatToBelgianDate(); + + UpdateHistoriek(document, werkingsgebiedenWerdenGewijzigd); + } } diff --git a/src/AssociationRegistry.Admin.Schema/PowerBiExport/PowerBiExportDocument.cs b/src/AssociationRegistry.Admin.Schema/PowerBiExport/PowerBiExportDocument.cs index 7344e808c..56d55cfd2 100644 --- a/src/AssociationRegistry.Admin.Schema/PowerBiExport/PowerBiExportDocument.cs +++ b/src/AssociationRegistry.Admin.Schema/PowerBiExport/PowerBiExportDocument.cs @@ -24,6 +24,9 @@ public record PowerBiExportDocument : IVCode public HoofdactiviteitVerenigingsloket[] HoofdactiviteitenVerenigingsloket { get; set; } = Array.Empty(); + public Werkingsgebied[] Werkingsgebieden { get; set; } = + Array.Empty(); + public bool IsUitgeschrevenUitPubliekeDatastroom { get; set; } public string Bron { get; set; } = null!; [Identity] public string VCode { get; init; } = null!; diff --git a/src/AssociationRegistry.Admin.Schema/PowerBiExport/Werkingsgebied.cs b/src/AssociationRegistry.Admin.Schema/PowerBiExport/Werkingsgebied.cs new file mode 100644 index 000000000..a12eec3d1 --- /dev/null +++ b/src/AssociationRegistry.Admin.Schema/PowerBiExport/Werkingsgebied.cs @@ -0,0 +1,7 @@ +namespace AssociationRegistry.Admin.Schema.PowerBiExport; + +public record Werkingsgebied +{ + public string Code { get; init; } = null!; + public string Naam { get; init; } = null!; +} diff --git a/src/AssociationRegistry.PowerBi.ExportHost/Program.cs b/src/AssociationRegistry.PowerBi.ExportHost/Program.cs index 1e6107555..e6d12470c 100644 --- a/src/AssociationRegistry.PowerBi.ExportHost/Program.cs +++ b/src/AssociationRegistry.PowerBi.ExportHost/Program.cs @@ -64,6 +64,7 @@ private static void ConfigureServices(HostBuilderContext context, IServiceCollec new Exporter(WellKnownFileNames.Basisgegevens, powerBiExportOptions.BucketName, new BasisgegevensRecordWriter(), sp.GetRequiredService(), sp.GetRequiredService>()), new Exporter(WellKnownFileNames.Contactgegevens, powerBiExportOptions.BucketName, new ContactgegevensRecordWriter(), sp.GetRequiredService(), sp.GetRequiredService>()), new Exporter(WellKnownFileNames.Hoofdactiviteiten, powerBiExportOptions.BucketName, new HoofdactiviteitenRecordWriter(), sp.GetRequiredService(), sp.GetRequiredService>()), + new Exporter(WellKnownFileNames.Werkingsgebieden, powerBiExportOptions.BucketName, new WerkingsgebiedenRecordWriter(), sp.GetRequiredService(), sp.GetRequiredService>()), new Exporter(WellKnownFileNames.Locaties, powerBiExportOptions.BucketName, new LocatiesRecordWriter(), sp.GetRequiredService(), sp.GetRequiredService>()), new Exporter(WellKnownFileNames.Historiek, powerBiExportOptions.BucketName, new HistoriekRecordWriter(), sp.GetRequiredService(), sp.GetRequiredService>()), }); diff --git a/src/AssociationRegistry.PowerBi.ExportHost/Records/WerkingsgebiedenRecord.cs b/src/AssociationRegistry.PowerBi.ExportHost/Records/WerkingsgebiedenRecord.cs new file mode 100644 index 000000000..0ba0b0ddc --- /dev/null +++ b/src/AssociationRegistry.PowerBi.ExportHost/Records/WerkingsgebiedenRecord.cs @@ -0,0 +1,8 @@ +namespace AssociationRegistry.PowerBi.ExportHost.Records; + +using CsvHelper.Configuration.Attributes; + +public record WerkingsgebiedenRecord( + [property: Name("code"), Index(0)] string Code, + [property: Name("naam"), Index(1)] string Naam, + [property: Name("vcode"), Index(2)] string VCode); diff --git a/src/AssociationRegistry.PowerBi.ExportHost/WellKnownFileNames.cs b/src/AssociationRegistry.PowerBi.ExportHost/WellKnownFileNames.cs index 9e483ac27..67d659b51 100644 --- a/src/AssociationRegistry.PowerBi.ExportHost/WellKnownFileNames.cs +++ b/src/AssociationRegistry.PowerBi.ExportHost/WellKnownFileNames.cs @@ -7,4 +7,5 @@ public class WellKnownFileNames public const string Locaties = "Locaties.csv"; public const string Contactgegevens = "Contactgegevens.csv"; public const string Historiek = "Historiek.csv"; + public const string Werkingsgebieden = "Werkingsgebieden.csv"; } diff --git a/src/AssociationRegistry.PowerBi.ExportHost/Writers/WerkingsgebiedenRecordWriter.cs b/src/AssociationRegistry.PowerBi.ExportHost/Writers/WerkingsgebiedenRecordWriter.cs new file mode 100644 index 000000000..9d3e39e70 --- /dev/null +++ b/src/AssociationRegistry.PowerBi.ExportHost/Writers/WerkingsgebiedenRecordWriter.cs @@ -0,0 +1,26 @@ +namespace AssociationRegistry.PowerBi.ExportHost.Writers; + +using Admin.Schema.PowerBiExport; +using Records; +using CsvHelper; + +public class WerkingsgebiedenRecordWriter : IRecordWriter +{ + public async Task Write(IEnumerable docs, IWriter csvWriter) + { + csvWriter.WriteHeader(); + await csvWriter.NextRecordAsync(); + + foreach (var vereniging in docs) + { + foreach (var werkgebied in vereniging.Werkingsgebieden) + { + csvWriter.WriteRecord(new WerkingsgebiedenRecord( + werkgebied.Code, werkgebied.Naam, + vereniging.VCode)); + + await csvWriter.NextRecordAsync(); + } + } + } +} diff --git a/test/AssociationRegistry.Test.Admin.Api/Projections/V2/PowerBiExport/Given_FeitelijkeVerenigingWerdGeregistreerd.cs b/test/AssociationRegistry.Test.Admin.Api/Projections/V2/PowerBiExport/Given_FeitelijkeVerenigingWerdGeregistreerd.cs index bc3ce7d92..9fa71c2e2 100644 --- a/test/AssociationRegistry.Test.Admin.Api/Projections/V2/PowerBiExport/Given_FeitelijkeVerenigingWerdGeregistreerd.cs +++ b/test/AssociationRegistry.Test.Admin.Api/Projections/V2/PowerBiExport/Given_FeitelijkeVerenigingWerdGeregistreerd.cs @@ -62,6 +62,31 @@ await documentSession powerBiExportDocument.HoofdactiviteitenVerenigingsloket.ShouldCompare(expectedHoofdactiviteiten); } + [Fact] + public async Task ARecordIsStored_With_Werkingsgebieden() + { + await using var documentSession = _context + .Session; + + var powerBiExportDocument = + await documentSession + .Query() + .SingleAsync(x => x.VCode == _scenario.VerenigingWerdGeregistreerd.VCode); + + var expectedHoofdactiviteiten = + _scenario + .VerenigingWerdGeregistreerd + .Werkingsgebieden! + .Select(x => new Werkingsgebied() + { + Naam = x.Naam, + Code = x.Code, + }) + .ToArray(); + + powerBiExportDocument.Werkingsgebieden.ShouldCompare(expectedHoofdactiviteiten); + } + [Fact] public async Task ARecordIsStored_With_Historiek() { diff --git a/test/AssociationRegistry.Test.Admin.Api/Projections/V2/PowerBiExport/Given_WerkingsgebiedenWerdenGewijzigd.cs b/test/AssociationRegistry.Test.Admin.Api/Projections/V2/PowerBiExport/Given_WerkingsgebiedenWerdenGewijzigd.cs new file mode 100644 index 000000000..3d4a8e08d --- /dev/null +++ b/test/AssociationRegistry.Test.Admin.Api/Projections/V2/PowerBiExport/Given_WerkingsgebiedenWerdenGewijzigd.cs @@ -0,0 +1,67 @@ +namespace AssociationRegistry.Test.Admin.Api.Projections.V2.PowerBiExport; + +using AssociationRegistry.Admin.Schema.PowerBiExport; +using FluentAssertions; +using KellermanSoftware.CompareNetObjects; +using Marten; +using Projections.PowerBiExport; +using ScenarioClassFixtures; +using Xunit; + +[Collection(nameof(PowerBiExportContext))] +public class Given_WerkingsgebiedenWerdenGewijzigd : IClassFixture +{ + private readonly PowerBiExportContext _context; + private readonly WerkingsgebiedenWerdenGewijzigdScenario _scenario; + + public Given_WerkingsgebiedenWerdenGewijzigd( + PowerBiExportContext context, + WerkingsgebiedenWerdenGewijzigdScenario scenario) + { + _context = context; + _scenario = scenario; + } + + [Fact] + public async Task ARecordIsStored_With_Hoofdactiviteiten() + { + await using var documentSession = _context + .Session; + + var powerBiExportDocument = + await documentSession + .Query() + .Where(w => w.VCode == _scenario.VerenigingWerdGeregistreerd.VCode) + .SingleAsync(); + + var expectedHoofdactiviteiten = + _scenario + .WerkingsgebiedenWerdenGewijzigd + .Werkingsgebieden + .Select(x => new Werkingsgebied() + { + Naam = x.Naam, + Code = x.Code, + }) + .ToArray(); + + powerBiExportDocument.Werkingsgebieden.ShouldCompare(expectedHoofdactiviteiten); + } + + [Fact] + public async Task ARecordIsStored_With_Historiek() + { + await using var documentSession = _context + .Session; + + var powerBiExportDocument = + await documentSession + .Query() + .SingleAsync(w => w.VCode == _scenario.VerenigingWerdGeregistreerd.VCode); + + powerBiExportDocument.VCode.Should().Be(_scenario.VerenigingWerdGeregistreerd.VCode); + powerBiExportDocument.Historiek.Should().NotBeEmpty(); + powerBiExportDocument.Historiek.Should() + .ContainSingle(x => x.EventType == "WerkingsgebiedenWerdenGewijzigd"); + } +} diff --git a/test/AssociationRegistry.Test.Admin.Api/Projections/V2/PowerBiExport/ScenarioClassFixtures/WerkingsgebiedenWerdenGewijzigdScenario.cs b/test/AssociationRegistry.Test.Admin.Api/Projections/V2/PowerBiExport/ScenarioClassFixtures/WerkingsgebiedenWerdenGewijzigdScenario.cs new file mode 100644 index 000000000..864a76f8a --- /dev/null +++ b/test/AssociationRegistry.Test.Admin.Api/Projections/V2/PowerBiExport/ScenarioClassFixtures/WerkingsgebiedenWerdenGewijzigdScenario.cs @@ -0,0 +1,36 @@ +namespace AssociationRegistry.Test.Admin.Api.Projections.V2.PowerBiExport.ScenarioClassFixtures; + +using AssociationRegistry.Events; +using AssociationRegistry.Test.Admin.Api.Projections.V2.PowerBiExport; +using AutoFixture; +using Projections.PowerBiExport; + +public class WerkingsgebiedenWerdenGewijzigdScenario : ProjectionScenarioFixture +{ + public FeitelijkeVerenigingWerdGeregistreerd VerenigingWerdGeregistreerd { get; } + public WerkingsgebiedenWerdenGewijzigd WerkingsgebiedenWerdenGewijzigd { get; set; } + + public WerkingsgebiedenWerdenGewijzigdScenario(PowerBiExportContext context): base(context) + { + VerenigingWerdGeregistreerd = AutoFixture.Create(); + + WerkingsgebiedenWerdenGewijzigd = AutoFixture.Create(); + } + + public override async Task Given() + { + await using var session = await Context.DocumentSession(); + + session.Events.Append(VerenigingWerdGeregistreerd.VCode, + VerenigingWerdGeregistreerd); + await session.SaveChangesAsync(); + await using var session2 = await Context.DocumentSession(); + + session2.Events.Append(VerenigingWerdGeregistreerd.VCode, + WerkingsgebiedenWerdenGewijzigd); + + await session2.SaveChangesAsync(); + + await Context.WaitForNonStaleProjectionDataAsync(); + } +} diff --git a/test/AssociationRegistry.Test.Common/AutoFixture/AutoFixtureCustomizations.cs b/test/AssociationRegistry.Test.Common/AutoFixture/AutoFixtureCustomizations.cs index b10b1507d..5ff4560bc 100644 --- a/test/AssociationRegistry.Test.Common/AutoFixture/AutoFixtureCustomizations.cs +++ b/test/AssociationRegistry.Test.Common/AutoFixture/AutoFixtureCustomizations.cs @@ -10,6 +10,7 @@ namespace AssociationRegistry.Test.Common.AutoFixture; using Vereniging.TelefoonNummers; using Vereniging.Websites; using HoofdactiviteitVerenigingsloket = Vereniging.HoofdactiviteitVerenigingsloket; +using Werkingsgebied = Vereniging.Werkingsgebied; public static class AutoFixtureCustomizations { diff --git a/test/AssociationRegistry.Test.PowerBi.ExportHost/WerkingsgebiedenExportTests.cs b/test/AssociationRegistry.Test.PowerBi.ExportHost/WerkingsgebiedenExportTests.cs new file mode 100644 index 000000000..ce836c43b --- /dev/null +++ b/test/AssociationRegistry.Test.PowerBi.ExportHost/WerkingsgebiedenExportTests.cs @@ -0,0 +1,100 @@ +namespace AssociationRegistry.Test.PowerBi.ExportHost; + +using Admin.Schema.PowerBiExport; +using Amazon.S3; +using Amazon.S3.Model; +using AssociationRegistry.PowerBi.ExportHost; +using AssociationRegistry.PowerBi.ExportHost.Writers; +using AutoFixture; +using Common.AutoFixture; +using FluentAssertions; +using Microsoft.Extensions.Logging.Abstractions; +using Moq; +using System.Net; +using System.Text; +using Xunit; + +public class WerkingsgebiedenRecordWriterTests +{ + private Stream _resultStream; + private readonly Fixture _fixture; + private readonly Mock _s3ClientMock; + + public WerkingsgebiedenRecordWriterTests() + { + _fixture = new Fixture().CustomizeDomain(); + _s3ClientMock = SetupS3Client(); + } + + [Fact] + public async Task WithNoDocuments_ThenCsvExportsOnlyHeaders() + { + var docs = Array.Empty(); + + await Export(docs); + + var actualResult = await GetActualResult(); + actualResult.Should().BeEquivalentTo("code,naam,vcode\r\n"); + } + + [Fact] + public async Task WithMultipleDocuments_ThenCsvExportShouldExport() + { + var docs = _fixture.CreateMany(); + + await Export(docs); + + var actualResult = await GetActualResult(); + var expectedResult = GetExpectedResult(docs); + + actualResult.Should().BeEquivalentTo(expectedResult); + } + + private async Task GetActualResult() + { + using var reader = new StreamReader(_resultStream, Encoding.UTF8); + + var content = await reader.ReadToEndAsync(); + + return content; + } + + private static string GetExpectedResult(IEnumerable docs) + { + var stringBuilder = new StringBuilder(); + stringBuilder.Append("code,naam,vcode\r\n"); + + foreach (var doc in docs) + { + foreach (var werkgebied in doc.Werkingsgebieden) + { + stringBuilder.Append( + $"{werkgebied.Code},{werkgebied.Naam},{doc.VCode}\r\n"); + } + } + + return stringBuilder.ToString(); + } + + private Mock SetupS3Client() + { + var s3ClientMock = new Mock(); + + s3ClientMock.Setup(x => x.PutObjectAsync(It.IsAny(), default)) + .Callback((request, _) => _resultStream = request.InputStream) + .ReturnsAsync(new PutObjectResponse { HttpStatusCode = HttpStatusCode.OK }); + + return s3ClientMock; + } + + private async Task Export(IEnumerable docs) + { + var exporter = new Exporter(WellKnownFileNames.Werkingsgebieden, + bucketName: "something", + new WerkingsgebiedenRecordWriter(), + _s3ClientMock.Object, + new NullLogger()); + + await exporter.Export(docs); + } +}