146 lines
6.6 KiB
C#
146 lines
6.6 KiB
C#
using Elwig.Helpers;
|
|
using Elwig.Helpers.Billing;
|
|
using Elwig.Models.Dtos;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
|
|
namespace Elwig.Windows {
|
|
public partial class PaymentAdjustmentWindow : ContextWindow {
|
|
|
|
public readonly int Year;
|
|
public readonly bool SeasonLocked;
|
|
|
|
public PaymentAdjustmentWindow(int year) {
|
|
InitializeComponent();
|
|
Year = year;
|
|
using (var ctx = new AppDbContext()) {
|
|
SeasonLocked = ctx.Seasons.Find(Year + 1) != null;
|
|
}
|
|
Title = $"Auszahlung anpassen - Lese {Year} - Elwig";
|
|
AutoAdjustBsButton.IsEnabled = !SeasonLocked;
|
|
UnAdjustBsButton.IsEnabled = !SeasonLocked;
|
|
|
|
AllowanceKgInput.Text = $"{App.Client.AutoAdjustBs.AllowanceKg}";
|
|
AllowanceBsInput.Text = $"{App.Client.AutoAdjustBs.AllowanceBs}";
|
|
AllowanceKgPerBsInput.Text = $"{App.Client.AutoAdjustBs.AllowanceKgPerBs}";
|
|
AllowancePercentInput.Text = $"{App.Client.AutoAdjustBs.AllowancePercent}";
|
|
MinBsInput.Text = $"{App.Client.AutoAdjustBs.MinBs}";
|
|
}
|
|
|
|
protected override async Task OnRenewContext(AppDbContext ctx) {
|
|
var members = await ctx.Members
|
|
.Select(m => new {
|
|
m.MgNr,
|
|
m.FamilyName,
|
|
m.GivenName,
|
|
m.BusinessShares,
|
|
})
|
|
.OrderBy(m => m.FamilyName)
|
|
.ThenBy(m => m.GivenName)
|
|
.ThenBy(m => m.MgNr)
|
|
.ToListAsync();
|
|
var season = (await ctx.Seasons.FindAsync(Year))!;
|
|
|
|
var tbl = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, Year);
|
|
var weight = tbl.Rows.ToDictionary(r => r.MgNr, r => r.Weight);
|
|
|
|
var history = await ctx.MemberHistory
|
|
.Where(h => h.DateString.CompareTo($"{Year}-01-01") >= 0 && h.DateString.CompareTo($"{Year}-12-31") <= 0 && h.Type == "auto" && h.BusinessShares > 0)
|
|
.GroupBy(h => h.Member)
|
|
.ToDictionaryAsync(h => h.Key.MgNr, h => h.Sum(g => g.BusinessShares));
|
|
|
|
var list = members
|
|
.Select(m => new {
|
|
m.MgNr,
|
|
m.FamilyName,
|
|
m.GivenName,
|
|
BusinessShares = m.BusinessShares - history.GetValueOrDefault(m.MgNr, 0),
|
|
DeliveryObligation = (m.BusinessShares - history.GetValueOrDefault(m.MgNr, 0)) * season.MinKgPerBusinessShare,
|
|
DeliveryRight = (m.BusinessShares - history.GetValueOrDefault(m.MgNr, 0)) * season.MaxKgPerBusinessShare,
|
|
})
|
|
.Select(m => new {
|
|
m.MgNr,
|
|
m.FamilyName,
|
|
m.GivenName,
|
|
m.BusinessShares,
|
|
OverUnder = weight.TryGetValue(m.MgNr, out int v1) ?
|
|
(v1 < m.DeliveryObligation ? (int?)v1 - m.DeliveryObligation :
|
|
v1 > m.DeliveryRight ? (int?)v1 - m.DeliveryRight : null)
|
|
: null,
|
|
Adjust = history.TryGetValue(m.MgNr, out int v2) ? (int?)v2 : null
|
|
})
|
|
.Where(m => m.OverUnder != null || m.Adjust != null)
|
|
.OrderByDescending(m => m.OverUnder)
|
|
.ThenBy(m => m.FamilyName)
|
|
.ThenBy(m => m.GivenName)
|
|
.ThenBy(m => m.MgNr)
|
|
.ToList();
|
|
|
|
MemberList.ItemsSource = list;
|
|
}
|
|
|
|
private async void AutoAdjustBsButton_Click(object sender, RoutedEventArgs evt) {
|
|
Mouse.OverrideCursor = Cursors.AppStarting;
|
|
try {
|
|
int? kg = AllowanceKgInput.Text == "" ? null : int.Parse(AllowanceKgInput.Text);
|
|
double? bs = AllowanceBsInput.Text == "" ? null : double.Parse(AllowanceBsInput.Text);
|
|
int? kgPerBs = AllowanceKgPerBsInput.Text == "" ? null : int.Parse(AllowanceKgPerBsInput.Text);
|
|
double? percent = AllowancePercentInput.Text == "" ? null : double.Parse(AllowancePercentInput.Text);
|
|
int? minBs = MinBsInput.Text == "" ? null : int.Parse(MinBsInput.Text);
|
|
|
|
App.Client.AutoAdjustBs.AllowanceKg = kg;
|
|
App.Client.AutoAdjustBs.AllowanceBs = bs;
|
|
App.Client.AutoAdjustBs.AllowanceKgPerBs = kgPerBs;
|
|
App.Client.AutoAdjustBs.AllowancePercent = percent;
|
|
App.Client.AutoAdjustBs.MinBs = minBs;
|
|
await App.Client.UpdateValues();
|
|
|
|
var b = new Billing(Year);
|
|
await b.AutoAdjustBusinessShares(new DateOnly(Year, 11, 30), kg ?? default, bs ?? default, kgPerBs ?? default, percent / 100.0 ?? default, minBs ?? default);
|
|
await App.HintContextChange();
|
|
} catch (Exception exc) {
|
|
var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message;
|
|
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
|
|
MessageBox.Show(str, "GA Nachzeichnen", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
}
|
|
Mouse.OverrideCursor = null;
|
|
}
|
|
|
|
private async void UnAdjustBsButton_Click(object sender, RoutedEventArgs evt) {
|
|
Mouse.OverrideCursor = Cursors.AppStarting;
|
|
try {
|
|
var b = new Billing(Year);
|
|
await b.UnAdjustBusinessShares();
|
|
await App.HintContextChange();
|
|
} catch (Exception exc) {
|
|
var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message;
|
|
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
|
|
MessageBox.Show(str, "GA Nachzeichnen", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
}
|
|
Mouse.OverrideCursor = null;
|
|
}
|
|
|
|
private void SeasonButton_Click(object sender, RoutedEventArgs evt) {
|
|
App.FocusBaseDataSeason(Year);
|
|
}
|
|
|
|
private void KgInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
Validator.CheckInteger((TextBox)sender, false, 6);
|
|
}
|
|
|
|
private void BsInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
Validator.CheckInteger((TextBox)sender, false, 3);
|
|
}
|
|
|
|
private void PercentInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
Validator.CheckDecimal((TextBox)sender, false, 3, 2);
|
|
}
|
|
}
|
|
}
|