MemberAdminWindow: Add menu item for generating CreditNotes per member
All checks were successful
Test / Run tests (push) Successful in 2m5s
All checks were successful
Test / Run tests (push) Successful in 2m5s
This commit is contained in:
@ -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"/>
|
||||
|
@ -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}): -";
|
||||
|
Reference in New Issue
Block a user