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; namespace Elwig.Windows { public partial class SeasonFinishWindow : ContextWindow { public SeasonFinishWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs evt) { SeasonInput.Value = Utils.CurrentLastSeason; } protected override async Task OnRenewContext() { SeasonInput_ValueChanged(null, null); } private async void SeasonInput_ValueChanged(object? sender, RoutedEventArgs? evt) { var s0 = await Context.Seasons.FindAsync(SeasonInput.Value); var s1 = await Context.Seasons.FindAsync(SeasonInput.Value + 1); var valid = (s0 != null); var last = (s1 == null); CalculateBucketsButton.IsEnabled = valid && last; DeliveryConfirmationButton.IsEnabled = valid; OverUnderDeliveryButton.IsEnabled = valid; } private async void CalculateBucketsButton_Click(object sender, RoutedEventArgs evt) { if (SeasonInput.Value is not int year) return; CalculateBucketsButton.IsEnabled = false; Mouse.OverrideCursor = Cursors.AppStarting; var b = new Billing(year); await b.FinishSeason(); await b.CalculateBuckets( AllowAttrIntoLowerInput.IsChecked ?? false, AvoidUnderDeliveriesInput.IsChecked ?? false, HonorGebundenInput.IsChecked ?? false); Mouse.OverrideCursor = null; CalculateBucketsButton.IsEnabled = true; } private void DeliveryConfirmationButton_Click(object sender, RoutedEventArgs evt) { if (SeasonInput.Value is not int year) return; var w = new DeliveryConfirmationsWindow(year); w.Show(); } 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 * s.min_kg_per_bs AS min_kg, m.business_shares * s.max_kg_per_bs 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 season s ON s.year = {year} LEFT JOIN v_delivery d ON d.mgnr = m.mgnr AND d.year = s.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).Split(',')[0]; 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;Fläche;Lieferpflicht;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.bucket, c.area, u.min_kg, u.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 LEFT JOIN v_area_commitment_bucket_strict c ON c.mgnr = m.mgnr AND c.year = {year} JOIN v_under_delivery u ON (u.mgnr, u.bucket, u.year) = (m.mgnr, c.bucket, c.year) WHERE m.active = 1 ORDER BY m.mgnr, c.bucket """; 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).Split(',')[0]; var addr = reader.GetString(5); var id = reader.GetString(6); var area = reader.GetInt32(7); var minKg = reader.GetInt32(8); var sum = reader.GetInt32(9); await file.WriteLineAsync($"{mgnr};{familyName};{givenName};{addr};{plz};{ort};{id};{area};{minKg};{sum};{sum - minKg};{sum * 100.0 / minKg - 100.0:0.0}"); } } await file.WriteLineAsync($";;;;;;;;;;;"); await file.WriteLineAsync($"Lieferungen pro Mitglied und Sorte;;;;;;;;;;;"); await file.WriteLineAsync($"MgNr;Name;Vorname;Adresse;PLZ;Ort;Sorte;Attribut;Geliefert;Fläche;Ertrag"); using (var cmd = cnx.CreateCommand()) { cmd.CommandText = $""" SELECT m.mgnr, m.family_name, m.given_name, p.plz, o.name, m.address, v.bucket, v.weight, v.area FROM ( SELECT c.year AS year, c.mgnr AS mgnr, c.bucket AS bucket, COALESCE(d.weight, 0) AS weight, COALESCE(c.area, 0) AS area FROM v_area_commitment_bucket_strict c LEFT JOIN v_delivery_bucket_strict d ON (d.year, d.mgnr, d.bucket) = (c.year, c.mgnr, c.bucket) WHERE c.year = {year} UNION SELECT d.year, d.mgnr, d.bucket, COALESCE(d.weight, 0), COALESCE(c.area, 0) FROM v_delivery_bucket_strict d LEFT JOIN v_area_commitment_bucket_strict c ON (c.year, c.mgnr, c.bucket) = (d.year, d.mgnr, d.bucket) WHERE d.year = {year} ) v LEFT JOIN member m ON m.mgnr = v.mgnr LEFT JOIN AT_plz_dest p ON p.id = m.postal_dest LEFT JOIN AT_ort o ON o.okz = p.okz ORDER BY m.mgnr, v.bucket """; 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).Split(',')[0]; var addr = reader.GetString(5); var id = reader.GetString(6); var sum = reader.GetInt32(7); var area = reader.GetInt32(8); await file.WriteLineAsync($"{mgnr};{familyName};{givenName};{addr};{plz};{ort};{id[..2]};{id[2..]};{sum};{area};{(area > 0 ? sum * 10000 / area : "")}"); } } } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } Mouse.OverrideCursor = null; } private void PaymentButton_Click(object sender, RoutedEventArgs evt) { var w = new ChartWindow(); w.Show(); } } }