From 10ee1d65484001f328c8ffa72c2946f6f8ce67da Mon Sep 17 00:00:00 2001
From: Lorenz Stechauner <lorenz.stechauner@necronda.net>
Date: Tue, 30 Jul 2024 17:00:10 +0200
Subject: [PATCH] [#3] MemberService: Export area commitments with members

---
 Elwig/Helpers/Export/ElwigData.cs | 28 ++++++++++++++++++++++++++++
 Elwig/Services/MemberService.cs   |  9 +++++++--
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/Elwig/Helpers/Export/ElwigData.cs b/Elwig/Helpers/Export/ElwigData.cs
index e6659b3..d8766b7 100644
--- a/Elwig/Helpers/Export/ElwigData.cs
+++ b/Elwig/Helpers/Export/ElwigData.cs
@@ -136,6 +136,7 @@ namespace Elwig.Helpers.Export {
                 }
 
                 var importedMembers = new List<(string FileName, string ZwstId, string Device, int New, int Overwritten, int NotImported, string Filters)>();
+                var importedAreaComs = new List<(string FileName, string ZwstId, string Device, int Imported, int NotImported, string Filters)>();
                 var importedDeliveries = new List<(string FileName, string ZwstId, string Device, int New, int Overwritten, int NotImported, string Filters)>();
 
                 foreach (var ((members, billingAddresses, telephoneNumbers, emailAddresses, areaCommitments, riede, deliveries, deliveryParts, modifiers), meta) in data.Zip(metaData)) {
@@ -159,6 +160,12 @@ namespace Elwig.Helpers.Export {
                     if (duplicateMgNrs.Count > 0)
                         importDuplicateMembers = ImportQuestion(branch.Name, device, "Mitglieder", true, duplicateMgNrs.Count);
 
+                    var fbnrs = areaCommitments.Select(c => c.FbNr).ToList();
+                    var duplicateFbNrs = await ctx.AreaCommitments
+                        .Where(c => fbnrs.Contains(c.FbNr))
+                        .Select(c => c.FbNr)
+                        .ToListAsync();
+
                     var lsnrs = deliveries.Select(d => d.LsNr).ToList();
                     var duplicateLsNrs = await ctx.Deliveries
                         .Where(d => lsnrs.Contains(d.LsNr))
@@ -199,18 +206,26 @@ namespace Elwig.Helpers.Export {
                         ctx.AddRange(billingAddresses.Where(a => duplicateMgNrs.Contains(a.MgNr)));
                         ctx.AddRange(telephoneNumbers.Where(n => duplicateMgNrs.Contains(n.MgNr)));
                         ctx.AddRange(emailAddresses.Where(a => duplicateMgNrs.Contains(a.MgNr)));
+                        ctx.UpdateRange(areaCommitments.Where(c => duplicateMgNrs.Contains(c.MgNr) && duplicateFbNrs.Contains(c.FbNr)));
+                        ctx.AddRange(areaCommitments.Where(c => duplicateMgNrs.Contains(c.MgNr) && !duplicateFbNrs.Contains(c.FbNr)));
                     }
                     if (importNewMembers) {
                         ctx.AddRange(members.Where(m => !duplicateMgNrs.Contains(m.MgNr)));
                         ctx.AddRange(billingAddresses.Where(a => !duplicateMgNrs.Contains(a.MgNr)));
                         ctx.AddRange(telephoneNumbers.Where(n => !duplicateMgNrs.Contains(n.MgNr)));
                         ctx.AddRange(emailAddresses.Where(a => !duplicateMgNrs.Contains(a.MgNr)));
+                        ctx.UpdateRange(areaCommitments.Where(c => !duplicateMgNrs.Contains(c.MgNr) && duplicateFbNrs.Contains(c.FbNr)));
+                        ctx.AddRange(areaCommitments.Where(c => !duplicateMgNrs.Contains(c.MgNr) && !duplicateFbNrs.Contains(c.FbNr)));
                     }
                     if (members.Count > 0) {
                         var n = importNewMembers ? members.Count - duplicateMgNrs.Count : 0;
                         var o = importDuplicateMembers ? duplicateMgNrs.Count : 0;
                         importedMembers.Add((meta.FileName, meta.ZwstId, meta.Device, n, o, members.Count - n - o, meta.MemberFilters));
                     }
+                    if (areaCommitments.Count > 0) {
+                        var imported = areaCommitments.Where(c => (importNewMembers && !duplicateMgNrs.Contains(c.MgNr)) || (importDuplicateMembers && duplicateMgNrs.Contains(c.MgNr))).ToList();
+                        importedAreaComs.Add((meta.FileName, meta.ZwstId, meta.Device, imported.Count, areaCommitments.Count - imported.Count, meta.AreaComFilters));
+                    }
 
                     if (allowedDuplicateLsNrs.Count > 0) {
                         var dids = deliveries
@@ -265,6 +280,12 @@ namespace Elwig.Helpers.Export {
                             $"    ({d.New} neu, {d.Overwritten} überschrieben, {d.NotImported} nicht importiert)\n" +
                             $"    Zweigstelle: {branches[d.ZwstId].Name} (Gerät {d.Device})\n" +
                             $"    Filter: {d.Filters}"),
+                        $"Flächenbindungen: {importedAreaComs.Sum(d => d.Imported)}",
+                        ..importedAreaComs.Select(d =>
+                            $"  {d.FileName} ({d.Imported})\n" +
+                            $"    ({d.Imported} importiert, {d.NotImported} nicht importiert)\n" +
+                            $"    Zweigstelle: {branches[d.ZwstId].Name} (Gerät {d.Device})\n" +
+                            $"    Filter: {d.Filters}"),
                         $"Lieferungen: {importedDeliveries.Sum(d => d.New + d.Overwritten)}",
                         ..importedDeliveries.Select(d =>
                             $"  {d.FileName} ({d.New + d.Overwritten})\n" +
@@ -298,6 +319,13 @@ namespace Elwig.Helpers.Export {
             }.Export(filename);
         }
 
+        public static Task Export(string filename, IEnumerable<Member> members, IEnumerable<AreaCom> areaComs, IEnumerable<string> filters) {
+            return new ElwigExport {
+                Members = (members, filters),
+                AreaComs = (areaComs, ["von exportierten Mitgliedern"]),
+            }.Export(filename);
+        }
+
         public static Task Export(string filename, IEnumerable<Delivery> deliveries, IEnumerable<string> filters) {
             return new ElwigExport {
                 Deliveries = (deliveries, filters)
diff --git a/Elwig/Services/MemberService.cs b/Elwig/Services/MemberService.cs
index a2712de..424b36b 100644
--- a/Elwig/Services/MemberService.cs
+++ b/Elwig/Services/MemberService.cs
@@ -432,13 +432,18 @@ namespace Elwig.Services {
                 if (d.ShowDialog() == true) {
                     Mouse.OverrideCursor = Cursors.AppStarting;
                     try {
-                        await ElwigData.Export(d.FileName, await query
+                        var members = await query
                             .OrderBy(m => m.MgNr)
                             .Include(m => m.BillingAddress)
                             .Include(m => m.TelephoneNumbers)
                             .Include(m => m.EmailAddresses)
                             .AsSplitQuery()
-                            .ToListAsync(), filterNames);
+                            .ToListAsync();
+                        var areaComs = await query
+                            .SelectMany(m => m.AreaCommitments)
+                            .Include(c => c.Rd)
+                            .ToListAsync();
+                        await ElwigData.Export(d.FileName, members, areaComs, filterNames);
                     } catch (Exception exc) {
                         MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                     }