diff --git a/Elwig/Documents/CreditNote.cshtml b/Elwig/Documents/CreditNote.cshtml index 4dd0b4f..f933faf 100644 --- a/Elwig/Documents/CreditNote.cshtml +++ b/Elwig/Documents/CreditNote.cshtml @@ -9,8 +9,8 @@ - - + + @@ -51,7 +51,7 @@ @if (i == 0) { - +
@p.LsNr@p.DPNr@p.DPNr @p.Variety @p.Attribute@(p.Attribute != null && p.Cultivation != null ? " / " : "")@p.Cultivation diff --git a/Elwig/Documents/DeliveryConfirmation.cshtml b/Elwig/Documents/DeliveryConfirmation.cshtml index 3bdc972..52f91b1 100644 --- a/Elwig/Documents/DeliveryConfirmation.cshtml +++ b/Elwig/Documents/DeliveryConfirmation.cshtml @@ -9,8 +9,8 @@ - - + + @@ -60,7 +60,7 @@ i + 1 ? "last" : "")"> @if (first) { - + diff --git a/Elwig/Documents/DeliveryDepreciationList.cs b/Elwig/Documents/DeliveryDepreciationList.cs new file mode 100644 index 0000000..5fb92c4 --- /dev/null +++ b/Elwig/Documents/DeliveryDepreciationList.cs @@ -0,0 +1,22 @@ +using Elwig.Models.Dtos; +using System.Collections.Generic; + +namespace Elwig.Documents { + public class DeliveryDepreciationList : Document { + + public new static string Name => "Abwertungsliste"; + + public string Filter; + public IEnumerable Deliveries; + + public DeliveryDepreciationList(string filter, IEnumerable deliveries) : + base($"{Name} {filter}") { + Filter = filter; + Deliveries = deliveries; + } + + public DeliveryDepreciationList(string filter, DeliveryJournalData data) : + this(filter, data.Rows) { + } + } +} diff --git a/Elwig/Documents/DeliveryDepreciationList.cshtml b/Elwig/Documents/DeliveryDepreciationList.cshtml new file mode 100644 index 0000000..df85d07 --- /dev/null +++ b/Elwig/Documents/DeliveryDepreciationList.cshtml @@ -0,0 +1,104 @@ +@using RazorLight +@inherits TemplatePage +@model Elwig.Documents.DeliveryDepreciationList +@{ Layout = "Document"; } + +
+

Abwertungsliste

+

@Model.Filter

