From 913129f155bb1f8257ded4a25bec8cd2cd486783 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Thu, 3 Jul 2025 11:33:56 +0200 Subject: [PATCH] PaymentVariantsWindow: Add estimates for uncommited variants --- Elwig/Windows/PaymentVariantsWindow.xaml.cs | 132 ++++++++++++++------ 1 file changed, 95 insertions(+), 37 deletions(-) diff --git a/Elwig/Windows/PaymentVariantsWindow.xaml.cs b/Elwig/Windows/PaymentVariantsWindow.xaml.cs index b3006bc..0985dc1 100644 --- a/Elwig/Windows/PaymentVariantsWindow.xaml.cs +++ b/Elwig/Windows/PaymentVariantsWindow.xaml.cs @@ -1,18 +1,18 @@ +using Elwig.Documents; using Elwig.Helpers; +using Elwig.Helpers.Billing; +using Elwig.Helpers.Export; using Elwig.Models.Dtos; using Elwig.Models.Entities; using Microsoft.EntityFrameworkCore; +using Microsoft.Win32; using System; using System.Linq; +using System.Text.Json; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; -using Elwig.Helpers.Billing; -using Elwig.Helpers.Export; -using Microsoft.Win32; -using System.Text.Json; -using Elwig.Documents; namespace Elwig.Windows { public partial class PaymentVariantsWindow : ContextWindow { @@ -57,10 +57,10 @@ namespace Elwig.Windows { .OrderBy(v => v.AvNr) .Include(v => v.Season.Currency) .ToListAsync()); - await Update(); + Update(); } - private async Task Update() { + private void Update() { if (PaymentVariantList.SelectedItem is PaymentVar v) { var locked = !v.TestVariant; DeleteButton.IsEnabled = !locked; @@ -123,6 +123,15 @@ namespace Elwig.Windows { ConsiderAutoInput.IsEnabled = !locked; ConsiderCustomInput.IsEnabled = !locked; DataInput.IsReadOnly = locked; + + ModifierSum.Text = "..."; + TotalSum.Text = "..."; + VatSum.Text = "..."; + DeductionSum.Text = "..."; + PaymentSum.Text = "..."; + Utils.RunBackground("Variantendaten laden", async () => { + await UpdateSums(v); + }); } else { EditButton.Content = "Bearbeiten"; EditButton.IsEnabled = false; @@ -167,8 +176,14 @@ namespace Elwig.Windows { ConsiderCustomInput.IsEnabled = false; DataInput.Text = ""; DataInput.IsReadOnly = true; + + ModifierSum.Text = "-"; + TotalSum.Text = "-"; + VatSum.Text = "-"; + DeductionSum.Text = "-"; + PaymentSum.Text = "-"; } - await UpdateSums(); + UpdateSaveButton(); } @@ -187,41 +202,84 @@ namespace Elwig.Windows { CommitButton.IsEnabled = CalculateButton.IsEnabled; } - private async Task UpdateSums() { - if (PaymentVariantList.SelectedItem is PaymentVar v) { - using var ctx = new AppDbContext(); - var sym = v.Season.Currency.Symbol ?? v.Season.Currency.Code; - var modSum = await ctx.PaymentDeliveryParts - .Where(p => p.Year == v.Year && p.AvNr == v.AvNr) - .SumAsync(p => p.AmountValue - p.NetAmountValue); - ModifierSum.Text = $"{v.Season.DecFromDb(modSum):N2} {sym}"; - var totalSum = await ctx.MemberPayments - .Where(p => p.Year == v.Year && p.AvNr == v.AvNr) - .SumAsync(p => p.AmountValue); - TotalSum.Text = $"{v.Season.DecFromDb(totalSum):N2} {sym}"; - var credits = ctx.Credits.Where(c => c.Year == v.Year && c.AvNr == v.AvNr); - if (!credits.Any()) { - VatSum.Text = $"- {sym}"; - DeductionSum.Text = $"- {sym}"; - PaymentSum.Text = $"- {sym}"; + private async Task UpdateSums(PaymentVar v) { + if (App.MainDispatcher == null) + return; + var modText = "-"; + var totalText = "-"; + var vatText = "-"; + var deductionText = "-"; + var paymentText = "-"; + + using var ctx = new AppDbContext(); + var sym = v.Season.Currency.Symbol ?? v.Season.Currency.Code; + + var modSum = await ctx.PaymentDeliveryParts + .Where(p => p.Year == v.Year && p.AvNr == v.AvNr) + .SumAsync(p => p.AmountValue - p.NetAmountValue); + modText = $"{v.Season.DecFromDb(modSum):N2} {sym}"; + + var totalSum = await ctx.MemberPayments + .Where(p => p.Year == v.Year && p.AvNr == v.AvNr) + .SumAsync(p => p.AmountValue); + totalText = $"{v.Season.DecFromDb(totalSum):N2} {sym}"; + + await App.MainDispatcher.BeginInvoke(() => { + if (PaymentVariantList.SelectedItem != v) + return; + ModifierSum.Text = modText; + TotalSum.Text = totalText; + }); + + var credits = ctx.Credits.Where(c => c.Year == v.Year && c.AvNr == v.AvNr); + if (!credits.Any()) { + long lastTotalSum = 0; + decimal vatSum = 0; + var currentPayments = await ctx.MemberPayments + .Where(p => p.Year == v.Year && p.AvNr == v.AvNr) + .ToDictionaryAsync(p => p.MgNr); + var lastV = await ctx.PaymentVariants + .Where(l => l.Year == v.Year && !l.TestVariant) + .OrderByDescending(l => l.TransferDateString ?? l.DateString) + .ThenByDescending(l => l.AvNr) + .FirstOrDefaultAsync(); + if (lastV != null) { + var lastPayments = await ctx.MemberPayments + .Where(p => p.Year == v.Year && p.AvNr == lastV.AvNr) + .ToDictionaryAsync(p => p.MgNr); + lastTotalSum = lastPayments.Sum(e => e.Value.AmountValue); + foreach (int mgnr in currentPayments.Keys) { + var c = currentPayments[mgnr]; + var l = lastPayments[mgnr]; + vatSum += (c.Amount - l.Amount) * (decimal)(c.Member.IsBuchführend ? v.Season.VatNormal : v.Season.VatFlatrate); + } } else { - // all values in the credit table are stored with precision 2! - TotalSum.Text = $"{Utils.DecFromDb(await credits.SumAsync(c => c.NetAmountValue), 2):N2} {sym}"; - VatSum.Text = $"{Utils.DecFromDb(await credits.SumAsync(c => c.VatAmountValue), 2):N2} {sym}"; - DeductionSum.Text = $"{-Utils.DecFromDb(await credits.SumAsync(c => c.ModifiersValue ?? 0), 2):N2} {sym}"; - PaymentSum.Text = $"{Utils.DecFromDb(await credits.SumAsync(c => c.AmountValue), 2):N2} {sym}"; + vatSum = currentPayments.Sum(e => e.Value.Amount * (decimal)(e.Value.Member.IsBuchführend ? v.Season.VatNormal : v.Season.VatFlatrate)); } + vatText = $"~{vatSum:N2} {sym}"; + deductionText = $"- {sym}"; + paymentText = $"~{v.Season.DecFromDb(totalSum - lastTotalSum) + vatSum:N2} {sym}"; } else { - ModifierSum.Text = "-"; - TotalSum.Text = "-"; - VatSum.Text = "-"; - DeductionSum.Text = "-"; - PaymentSum.Text = "-"; + // all values in the credit table are stored with precision 2! + totalText = $"{Utils.DecFromDb(await credits.SumAsync(c => c.NetAmountValue), 2):N2} {sym}"; + vatText = $"{Utils.DecFromDb(await credits.SumAsync(c => c.VatAmountValue), 2):N2} {sym}"; + deductionText = $"{-Utils.DecFromDb(await credits.SumAsync(c => c.ModifiersValue ?? 0), 2):N2} {sym}"; + paymentText = $"{Utils.DecFromDb(await credits.SumAsync(c => c.AmountValue), 2):N2} {sym}"; } + + await App.MainDispatcher.BeginInvoke(() => { + if (PaymentVariantList.SelectedItem != v) + return; + ModifierSum.Text = modText; + TotalSum.Text = totalText; + VatSum.Text = vatText; + DeductionSum.Text = deductionText; + PaymentSum.Text = paymentText; + }); } - private async void PaymentVariantList_SelectionChanged(object sender, SelectionChangedEventArgs evt) { - await Update(); + private void PaymentVariantList_SelectionChanged(object sender, SelectionChangedEventArgs evt) { + Update(); } private async void AddButton_Click(object sender, RoutedEventArgs evt) {