From 6e2ba56a7c43be737bc3b9276f99b8810dd0de5c Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Thu, 19 Oct 2023 00:09:38 +0200 Subject: [PATCH] =?UTF-8?q?SeasonFinishWindow:=20Implement=20=C3=9Cber-/Un?= =?UTF-8?q?terlieferungen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Elwig/Windows/SeasonFinishWindow.xaml.cs | 95 +++++++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/Elwig/Windows/SeasonFinishWindow.xaml.cs b/Elwig/Windows/SeasonFinishWindow.xaml.cs index 936872c..d4dbaa1 100644 --- a/Elwig/Windows/SeasonFinishWindow.xaml.cs +++ b/Elwig/Windows/SeasonFinishWindow.xaml.cs @@ -1,6 +1,10 @@ using Elwig.Dialogs; using Elwig.Helpers; using Elwig.Helpers.Billing; +using Microsoft.Win32; +using System; +using System.IO; +using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; @@ -51,7 +55,96 @@ namespace Elwig.Windows { d.Show(); } - private void OverUnderDeliveryButton_Click(object sender, RoutedEventArgs evt) { + private async void OverUnderDeliveryButton_Click(object sender, RoutedEventArgs evt) { + if (SeasonInput.Value is not int year) + return; + var d = new SaveFileDialog() { + FileName = $"Über-Unterlieferungen-{year}.csv", + DefaultExt = "csv", + Filter = "CSV-Datei (*.csv)|*.csv", + Title = $"Über-/Unterlieferungen {year} speichern unter - Elwig" + }; + if (d.ShowDialog() == false) + return; + + Mouse.OverrideCursor = Cursors.AppStarting; + + try { + using var file = new StreamWriter(d.FileName, false, Encoding.Latin1); + using var cnx = await AppDbContext.ConnectAsync(); + await file.WriteLineAsync($"Auswertungen {year};;;;;;;;;;;"); + + await file.WriteLineAsync($";;;;;;;;;;;"); + await file.WriteLineAsync($"Über-/Unterlieferungen lt. gez. GA;;;;;;;;;;;"); + await file.WriteLineAsync($"MgNr;Name;Vorname;Adresse;PLZ;Ort;GA;Lieferpflicht;Lieferrecht;Geliefert;Über-/Unterliefert;Prozent"); + using (var cmd = cnx.CreateCommand()) { + cmd.CommandText = $""" + SELECT m.mgnr, m.family_name, m.given_name, p.plz, o.name, m.address, m.business_shares, + m.business_shares * (SELECT value FROM client_parameter WHERE param = 'DELIVERY_OBLIGATION') AS min_kg, + m.business_shares * (SELECT value FROM client_parameter WHERE param = 'DELIVERY_RIGHT') AS max_kg, + COALESCE(SUM(d.weight), 0) AS sum + FROM member m + LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest + LEFT JOIN AT_ort o ON o.okz = p.okz + LEFT JOIN v_delivery d ON d.mgnr = m.mgnr AND d.year = {year} + WHERE m.active = 1 + GROUP BY d.year, m.mgnr + ORDER BY sum = 0 DESC, 100.0 * sum / max_kg, m.mgnr; + """; + using var reader = await cmd.ExecuteReaderAsync(); + while (await reader.ReadAsync()) { + var mgnr = reader.GetInt32(0); + var familyName = reader.GetString(1); + var givenName = reader.GetString(2); + var plz = reader.GetInt32(3); + var ort = reader.GetString(4); + var addr = reader.GetString(5); + var ga = reader.GetInt32(6); + var minKg = reader.GetInt32(7); + var maxKg = reader.GetInt32(8); + var sum = reader.GetInt32(9); + var s1 = sum < minKg ? $"{sum - minKg}" : sum > maxKg ? $"{sum - maxKg}" : ""; + var s2 = sum < minKg ? $"{sum * 100.0 / minKg - 100.0:0.0}" : sum > maxKg ? $"{sum * 100.0 / maxKg - 100:0.0}" : ""; + await file.WriteLineAsync($"{mgnr};{familyName};{givenName};{addr};{plz};{ort};{ga};{minKg};{maxKg};{sum};{s1};{s2}"); + } + } + + await file.WriteLineAsync($";;;;;;;;;;;"); + await file.WriteLineAsync($"Unterlieferungen lt. Flächenbindungen;;;;;;;;;;;"); + await file.WriteLineAsync($"MgNr;Name;Vorname;Adresse;PLZ;Ort;Vertrag;Lieferpflicht;Lieferrecht;Geliefert;Unterliefert;Prozent"); + using (var cmd = cnx.CreateCommand()) { + cmd.CommandText = $""" + SELECT m.mgnr, m.family_name, m.given_name, p.plz, o.name, m.address, + c.bin, c.min_kg, c.max_kg, b.weight + FROM member m + LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest + LEFT JOIN AT_ort o ON o.okz = p.okz + JOIN v_area_commitment_bin c ON c.mgnr = m.mgnr AND c.year = {year} + LEFT JOIN v_payment_bin b ON (b.mgnr, b.bin) = (m.mgnr, c.bin) AND b.year = {year} + WHERE m.active = 1 AND b.weight < c.min_kg + ORDER BY m.mgnr, c.bin + """; + using var reader = await cmd.ExecuteReaderAsync(); + while (await reader.ReadAsync()) { + var mgnr = reader.GetInt32(0); + var familyName = reader.GetString(1); + var givenName = reader.GetString(2); + var plz = reader.GetInt32(3); + var ort = reader.GetString(4); + var addr = reader.GetString(5); + var id = reader.GetString(6); + var minKg = reader.GetInt32(7); + var maxKg = reader.GetInt32(8); + var sum = reader.GetInt32(9); + await file.WriteLineAsync($"{mgnr};{familyName};{givenName};{addr};{plz};{ort};{id};{minKg};{maxKg};{sum};{sum - minKg};{sum * 100.0 / minKg - 100.0:0.0}"); + } + } + + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } + + Mouse.OverrideCursor = null; } private void PaymentButton_Click(object sender, RoutedEventArgs evt) {