+
@p.LsNr@p.DPNr@p.DPNr @p.Variety @p.Attribute@(p.Attribute != null && p.Cultivation != null ? " / " : "")@p.Cultivation @p.QualityLevel
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @{ + int? lastMember = null; + } + @foreach (var p in Model.Deliveries) { + if (lastMember != p.MgNr) { + + @{ + var memberDeliveries = Model.Deliveries.Where(d => d.MgNr == p.MgNr).ToList(); + var memberKmw = Elwig.Helpers.Utils.AggregateDeliveryPartsKmw(memberDeliveries); + var memberOe = Elwig.Helpers.Utils.KmwToOe(memberKmw); + } + + + + + + + } + + + + + + + + + + + + lastMember = p.MgNr; + } + @{ + var branches = Model.Deliveries.Select(d => d.DeliveryBranch).Distinct().Order().ToArray(); + if (branches.Length > 1) { + foreach (var b in branches) { + + @{ + var branchDeliveries = Model.Deliveries.Where(d => d.DeliveryBranch == b).ToList(); + var branchKmw = Elwig.Helpers.Utils.AggregateDeliveryPartsKmw(branchDeliveries); + var branchOe = Elwig.Helpers.Utils.KmwToOe(branchKmw); + } + + + + + + + } + } + } + + @{ + var kmw = Elwig.Helpers.Utils.AggregateDeliveryPartsKmw(Model.Deliveries); + var oe = Elwig.Helpers.Utils.KmwToOe(kmw); + } + + + + + + + +
Lieferschein-Nr.Pos.DatumZeitSorteAttr./Bewirt.GradationGewicht
[°Oe][°KMW][kg]
+ @($"{p.MgNr}, {p.AdministrativeName}") + Teil-Lfrg.: @($"{memberDeliveries.Count():N0}")@($"{memberOe:N0}")@($"{memberKmw:N1}")@($"{memberDeliveries.Sum(p => p.Weight):N0}")
@p.LsNr@p.Pos@($"{p.Date:dd.MM.yyyy}")@($"{p.Time:HH:mm}")@p.Variety@p.Attribute@(p.Attribute != null && p.Cultivation != null ? " / " : "")@p.Cultivation@($"{p.Oe:N0}")@($"{p.Kmw:N1}")@($"{p.Weight:N0}")
@b:(Teil-)Lieferungen: @($"{branchDeliveries.DistinctBy(p => p.LsNr).Count():N0}") (@($"{branchDeliveries.Count():N0}"))@($"{branchOe:N0}")@($"{branchKmw:N1}")@($"{branchDeliveries.Sum(p => p.Weight):N0}")
Gesamt:(Teil-)Lieferungen: @($"{Model.Deliveries.DistinctBy(p => p.LsNr).Count():N0}") (@($"{Model.Deliveries.Count():N0}"))@($"{oe:N0}")@($"{kmw:N1}")@($"{Model.Deliveries.Sum(p => p.Weight):N0}")
+ diff --git a/Elwig/Documents/DeliveryDepreciationList.css b/Elwig/Documents/DeliveryDepreciationList.css new file mode 100644 index 0000000..f0d3b56 --- /dev/null +++ b/Elwig/Documents/DeliveryDepreciationList.css @@ -0,0 +1,13 @@ + +h1 { + text-align: center; + font-size: 24pt; + margin-top: 10mm; + margin-bottom: 2mm; +} + +h2 { + text-align: center; + font-size: 14pt; + margin-top: 2mm; +} diff --git a/Elwig/Documents/DeliveryJournal.cs b/Elwig/Documents/DeliveryJournal.cs index 293ed42..2e531aa 100644 --- a/Elwig/Documents/DeliveryJournal.cs +++ b/Elwig/Documents/DeliveryJournal.cs @@ -9,7 +9,8 @@ namespace Elwig.Documents { public string Filter; public IEnumerable Deliveries; - public DeliveryJournal(string filter, IEnumerable deliveries) : base($"{Name} {filter}") { + public DeliveryJournal(string filter, IEnumerable deliveries) : + base($"{Name} {filter}") { Filter = filter; Deliveries = deliveries; } diff --git a/Elwig/Documents/DeliveryJournal.cshtml b/Elwig/Documents/DeliveryJournal.cshtml index cb8054b..6ef0a21 100644 --- a/Elwig/Documents/DeliveryJournal.cshtml +++ b/Elwig/Documents/DeliveryJournal.cshtml @@ -9,10 +9,10 @@ - + - - + + @@ -41,7 +41,7 @@ @foreach (var p in Model.Deliveries) { - + @@ -52,6 +52,25 @@ } + @{ + var branches = Model.Deliveries.Select(d => d.DeliveryBranch).Distinct().Order().ToArray(); + if (branches.Length > 1) { + foreach (var b in branches) { + + @{ + var branchDeliveries = Model.Deliveries.Where(d => d.DeliveryBranch == b).ToList(); + var branchKmw = Elwig.Helpers.Utils.AggregateDeliveryPartsKmw(branchDeliveries); + var branchOe = Elwig.Helpers.Utils.KmwToOe(branchKmw); + } + + + + + + + } + } + } @{ var kmw = Elwig.Helpers.Utils.AggregateDeliveryPartsKmw(Model.Deliveries); diff --git a/Elwig/Documents/Document.cs b/Elwig/Documents/Document.cs index 4a77a55..348083a 100644 --- a/Elwig/Documents/Document.cs +++ b/Elwig/Documents/Document.cs @@ -78,6 +78,8 @@ namespace Elwig.Documents { name = "CreditNote"; } else if (this is DeliveryJournal) { name = "DeliveryJournal"; + } else if (this is DeliveryDepreciationList) { + name = "DeliveryDepreciationList"; } else if (this is Letterhead) { name = "Letterhead"; } else if (this is DeliveryConfirmation) { diff --git a/Elwig/Services/DeliveryService.cs b/Elwig/Services/DeliveryService.cs index 4d90cbb..6725d88 100644 --- a/Elwig/Services/DeliveryService.cs +++ b/Elwig/Services/DeliveryService.cs @@ -24,7 +24,7 @@ namespace Elwig.Services { public static class DeliveryService { public enum ExportSubject { - FromFilters, FromToday, FromSeasonAndBranch, Selected, + FromFilters, FromToday, FromSeason, FromSeasonAndBranch, Selected, }; public static async Task GetMemberAsync(int mgnr) { @@ -809,6 +809,71 @@ namespace Elwig.Services { Mouse.OverrideCursor = null; } + public static async Task GenerateDeliveryDepreciationList(this DeliveryAdminViewModel vm, ExportSubject subject, ExportMode mode) { + using var ctx = new AppDbContext(); + IQueryable query; + List filterNames = []; + if (subject == ExportSubject.FromFilters) { + var (f, _, q, _, _) = await vm.GetFilters(ctx); + query = q; + filterNames.AddRange(f); + } else if (subject == ExportSubject.FromSeason) { + var year = vm.FilterSeason ?? Utils.CurrentLastSeason; + query = ctx.DeliveryParts + .Where(p => p.Year == year); + filterNames.Add($"{year}"); + } else { + throw new ArgumentException("Invalid value for ExportSubject"); + } + + query = query + .Where(p => p.QualId == "WEI") + .OrderBy(p => p.Delivery.MgNr) + .ThenBy(p => p.Delivery.DateString) + .ThenBy(p => p.Delivery.TimeString) + .ThenBy(p => p.Delivery.LsNr) + .ThenBy(p => p.DPNr); + filterNames.Remove("abgewertet"); + + if (mode == ExportMode.SaveList) { + var d = new SaveFileDialog() { + FileName = $"{DeliveryDepreciationList.Name}-{vm.FilterSeason ?? Utils.CurrentLastSeason}.ods", + DefaultExt = "ods", + Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", + Title = $"{DeliveryDepreciationList.Name} speichern unter - Elwig" + }; + if (d.ShowDialog() == true) { + Mouse.OverrideCursor = Cursors.AppStarting; + try { + using var ods = new OdsFile(d.FileName); + var tblTotal = await DeliveryJournalData.FromQuery(query, filterNames); + tblTotal.FullName = DeliveryDepreciationList.Name; + tblTotal.Name = "Gesamt"; + await ods.AddTable(tblTotal); + foreach (var branch in await ctx.Branches.OrderBy(b => b.Name).ToListAsync()) { + var tbl = await DeliveryJournalData.FromQuery(query.Where(p => p.Delivery.ZwstId == branch.ZwstId), filterNames); + tbl.FullName = DeliveryDepreciationList.Name; + tbl.Name = branch.Name; + await ods.AddTable(tbl); + } + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } + Mouse.OverrideCursor = null; + } + } else { + Mouse.OverrideCursor = Cursors.AppStarting; + try { + var data = await DeliveryJournalData.FromQuery(query, filterNames); + using var doc = new DeliveryDepreciationList(string.Join(" / ", filterNames), data); + await Utils.ExportDocument(doc, mode); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } + Mouse.OverrideCursor = null; + } + } + private static void AddToolTipCell(Grid grid, string text, int row, int col, int colSpan = 1, bool bold = false, bool alignRight = false, bool alignCenter = false) { var tb = new TextBlock() { Text = text, diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml b/Elwig/Windows/DeliveryAdminWindow.xaml index 9d18fe4..acf3f9d 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml +++ b/Elwig/Windows/DeliveryAdminWindow.xaml @@ -120,6 +120,25 @@ + + + + + + + + + + + diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 14560a7..d1f46d9 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -252,6 +252,23 @@ namespace Elwig.Windows { await App.Client.UpdateValues(); } + private async void Menu_DeliveryDepreciationList_SaveFilters_Click(object sender, RoutedEventArgs evt) => + await ViewModel.GenerateDeliveryDepreciationList(DeliveryService.ExportSubject.FromFilters, ExportMode.SaveList); + private async void Menu_DeliveryDepreciationList_ShowFilters_Click(object sender, RoutedEventArgs evt) => + await ViewModel.GenerateDeliveryDepreciationList(DeliveryService.ExportSubject.FromFilters, ExportMode.Show); + private async void Menu_DeliveryDepreciationList_SavePdfFilters_Click(object sender, RoutedEventArgs evt) => + await ViewModel.GenerateDeliveryDepreciationList(DeliveryService.ExportSubject.FromFilters, ExportMode.SavePdf); + private async void Menu_DeliveryDepreciationList_PrintFilters_Click(object sender, RoutedEventArgs evt) => + await ViewModel.GenerateDeliveryDepreciationList(DeliveryService.ExportSubject.FromFilters, ExportMode.Print); + private async void Menu_DeliveryDepreciationList_SaveSeason_Click(object sender, RoutedEventArgs evt) => + await ViewModel.GenerateDeliveryDepreciationList(DeliveryService.ExportSubject.FromSeason, ExportMode.SaveList); + private async void Menu_DeliveryDepreciationList_ShowSeason_Click(object sender, RoutedEventArgs evt) => + await ViewModel.GenerateDeliveryDepreciationList(DeliveryService.ExportSubject.FromSeason, ExportMode.Show); + private async void Menu_DeliveryDepreciationList_SavePdfSeason_Click(object sender, RoutedEventArgs evt) => + await ViewModel.GenerateDeliveryDepreciationList(DeliveryService.ExportSubject.FromSeason, ExportMode.SavePdf); + private async void Menu_DeliveryDepreciationList_PrintSeason_Click(object sender, RoutedEventArgs evt) => + await ViewModel.GenerateDeliveryDepreciationList(DeliveryService.ExportSubject.FromSeason, ExportMode.Print); + private void Menu_Settings_EnableFreeEditing_Checked(object sender, RoutedEventArgs evt) { if (IsEditing || IsCreating) { DateInput.IsReadOnly = false; diff --git a/Tests/DocumentTests/CreditNoteTest.cs b/Tests/DocumentTests/CreditNoteTest.cs index 0195c6e..265d312 100644 --- a/Tests/DocumentTests/CreditNoteTest.cs +++ b/Tests/DocumentTests/CreditNoteTest.cs @@ -29,9 +29,10 @@ namespace Tests.DocumentTests { Assert.That(text, Contains.Substring("AT81 1234 5678 9012 3457")); Assert.That(text, Contains.Substring(""" 20201001X001 1 Grüner Veltliner 73 15,0 ungeb.: 3 219 0,5000 - - 1 609,50 - 20201001X003 1 Grüner Veltliner 75 15,4 ungeb.: 2 561 - - - 20201001X003 2 Grüner Veltliner Kabinett 87 17,6 ungeb.: 3 129 - - - 20201001X003 3 Grüner Veltliner 79 16,1 ungeb.: 1 280 - - + 20201001X003 1 Grüner Veltliner abgew. 75 15,4 ungeb.: 2 561 - - + 20201001X003 2 Grüner Veltliner Kabinett / abgew. + 87 17,6 ungeb.: 3 129 - - + 20201001X003 3 Grüner Veltliner abgew. 79 16,1 ungeb.: 1 280 - - 20201001X005 1 Welschriesling 84 17,0 ungeb.: 3 192 - - 20201001X005 2 Welschriesling 84 17,1 ungeb.: 2 190 - - """)); diff --git a/Tests/DocumentTests/DeliveryConfirmationTest.cs b/Tests/DocumentTests/DeliveryConfirmationTest.cs index 3199d03..262dae9 100644 --- a/Tests/DocumentTests/DeliveryConfirmationTest.cs +++ b/Tests/DocumentTests/DeliveryConfirmationTest.cs @@ -24,10 +24,10 @@ namespace Tests.DocumentTests { Assert.That(text, Contains.Substring($"Wolkersdorf, am {Elwig.Helpers.Utils.Today:dd.MM.yyyy}")); Assert.That(text, Contains.Substring("Anlieferungsbestätigung 2020")); Assert.That(text, Contains.Substring(""" - 20201001X003 2 Grüner Veltliner Kabinett Kabinett 87 17,6 ungeb.: 3 129 3 129 ☑ - 20201001X003 3 Grüner Veltliner Qualitätswein 79 16,1 ungeb.: 1 280 1 280 ☑ - 20201001X003 1 Grüner Veltliner Qualitätswein 75 15,4 ungeb.: 2 561 2 561 ☑ 20201001X001 1 Grüner Veltliner Qualitätswein 73 15,0 ungeb.: 3 219 3 219 ☑ + 20201001X003 2 Grüner Veltliner Kabinett Wein 87 17,6 ungeb.: 3 129 3 129 ☑ + 20201001X003 3 Grüner Veltliner Wein 79 16,1 ungeb.: 1 280 1 280 ☑ + 20201001X003 1 Grüner Veltliner Wein 75 15,4 ungeb.: 2 561 2 561 ☑ 20201001X005 2 Welschriesling Kabinett 84 17,1 ungeb.: 2 190 2 190 ☑ 20201001X005 1 Welschriesling Kabinett 84 17,0 ungeb.: 3 192 3 192 ☑ """)); diff --git a/Tests/DocumentTests/DeliveryDepreciationListTest.cs b/Tests/DocumentTests/DeliveryDepreciationListTest.cs new file mode 100644 index 0000000..c1a126d --- /dev/null +++ b/Tests/DocumentTests/DeliveryDepreciationListTest.cs @@ -0,0 +1,32 @@ +using Elwig.Documents; +using Elwig.Helpers; +using Elwig.Models.Dtos; + +namespace Tests.DocumentTests { + [TestFixture] + public class DeliveryDepreciationListTest { + + [Test] + public async Task Test_01_DepreciatedDeliveries2020() { + using var ctx = new AppDbContext(); + var data = await DeliveryJournalData.FromQuery(ctx.Deliveries.Where(d => d.Year == 2020).SelectMany(d => d.Parts).Where(d => d.QualId == "WEI"), ["Saison 2020"]); + using var doc = new DeliveryDepreciationList("Saison 2020", data); + var text = await Utils.GeneratePdfText(doc, true); + var table = Utils.ExtractTable(text); + Assert.Multiple(() => { + Assert.That(text, Contains.Substring("Abwertungsliste")); + Assert.That(text, Contains.Substring("Saison 2020")); + Assert.That(table, Is.EqualTo(new string[][] { + ["101, MUSTERMANN Max", "Teil-Lfrg.:", "3", "81", "16,5", "6 970"], + ["20201001X003 1 01.10.2020 10:24", "Grüner Veltliner", "75", "15,4", "2 561"], + ["20201001X003 2 01.10.2020 10:24", "Grüner Veltliner", "Kabinett", "87", "17,6", "3 129"], + ["20201001X003 3 01.10.2020 10:24", "Grüner Veltliner", "79", "16,1", "1 280"], + ["103, MUSTERBAUER Matthäus", "Teil-Lfrg.:", "2", "79", "16,2", "6 099"], + ["20201002X001 1 02.10.2020 09:13", "Grüner Veltliner", "Bio", "80", "16,3", "3 198"], + ["20201002X002 1 02.10.2020 09:28", "Grüner Veltliner", "Bio", "78", "16,0", "2 901"], + ["Gesamt:", "(Teil-)Lieferungen: 3 (5)", "80", "16,3", "13 069"], + })); + }); + } + } +} diff --git a/Tests/DocumentTests/DeliveryNoteTest.cs b/Tests/DocumentTests/DeliveryNoteTest.cs index 11235d6..6529d62 100644 --- a/Tests/DocumentTests/DeliveryNoteTest.cs +++ b/Tests/DocumentTests/DeliveryNoteTest.cs @@ -84,20 +84,20 @@ namespace Tests.DocumentTests { Assert.That(text, Contains.Substring("Traubenübernahmeschein Nr. 20201001X003")); Assert.That(text, Contains.Substring("Das Mitglied erklärt, dass die gelieferte Ware dem österreichischen Weingesetz entspricht")); Assert.That(text, Contains.Substring(""" - 1 Grüner Veltliner Qualitätswein 75 15,4 2 561 - Herkunft: Österreich / Weinland / Niederösterreich + 1 Grüner Veltliner Wein 75 15,4 2 561 + Herkunft: Österreich / Matzner Hügel / Hohenruppersdorf / KG Hohenruppersdorf Waage: ?, ID: ? (gerebelt gewogen) """)); Assert.That(text, Contains.Substring(""" - 2 Grüner Veltliner Kabinett Kabinett 87 17,6 3 129 - Herkunft: Österreich / Weinland / Niederösterreich + 2 Grüner Veltliner Kabinett Wein 87 17,6 3 129 + Herkunft: Österreich / Matzner Hügel / Hohenruppersdorf / KG Hohenruppersdorf Waage: ?, ID: ? (gerebelt gewogen) """)); Assert.That(text, Contains.Substring(""" - 3 Grüner Veltliner Qualitätswein 79 16,1 1 280 - Herkunft: Österreich / Weinland / Niederösterreich + 3 Grüner Veltliner Wein 79 16,1 1 280 + Herkunft: Österreich / Matzner Hügel / Hohenruppersdorf / KG Hohenruppersdorf Waage: ?, ID: ? (gerebelt gewogen) """)); @@ -123,9 +123,9 @@ namespace Tests.DocumentTests { Assert.That(text, Contains.Substring("Traubenübernahmeschein Nr. 20201002X001")); Assert.That(text, Contains.Substring("Das Mitglied erklärt, dass die gelieferte Ware dem österreichischen Weingesetz entspricht")); Assert.That(text, Contains.Substring(""" - 1 Grüner Veltliner Qualitätswein 80 16,3 3 198 + 1 Grüner Veltliner Wein 80 16,3 3 198 Bewirtschaftung: Bio (AT-BIO-302) - Herkunft: Österreich / Weinland / Niederösterreich + Herkunft: Österreich / Wolkersdorfer Hochleithen / Wolkersdorf im Weinviertel / KG Wolkersdorf Waage: ?, ID: ? (gerebelt gewogen) """)); diff --git a/Tests/DocumentTests/WineQualityStatisticsTest.cs b/Tests/DocumentTests/WineQualityStatisticsTest.cs index 616b3aa..f145fef 100644 --- a/Tests/DocumentTests/WineQualityStatisticsTest.cs +++ b/Tests/DocumentTests/WineQualityStatisticsTest.cs @@ -16,14 +16,19 @@ namespace Tests.DocumentTests { Assert.That(text, Contains.Substring("Qualitätsstatistik")); Assert.That(text, Contains.Substring("Saison 2020")); Assert.That(text, Contains.Substring(""" - Qualitätswein - 73 2 4 431 - 74 2 4 203 - 75 3 5 176 - 77 1 842 + Wein + 75 1 2 561 78 1 2 901 79 1 1 280 80 1 3 198 + 87 1 3 129 + """)); + Assert.That(text, Contains.Substring(""" + Qualitätswein + 73 2 4 431 + 74 2 4 203 + 75 2 2 615 + 77 1 842 82 1 4 002 """)); Assert.That(text, Contains.Substring(""" @@ -31,14 +36,14 @@ namespace Tests.DocumentTests { 84 3 8 960 85 3 11 181 86 1 2 987 - 87 2 5 002 + 87 1 1 873 89 2 4 723 """)); Assert.That(text, Contains.Substring( + "80 5 " + "13 069 " + "- 0 0 " + - "- 0 0 " + - "77 12 " + "26 033 " + - "86 11 " + "32 853")); + "77 5 " + "11 568 " + + "85 6 " + "17 561")); }); } } diff --git a/Tests/Resources/Sql/DocumentInsert.sql b/Tests/Resources/Sql/DocumentInsert.sql index a61dfe5..543dab4 100644 --- a/Tests/Resources/Sql/DocumentInsert.sql +++ b/Tests/Resources/Sql/DocumentInsert.sql @@ -43,17 +43,17 @@ INSERT INTO delivery_part (year, did, dpnr, sortid, attrid, cultid, weight, kmw, (2020, 1, 1, 'GV', NULL, NULL, 3219, 15.0, 'QUW', 'WLNO', 06109, TRUE, FALSE, FALSE, '1', '{"id":"321","nr":321,"gross_weight":3219,"tare_weight":0,"net_weight":3219,"date":"2020-10-01","time":"09:02:46"}', NULL), (2020, 2, 1, 'GV', 'K', NULL, 2987, 17.5, 'KAB', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 2, 2, 'GV', 'K', NULL, 1873, 17.7, 'KAB', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), -(2020, 3, 1, 'GV', NULL, NULL, 2561, 15.4, 'QUW', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), -(2020, 3, 2, 'GV', 'K', NULL, 3129, 17.6, 'KAB', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), -(2020, 3, 3, 'GV', NULL, NULL, 1280, 16.1, 'QUW', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2020, 3, 1, 'GV', NULL, NULL, 2561, 15.4, 'WEI', 'OEST', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2020, 3, 2, 'GV', 'K', NULL, 3129, 17.6, 'WEI', 'OEST', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2020, 3, 3, 'GV', NULL, NULL, 1280, 16.1, 'WEI', 'OEST', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 4, 1, 'GV', NULL, NULL, 4002, 16.7, 'QUW', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 4, 2, 'GV', NULL, NULL, 481, 15.3, 'QUW', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 5, 1, 'WR', NULL, NULL, 3192, 17.0, 'KAB', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 5, 2, 'WR', NULL, NULL, 2190, 17.1, 'KAB', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 6, 1, 'GV', NULL, 'B', 1732, 15.2, 'QUW', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), -(2020, 7, 1, 'GV', NULL, 'B', 3198, 16.3, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2020, 7, 1, 'GV', NULL, 'B', 3198, 16.3, 'WEI', 'OEST', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 7, 2, 'GV', NULL, 'B', 2134, 15.4, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), -(2020, 8, 1, 'GV', NULL, 'B', 2901, 16.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2020, 8, 1, 'GV', NULL, 'B', 2901, 16.0, 'WEI', 'OEST', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 8, 2, 'GV', NULL, 'B', 3321, 17.3, 'KAB', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 9, 1, 'WR', NULL, 'B', 3998, 17.2, 'KAB', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 10, 1, 'ZW', NULL, NULL, 1212, 15.0, 'QUW', 'WLNO', 15224, TRUE, FALSE, FALSE, NULL, NULL, NULL),
@p.LsNr@p.Pos@p.Pos @($"{p.Date:dd.MM.yyyy}") @($"{p.Time:HH:mm}") @p.MgNr@($"{p.Weight:N0}")
@b:(Teil-)Lieferungen: @($"{branchDeliveries.DistinctBy(p => p.LsNr).Count():N0}") (@($"{branchDeliveries.Count():N0}"))@($"{branchOe:N0}")@($"{branchKmw:N1}")@($"{branchDeliveries.Sum(p => p.Weight):N0}")