348 lines
14 KiB
C#
348 lines
14 KiB
C#
using Elwig.Helpers;
|
|
using Elwig.Models.Entities;
|
|
using Elwig.Services;
|
|
using Elwig.ViewModels;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using System;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
|
|
namespace Elwig.Windows {
|
|
public partial class MemberBusinessSharesAdminWindow : AdministrationWindow {
|
|
|
|
public MemberBusinessSharesViewModel ViewModel => (MemberBusinessSharesViewModel)DataContext;
|
|
|
|
public MemberBusinessSharesAdminWindow(int mgnr) {
|
|
InitializeComponent();
|
|
using var ctx = new AppDbContext();
|
|
ViewModel.FilterMember = ctx.Members.Find(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value");
|
|
ViewModel.Title = $"Geschäftsanteilbewegungen - {ViewModel.FilterMember.AdministrativeName} - Elwig";
|
|
ExemptInputs = [
|
|
MemberHistoryList, TotalAmountInput
|
|
];
|
|
RequiredInputs = [
|
|
ReasonInput, DateNoticeInput, DateEffeciveInput, SharesInput
|
|
];
|
|
}
|
|
|
|
public void FocusMemberHistory(int histnr) {
|
|
if (IsEditing || IsCreating) return;
|
|
var item = ViewModel.History.FirstOrDefault(h => h.HistNr == histnr);
|
|
if (item != null) {
|
|
ControlUtils.SelectItem(MemberHistoryList, item);
|
|
}
|
|
}
|
|
|
|
private async Task RefreshList() {
|
|
var vm = ViewModel;
|
|
var cursor = Mouse.OverrideCursor != null;
|
|
if (!cursor) Mouse.OverrideCursor = Cursors.Wait;
|
|
var history = await Task.Run(async () => {
|
|
using var ctx = new AppDbContext();
|
|
return await ctx.MemberHistory
|
|
.Where(h => h.FromMgNr == vm.FilterMember.MgNr || h.ToMgNr == vm.FilterMember.MgNr)
|
|
.OrderBy(h => h.DateNoticeString).ThenBy(h => h.HistNr)
|
|
.ToListAsync();
|
|
});
|
|
if (!cursor) Mouse.OverrideCursor = null;
|
|
history.ForEach(h => h.PoVMgNr = vm.FilterMember.MgNr);
|
|
|
|
ControlUtils.RenewItemsSource(MemberHistoryList, history,
|
|
MemberHistoryList_SelectionChanged, ControlUtils.RenewSourceDefault.None);
|
|
RefreshInputs();
|
|
}
|
|
|
|
|
|
private void RefreshInputs(bool validate = false) {
|
|
ClearInputStates();
|
|
if (ViewModel.SelectedHistoryEntry is MemberHistory h) {
|
|
EditHistoryButton.IsEnabled = true;
|
|
DeleteHistoryButton.IsEnabled = true;
|
|
FillInputs(h);
|
|
} else {
|
|
EditHistoryButton.IsEnabled = false;
|
|
DeleteHistoryButton.IsEnabled = false;
|
|
ClearOriginalValues();
|
|
ClearDefaultValues();
|
|
ClearInputs(validate);
|
|
ClearInputStates();
|
|
}
|
|
GC.Collect();
|
|
}
|
|
|
|
private void FillInputs(MemberHistory h) {
|
|
ClearOriginalValues();
|
|
ClearDefaultValues();
|
|
ViewModel.FillInputs(h);
|
|
ReasonInput.SelectedValue = h.Reason + (h.Reason == MemberHistory.REASON_TRANSFER ? $"_{(h.FromMgNr == ViewModel.FilterMember.MgNr ? "to" : "from")}" : "");
|
|
FinishInputFilling();
|
|
}
|
|
|
|
private async Task InitInputs() {
|
|
ClearOriginalValues();
|
|
ClearDefaultValues();
|
|
await ViewModel.InitInputs();
|
|
SetDefaultValue(DateNoticeInput);
|
|
if (ViewModel.ValuePerShare != null)
|
|
SetDefaultValue(ValuePerShareInput);
|
|
ValidateRequiredInputs();
|
|
}
|
|
|
|
new protected void ClearInputs(bool validate = false) {
|
|
ViewModel.ClearInputs();
|
|
base.ClearInputs(validate);
|
|
}
|
|
|
|
override protected void UpdateButtons() {
|
|
if (!IsEditing && !IsCreating) return;
|
|
bool ch = HasChanged, v = IsValid;
|
|
ResetButton.IsEnabled = ch;
|
|
SaveButton.IsEnabled = v && ch;
|
|
}
|
|
|
|
protected override async Task OnRenewContext(AppDbContext ctx) {
|
|
await base.OnRenewContext(ctx);
|
|
|
|
if (await ctx.FetchMembers(ViewModel.FilterMember.MgNr).SingleOrDefaultAsync() is not Member m) {
|
|
Close();
|
|
return;
|
|
}
|
|
ViewModel.FilterMember = m;
|
|
ViewModel.Title = $"Geschäftsanteilbewegungen - {ViewModel.FilterMember.AdministrativeName} - Elwig";
|
|
|
|
ControlUtils.RenewItemsSource(OtherMemberInput, await ctx.FetchMembers(includeNotActive: true).ToListAsync());
|
|
|
|
MemberInfo.Text = $"{m.FullAdministrativeName}\nGA: {m.Shares:N0} (normal) / {m.SharesRed:N0} (rot) / {m.SharesWhite:N0} (weiß) / {m.SharesDormant:N0} (ruhend)";
|
|
|
|
await RefreshList();
|
|
}
|
|
|
|
private void MemberHistoryList_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) {
|
|
RefreshInputs();
|
|
}
|
|
|
|
protected override void ShortcutNew() {
|
|
if (!NewHistoryButton.IsEnabled || NewHistoryButton.Visibility != Visibility.Visible)
|
|
return;
|
|
NewHistoryButton_Click(null, null);
|
|
}
|
|
|
|
private async void NewHistoryButton_Click(object? sender, RoutedEventArgs? evt) {
|
|
IsCreating = true;
|
|
MemberHistoryList.IsEnabled = false;
|
|
ViewModel.SelectedHistoryEntry = null;
|
|
HideNewEditDeleteButtons();
|
|
ShowSaveResetCancelButtons();
|
|
UnlockInputs();
|
|
await InitInputs();
|
|
DeductInput.IsEnabled = false;
|
|
OtherMgNrInput.IsEnabled = false;
|
|
OtherMemberInput.IsEnabled = false;
|
|
}
|
|
|
|
protected override void ShortcutEdit() {
|
|
if (!EditHistoryButton.IsEnabled || EditHistoryButton.Visibility != Visibility.Visible)
|
|
return;
|
|
EditHistoryButton_Click(null, null);
|
|
}
|
|
|
|
private void EditHistoryButton_Click(object? sender, RoutedEventArgs? evt) {
|
|
if (ViewModel.SelectedHistoryEntry == null) return;
|
|
|
|
IsEditing = true;
|
|
MemberHistoryList.IsEnabled = false;
|
|
|
|
HideNewEditDeleteButtons();
|
|
ShowSaveResetCancelButtons();
|
|
UnlockInputs();
|
|
|
|
DeductInput.IsEnabled = ViewModel.Reason == MemberHistory.REASON_PURCHASE || ViewModel.Reason == MemberHistory.REASON_PRESCRIPTION;
|
|
OtherMgNrInput.IsEnabled = ViewModel.Reason?.StartsWith(MemberHistory.REASON_TRANSFER) ?? false;
|
|
OtherMemberInput.IsEnabled = OtherMgNrInput.IsEnabled;
|
|
}
|
|
|
|
protected override void ShortcutDelete() {
|
|
if (!DeleteHistoryButton.IsEnabled || DeleteHistoryButton.Visibility != Visibility.Visible)
|
|
return;
|
|
DeleteHistoryButton_Click(null, null);
|
|
}
|
|
|
|
private async void DeleteHistoryButton_Click(object? sender, RoutedEventArgs? evt) {
|
|
if (ViewModel.SelectedHistoryEntry is not MemberHistory h)
|
|
return;
|
|
|
|
if (InteractionService.AskContinueYesNo("Geschäftsanteilbewegung löschen", $"Soll die Geschäftsanteilbewegung wirklich unwiderruflich\ngelöscht werden?\n\nFalls ja:\nSoll die Änderung der aktuellen GA wieder rückgängig gemacht werden?") is bool enableTriggers) {
|
|
Mouse.OverrideCursor = Cursors.Wait;
|
|
try {
|
|
await MemberBusinessSharesService.DeleteMemberHistory(h.HistNr, enableTriggers);
|
|
App.HintContextChange();
|
|
} catch (Exception exc) {
|
|
InteractionService.ShowDbException("Geschäftsanteilbewegung löschen", exc);
|
|
}
|
|
Mouse.OverrideCursor = null;
|
|
}
|
|
}
|
|
|
|
protected override void ShortcutSave() {
|
|
if (!SaveButton.IsEnabled || SaveButton.Visibility != Visibility.Visible)
|
|
return;
|
|
SaveButton_Click(null, null);
|
|
}
|
|
|
|
private async void SaveButton_Click(object? sender, RoutedEventArgs? evt) {
|
|
Mouse.OverrideCursor = Cursors.Wait;
|
|
SaveButton.IsEnabled = false;
|
|
|
|
int mgnr;
|
|
try {
|
|
mgnr = await ViewModel.UpdateMemberHistory(ViewModel.SelectedHistoryEntry?.HistNr, IsEditing || ViewModel.DateNotice >= DateOnly.FromDateTime(Utils.Today).AddDays(-14));
|
|
App.HintContextChange();
|
|
} catch (Exception exc) {
|
|
InteractionService.ShowDbException("Geschäftsanteilbewegung aktualisieren", exc);
|
|
SaveButton.IsEnabled = true;
|
|
Mouse.OverrideCursor = null;
|
|
return;
|
|
}
|
|
|
|
IsEditing = false;
|
|
IsCreating = false;
|
|
MemberHistoryList.IsEnabled = true;
|
|
OtherMgNrInput.IsEnabled = true;
|
|
HideSaveResetCancelButtons();
|
|
ShowNewEditDeleteButtons();
|
|
LockInputs();
|
|
FinishInputFilling();
|
|
await EnsureContextRenewed();
|
|
Mouse.OverrideCursor = null;
|
|
if (mgnr is int m)
|
|
FocusMemberHistory(m);
|
|
}
|
|
|
|
protected override void ShortcutReset() {
|
|
if (!ResetButton.IsEnabled || ResetButton.Visibility != Visibility.Visible)
|
|
return;
|
|
ResetButton_Click(null, null);
|
|
}
|
|
|
|
private async void ResetButton_Click(object? sender, RoutedEventArgs? evt) {
|
|
if (IsEditing) {
|
|
RefreshInputs();
|
|
} else if (IsCreating) {
|
|
ClearInputs();
|
|
await InitInputs();
|
|
}
|
|
UpdateButtons();
|
|
}
|
|
|
|
private void CancelButton_Click(object sender, RoutedEventArgs evt) {
|
|
IsEditing = false;
|
|
IsCreating = false;
|
|
MemberHistoryList.IsEnabled = true;
|
|
OtherMgNrInput.IsEnabled = true;
|
|
HideSaveResetCancelButtons();
|
|
ShowNewEditDeleteButtons();
|
|
RefreshInputs();
|
|
LockInputs();
|
|
}
|
|
|
|
private void ShowSaveResetCancelButtons() {
|
|
SaveButton.IsEnabled = false;
|
|
ResetButton.IsEnabled = false;
|
|
CancelButton.IsEnabled = true;
|
|
ViewModel.EditingButtonsVisibility = Visibility.Visible;
|
|
}
|
|
|
|
private void HideSaveResetCancelButtons() {
|
|
SaveButton.IsEnabled = false;
|
|
ResetButton.IsEnabled = false;
|
|
CancelButton.IsEnabled = false;
|
|
ViewModel.EditingButtonsVisibility = Visibility.Hidden;
|
|
}
|
|
|
|
private void ShowNewEditDeleteButtons() {
|
|
NewHistoryButton.IsEnabled = true;
|
|
EditHistoryButton.IsEnabled = ViewModel.SelectedHistoryEntry != null;
|
|
DeleteHistoryButton.IsEnabled = ViewModel.SelectedHistoryEntry != null;
|
|
ViewModel.ControlButtonsVisibility = Visibility.Visible;
|
|
}
|
|
|
|
private void HideNewEditDeleteButtons() {
|
|
NewHistoryButton.IsEnabled = false;
|
|
EditHistoryButton.IsEnabled = false;
|
|
DeleteHistoryButton.IsEnabled = false;
|
|
ViewModel.ControlButtonsVisibility = Visibility.Hidden;
|
|
}
|
|
|
|
private void OtherMgNrInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
var valid = InputTextChanged((TextBox)sender, Validator.CheckMgNr);
|
|
var text = OtherMgNrInput.Text;
|
|
var caret = OtherMgNrInput.CaretIndex;
|
|
ControlUtils.SelectItemWithPk(OtherMemberInput, valid ? ViewModel.OtherMgNr : null);
|
|
OtherMgNrInput.Text = text;
|
|
OtherMgNrInput.CaretIndex = caret;
|
|
}
|
|
|
|
private void OtherMgNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
|
var valid = InputLostFocus((TextBox)sender, Validator.CheckMgNr);
|
|
ControlUtils.SelectItemWithPk(OtherMemberInput, valid ? ViewModel.OtherMgNr : null);
|
|
}
|
|
|
|
private void OtherMemberInput_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) {
|
|
var m = OtherMemberInput.SelectedItem as Member;
|
|
ViewModel.OtherMgNr = m?.MgNr;
|
|
}
|
|
|
|
private void OtherMemberReferenceButton_Click(object sender, RoutedEventArgs evt) {
|
|
if (OtherMemberInput.SelectedItem is not Member m) return;
|
|
App.FocusMember(m.MgNr);
|
|
}
|
|
|
|
private void ReasonInput_SelectionChanged(object sender, RoutedEventArgs evt) {
|
|
ComboBox_SelectionChanged(sender, evt);
|
|
if (!IsEditing && !IsCreating) return;
|
|
if (ViewModel.DateNotice is not DateOnly d) return;
|
|
if (ViewModel.Reason == MemberHistory.REASON_EXCLUSION || ViewModel.Reason == MemberHistory.REASON_DECEASED || ViewModel.Reason == MemberHistory.REASON_RETIREMENT) {
|
|
ViewModel.DateEffectiveString = $"31.12.{d.Year + 1}";
|
|
} else {
|
|
ViewModel.DateEffectiveString = ViewModel.DateNoticeString;
|
|
}
|
|
DeductInput.IsEnabled = ViewModel.Reason == MemberHistory.REASON_PURCHASE || ViewModel.Reason == MemberHistory.REASON_PRESCRIPTION;
|
|
if (!DeductInput.IsEnabled) DeductInput.IsChecked = false;
|
|
OtherMgNrInput.IsEnabled = ViewModel.Reason?.StartsWith(MemberHistory.REASON_TRANSFER) ?? false;
|
|
OtherMemberInput.IsEnabled = OtherMgNrInput.IsEnabled;
|
|
if (!OtherMgNrInput.IsEnabled) OtherMgNrInput.Text = "";
|
|
}
|
|
|
|
private void DateNoticeInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
DateInput_TextChanged(sender, evt);
|
|
if (!IsEditing && !IsCreating) return;
|
|
if (ViewModel.DateNotice is not DateOnly d) return;
|
|
ViewModel.DeductYear = d.Year;
|
|
if (ViewModel.DateEffective == null && ViewModel.Reason != null) {
|
|
if (ViewModel.Reason == MemberHistory.REASON_EXCLUSION || ViewModel.Reason == MemberHistory.REASON_DECEASED || ViewModel.Reason == MemberHistory.REASON_RETIREMENT) {
|
|
ViewModel.DateEffectiveString = $"31.12.{d.Year + 1}";
|
|
} else {
|
|
ViewModel.DateEffectiveString = ViewModel.DateNoticeString;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void UpdateAmount() {
|
|
ViewModel.TotalAmount = $"{ViewModel.Shares * ViewModel.ValuePerShare:N2}";
|
|
}
|
|
|
|
private void SharesInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
IntegerInput_TextChanged(sender, evt);
|
|
UpdateAmount();
|
|
}
|
|
|
|
private void AmountPerShareInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
InputTextChanged((TextBox)sender, Validator.CheckDecimal((TextBox)sender, false, 3, 2));
|
|
UpdateAmount();
|
|
}
|
|
}
|
|
}
|