[#13][#31] DeliveryAdminWindow: Rework menu and add DeliveryJournal export

This commit is contained in:
2024-03-27 16:10:28 +01:00
parent cac0959fe7
commit 7f21b7b231
5 changed files with 317 additions and 123 deletions

View File

@ -2,6 +2,7 @@ using Elwig.Documents;
using Elwig.Helpers;
using Elwig.Helpers.Export;
using Elwig.Helpers.Weighing;
using Elwig.Models.Dtos;
using Elwig.Models.Entities;
using LinqKit;
using Microsoft.EntityFrameworkCore;
@ -31,8 +32,13 @@ namespace Elwig.Windows {
private List<string> TextFilter = [];
private readonly RoutedCommand CtrlF = new("CtrlF", typeof(DeliveryAdminWindow), [new KeyGesture(Key.F, ModifierKeys.Control)]);
private readonly RoutedCommand CtrlL = new("CtrlL", typeof(DeliveryAdminWindow), [new KeyGesture(Key.L, ModifierKeys.Control)]);
private readonly RoutedCommand CtrlP = new("CtrlP", typeof(DeliveryAdminWindow), [new KeyGesture(Key.P, ModifierKeys.Control)]);
private readonly RoutedCommand CtrlO = new("CtrlO", typeof(DeliveryAdminWindow), [new KeyGesture(Key.O, ModifierKeys.Control)]);
private readonly RoutedCommand CtrlJ = new("CtrlJ", typeof(DeliveryAdminWindow), [new KeyGesture(Key.J, ModifierKeys.Control)]);
private readonly RoutedCommand CtrlQ = new("CtrlQ", typeof(DeliveryAdminWindow), [new KeyGesture(Key.Q, ModifierKeys.Control)]);
private readonly RoutedCommand CtrlShiftP = new("CtrlShiftP", typeof(DeliveryAdminWindow), [new KeyGesture(Key.P, ModifierKeys.Control | ModifierKeys.Shift)]);
private readonly RoutedCommand CtrlShiftO = new("CtrlShiftO", typeof(DeliveryAdminWindow), [new KeyGesture(Key.O, ModifierKeys.Control | ModifierKeys.Shift)]);
private string? LastScaleError = null;
private string? ManualWeighingReason = null;
@ -43,8 +49,13 @@ namespace Elwig.Windows {
public DeliveryAdminWindow(bool receipt = false) {
InitializeComponent();
CommandBindings.Add(new CommandBinding(CtrlF, FocusSearchInput));
CommandBindings.Add(new CommandBinding(CtrlP, Menu_Print_ShowDeliveryNote_Click));
CommandBindings.Add(new CommandBinding(CtrlShiftP, Menu_Print_PrintDeliveryNote_Click));
CommandBindings.Add(new CommandBinding(CtrlL, Menu_DeliveryJournal_SaveFilters_Click));
CommandBindings.Add(new CommandBinding(CtrlP, Menu_DeliveryNote_Show_Click));
CommandBindings.Add(new CommandBinding(CtrlO, Menu_DeliveryJournal_ShowFilters_Click));
CommandBindings.Add(new CommandBinding(CtrlJ, Menu_DeliveryJournal_PrintToday_Click));
CommandBindings.Add(new CommandBinding(CtrlQ, Menu_WineQualityStatistics_PrintToday_Click));
CommandBindings.Add(new CommandBinding(CtrlShiftP, Menu_DeliveryNote_Print_Click));
CommandBindings.Add(new CommandBinding(CtrlShiftO, Menu_DeliveryJournal_PrintFilters_Click));
RequiredInputs = [
MgNrInput, MemberInput,
LsNrInput, DateInput, BranchInput,
@ -132,35 +143,48 @@ namespace Elwig.Windows {
}
}
private async void Menu_Print_ShowDeliveryNote_Click(object sender, RoutedEventArgs evt) {
if (DeliveryList.SelectedItem is not Delivery d) return;
private async void Menu_DeliveryNote_Show_Click(object sender, RoutedEventArgs evt) {
if (DeliveryList.SelectedItem is not Delivery d)
return;
await GenerateDeliveryNote(d.Year, d.DId, 0);
}
private async void Menu_DeliveryNote_Print_Click(object sender, RoutedEventArgs evt) {
if (DeliveryList.SelectedItem is not Delivery d)
return;
await GenerateDeliveryNote(d.Year, d.DId, 1);
}
private async void Menu_DeliveryNote_Email_Click(object sender, RoutedEventArgs evt) {
if (DeliveryList.SelectedItem is not Delivery d)
return;
await GenerateDeliveryNote(d.Year, d.DId, 2);
}
private static async Task GenerateDeliveryNote(int year, int did, int mode) {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
using var ctx = new AppDbContext();
using var doc = new DeliveryNote((await ctx.Deliveries.FindAsync(d.Year, d.DId))!, ctx);
var d = (await ctx.Deliveries.FindAsync(year, did))!;
using var doc = new DeliveryNote(d, ctx);
await doc.Generate();
doc.Show();
if (mode == 1 && !App.Config.Debug) {
await doc.Print();
} else if (mode == 2) {
var success = await Utils.SendEmail(d.Member, $"{DeliveryNote.Name} Nr. {d.LsNr}", $"Im Anhang finden Sie den {DeliveryNote.Name} Nr. {d.LsNr}", [doc]);
if (success)
MessageBox.Show("Die E-Mail wurde erfolgreich verschickt!", "E-Mail verschickt",
MessageBoxButton.OK, MessageBoxImage.Information);
} else {
doc.Show();
}
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
Mouse.OverrideCursor = null;
}
private async void Menu_Print_PrintDeliveryNote_Click(object sender, RoutedEventArgs evt) {
if (DeliveryList.SelectedItem is not Delivery d) return;
Mouse.OverrideCursor = Cursors.AppStarting;
try {
using var ctx = new AppDbContext();
using var doc = new DeliveryNote((await ctx.Deliveries.FindAsync(d.Year, d.DId))!, ctx);
await doc.Generate();
await doc.Print();
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
Mouse.OverrideCursor = null;
}
private async void Menu_Export_Bki_Click(object sender, RoutedEventArgs evt) {
private async void Menu_Bki_SaveList_Click(object sender, RoutedEventArgs evt) {
if (sender is not MenuItem m) return;
var year = int.Parse(m.Header.ToString()?.Split(" ")[^1] ?? Utils.CurrentLastSeason.ToString());
var d = new SaveFileDialog() {
@ -177,58 +201,113 @@ namespace Elwig.Windows {
}
}
private async void Menu_Print_DeliveryJournal_ShowToday_Click(object sender, RoutedEventArgs evt) {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
using var ctx = new AppDbContext();
using var doc = new DeliveryJournal(ctx, DateOnly.FromDateTime(Utils.Today));
await doc.Generate();
doc.Show();
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
Mouse.OverrideCursor = null;
private async void Menu_DeliveryJournal_SaveToday_Click(object sender, RoutedEventArgs evt) {
await GenerateDeliveryJournal(1, 0);
}
private async void Menu_Print_DeliveryJournal_PrintToday_Click(object sender, RoutedEventArgs evt) {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
using var ctx = new AppDbContext();
using var doc = new DeliveryJournal(ctx, DateOnly.FromDateTime(Utils.Today));
await doc.Generate();
await doc.Print();
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
Mouse.OverrideCursor = null;
private async void Menu_DeliveryJournal_ShowToday_Click(object sender, RoutedEventArgs evt) {
await GenerateDeliveryJournal(1, 1);
}
private async void Menu_Print_DeliveryJournal_ShowFilter_Click(object sender, RoutedEventArgs evt) {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
using var ctx = new AppDbContext();
var (f, _, d, _, _) = await GetFilters(ctx);
var doc = new DeliveryJournal(string.Join(" / ", f), d);
await doc.Generate();
doc.Show();
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
Mouse.OverrideCursor = null;
private async void Menu_DeliveryJournal_PrintToday_Click(object sender, RoutedEventArgs evt) {
await GenerateDeliveryJournal(1, 2);
}
private async void Menu_Print_DeliveryJournal_PrintFilter_Click(object sender, RoutedEventArgs evt) {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
using var ctx = new AppDbContext();
var (f, _, d, _, _) = await GetFilters(ctx);
var doc = new DeliveryJournal(string.Join(" / ", f), d);
await doc.Generate();
doc.Show();
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
private async void Menu_DeliveryJournal_SaveFilters_Click(object sender, RoutedEventArgs evt) {
await GenerateDeliveryJournal(0, 0);
}
private async void Menu_DeliveryJournal_ShowFilters_Click(object sender, RoutedEventArgs evt) {
await GenerateDeliveryJournal(0, 1);
}
private async void Menu_DeliveryJournal_PrintFilters_Click(object sender, RoutedEventArgs evt) {
await GenerateDeliveryJournal(0, 2);
}
private async Task GenerateDeliveryJournal(int modeWho, int modeWhat) {
using var ctx = new AppDbContext();
IQueryable<DeliveryPart> query;
List<string> filterNames = [];
if (modeWho == 0) {
var (f, _, q, _, _) = await GetFilters(ctx);
query = q;
filterNames.AddRange(f);
} else {
var date = $"{Utils.Today:yyyy-MM-dd}";
query = ctx.DeliveryParts
.Where(p => p.Delivery.DateString == date);
filterNames.Add($"{Utils.Today:dd.MM.yyyy}");
}
Mouse.OverrideCursor = null;
query = query
.OrderBy(p => p.Delivery.DateString)
.ThenBy(p => p.Delivery.TimeString)
.ThenBy(p => p.Delivery.LsNr)
.ThenBy(p => p.DPNr);
if (modeWhat == 0) {
var d = new SaveFileDialog() {
FileName = $"{DeliveryJournal.Name}.ods",
DefaultExt = "ods",
Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods",
Title = $"{DeliveryJournal.Name} speichern unter - Elwig"
};
if (d.ShowDialog() == true) {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
var data = await DeliveryJournalData.FromQuery(query, filterNames);
using var ods = new OdsFile(d.FileName);
await ods.AddTable(data);
} 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 DeliveryJournal(string.Join(" / ", filterNames), data);
await doc.Generate();
if (modeWhat == 2 && !App.Config.Debug) {
await doc.Print();
} else {
doc.Show();
}
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
Mouse.OverrideCursor = null;
}
}
private async void Menu_WineQualityStatistics_SaveToday_Click(object sender, RoutedEventArgs evt) {
await GenerateWineQualityStatistics(1, 0);
}
private async void Menu_WineQualityStatistics_ShowToday_Click(object sender, RoutedEventArgs evt) {
await GenerateWineQualityStatistics(1, 1);
}
private async void Menu_WineQualityStatistics_PrintToday_Click(object sender, RoutedEventArgs evt) {
await GenerateWineQualityStatistics(1, 2);
}
private async void Menu_WineQualityStatistics_SaveFilters_Click(object sender, RoutedEventArgs evt) {
await GenerateWineQualityStatistics(0, 0);
}
private async void Menu_WineQualityStatistics_ShowFilters_Click(object sender, RoutedEventArgs evt) {
await GenerateWineQualityStatistics(0, 1);
}
private async void Menu_WineQualityStatistics_PrintFilters_Click(object sender, RoutedEventArgs evt) {
await GenerateWineQualityStatistics(0, 2);
}
private async Task GenerateWineQualityStatistics(int modeWho, int modeWhat) {
// TODO
}
private void Menu_Settings_EnableFreeEditing_Checked(object sender, RoutedEventArgs evt) {
@ -753,7 +832,7 @@ namespace Elwig.Windows {
AddGradationToolTipRow(1, "Gradation", null, kmwMin, kmwAvg, kmwMax);
var attrGroups = await deliveryParts
.GroupBy(p => new { Attr = p.Attribute.Name, Cult = p.Cultivation.Name })
.GroupBy(p => new { Attr = p.Attribute!.Name, Cult = p.Cultivation!.Name })
.Select(g => new {
g.Key.Attr,
g.Key.Cult,
@ -779,8 +858,8 @@ namespace Elwig.Windows {
.ToListAsync();
var groups = await deliveryParts
.GroupBy(p => new {
Attr = p.Attribute.Name,
Cult = p.Cultivation.Name,
Attr = p.Attribute!.Name,
Cult = p.Cultivation!.Name,
p.SortId,
})
.Select(g => new {
@ -856,13 +935,13 @@ namespace Elwig.Windows {
Title = $"Lieferungen - {Member.AdministrativeName} - Elwig";
}
Menu_Export_Bki.Items.Clear();
Menu_Bki_SaveList.Items.Clear();
foreach (var s in await ctx.Seasons.OrderByDescending(s => s.Year).ToListAsync()) {
var i = new MenuItem {
Header = $"Saison {s.Year}",
};
i.Click += Menu_Export_Bki_Click;
Menu_Export_Bki.Items.Add(i);
i.Click += Menu_Bki_SaveList_Click;
Menu_Bki_SaveList.Items.Add(i);
}
await RefreshDeliveryList();
@ -1176,12 +1255,14 @@ namespace Elwig.Windows {
await RefreshDeliveryParts();
if (DeliveryList.SelectedItem != null) {
DeleteDeliveryButton.IsEnabled = true;
Menu_Print_ShowDeliveryNote.IsEnabled = !IsEditing && !IsCreating;
Menu_Print_PrintDeliveryNote.IsEnabled = !IsEditing && !IsCreating;
Menu_DeliveryNote_Show.IsEnabled = !IsEditing && !IsCreating;
Menu_DeliveryNote_Print.IsEnabled = !IsEditing && !IsCreating;
Menu_DeliveryNote_Email.IsEnabled = !IsEditing && !IsCreating;
} else {
DeleteDeliveryButton.IsEnabled = false;
Menu_Print_ShowDeliveryNote.IsEnabled = false;
Menu_Print_PrintDeliveryNote.IsEnabled = false;
Menu_DeliveryNote_Show.IsEnabled = false;
Menu_DeliveryNote_Print.IsEnabled = false;
Menu_DeliveryNote_Email.IsEnabled = false;
}
}