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);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |