diff --git a/Elwig/Helpers/Utils.cs b/Elwig/Helpers/Utils.cs index ad892f0..0d0b8be 100644 --- a/Elwig/Helpers/Utils.cs +++ b/Elwig/Helpers/Utils.cs @@ -30,6 +30,7 @@ namespace Elwig.Helpers { public static int CurrentYear => DateTime.Now.Year; public static int CurrentNextSeason => DateTime.Now.Year - (DateTime.Now.Month <= 3 ? 1 : 0); public static int CurrentLastSeason => DateTime.Now.Year - (DateTime.Now.Month <= 7 ? 1 : 0); + public static int FollowingSeason => DateTime.Now.Year + (DateTime.Now.Month >= 11 ? 1 : 0); public static DateTime Today => (DateTime.Now.Hour >= 3) ? DateTime.Today : DateTime.Today.AddDays(-1); [GeneratedRegex("^serial://([A-Za-z0-9]+):([0-9]+)(,([5-9]),([NOEMSnoems]),(0|1|1\\.5|2|))?$", RegexOptions.Compiled)] diff --git a/Elwig/Windows/MemberAdminWindow.xaml.cs b/Elwig/Windows/MemberAdminWindow.xaml.cs index a3dfc59..07f0012 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml.cs +++ b/Elwig/Windows/MemberAdminWindow.xaml.cs @@ -15,7 +15,9 @@ using System.Diagnostics; namespace Elwig.Windows { public partial class MemberAdminWindow : AdministrationWindow { - private List TextFilter = []; + protected bool TransferPredecessorAreaComs = false; + protected List TextFilter = []; + private readonly (ComboBox Type, TextBox Number, TextBox Comment)[] PhoneNrInputs; private readonly (Label Label, TextBox Address)[] EmailAddressInputs; @@ -23,7 +25,7 @@ namespace Elwig.Windows { private readonly RoutedCommand CtrlP = new("CtrlP", typeof(MemberAdminWindow), [new KeyGesture(Key.P, ModifierKeys.Control)]); private readonly RoutedCommand CtrlShiftP = new("CtrlShiftP", typeof(MemberAdminWindow), [new KeyGesture(Key.P, ModifierKeys.Control | ModifierKeys.Shift)]); - private static ObservableCollection> PhoneNrTypes { get; set; } = new(Utils.PhoneNrTypes); + protected static ObservableCollection> PhoneNrTypes { get; set; } = new(Utils.PhoneNrTypes); public MemberAdminWindow() { InitializeComponent(); @@ -338,6 +340,7 @@ namespace Elwig.Windows { IsCreating = true; MemberList.IsEnabled = false; MemberList.SelectedItem = null; + TransferPredecessorAreaComs = false; HideNewEditDeleteButtons(); ShowSaveResetCancelButtons(); UnlockInputs(); @@ -352,6 +355,7 @@ namespace Elwig.Windows { IsEditing = true; MemberList.IsEnabled = false; + TransferPredecessorAreaComs = false; HideNewEditDeleteButtons(); ShowSaveResetCancelButtons(); @@ -402,6 +406,7 @@ namespace Elwig.Windows { } private void ResetButton_Click(object sender, RoutedEventArgs evt) { + TransferPredecessorAreaComs = false; if (IsEditing) { RefreshInputs(); } else if (IsCreating) { @@ -415,6 +420,7 @@ namespace Elwig.Windows { IsEditing = false; IsCreating = false; MemberList.IsEnabled = true; + TransferPredecessorAreaComs = false; HideSaveResetCancelButtons(); ShowNewEditDeleteButtons(); RefreshInputs(); @@ -651,6 +657,33 @@ namespace Elwig.Windows { await ctx.SaveChangesAsync(); + if (TransferPredecessorAreaComs && m.PredecessorMgNr is int predecessor) { + var year = Utils.FollowingSeason; + var areaComs = await ctx.AreaCommitments + .Where(c => c.MgNr == predecessor && (c.YearTo == null || c.YearTo >= year)) + .ToListAsync(); + + var fbNr = await ctx.NextFbNr(); + ctx.AddRange(areaComs.Select((c, i) => new AreaCom { + FbNr = fbNr + i, + MgNr = m.MgNr, + VtrgId = c.VtrgId, + CultId = c.CultId, + Area = c.Area, + KgNr = c.KgNr, + GstNr = c.GstNr, + RdNr = c.RdNr, + YearFrom = year, + YearTo = c.YearTo, + })); + + foreach (var ac in areaComs) + ac.YearTo = year - 1; + ctx.UpdateRange(areaComs); + await ctx.SaveChangesAsync(); + } + TransferPredecessorAreaComs = false; + if (newMgNr != m.MgNr) { await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {oldMgNr}"); } @@ -804,8 +837,26 @@ namespace Elwig.Windows { InputTextChanged((TextBox)sender, Validator.CheckPredecessorMgNr); } - private void PredecessorMgNrInput_LostFocus(object sender, RoutedEventArgs evt) { - InputLostFocus((TextBox)sender, Validator.CheckPredecessorMgNr); + private async void PredecessorMgNrInput_LostFocus(object sender, RoutedEventArgs evt) { + var valid = InputLostFocus((TextBox)sender, Validator.CheckPredecessorMgNr); + if (valid && PredecessorMgNrInput.Text != "" && (IsEditing || IsCreating)) { + var mgnr = int.Parse(PredecessorMgNrInput.Text); + if (MemberList.SelectedItem is Member m && m.MgNr == mgnr) + return; + using var ctx = new AppDbContext(); + var areaComs = await ctx.AreaCommitments.Where(c => c.MgNr == mgnr && c.YearTo == null).ToListAsync(); + if (areaComs.Count == 0) + return; + var res = MessageBox.Show("Sollen die aktiven Flächenbindungen des angegebenen\n" + + $"Vorgängers übernommen werden? ({areaComs.Sum(c => c.Area)} m²)\n\n" + + "Die Flächenbindungen werden erst\nnach dem Speichern übernommen!", + "Aktive Flächenbindungen übernehmen", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No); + if (res != MessageBoxResult.Yes) + return; + TransferPredecessorAreaComs = true; + SetOriginalValue(PredecessorMgNrInput, -1); // hack to allow user to save + UpdateButtons(); + } } private new void EmailAddressInput_TextChanged(object sender, TextChangedEventArgs evt) {