Files
elwig/Elwig/Windows/BaseDataWindow.xaml.cs

420 lines
20 KiB
C#

using Elwig.Helpers;
using Elwig.Models.Entities;
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespace Elwig.Windows {
public partial class BaseDataWindow : AdministrationWindow {
protected AppDbContext? EditContext;
public BaseDataWindow() {
InitializeComponent();
RequiredInputs = [
ClientNameInput, ClientNameTypeInput, ClientNameTokenInput, ClientNameShortInput,
ClientAddressInput, ClientPlzInput, ClientOrtInput,
];
ExemptInputs = [
ClientNameFull,
BranchIdInput, BranchNameInput, BranchPlzInput, BranchOrtInput,
BranchAddressInput, BranchPhoneNrInput, BranchFaxNrInput, BranchMobileNrInput,
WineAttributeIdInput, WineAttributeNameInput, WineAttributeActiveInput,
WineAttributeMaxKgPerHaInput.TextBox, WineAttributeStrictInput, WineAttributeFillLowerInput,
WineCultivationIdInput, WineCultivationNameInput, WineCultivationDescriptionInput,
AreaCommitmentTypeIdInput, AreaCommitmentTypeWineVariantInput, AreaCommitmentTypeWineAttributeInput,
AreaCommitmentTypeMinKgPerHaInput.TextBox, AreaCommitmentTypePenaltyPerKgInput.TextBox,
AreaCommitmentTypePenaltyInput.TextBox, AreaCommitmentTypePenaltyNoneInput.TextBox,
SeasonMaxKgPerHaInput.TextBox, SeasonVatNormalInput.TextBox, SeasonVatFlatrateInput.TextBox, SeasonStartInput, SeasonEndInput,
SeasonMinKgPerBsInput.TextBox, SeasonMaxKgPerBsInput.TextBox, SeasonBsValueInput.TextBox,
SeasonPenaltyPerKgInput.TextBox, SeasonPenaltyInput.TextBox, SeasonPenaltyNoneInput.TextBox,
SeasonModifierIdInput, SeasonModifierNameInput, SeasonModifierRelInput.TextBox, SeasonModifierAbsInput.TextBox,
];
WineAttributeFillLowerInput.Visibility = Visibility.Hidden;
WineAttributeFillLowerLabel.Visibility = Visibility.Hidden;
ParameterAreaComGroup.Header = ParameterAreaComGroup.Header.ToString()!.Split('(')[0] + $"({Utils.CurrentLastSeason})";
}
protected override void ShortcutNew() { }
protected override void ShortcutDelete() { }
new protected void LockInputs() {
base.LockInputs();
BranchIdInput.IsReadOnly = true;
BranchNameInput.IsReadOnly = true;
BranchPlzInput.IsReadOnly = true;
BranchOrtInput.IsEnabled = false;
BranchAddressInput.IsReadOnly = true;
BranchPhoneNrInput.IsReadOnly = true;
BranchFaxNrInput.IsReadOnly = true;
BranchMobileNrInput.IsReadOnly = true;
WineAttributeIdInput.IsReadOnly = true;
WineAttributeNameInput.IsReadOnly = true;
WineAttributeActiveInput.IsEnabled = false;
WineAttributeMaxKgPerHaInput.TextBox.IsReadOnly = true;
WineAttributeStrictInput.IsEnabled = false;
WineAttributeFillLowerInput.IsEnabled = false;
WineCultivationIdInput.IsReadOnly = true;
WineCultivationNameInput.IsReadOnly = true;
WineCultivationDescriptionInput.IsReadOnly = true;
AreaCommitmentTypeWineVariantInput.IsEnabled = false;
AreaCommitmentTypeWineAttributeInput.IsEnabled = false;
AreaCommitmentTypeMinKgPerHaInput.TextBox.IsReadOnly = true;
AreaCommitmentTypePenaltyPerKgInput.TextBox.IsReadOnly = true;
AreaCommitmentTypePenaltyInput.TextBox.IsReadOnly = true;
AreaCommitmentTypePenaltyNoneInput.TextBox.IsReadOnly = true;
SeasonMaxKgPerHaInput.TextBox.IsReadOnly = true;
SeasonVatNormalInput.TextBox.IsReadOnly = true;
SeasonVatFlatrateInput.TextBox.IsReadOnly = true;
SeasonMinKgPerBsInput.TextBox.IsReadOnly = true;
SeasonMaxKgPerBsInput.TextBox.IsReadOnly = true;
SeasonPenaltyPerKgInput.TextBox.IsReadOnly = true;
SeasonPenaltyInput.TextBox.IsReadOnly = true;
SeasonPenaltyNoneInput.TextBox.IsReadOnly = true;
SeasonBsValueInput.TextBox.IsReadOnly = true;
SeasonModifierIdInput.IsReadOnly = true;
SeasonModifierNameInput.IsReadOnly = true;
SeasonModifierRelInput.TextBox.IsReadOnly = true;
SeasonModifierAbsInput.TextBox.IsReadOnly = true;
ParameterAllowAttrIntoLowerInput.IsEnabled = false;
ParameterAvoidUnderDeliveriesInput.IsEnabled = false;
ParameterHonorGebundenInput.IsEnabled = false;
}
new protected void UnlockInputs() {
base.UnlockInputs();
BranchIdInput.IsReadOnly = false;
BranchNameInput.IsReadOnly = false;
BranchPlzInput.IsReadOnly = false;
BranchOrtInput.IsEnabled = true;
BranchAddressInput.IsReadOnly = false;
BranchPhoneNrInput.IsReadOnly = false;
BranchFaxNrInput.IsReadOnly = false;
BranchMobileNrInput.IsReadOnly = false;
WineAttributeIdInput.IsReadOnly = false;
WineAttributeNameInput.IsReadOnly = false;
WineAttributeActiveInput.IsEnabled = true;
WineAttributeMaxKgPerHaInput.TextBox.IsReadOnly = false;
WineAttributeStrictInput.IsEnabled = true;
WineAttributeFillLowerInput.IsEnabled = true;
WineCultivationIdInput.IsReadOnly = false;
WineCultivationNameInput.IsReadOnly = false;
WineCultivationDescriptionInput.IsReadOnly = false;
AreaCommitmentTypeWineVariantInput.IsEnabled = true;
AreaCommitmentTypeWineAttributeInput.IsEnabled = true;
AreaCommitmentTypeMinKgPerHaInput.TextBox.IsReadOnly = false;
AreaCommitmentTypePenaltyPerKgInput.TextBox.IsReadOnly = false;
AreaCommitmentTypePenaltyInput.TextBox.IsReadOnly = false;
AreaCommitmentTypePenaltyNoneInput.TextBox.IsReadOnly = false;
SeasonMaxKgPerHaInput.TextBox.IsReadOnly = false;
SeasonVatNormalInput.TextBox.IsReadOnly = false;
SeasonVatFlatrateInput.TextBox.IsReadOnly = false;
SeasonMinKgPerBsInput.TextBox.IsReadOnly = false;
SeasonMaxKgPerBsInput.TextBox.IsReadOnly = false;
SeasonPenaltyPerKgInput.TextBox.IsReadOnly = false;
SeasonPenaltyInput.TextBox.IsReadOnly = false;
SeasonPenaltyNoneInput.TextBox.IsReadOnly = false;
SeasonBsValueInput.TextBox.IsReadOnly = false;
SeasonModifierIdInput.IsReadOnly = false;
SeasonModifierNameInput.IsReadOnly = false;
SeasonModifierRelInput.TextBox.IsReadOnly = false;
SeasonModifierAbsInput.TextBox.IsReadOnly = false;
ParameterAllowAttrIntoLowerInput.IsEnabled = true;
ParameterAvoidUnderDeliveriesInput.IsEnabled = true;
ParameterHonorGebundenInput.IsEnabled = true;
}
private void Window_Loaded(object sender, RoutedEventArgs evt) {
LockInputs();
}
protected override async Task OnRenewContext(AppDbContext ctx) {
await base.OnRenewContext(ctx);
FillInputs(App.Client, (await ctx.Seasons.FindAsync(Utils.CurrentLastSeason))!);
ControlUtils.RenewItemsSource(SeasonList, await ctx.Seasons
.OrderByDescending(s => s.Year)
.Include(s => s.Modifiers)
.ToListAsync(), null, ControlUtils.RenewSourceDefault.First);
var year = (SeasonList.SelectedItem as Season)?.Year;
ControlUtils.RenewItemsSource(BranchList, await ctx.Branches
.OrderBy(b => b.Name)
.Include(b => b.PostalDest!.AtPlz)
.ToListAsync(), null, ControlUtils.RenewSourceDefault.First);
ControlUtils.RenewItemsSource(WineAttributeList, await ctx.WineAttributes
.OrderBy(a => a.Name)
.ToListAsync(), null, ControlUtils.RenewSourceDefault.First);
ControlUtils.RenewItemsSource(AreaCommitmentTypeWineVariantInput, await ctx.WineVarieties
.OrderBy(s => s.Name)
.ToListAsync());
var attrList = await ctx.WineAttributes.OrderBy(a => a.Name).Cast<object>().ToListAsync();
attrList.Insert(0, new NullItem(""));
ControlUtils.RenewItemsSource(AreaCommitmentTypeWineAttributeInput, attrList);
ControlUtils.RenewItemsSource(AreaCommitmentTypeList, await ctx.AreaCommitmentTypes
.OrderBy(t => t.VtrgId)
.Include(t => t.WineVar)
.Include(t => t.WineAttr)
.ToListAsync(), null, ControlUtils.RenewSourceDefault.First);
ControlUtils.RenewItemsSource(WineCultivationList, await ctx.WineCultivations
.OrderBy(c => c.Name)
.ToListAsync(), null, ControlUtils.RenewSourceDefault.First);
ControlUtils.RenewItemsSource(SeasonModifierList, await ctx.Modifiers
.Where(m => m.Year == year)
.OrderBy(m => m.Ordering)
.ToListAsync(), null, ControlUtils.RenewSourceDefault.First);
}
protected override void UpdateButtons() {
if (!IsEditing && !IsCreating) return;
bool ch = _branchChanged || _attrChanged || _cultChanged || _actChanged ||
_seasonChanged || _modChanged || HasChanged,
v = IsValid;
CancelButton.IsEnabled = true;
ResetButton.IsEnabled = ch;
SaveButton.IsEnabled = ch && v;
BranchAddButton.IsEnabled = true;
BranchDeleteButton.IsEnabled = BranchList.SelectedIndex != -1;
WineAttributeAddButton.IsEnabled = true;
WineAttributeDeleteButton.IsEnabled = WineAttributeList.SelectedIndex != -1;
WineCultivationAddButton.IsEnabled = true;
WineCultivationDeleteButton.IsEnabled = WineCultivationList.SelectedIndex != -1;
AreaCommitmentTypeAddButton.IsEnabled = true;
AreaCommitmentTypeDeleteButton.IsEnabled = AreaCommitmentTypeList.SelectedIndex != -1;
SeasonModifierUpButton.IsEnabled = SeasonModifierList.SelectedIndex >= 1;
SeasonModifierDownButton.IsEnabled = SeasonModifierList.SelectedIndex != -1 && SeasonModifierList.SelectedIndex < (_modList?.Count - 1 ?? 0);
SeasonModifierAddButton.IsEnabled = true;
SeasonModifierDeleteButton.IsEnabled = SeasonModifierList.SelectedIndex != -1;
}
private void OriginButton_Click(object sender, RoutedEventArgs evt) {
App.FocusOriginHierarchy();
}
private async Task InitEditing() {
EditContext = new AppDbContext();
await BranchesInitEditing(EditContext);
await WineAttributesInitEditing(EditContext);
await WineCultivationsInitEditing(EditContext);
await AreaCommitmentTypesInitEditing(EditContext);
await SeasonsInitEditing(EditContext);
await ModifiersInitEditing(EditContext);
}
private async Task Save() {
await UpdateClientParameters(App.Client);
await UpdateParameters(Utils.CurrentLastSeason);
using var tx = await EditContext!.Database.BeginTransactionAsync();
await BranchesSave(EditContext!);
await WineAttributesSave(EditContext!);
await WineCultivationsSave(EditContext!);
await AreaCommitmentTypesSave(EditContext!);
await SeasonsSave(EditContext!);
await ModifiersSave(EditContext!);
await tx.CommitAsync();
}
private async Task FinishEditing() {
EditContext?.Dispose();
EditContext = null;
using var ctx = new AppDbContext();
await BranchesFinishEditing(ctx);
await WineAttributesFinishEditing(ctx);
await WineCultivationsFinishEditing(ctx);
await AreaCommitmentTypesFinishEditing(ctx);
await SeasonsFinishEditing(ctx);
await ModifiersFinishEditing(ctx);
}
protected override void ShortcutEdit() {
if (!EditButton.IsEnabled || EditButton.Visibility != Visibility.Visible)
return;
EditButton_Click(null, null);
}
private async void EditButton_Click(object? sender, RoutedEventArgs? evt) {
IsEditing = true;
EditButton.Visibility = Visibility.Hidden;
ResetButton.Visibility = Visibility.Visible;
await InitEditing();
UnlockInputs();
UpdateButtons();
}
private async 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;
await FinishEditing();
using var ctx = new AppDbContext();
ClearInputStates();
FillInputs(App.Client, (await ctx.Seasons.FindAsync(Utils.CurrentLastSeason))!);
LockInputs();
}
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) {
_branchChanged = false;
_attrChanged = false;
_cultChanged = false;
_modChanged = false;
await InitEditing();
using var ctx = new AppDbContext();
ClearInputStates();
FillInputs(App.Client, (await ctx.Seasons.FindAsync(Utils.CurrentLastSeason))!);
UpdateButtons();
}
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) {
try {
await Save();
} 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;
await FinishEditing();
using (var ctx = new AppDbContext()) {
ClearInputStates();
FillInputs(App.Client, (await ctx.Seasons.FindAsync(Utils.CurrentLastSeason))!);
LockInputs();
}
await HintContextChange();
}
private void FillInputs(ClientParameters p, Season s) {
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;
}
TextElementDeliveryConfirmation.Text = p.TextDeliveryConfirmation;
TextElementCreditNote.Text = p.TextCreditNote;
ParameterAllowAttrIntoLowerInput.IsChecked = s.Billing_AllowAttrsIntoLower;
ParameterAvoidUnderDeliveriesInput.IsChecked = s.Billing_AvoidUnderDeliveries;
ParameterHonorGebundenInput.IsChecked = s.Billing_HonorGebunden;
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;
p.TextDeliveryConfirmation = TextElementDeliveryConfirmation.Text.Length > 0 ? TextElementDeliveryConfirmation.Text : null;
p.TextCreditNote = TextElementCreditNote.Text.Length > 0 ? TextElementCreditNote.Text : null;
await p.UpdateValues();
}
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 Task UpdateParameters(int year) {
try {
using var ctx = new AppDbContext();
if (await ctx.Seasons.FindAsync(year) is not Season s)
return;
s.Billing_AllowAttrsIntoLower = ParameterAllowAttrIntoLowerInput.IsChecked ?? false;
s.Billing_AvoidUnderDeliveries = ParameterAvoidUnderDeliveriesInput.IsChecked ?? false;
s.Billing_HonorGebunden = ParameterHonorGebundenInput.IsChecked ?? false;
ctx.Update(s);
await ctx.SaveChangesAsync();
} catch { }
}
}
}