420 lines
20 KiB
C#
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 { }
|
|
}
|
|
}
|
|
}
|