[#41] MemberAdminWindow: Add feature to transfer area commitments from predecessor

This commit is contained in:
2024-03-19 18:27:19 +01:00
parent a9bad4dd3f
commit 1b822a88f3
2 changed files with 56 additions and 4 deletions

View File

@ -30,6 +30,7 @@ namespace Elwig.Helpers {
public static int CurrentYear => DateTime.Now.Year; public static int CurrentYear => DateTime.Now.Year;
public static int CurrentNextSeason => DateTime.Now.Year - (DateTime.Now.Month <= 3 ? 1 : 0); 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 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); 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)] [GeneratedRegex("^serial://([A-Za-z0-9]+):([0-9]+)(,([5-9]),([NOEMSnoems]),(0|1|1\\.5|2|))?$", RegexOptions.Compiled)]

View File

@ -15,7 +15,9 @@ using System.Diagnostics;
namespace Elwig.Windows { namespace Elwig.Windows {
public partial class MemberAdminWindow : AdministrationWindow { public partial class MemberAdminWindow : AdministrationWindow {
private List<string> TextFilter = []; protected bool TransferPredecessorAreaComs = false;
protected List<string> TextFilter = [];
private readonly (ComboBox Type, TextBox Number, TextBox Comment)[] PhoneNrInputs; private readonly (ComboBox Type, TextBox Number, TextBox Comment)[] PhoneNrInputs;
private readonly (Label Label, TextBox Address)[] EmailAddressInputs; 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 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 readonly RoutedCommand CtrlShiftP = new("CtrlShiftP", typeof(MemberAdminWindow), [new KeyGesture(Key.P, ModifierKeys.Control | ModifierKeys.Shift)]);
private static ObservableCollection<KeyValuePair<string, string>> PhoneNrTypes { get; set; } = new(Utils.PhoneNrTypes); protected static ObservableCollection<KeyValuePair<string, string>> PhoneNrTypes { get; set; } = new(Utils.PhoneNrTypes);
public MemberAdminWindow() { public MemberAdminWindow() {
InitializeComponent(); InitializeComponent();
@ -338,6 +340,7 @@ namespace Elwig.Windows {
IsCreating = true; IsCreating = true;
MemberList.IsEnabled = false; MemberList.IsEnabled = false;
MemberList.SelectedItem = null; MemberList.SelectedItem = null;
TransferPredecessorAreaComs = false;
HideNewEditDeleteButtons(); HideNewEditDeleteButtons();
ShowSaveResetCancelButtons(); ShowSaveResetCancelButtons();
UnlockInputs(); UnlockInputs();
@ -352,6 +355,7 @@ namespace Elwig.Windows {
IsEditing = true; IsEditing = true;
MemberList.IsEnabled = false; MemberList.IsEnabled = false;
TransferPredecessorAreaComs = false;
HideNewEditDeleteButtons(); HideNewEditDeleteButtons();
ShowSaveResetCancelButtons(); ShowSaveResetCancelButtons();
@ -402,6 +406,7 @@ namespace Elwig.Windows {
} }
private void ResetButton_Click(object sender, RoutedEventArgs evt) { private void ResetButton_Click(object sender, RoutedEventArgs evt) {
TransferPredecessorAreaComs = false;
if (IsEditing) { if (IsEditing) {
RefreshInputs(); RefreshInputs();
} else if (IsCreating) { } else if (IsCreating) {
@ -415,6 +420,7 @@ namespace Elwig.Windows {
IsEditing = false; IsEditing = false;
IsCreating = false; IsCreating = false;
MemberList.IsEnabled = true; MemberList.IsEnabled = true;
TransferPredecessorAreaComs = false;
HideSaveResetCancelButtons(); HideSaveResetCancelButtons();
ShowNewEditDeleteButtons(); ShowNewEditDeleteButtons();
RefreshInputs(); RefreshInputs();
@ -651,6 +657,33 @@ namespace Elwig.Windows {
await ctx.SaveChangesAsync(); 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) { if (newMgNr != m.MgNr) {
await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {oldMgNr}"); await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {oldMgNr}");
} }
@ -804,8 +837,26 @@ namespace Elwig.Windows {
InputTextChanged((TextBox)sender, Validator.CheckPredecessorMgNr); InputTextChanged((TextBox)sender, Validator.CheckPredecessorMgNr);
} }
private void PredecessorMgNrInput_LostFocus(object sender, RoutedEventArgs evt) { private async void PredecessorMgNrInput_LostFocus(object sender, RoutedEventArgs evt) {
InputLostFocus((TextBox)sender, Validator.CheckPredecessorMgNr); 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) { private new void EmailAddressInput_TextChanged(object sender, TextChangedEventArgs evt) {