MemberAdminWindow: Add menu item for generating CreditNotes per member
All checks were successful
Test / Run tests (push) Successful in 2m5s

This commit is contained in:
2024-06-28 13:48:16 +02:00
parent 91c60018f1
commit bce2eea3ac
2 changed files with 114 additions and 15 deletions

View File

@ -71,6 +71,16 @@
<MenuItem x:Name="Menu_DeliveryConfirmation_Email" Header="...per E-Mail schicken" IsEnabled="False"
Click="Menu_DeliveryConfirmation_Email_Click"/>
</MenuItem>
<MenuItem Header="Traubengutschrift" x:Name="Menu_CreditNote">
<MenuItem x:Name="Menu_CreditNote_Show" Header="...anzeigen (PDF)" IsEnabled="False"
Click="Menu_CreditNote_Show_Click"/>
<MenuItem x:Name="Menu_CreditNote_SavePdf" Header="...speichern... (PDF)" IsEnabled="False"
Click="Menu_CreditNote_SavePdf_Click"/>
<MenuItem x:Name="Menu_CreditNote_Print" Header="...drucken" IsEnabled="False"
Click="Menu_CreditNote_Print_Click"/>
<MenuItem x:Name="Menu_CreditNote_Email" Header="...per E-Mail schicken" IsEnabled="False"
Click="Menu_CreditNote_Email_Click"/>
</MenuItem>
<MenuItem Header="Mitgliederliste" x:Name="Menu_List">
<MenuItem x:Name="Menu_List_SaveActive" Header="...mit Aktiven speichern (Excel)"
Click="Menu_List_SaveActive_Click" InputGestureText="Strg+L"/>

View File

