359 lines
17 KiB
C#
359 lines
17 KiB
C#
using Elwig.Helpers;
|
|
using Elwig.Models;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Data;
|
|
|
|
namespace Elwig.Windows {
|
|
public partial class BaseDataWindow : AdministrationWindow {
|
|
|
|
private Dictionary<string, string?>? Modifiers = null;
|
|
private Dictionary<Modifier, string>? ModifierIds = null;
|
|
private ObservableCollection<Modifier>? ModifierList = null;
|
|
private bool ModifiersChanged = false;
|
|
private bool ModifierUpdate = false;
|
|
|
|
public BaseDataWindow() {
|
|
InitializeComponent();
|
|
RequiredInputs = new Control[] {
|
|
ClientNameInput, ClientNameTypeInput, ClientNameTokenInput, ClientNameShortInput,
|
|
ClientAddressInput, ClientPlzInput, ClientOrtInput,
|
|
};
|
|
ExemptInputs = new Control[] {
|
|
ClientNameFull,
|
|
SeasonModifierIdInput, SeasonModifierNameInput, SeasonModifierRelInput, SeasonModifierAbsInput,
|
|
};
|
|
}
|
|
|
|
new protected void LockInputs() {
|
|
base.LockInputs();
|
|
SeasonModifierIdInput.IsReadOnly = true;
|
|
SeasonModifierNameInput.IsReadOnly = true;
|
|
SeasonModifierRelInput.IsReadOnly = true;
|
|
SeasonModifierAbsInput.IsReadOnly = true;
|
|
}
|
|
|
|
new protected void UnlockInputs() {
|
|
base.UnlockInputs();
|
|
SeasonModifierIdInput.IsReadOnly = false;
|
|
SeasonModifierNameInput.IsReadOnly = false;
|
|
SeasonModifierRelInput.IsReadOnly = false;
|
|
SeasonModifierAbsInput.IsReadOnly = false;
|
|
}
|
|
|
|
private void Window_Loaded(object sender, RoutedEventArgs evt) {
|
|
LockInputs();
|
|
FillInputs(App.Client);
|
|
}
|
|
|
|
protected override async Task OnRenewContext() {
|
|
await base.OnRenewContext();
|
|
ControlUtils.RenewItemsSource(SeasonList, await Context.Seasons.OrderByDescending(s => s.Year).ToListAsync(), s => (s as Season)?.Year, null, ControlUtils.RenewSourceDefault.First);
|
|
var year = (SeasonList.SelectedItem as Season)?.Year;
|
|
ControlUtils.RenewItemsSource(SeasonModifierList, await Context.Modifiers.Where(m => m.Year == year).OrderBy(m => m.Ordering).ToListAsync(), m => (m as Modifier)?.ModId);
|
|
}
|
|
|
|
protected override void UpdateButtons() {
|
|
if (!IsEditing && !IsCreating) return;
|
|
bool ch = ModifiersChanged || HasChanged, v = IsValid;
|
|
CancelButton.IsEnabled = true;
|
|
ResetButton.IsEnabled = ch;
|
|
SaveButton.IsEnabled = ch && v;
|
|
SeasonModifierUpButton.IsEnabled = SeasonModifierList.SelectedIndex >= 1;
|
|
SeasonModifierDownButton.IsEnabled = SeasonModifierList.SelectedIndex != -1 && SeasonModifierList.SelectedIndex < (ModifierList?.Count - 1 ?? 0);
|
|
SeasonModifierAddButton.IsEnabled = true;
|
|
SeasonModifierDeleteButton.IsEnabled = SeasonModifierList.SelectedIndex != -1;
|
|
}
|
|
|
|
private void ModifiersInitEditing() {
|
|
var year = (SeasonList.SelectedItem as Season)?.Year;
|
|
Context.ChangeTracker.Clear();
|
|
ModifierList = new(Context.Modifiers.Where(m => m.Year == year).OrderBy(m => m.Ordering).ToList());
|
|
Modifiers = ModifierList.ToDictionary(m => m.ModId, m => m.ModId);
|
|
ModifierIds = ModifierList.ToDictionary(m => m, m => m.ModId);
|
|
ControlUtils.RenewItemsSource(SeasonModifierList, ModifierList, m => (m as Modifier)?.ModId);
|
|
}
|
|
|
|
private void ModifiersFinishEditing() {
|
|
var year = (SeasonList.SelectedItem as Season)?.Year;
|
|
ControlUtils.RenewItemsSource(SeasonModifierList, Context.Modifiers.Where(m => m.Year == year).OrderBy(m => m.Ordering).ToList(), m => (m as Modifier)?.ModId);
|
|
ModifierList = null;
|
|
Modifiers = null;
|
|
ModifierIds = null;
|
|
ModifiersChanged = false;
|
|
|
|
SeasonModifierUpButton.IsEnabled = false;
|
|
SeasonModifierDownButton.IsEnabled = false;
|
|
SeasonModifierAddButton.IsEnabled = false;
|
|
SeasonModifierDeleteButton.IsEnabled = false;
|
|
}
|
|
|
|
private async Task ModifiersSave() {
|
|
if (!ModifiersChanged || ModifierList == null || Modifiers == null || ModifierIds == null) return;
|
|
int i = 0;
|
|
foreach (var mod in ModifierList) mod.Ordering = ++i;
|
|
|
|
var year = (SeasonList.SelectedItem as Season)?.Year;
|
|
foreach (var (modid, _) in Modifiers.Where(m => m.Value == null)) {
|
|
Context.Remove(Context.Modifiers.Find(new object?[] { year, modid }));
|
|
}
|
|
foreach (var (mod, old) in ModifierIds) {
|
|
mod.ModId = old;
|
|
}
|
|
foreach (var (old, modid) in Modifiers.Where(m => m.Value != null)) {
|
|
Context.Update(Context.Modifiers.Find(new object?[] { year, old }));
|
|
}
|
|
await Context.SaveChangesAsync();
|
|
|
|
foreach (var (old, modid) in Modifiers.Where(m => m.Value != null)) {
|
|
await Context.Database.ExecuteSqlAsync($"UPDATE modifier SET modid = {modid} WHERE (year, modid) = ({year}, {old})");
|
|
}
|
|
await Context.SaveChangesAsync();
|
|
|
|
foreach (var mod in ModifierList.Where(m => !ModifierIds.ContainsKey(m))) {
|
|
if (mod.ModId == null) continue;
|
|
await Context.AddAsync(mod);
|
|
}
|
|
await Context.SaveChangesAsync();
|
|
}
|
|
|
|
private void EditButton_Click(object sender, RoutedEventArgs evt) {
|
|
IsEditing = true;
|
|
EditButton.Visibility = Visibility.Hidden;
|
|
ResetButton.Visibility = Visibility.Visible;
|
|
|
|
ModifiersInitEditing();
|
|
UnlockInputs();
|
|
UpdateButtons();
|
|
}
|
|
|
|
private void CancelButton_Click(object sender, RoutedEventArgs evt) {
|
|
IsEditing = false;
|
|
IsCreating = false;
|
|
EditButton.Visibility = Visibility.Visible;
|
|
ResetButton.Visibility = Visibility.Hidden;
|
|
CancelButton.IsEnabled = false;
|
|
SaveButton.IsEnabled = false;
|
|
ResetButton.IsEnabled = false;
|
|
ModifiersFinishEditing();
|
|
|
|
ClearInputStates();
|
|
FillInputs(App.Client);
|
|
LockInputs();
|
|
}
|
|
|
|
private void ResetButton_Click(object sender, RoutedEventArgs evt) {
|
|
ModifiersChanged = false;
|
|
ModifiersInitEditing();
|
|
ClearInputStates();
|
|
FillInputs(App.Client);
|
|
UpdateButtons();
|
|
}
|
|
|
|
private async void SaveButton_Click(object sender, RoutedEventArgs evt) {
|
|
try {
|
|
await UpdateClientParameters(App.Client);
|
|
await ModifiersSave();
|
|
} 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, "Stammdaten aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
}
|
|
|
|
IsEditing = false;
|
|
IsCreating = false;
|
|
EditButton.Visibility = Visibility.Visible;
|
|
ResetButton.Visibility = Visibility.Hidden;
|
|
CancelButton.IsEnabled = false;
|
|
SaveButton.IsEnabled = false;
|
|
ResetButton.IsEnabled = false;
|
|
ModifiersFinishEditing();
|
|
|
|
ClearInputStates();
|
|
FillInputs(App.Client);
|
|
LockInputs();
|
|
}
|
|
|
|
private void FillInputs(ClientParameters p) {
|
|
ClearOriginalValues();
|
|
ClearDefaultValues();
|
|
|
|
ClientNameInput.Text = p.Name;
|
|
ClientNameSuffixInput.Text = p.NameSuffix;
|
|
ClientNameTypeInput.Text = p.NameType;
|
|
ClientNameTokenInput.Text = p.NameToken;
|
|
ClientNameShortInput.Text = p.NameShort;
|
|
ClientAddressInput.Text = p.Address;
|
|
ClientPlzInput.Text = p.Plz.ToString();
|
|
ClientOrtInput.Text = p.Ort;
|
|
ClientIbanInput.Text = p.Iban;
|
|
ClientBicInput.Text = p.Bic;
|
|
ClientUstIdNrInput.Text = p.UstIdNr;
|
|
ClientLfbisNrInput.Text = p.LfbisNr;
|
|
ClientPhoneNrInput.Text = p.PhoneNr;
|
|
ClientFaxNrInput.Text = p.FaxNr;
|
|
ClientEmailAddressInput.Text = p.EmailAddress;
|
|
ClientWebsiteInput.Text = p.Website;
|
|
|
|
TextElementDeliveryNote.Text = p.TextDeliveryNote;
|
|
switch (p.ModeDeliveryNoteStats) {
|
|
case 0: ModeDeliveryNoteNone.IsChecked = true; break;
|
|
case 1: ModeDeliveryNoteGaOnly.IsChecked = true; break;
|
|
case 2: ModeDeliveryNoteShort.IsChecked = true; break;
|
|
case 3: ModeDeliveryNoteFull.IsChecked = true; break;
|
|
}
|
|
|
|
FinishInputFilling();
|
|
}
|
|
|
|
private async Task UpdateClientParameters(ClientParameters p) {
|
|
p.Name = ClientNameInput.Text;
|
|
p.NameSuffix = ClientNameSuffixInput.Text.Length > 0 ? ClientNameSuffixInput.Text : null;
|
|
p.NameType = ClientNameTypeInput.Text;
|
|
p.NameToken = ClientNameTokenInput.Text;
|
|
p.NameShort = ClientNameShortInput.Text;
|
|
p.Address = ClientAddressInput.Text;
|
|
p.Plz = int.Parse(ClientPlzInput.Text);
|
|
p.Ort = ClientOrtInput.Text;
|
|
p.Iban = ClientIbanInput.Text.Length > 0 ? ClientIbanInput.Text : null;
|
|
p.Bic = ClientBicInput.Text.Length > 0 ? ClientBicInput.Text : null;
|
|
p.UstIdNr = ClientUstIdNrInput.Text.Length > 0 ? ClientUstIdNrInput.Text : null;
|
|
p.LfbisNr = ClientLfbisNrInput.Text.Length > 0 ? ClientLfbisNrInput.Text : null;
|
|
p.PhoneNr = ClientPhoneNrInput.Text.Length > 0 ? ClientPhoneNrInput.Text : null;
|
|
p.FaxNr = ClientFaxNrInput.Text.Length > 0 ? ClientFaxNrInput.Text : null;
|
|
p.EmailAddress = ClientEmailAddressInput.Text.Length > 0 ? ClientEmailAddressInput.Text : null;
|
|
p.Website = ClientWebsiteInput.Text.Length > 0 ? ClientWebsiteInput.Text : null;
|
|
|
|
p.TextDeliveryNote = TextElementDeliveryNote.Text.Length > 0 ? TextElementDeliveryNote.Text : null;
|
|
p.ModeDeliveryNoteStats = (ModeDeliveryNoteNone.IsChecked == true) ? 0 : (ModeDeliveryNoteGaOnly.IsChecked == true) ? 1 : (ModeDeliveryNoteShort.IsChecked == true) ? 2 : (ModeDeliveryNoteFull.IsChecked == true) ? 3 : 2;
|
|
|
|
await p.UpdateValues();
|
|
}
|
|
|
|
private void SeasonModifierUpButton_Click(object sender, RoutedEventArgs evt) {
|
|
if (ModifierList == null) return;
|
|
ModifiersChanged = true;
|
|
var idx = SeasonModifierList.SelectedIndex;
|
|
var item = ModifierList[idx];
|
|
ModifierList.RemoveAt(idx);
|
|
idx--;
|
|
ModifierList.Insert(idx, item);
|
|
SeasonModifierList.SelectedIndex = idx;
|
|
UpdateButtons();
|
|
}
|
|
|
|
private void SeasonModifierDownButton_Click(object sender, RoutedEventArgs evt) {
|
|
if (ModifierList == null) return;
|
|
ModifiersChanged = true;
|
|
var idx = SeasonModifierList.SelectedIndex;
|
|
var item = ModifierList[idx];
|
|
ModifierList.RemoveAt(idx);
|
|
idx++;
|
|
ModifierList.Insert(idx, item);
|
|
SeasonModifierList.SelectedIndex = idx;
|
|
UpdateButtons();
|
|
}
|
|
|
|
private void SeasonModifierAddButton_Click(object sender, RoutedEventArgs evt) {
|
|
if (ModifierList == null || SeasonList.SelectedItem is not Season s) return;
|
|
ModifiersChanged = true;
|
|
var idx = (SeasonModifierList.SelectedIndex != -1) ? SeasonModifierList.SelectedIndex + 1 : ModifierList.Count;
|
|
var item = Context.CreateProxy<Modifier>();
|
|
item.Year = s.Year;
|
|
ModifierList.Insert(idx, item);
|
|
SeasonModifierList.SelectedIndex = idx;
|
|
UpdateButtons();
|
|
}
|
|
|
|
private void SeasonModifierDeleteButton_Click(object sender, RoutedEventArgs evt) {
|
|
if (ModifierList == null || Modifiers == null) return;
|
|
ModifiersChanged = true;
|
|
var idx = SeasonModifierList.SelectedIndex;
|
|
var item = ModifierList[idx];
|
|
Modifiers[item.ModId] = null;
|
|
ModifierList.RemoveAt(idx);
|
|
SeasonModifierList.SelectedIndex = idx < ModifierList.Count ? idx : idx - 1;
|
|
UpdateButtons();
|
|
}
|
|
|
|
|
|
private void ClientNames_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
var suffix = ClientNameSuffixInput.Text.Length > 0 ? ClientNameSuffixInput.Text : null;
|
|
ClientNameFull.Text = $"{ClientNameInput.Text}{(suffix != null ? $", {suffix}," : "")} {ClientNameTypeInput.Text}";
|
|
TextBox_TextChanged(sender, evt);
|
|
}
|
|
|
|
private async void SeasonList_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
|
var year = (SeasonList.SelectedItem as Season)?.Year;
|
|
SeasonModifierList.ItemsSource = await Context.Modifiers.Where(m => m.Year == year).OrderBy(m => m.Ordering).ToListAsync();
|
|
}
|
|
|
|
private void SeasonModifierList_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
|
UpdateButtons();
|
|
ModifierUpdate = true;
|
|
if (SeasonModifierList.SelectedItem is not Modifier mod) {
|
|
SeasonModifierIdInput.Text = "";
|
|
SeasonModifierNameInput.Text = "";
|
|
SeasonModifierRelInput.Text = "";
|
|
SeasonModifierAbsInput.Text = "";
|
|
} else {
|
|
SeasonModifierIdInput.Text = mod.ModId;
|
|
SeasonModifierNameInput.Text = mod.Name;
|
|
SeasonModifierRelInput.Text = (mod.Rel * 100)?.ToString();
|
|
SeasonModifierAbsInput.Text = mod.Abs?.ToString();
|
|
}
|
|
ModifierUpdate = false;
|
|
}
|
|
|
|
private void SeasonModifierIdInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
if ((!IsEditing && !IsCreating) || SeasonModifierList.SelectedItem is not Modifier mod || Modifiers == null || ModifierIds == null) return;
|
|
ModifiersChanged = ModifiersChanged || (SeasonModifierIdInput.Text ?? "") != ((SeasonModifierList.SelectedItem as Modifier)?.ModId ?? "");
|
|
if (ModifierUpdate) return;
|
|
var old = ModifierIds.GetValueOrDefault(mod);
|
|
var id = SeasonModifierIdInput.Text ?? "";
|
|
if (old != null) Modifiers[old] = id;
|
|
mod.ModId = id;
|
|
CollectionViewSource.GetDefaultView(ModifierList).Refresh();
|
|
UpdateButtons();
|
|
}
|
|
|
|
private void SeasonModifierNameInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
if ((!IsEditing && !IsCreating) || SeasonModifierList.SelectedItem is not Modifier mod) return;
|
|
ModifiersChanged = ModifiersChanged || (SeasonModifierNameInput.Text ?? "") != ((SeasonModifierList.SelectedItem as Modifier)?.Name ?? "");
|
|
if (ModifierUpdate) return;
|
|
mod.Name = SeasonModifierNameInput.Text ?? "";
|
|
CollectionViewSource.GetDefaultView(ModifierList).Refresh();
|
|
UpdateButtons();
|
|
}
|
|
|
|
private void SeasonModifierRelInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
// DecimalInput_TextChanged(sender, evt); FIXME '-' is ignored
|
|
if ((!IsEditing && !IsCreating) || SeasonModifierList.SelectedItem is not Modifier mod) return;
|
|
ModifiersChanged = ModifiersChanged || (SeasonModifierRelInput.Text ?? "") != ((SeasonModifierList.SelectedItem as Modifier)?.Rel?.ToString() ?? "");
|
|
if (ModifierUpdate) return;
|
|
mod.Rel = decimal.TryParse(SeasonModifierRelInput.Text, out var v) ? v / 100 : null;
|
|
if (mod.Rel != null) SeasonModifierAbsInput.Text = "";
|
|
CollectionViewSource.GetDefaultView(ModifierList).Refresh();
|
|
UpdateButtons();
|
|
}
|
|
|
|
private void SeasonModifierAbsInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
// DecimalInput_TextChanged(sender, evt); FIXME '-' is ignored
|
|
if ((!IsEditing && !IsCreating) || SeasonModifierList.SelectedItem is not Modifier mod || SeasonList.SelectedItem is not Season s) return;
|
|
ModifiersChanged = ModifiersChanged || (SeasonModifierAbsInput.Text ?? "") != ((SeasonModifierList.SelectedItem as Modifier)?.Abs?.ToString() ?? "");
|
|
if (ModifierUpdate) return;
|
|
// FIXME ValueStr does not work in ModifierList when modifier is newly created
|
|
mod.AbsValue = decimal.TryParse(SeasonModifierAbsInput.Text, out var v) ? Utils.DecToDb(v, s.Precision) : null;
|
|
if (mod.AbsValue != null) SeasonModifierRelInput.Text = "";
|
|
CollectionViewSource.GetDefaultView(ModifierList).Refresh();
|
|
UpdateButtons();
|
|
}
|
|
}
|
|
}
|