Compare commits
3 Commits
3aebcee324
...
97300b6e30
Author | SHA1 | Date | |
---|---|---|---|
97300b6e30 | |||
c6c8fd9b68 | |||
913129f155 |
@@ -101,7 +101,7 @@
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
|
||||
<Button x:Name="SaveButton" Content="Speichern" IsEnabled="False"
|
||||
<Button x:Name="SaveButton" Content="Speichern & Berechnen" IsEnabled="False"
|
||||
HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="10,5,35,10" Grid.Column="0" Grid.Row="2"
|
||||
Click="SaveButton_Click"/>
|
||||
|
||||
|
@@ -651,6 +651,12 @@ namespace Elwig.Windows {
|
||||
ctx.Update(PaymentVar);
|
||||
await ctx.SaveChangesAsync();
|
||||
}
|
||||
try {
|
||||
var b = new BillingVariant(PaymentVar.Year, PaymentVar.AvNr);
|
||||
await b.Calculate();
|
||||
} catch (Exception exc) {
|
||||
MessageBox.Show(exc.Message, "Berechnungsfehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
LockContext = false;
|
||||
App.HintContextChange();
|
||||
} catch (Exception exc) {
|
||||
|
@@ -3,7 +3,8 @@
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Elwig.Windows"
|
||||
Title="Ausgangs-Protokoll - Rundschreiben - Elwig" Height="600" Width="1000">
|
||||
Title="Ausgangs-Protokoll - Rundschreiben - Elwig" Height="600" Width="1000"
|
||||
Loaded="Window_Loaded">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="3*"/>
|
||||
|
@@ -2,6 +2,7 @@ using Elwig.Helpers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace Elwig.Windows {
|
||||
@@ -18,8 +19,16 @@ namespace Elwig.Windows {
|
||||
FilterInput.TextChanged -= FilterInput_TextChanged;
|
||||
}
|
||||
|
||||
private async void Window_Loaded(object sender, RoutedEventArgs evt) {
|
||||
await Load();
|
||||
}
|
||||
|
||||
private async void TimeSpanInput_SelectionChanged(object sender, RoutedEventArgs evt) {
|
||||
if (!IsLoaded) return;
|
||||
await Load();
|
||||
}
|
||||
|
||||
private async Task Load() {
|
||||
DateTime? fromDate = DateTime.Now;
|
||||
if (TimeSpanInput.SelectedIndex == 0) {
|
||||
fromDate = fromDate.Value.AddDays(-7);
|
||||
|
@@ -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