@ -319,9 +319,10 @@ namespace Elwig.Windows {
ControlUtils.RenewItemsSource(BranchInput, await ctx.Branches.OrderBy(b => b.Name).ToListAsync());
ControlUtils.RenewItemsSource(DefaultKgInput, await ctx.WbKgs.Select(k => k.AtKg).OrderBy(k => k.Name).ToListAsync());
var seasons = await ctx.Seasons.OrderByDescending(s => s.Year).ToListAsync();
Menu_DeliveryConfirmation.Items.Clear();
foreach (var s in await ctx.Seasons.OrderByDescending(s => s.Year).ToListAsync()) {
var i = new MenuItem { Header = $"Saison {s.Year}...", IsEnabled = MemberList.SelectedItem != null };
foreach (var s in seasons) {
var i = new MenuItem { Header = $"Saison {s.Year}...", Tag = s.Year, IsEnabled = MemberList.SelectedItem != null };
var show = new MenuItem { Header = "...anzeigen (PDF)" };
show.Click += Menu_DeliveryConfirmation_Show_Click;
i.Items.Add(show);
@ -331,10 +332,31 @@ namespace Elwig.Windows {
var print = new MenuItem { Header = "...drucken" };
print.Click += Menu_DeliveryConfirmation_Print_Click;
i.Items.Add(print);
Menu_DeliveryConfirmation.Items.Add(i);
var email = new MenuItem { Header = "...per E-Mail schicken" };
email.Click += Menu_DeliveryConfirmation_Email_Click;
i.Items.Add(email);
Menu_DeliveryConfirmation.Items.Add(i);
}
Menu_CreditNote.Items.Clear();
foreach (var s in seasons) {
var i1 = new MenuItem { Header = $"Saison {s.Year}...", Tag = s.Year, IsEnabled = MemberList.SelectedItem != null };
foreach (var v in s.PaymentVariants.OrderByDescending(v => v.AvNr)) {
var i2 = new MenuItem { Header = $"...{v.Name}...", Tag = v.AvNr };
var show = new MenuItem { Header = "...anzeigen (PDF)" };
show.Click += Menu_CreditNote_Show_Click;
i2.Items.Add(show);
var pdf = new MenuItem { Header = "...speichern... (PDF)" };
pdf.Click += Menu_CreditNote_Email_Click;
i2.Items.Add(pdf);
var print = new MenuItem { Header = "...drucken" };
print.Click += Menu_CreditNote_Print_Click;
i2.Items.Add(print);
var email = new MenuItem { Header = "...per E-Mail schicken" };
email.Click += Menu_CreditNote_Email_Click;
i2.Items.Add(email);
i1.Items.Add(i2);
}
Menu_CreditNote.Items.Add(i1);
}
await RefreshMemberList();
@ -627,31 +649,31 @@ namespace Elwig.Windows {
}
private async void Menu_DeliveryConfirmation_Show_Click(object sender, RoutedEventArgs evt) {
var season = ((sender as MenuItem)?.Parent as MenuItem)?.Header?.ToString()?.Split(' ')[^1].Split('.')[0];
if (MemberList.SelectedItem is not Member m || season == null || !int.TryParse(season, out var s))
var year = (int?)((sender as MenuItem)?.Parent as MenuItem)?.Tag;
if (MemberList.SelectedItem is not Member m || year == null)
return;
await GenerateDeliveryConfirmation(m, s, ExportMode.Show);
await GenerateDeliveryConfirmation(m, (int)year, ExportMode.Show);
}
private async void Menu_DeliveryConfirmation_SavePdf_Click(object sender, RoutedEventArgs evt) {
var season = ((sender as MenuItem)?.Parent as MenuItem)?.Header?.ToString()?.Split(' ')[^1].Split('.')[0];
if (MemberList.SelectedItem is not Member m || season == null || !int.TryParse(season, out var s))
var year = (int?)((sender as MenuItem)?.Parent as MenuItem)?.Tag;
if (MemberList.SelectedItem is not Member m || year == null)
return;
await GenerateDeliveryConfirmation(m, s, ExportMode.SavePdf);
await GenerateDeliveryConfirmation(m, (int)year, ExportMode.SavePdf);
}
private async void Menu_DeliveryConfirmation_Print_Click(object sender, RoutedEventArgs evt) {
var season = ((sender as MenuItem)?.Parent as MenuItem)?.Header?.ToString()?.Split(' ')[^1].Split('.')[0];
if (MemberList.SelectedItem is not Member m || season == null || !int.TryParse(season, out var s))
var year = (int?)((sender as MenuItem)?.Parent as MenuItem)?.Tag;
if (MemberList.SelectedItem is not Member m || year == null)
return;
await GenerateDeliveryConfirmation(m, s, ExportMode.Print);
await GenerateDeliveryConfirmation(m, (int)year, ExportMode.Print);
}
private async void Menu_DeliveryConfirmation_Email_Click(object sender, RoutedEventArgs evt) {
var season = ((sender as MenuItem)?.Parent as MenuItem)?.Header?.ToString()?.Split(' ')[^1].Split('.')[0];
if (MemberList.SelectedItem is not Member m || season == null || !int.TryParse(season, out var s))
var year = (int?)((sender as MenuItem)?.Parent as MenuItem)?.Tag;
if (MemberList.SelectedItem is not Member m || year == null)
return;
await GenerateDeliveryConfirmation(m, s, ExportMode.Email);
await GenerateDeliveryConfirmation(m, (int)year, ExportMode.Email);
}
private static async Task GenerateDeliveryConfirmation(Member m, int year, ExportMode mode) {
@ -672,6 +694,57 @@ namespace Elwig.Windows {
Mouse.OverrideCursor = null;
}
private async void Menu_CreditNote_Show_Click(object sender, RoutedEventArgs evt) {
var year = (int?)(((sender as MenuItem)?.Parent as MenuItem)?.Parent as MenuItem)?.Tag;
var avnr = (int?)((sender as MenuItem)?.Parent as MenuItem)?.Tag;
if (MemberList.SelectedItem is not Member m || year == null || avnr == null)
return;
await GenerateCreditNote(m, (int)year, (int)avnr, ExportMode.Show);
}
private async void Menu_CreditNote_SavePdf_Click(object sender, RoutedEventArgs evt) {
var year = (int?)(((sender as MenuItem)?.Parent as MenuItem)?.Parent as MenuItem)?.Tag;
var avnr = (int?)((sender as MenuItem)?.Parent as MenuItem)?.Tag;
if (MemberList.SelectedItem is not Member m || year == null || avnr == null)
return;
await GenerateCreditNote(m, (int)year, (int)avnr, ExportMode.SavePdf);
}
private async void Menu_CreditNote_Print_Click(object sender, RoutedEventArgs evt) {
var year = (int?)(((sender as MenuItem)?.Parent as MenuItem)?.Parent as MenuItem)?.Tag;
var avnr = (int?)((sender as MenuItem)?.Parent as MenuItem)?.Tag;
if (MemberList.SelectedItem is not Member m || year == null || avnr == null)
return;
await GenerateCreditNote(m, (int)year, (int)avnr, ExportMode.Print);
}
private async void Menu_CreditNote_Email_Click(object sender, RoutedEventArgs evt) {
var year = (int?)(((sender as MenuItem)?.Parent as MenuItem)?.Parent as MenuItem)?.Tag;
var avnr = (int?)((sender as MenuItem)?.Parent as MenuItem)?.Tag;
if (MemberList.SelectedItem is not Member m || year == null || avnr == null)
return;
await GenerateCreditNote(m, (int)year, (int)avnr, ExportMode.Email);
}
private static async Task GenerateCreditNote(Member m, int year, int avnr, ExportMode mode) {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
using var ctx = new AppDbContext();
var v = (await ctx.PaymentVariants.FindAsync(year, avnr))!;
var data = await CreditNoteDeliveryData.ForPaymentVariant(ctx.CreditNoteDeliveryRows, ctx.Seasons, year, avnr);
var p = (await ctx.MemberPayments.FindAsync(year, avnr, m.MgNr))!;
var b = BillingData.FromJson((await ctx.PaymentVariants.FindAsync(year, avnr))!.Data);
using var doc = new CreditNote(ctx, p, data[m.MgNr],
b.ConsiderContractPenalties, b.ConsiderTotalPenalty, b.ConsiderAutoBusinessShares, b.ConsiderCustomModifiers,
await ctx.GetMemberUnderDelivery(year, m.MgNr));
await Utils.ExportDocument(doc, mode, emailData: (m, $"{CreditNote.Name} {v.Name}", $"Im Anhang finden Sie die Traubengutschrift {v.Name}"));
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
Mouse.OverrideCursor = null;
}
private async void Menu_List_SaveActive_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(0, ExportMode.SaveList); }
private async void Menu_List_ShowActive_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(0, ExportMode.Show); }
private async void Menu_List_SavePdfActive_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(0, ExportMode.SavePdf); }
@ -1063,12 +1136,18 @@ namespace Elwig.Windows {
ContactPostalInput.IsChecked = m.ContactViaPost;
ContactEmailInput.IsChecked = m.ContactViaEmail;
Dictionary<int, int> delivieries;
using (var ctx = new AppDbContext()) {
var d1 = ctx.Deliveries.Where(d => d.Year == Utils.CurrentLastSeason && d.MgNr == m.MgNr);
var d2 = ctx.Deliveries.Where(d => d.Year == Utils.CurrentLastSeason - 1 && d.MgNr == m.MgNr);
StatusDeliveriesLastSeason.Text = $"Lieferungen ({Utils.CurrentLastSeason - 1}): {d2.Count():N0} ({d2.Sum(d => d.Parts.Count):N0}), {d2.SelectMany(d => d.Parts).Sum(p => p.Weight):N0} kg";
StatusDeliveriesThisSeason.Text = $"Lieferungen ({Utils.CurrentLastSeason}): {d1.Count():N0} ({d1.Sum(d => d.Parts.Count):N0}), {d1.SelectMany(d => d.Parts).Sum(p => p.Weight):N0} kg";
StatusAreaCommitment.Text = $"Gebundene Fläche: {m.ActiveAreaCommitments(ctx).Select(c => c.Area).Sum():N0} m²";
delivieries = ctx.Deliveries
.Where(d => d.MgNr == m.MgNr)
.SelectMany(d => d.Parts)
.GroupBy(d => d.Year)
.ToDictionary(g => g.Key, g => g.Sum(d => d.Weight));
}
Menu_Contact_Email.IsEnabled = m.EmailAddresses.Count > 0;
@ -1081,6 +1160,13 @@ namespace Elwig.Windows {
i.IsEnabled = true;
(i.Items[^1] as MenuItem)!.IsEnabled = App.Config.Smtp != null && m.EmailAddresses.Count > 0;
}
foreach (var i in Menu_CreditNote.Items.Cast<MenuItem>()) {
var year = (int)i.Tag;
i.IsEnabled = delivieries.GetValueOrDefault(year, 0) > 0;
foreach (var v in i.Items.Cast<MenuItem>()) {
(v.Items[^1] as MenuItem)!.IsEnabled = App.Config.Smtp != null && m.EmailAddresses.Count > 0;
}
}
FinishInputFilling();
}
@ -1095,6 +1181,9 @@ namespace Elwig.Windows {
foreach (var i in Menu_DeliveryConfirmation.Items.Cast<MenuItem>()) {
i.IsEnabled = false;
}
foreach (var i in Menu_CreditNote.Items.Cast<MenuItem>()) {
i.IsEnabled = false;
}
MemberReferenceButton.IsEnabled = false;
StatusDeliveriesLastSeason.Text = $"Lieferungen ({Utils.CurrentLastSeason - 1}): -";
StatusDeliveriesThisSeason.Text = $"Lieferungen ({Utils.CurrentLastSeason}): -";