diff --git a/Elwig/Windows/AreaCommAdminWindow.xaml b/Elwig/Windows/AreaCommAdminWindow.xaml
index 5d296e6..cc21a7d 100644
--- a/Elwig/Windows/AreaCommAdminWindow.xaml
+++ b/Elwig/Windows/AreaCommAdminWindow.xaml
@@ -59,7 +59,6 @@
-
+ HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="-5,10,0,10" Width="110" Grid.Column="3"/>
+ HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="-5,10,0,10" Width="110" Grid.Column="3"/>
@@ -115,22 +114,25 @@
-
+
-
+
-
+
-
+
-
+
@@ -143,7 +145,7 @@
@@ -152,10 +154,12 @@
Margin="0,40,0,0" Grid.Column="1"/>
-
+
-
+
diff --git a/Elwig/Windows/AreaCommAdminWindow.xaml.cs b/Elwig/Windows/AreaCommAdminWindow.xaml.cs
index 141db57..e0c84d4 100644
--- a/Elwig/Windows/AreaCommAdminWindow.xaml.cs
+++ b/Elwig/Windows/AreaCommAdminWindow.xaml.cs
@@ -8,6 +8,7 @@ using Elwig.Models;
using System.Runtime.CompilerServices;
using System;
using System.Threading.Tasks;
+using Microsoft.EntityFrameworkCore.ChangeTracking;
namespace Elwig.Windows {
public partial class AreaCommAdminWindow : AdministrationWindow {
@@ -20,22 +21,20 @@ namespace Elwig.Windows {
this.member = member;
Title = $"Flächenbindungen - {member.FamilyName} {member.GivenName} - Elwig";
ExemptInputs = new Control[] {
- ContractList, AreaCommitmentList, NewContractButton, DeleteContractButton,
+ MgNrInput, ContractList, AreaCommitmentList, NewContractButton, DeleteContractButton,
ContractSaveButton, ContractCancelButton, NewAreaCommitmentButton,
EditAreaCommitmentButton, DeleteAreaCommitmentButton, AreaCommitmentSaveButton,
AreaCommitmentResetButton, AreaCommitmentCancelButton
};
RequiredInputs = new Control[] {
- VNrInput, MgNrInput, YearFromInput, YearToInput, KgInput,
+ VNrInput, YearFromInput, KgInput,
GstNrInput, AreaInput, SortInput, CultInput
};
}
private async void Window_Loaded(object sender, RoutedEventArgs e) {
await RefreshContractList();
- //TODO Sources von Ried sollten sich auf Gemeinde beziehen
KgInput.ItemsSource = Context.WbKgs.Select(k => k.Kg).OrderBy(k => k.Name).ToList();
- RdInput.ItemsSource = Context.WbRde.OrderBy(r => r.Name).ToList();
SortInput.ItemsSource = Context.WineVarieties.OrderBy(s => s.Name).ToList();
AttrInput.ItemsSource = Context.WineAttributes.OrderBy(a => a.Name).ToList();
CultInput.ItemsSource = Context.WineCultivations.OrderBy(c => c.Name).ToList();
@@ -58,6 +57,7 @@ namespace Elwig.Windows {
if (contracts.Count == 1)
ContractList.SelectedIndex = 0;
+ //TODO notwendig?
await RefreshAreaCommitmentList();
RefreshInputs();
}
@@ -75,6 +75,7 @@ namespace Elwig.Windows {
AreaCommitmentList.ItemsSource = commitments;
if (commitments.Count == 1)
AreaCommitmentList.SelectedIndex = 0;
+ RefreshInputs();
}
private void RefreshInputs(bool validate = false) {
@@ -98,6 +99,7 @@ namespace Elwig.Windows {
EditAreaCommitmentButton.IsEnabled = false;
DeleteAreaCommitmentButton.IsEnabled = false;
ClearInputs();
+ MgNrInput.Text = "";
}
if (!validate) ClearInputStates();
GC.Collect();
@@ -132,6 +134,9 @@ namespace Elwig.Windows {
ShowAreaCommitmentSaveResetCancelButtons();
DisableContractNewDeleteButtons();
UnlockInputs();
+ VNrInput.IsReadOnly = true;
+ YearFromInput.IsReadOnly = true;
+ YearToInput.IsReadOnly = true;
InitInputs();
}
@@ -147,9 +152,6 @@ namespace Elwig.Windows {
ShowAreaCommitmentSaveResetCancelButtons();
DisableContractNewDeleteButtons();
UnlockInputs();
- //TODO schöner?
- VNrInput.IsReadOnly = true;
- MgNrInput.IsReadOnly = true;
}
private async void DeleteAreaCommitmentButton_Click(object sender, RoutedEventArgs evt) {
@@ -176,16 +178,6 @@ namespace Elwig.Windows {
ShowContractSaveCancelButtons();
DisableAreaCommitmentNewEditDeleteButtons();
UnlockInputs();
- //TODO schöner?
- KgInput.IsEnabled = false;
- RdInput.IsEnabled = false;
- GstNrInput.IsReadOnly = true;
- GstNrInput.IsEnabled = false;
- AreaInput.IsReadOnly = true;
- AreaInput.IsEnabled = false;
- SortInput.IsEnabled = false;
- AttrInput.IsEnabled = false;
- CultInput.IsEnabled = false;
InitInputs();
}
@@ -203,31 +195,70 @@ namespace Elwig.Windows {
}
}
- private async void AreaCommitmentSaveButton_Click(object sender, RoutedEventArgs evt) {
- AreaCommitment? a = new();
- if (IsEditing)
- a = (AreaCommitment)AreaCommitmentList.SelectedItem;
- else if (IsCreating)
- a = new();
+ private async Task UpdateContract(Contract c) {
+ int newVNr = int.Parse(VNrInput.Text);
+ c.MgNr = int.Parse(MgNrInput.Text);
+ c.YearFrom = int.Parse(YearFromInput.Text);
+ c.YearTo = (YearToInput.Text == "") ? null : int.Parse(YearToInput.Text);
- //TODO
+ EntityEntry? tr = null;
+ try {
+ if (IsEditing) {
+ tr = Context.Update(c);
+ } else if (IsCreating) {
+ c.VNr = newVNr;
+ tr = (await Context.AddAsync(c));
+ }
+ await Context.SaveChangesAsync();
+ if (newVNr != c.VNr) {
+ await Context.Database.ExecuteSqlAsync($"UPDATE contract SET vnr = {newVNr} WHERE mgnr = {c.VNr}");
+ await Context.Contracts.LoadAsync();
+ c = await Context.Contracts.FindAsync(newVNr);
+ }
+ } catch (Exception exc) {
+ if (tr != null) await tr.ReloadAsync();
+ 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, "Vertrag aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+
+ return c;
+ }
+
+ private async Task UpdateaAreaCommitment(AreaCommitment a) {
+ a.VNr = int.Parse(VNrInput.Text);
a.KgNr = ((AT_Kg)KgInput.SelectedItem).KgNr;
a.RdNr = ((WbRd)RdInput.SelectedItem).RdNr;
a.GstNr = GstNrInput.Text;
+ a.Area = int.Parse(AreaInput.Text);
+ a.SortId = ((WineVar)SortInput.SelectedItem).SortId;
+ a.AttrId = ((WineAttr)AttrInput.SelectedItem).AttrId;
+ a.CultId = ((WineCult)CultInput.SelectedItem).CultId;
+ EntityEntry? tr = null;
try {
- if (IsEditing)
- Context.Update(a);
- else if (IsCreating)
- Context.Add(a);
- Context.SaveChanges();
+ if (IsEditing) {
+ tr = Context.Update(a);
+ } else if (IsCreating) {
+ tr = (await Context.AddAsync(a));
+ }
+ await Context.SaveChangesAsync();
+
} catch (Exception exc) {
+ if (tr != null) await tr.ReloadAsync();
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, "Flächenbindung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error);
}
+ return a;
+ }
+
+ private async void AreaCommitmentSaveButton_Click(object sender, RoutedEventArgs evt) {
+ Contract c = await UpdateContract((Contract)ContractList.SelectedItem);
+ AreaCommitment a = await UpdateaAreaCommitment(IsEditing ? (AreaCommitment)AreaCommitmentList.SelectedItem : Context.CreateProxy());
+
IsEditing = false;
IsCreating = false;
AreaCommitmentList.IsEnabled = true;
@@ -237,6 +268,9 @@ namespace Elwig.Windows {
EnableContractNewDeleteButtons();
LockInputs();
await RefreshContractList();
+ await RefreshAreaCommitmentList();
+ ContractList.SelectedItem = c;
+ AreaCommitmentList.SelectedItem = a;
}
private void AreaCommitmentResetButton_Click(object sender, RoutedEventArgs evt) {
@@ -262,6 +296,9 @@ namespace Elwig.Windows {
}
private async void ContractSaveButton_Click(object sender, RoutedEventArgs evt) {
+ Contract c = await UpdateContract(Context.CreateProxy());
+ AreaCommitment a = await UpdateaAreaCommitment(Context.CreateProxy());
+
IsEditing = false;
IsCreating = false;
AreaCommitmentList.IsEnabled = true;
@@ -271,6 +308,9 @@ namespace Elwig.Windows {
EnableAreaCommitmentNewEditDeleteButtons();
LockInputs();
await RefreshContractList();
+ await RefreshAreaCommitmentList();
+ ContractList.SelectedItem = c;
+ AreaCommitmentList.SelectedItem = a;
}
private void ContractCancelButton_Click(object sender, RoutedEventArgs evt) {
@@ -289,12 +329,16 @@ namespace Elwig.Windows {
override protected void UpdateButtons() {
if (!IsEditing && !IsCreating) return;
bool ch = HasChanged(), v = IsValid();
+ ContractSaveButton.IsEnabled = (v && ch);
AreaCommitmentResetButton.IsEnabled = (ch);
AreaCommitmentSaveButton.IsEnabled = (v && ch);
}
- private void InitInputs() {
+ private async void InitInputs() {
+ VNrInput.Text = ContractList.SelectedItem == null ? (await Utils.NextVNr(Context)).ToString() : ((Contract)ContractList.SelectedItem).VNr.ToString();
+ MgNrInput.Text = member.MgNr.ToString();
FillOriginalValues();
+ ValidateRequiredInputs();
}
private void EnableContractNewDeleteButtons() {
@@ -378,11 +422,60 @@ namespace Elwig.Windows {
}
private async void ContractList_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
+ //await RefreshContractListQuery();
await RefreshAreaCommitmentList();
}
private void AreaCommitmentList_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
RefreshInputs();
}
+
+ private void KgInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
+ AT_Kg? curr_kg = (AT_Kg)KgInput.SelectedItem;
+ if (curr_kg != null) {
+ RdInput.ItemsSource = Context.WbRde.Where(r => r.KgNr == curr_kg.KgNr).OrderBy(r => r.Name).ToList();
+ }
+ ComboBox_SelectionChanged(sender, evt);
+ }
+
+ protected void InputTextChanged(TextBox input, Func checker) {
+ InputTextChanged(input, checker(input, SenderIsRequired(input), Context, (Contract)ContractList.SelectedItem));
+ }
+
+ protected void InputLostFocus(TextBox input, Func checker, string? msg = null) {
+ InputLostFocus(input, checker(input, SenderIsRequired(input), Context, (Contract)ContractList.SelectedItem), msg);
+ }
+
+ private void NumericInput_TextChanged(object sender, RoutedEventArgs evt) {
+ InputTextChanged((TextBox)sender, Validator.CheckNumeric);
+ }
+
+ private void VNrInput_TextChanged(object sender, RoutedEventArgs evt) {
+ InputTextChanged((TextBox)sender, Validator.CheckVNr);
+ }
+
+ private void VNrInput_LostFocus(object sender, RoutedEventArgs evt) {
+ InputLostFocus((TextBox)sender, Validator.CheckVNr);
+ }
+
+ private void YearFromInput_TextChanged(object sender, RoutedEventArgs evt) {
+ InputTextChanged((TextBox)sender, Validator.CheckNumeric);
+ }
+
+ private void YearToInput_TextChanged(object sender, RoutedEventArgs evt) {
+ InputTextChanged((TextBox)sender, Validator.CheckNumeric);
+ }
+
+ private void GstNrInput_TextChanged(object sender, RoutedEventArgs evt) {
+ InputTextChanged((TextBox)sender, Validator.CheckGstNr);
+ }
+
+ private void GstNrInput_LostFocus(object sender, RoutedEventArgs evt) {
+ InputLostFocus((TextBox)sender, Validator.CheckGstNr);
+ }
+
+ private void AreaInput_TextChanged(object sender, RoutedEventArgs evt) {
+ InputTextChanged((TextBox)sender, Validator.CheckNumeric);
+ }
}
}