PaymentVariantsWindow: Add estimates for uncommited variants
This commit is contained in:
		| @@ -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) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user