diff --git a/Elwig/App.xaml b/Elwig/App.xaml
index d8b5a5e..29d0516 100644
--- a/Elwig/App.xaml
+++ b/Elwig/App.xaml
@@ -11,17 +11,13 @@
-
-
-
+
-
-
-
+
diff --git a/Elwig/App.xaml.cs b/Elwig/App.xaml.cs
index ddda1b7..0d02224 100644
--- a/Elwig/App.xaml.cs
+++ b/Elwig/App.xaml.cs
@@ -58,19 +58,25 @@ namespace Elwig {
Dictionary branches = new();
using (var ctx = new AppDbContext()) {
- if (!ctx.Database.CanConnect()) {
- MessageBox.Show($"Invalid Database:\n\n{Config.DatabaseFile}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error);
- Shutdown();
- return;
- } else {
- branches = ctx.Branches.ToDictionary(b => b.Name.ToLower(), b => (b.ZwstId, b.Name, b.PostalDest?.AtPlz?.Plz, b.PostalDest?.AtPlz?.Dest, b.Address, b.PhoneNr, b.FaxNr, b.MobileNr));
- try {
- Client = new(ctx);
- } catch (Exception e) {
- MessageBox.Show($"Fehler beim Laden der Mandantendaten:\n\n{e.Message}", "Fehler");
+ try {
+ if (!ctx.Database.CanConnect()) {
+ MessageBox.Show($"Invalid Database:\n\n{Config.DatabaseFile}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error);
Shutdown();
return;
+ } else {
+ branches = ctx.Branches.ToDictionary(b => b.Name.ToLower(), b => (b.ZwstId, b.Name, b.PostalDest?.AtPlz?.Plz, b.PostalDest?.AtPlz?.Dest, b.Address, b.PhoneNr, b.FaxNr, b.MobileNr));
+ try {
+ Client = new(ctx);
+ } catch (Exception e) {
+ MessageBox.Show($"Fehler beim Laden der Mandantendaten:\n\n{e.Message}", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+ Shutdown();
+ return;
+ }
}
+ } catch (Exception e) {
+ MessageBox.Show($"Invalid Database:\n\n{e.Message}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error);
+ Shutdown();
+ return;
}
}
Utils.RunBackground("HTML Initialization", () => Documents.Html.Init(PrintingReadyChanged));
diff --git a/Elwig/Helpers/AppDbContext.cs b/Elwig/Helpers/AppDbContext.cs
index 5cd372d..f57ca2e 100644
--- a/Elwig/Helpers/AppDbContext.cs
+++ b/Elwig/Helpers/AppDbContext.cs
@@ -28,11 +28,11 @@ namespace Elwig.Helpers {
public DbSet WineAttributes { get; private set; }
public DbSet WineCultivations { get; private set; }
public DbSet Branches { get; private set; }
+ public DbSet AreaCommitmentTypes { get; private set; }
public DbSet Members { get; private set; }
public DbSet BillingAddresses { get; private set; }
public DbSet MemberTelephoneNrs { get; private set; }
public DbSet AreaCommitments { get; private set; }
- public DbSet AreaCommitmentAttributes { get; private set; }
public DbSet Seasons { get; private set; }
public DbSet Modifiers { get; private set; }
public DbSet Deliveries { get; private set; }
@@ -110,7 +110,7 @@ namespace Elwig.Helpers {
public async Task NextFbNr() {
int c = await AreaCommitments.Select(ac => ac.FbNr).MinAsync();
(await AreaCommitments.OrderBy(ac => ac.FbNr).Select(ac => ac.FbNr).ToListAsync())
- .ForEach(a => { if (a <= c + 100) c = a; });
+ .ForEach(a => { if (a <= c + 1000) c = a; });
return c + 1;
}
diff --git a/Elwig/Models/AreaCom.cs b/Elwig/Models/AreaCom.cs
index aebc26e..2e3c157 100644
--- a/Elwig/Models/AreaCom.cs
+++ b/Elwig/Models/AreaCom.cs
@@ -1,7 +1,5 @@
using Microsoft.EntityFrameworkCore;
-using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
-using System.Linq;
namespace Elwig.Models {
[Table("area_commitment"), PrimaryKey("FbNr")]
@@ -12,8 +10,8 @@ namespace Elwig.Models {
[Column("mgnr")]
public int MgNr { get; set; }
- [Column("sortid")]
- public string SortId { get; set; }
+ [Column("vtrgid")]
+ public string VtrgId { get; set; }
[Column("cultid")]
public string CultId { get; set; }
@@ -42,8 +40,8 @@ namespace Elwig.Models {
[ForeignKey("MgNr")]
public virtual Member Member { get; private set; }
- [ForeignKey("SortId")]
- public virtual WineVar WineVar { get; private set; }
+ [ForeignKey("VtrgId")]
+ public virtual AreaComType AreaComType { get; private set; }
[ForeignKey("CultId")]
public virtual WineCult WineCult { get; private set; }
@@ -53,11 +51,5 @@ namespace Elwig.Models {
[ForeignKey("KgNr, RdNr")]
public virtual WbRd? Rd { get; private set; }
-
- [InverseProperty("AreaCom")]
- public virtual ISet AttributeEntries { get; private set; }
-
- [NotMapped]
- public IEnumerable Attributes => AttributeEntries.Select(e => e.WineAttr);
}
}
diff --git a/Elwig/Models/AreaComAttr.cs b/Elwig/Models/AreaComAttr.cs
deleted file mode 100644
index cdb7f08..0000000
--- a/Elwig/Models/AreaComAttr.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using System.ComponentModel.DataAnnotations.Schema;
-
-namespace Elwig.Models {
- [Table("area_commitment_attribute"), PrimaryKey("FbNr", "AttrId")]
- public class AreaComAttr {
- [Column("fbnr")]
- public int FbNr { get; set; }
-
- [Column("attrid")]
- public string AttrId { get; set; }
-
- [ForeignKey("FbNr")]
- public virtual AreaCom AreaCom { get; private set; }
-
- [ForeignKey("AttrId")]
- public virtual WineAttr WineAttr { get; private set; }
- }
-}
diff --git a/Elwig/Models/AreaComType.cs b/Elwig/Models/AreaComType.cs
new file mode 100644
index 0000000..5043979
--- /dev/null
+++ b/Elwig/Models/AreaComType.cs
@@ -0,0 +1,50 @@
+using Microsoft.EntityFrameworkCore;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Elwig.Models {
+ [Table("area_commitment_type"), PrimaryKey("VtrgId"), Index("SortId", "AttrId1", "AttrId2", "Discriminator")]
+ public class AreaComType {
+ [Column("vtrgid")]
+ public string VtrgId { get; set; }
+
+ [Column("sortid")]
+ public string SortId { get; set; }
+
+ [Column("attrid_1")]
+ public string? AttrId1 { get; set; }
+
+ [Column("attrid_2")]
+ public string? AttrId2 { get; set; }
+
+ [Column("disc")]
+ public string? Discriminator { get; set; }
+
+ [Column("min_kg_per_ha")]
+ public int? MinKgPerHa { get; set; }
+
+ [Column("max_kg_per_ha")]
+ public int? MaxKgPerHa { get; set; }
+
+ [Column("penalty_amount")]
+ public double? PenaltyAmoutValue { get; set; }
+
+ [NotMapped]
+ public decimal? PenaltyAmount {
+ get => PenaltyAmoutValue != null ? (decimal)PenaltyAmoutValue : null;
+ set => PenaltyAmoutValue = value != null ? (double)value : null;
+ }
+
+ [ForeignKey("SortId")]
+ public virtual WineVar WineVar { get; private set; }
+
+ [ForeignKey("AttrId1")]
+ public virtual WineAttr? WineAttr1 { get; private set; }
+
+ [ForeignKey("AttrId2")]
+ public virtual WineAttr? WineAttr2 { get; private set; }
+
+ [NotMapped]
+ public string DisplayName => WineVar.Name + (WineAttr1 != null ? $" {WineAttr1.Name}" : "") +
+ (WineAttr2 != null ? $" {WineAttr2.Name}" : "") + (Discriminator != null ? $" ({Discriminator})" : "");
+ }
+}
diff --git a/Elwig/Models/Member.cs b/Elwig/Models/Member.cs
index c021a51..f523c10 100644
--- a/Elwig/Models/Member.cs
+++ b/Elwig/Models/Member.cs
@@ -110,6 +110,9 @@ namespace Elwig.Models {
[Column("active")]
public bool IsActive { get; set; }
+ [Column("deceased")]
+ public bool IsDeceased { get; set; }
+
[Column("iban")]
public string? Iban { get; set; }
diff --git a/Elwig/Windows/AreaComAdminWindow.xaml b/Elwig/Windows/AreaComAdminWindow.xaml
index 223e391..93592c5 100644
--- a/Elwig/Windows/AreaComAdminWindow.xaml
+++ b/Elwig/Windows/AreaComAdminWindow.xaml
@@ -47,9 +47,8 @@
-
-
-
+
+
@@ -60,7 +59,7 @@
-
+
@@ -69,38 +68,44 @@
+ Margin="5,10,5,42" FontSize="14" Grid.ColumnSpan="3" Background="#e2e2e2">
-
+
-
+
+
+
+
+
+ HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="5,5,2.5,10" Grid.Column="0"/>
+ HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="2.5,5,2.5,10" Grid.Column="1"/>
+ HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="2.5,5,5,10" Grid.Column="2"/>
+ HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="5,5,2.5,10" Grid.Column="0"/>
+ HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="2.5,5,2.5,10" Grid.Column="1"/>
+ HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="2.5,5,5,10" Grid.Column="2"/>
-
-
+
+
-
+
@@ -108,67 +113,51 @@
TextChanged="FbNrInput_TextChanged" LostFocus="FbNrInput_LostFocus"/>
-
+
-
-
+
+
+
+
+
+
-
+
-
+
+ HorizontalAlignment="Stretch" Margin="0,10,10,0" Grid.Column="1"
+ SelectionChanged="KgInput_SelectionChanged"/>
+ HorizontalAlignment="Stretch" Margin="0,40,10,0" Grid.Column="1"/>
-
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Elwig/Windows/AreaComAdminWindow.xaml.cs b/Elwig/Windows/AreaComAdminWindow.xaml.cs
index cae060a..f0329b8 100644
--- a/Elwig/Windows/AreaComAdminWindow.xaml.cs
+++ b/Elwig/Windows/AreaComAdminWindow.xaml.cs
@@ -25,12 +25,12 @@ namespace Elwig.Windows {
};
RequiredInputs = new Control[] {
FbNrInput, YearFromInput, KgInput,
- GstNrInput, AreaInput, WineVarietyInput, WineCultivationInput
+ GstNrInput, AreaInput, AreaComTypeInput, WineCultivationInput
};
}
- private async void Window_Loaded(object sender, RoutedEventArgs e) {
- await RenewContext();
+ private void Window_Loaded(object sender, RoutedEventArgs e) {
+ LockInputs();
}
private async Task RefreshAreaCommitmentList() {
@@ -50,9 +50,7 @@ namespace Elwig.Windows {
private void RefreshInputs(bool validate = false) {
ClearInputStates();
- AreaCom? a = (AreaCom)AreaCommitmentList.SelectedItem;
-
- if (a != null) {
+ if (AreaCommitmentList.SelectedItem is AreaCom a) {
EditAreaCommitmentButton.IsEnabled = true;
DeleteAreaCommitmentButton.IsEnabled = true;
FillInputs(a);
@@ -60,11 +58,9 @@ namespace Elwig.Windows {
EditAreaCommitmentButton.IsEnabled = false;
DeleteAreaCommitmentButton.IsEnabled = false;
ClearOriginalValues();
- ClearInputs();
- AttributesInput.UnSelectAll();
- MgNrInput.Text = "";
+ ClearInputs(validate);
+ ClearInputStates();
}
- if (!validate) ClearInputStates();
GC.Collect();
}
@@ -81,13 +77,7 @@ namespace Elwig.Windows {
GstNrInput.Text = a.GstNr;
AreaInput.Text = a.Area.ToString();
- WineVarietyInput.SelectedItem = a.WineVar;
-
- AttributesInput.UnSelectAll();
- foreach (var attr in a.Attributes) {
- AttributesInput.SelectedItems.Add(attr);
- }
-
+ AreaComTypeInput.SelectedItem = a.AreaComType;
WineCultivationInput.SelectedItem = a.WineCult;
FillOriginalValues();
@@ -103,8 +93,7 @@ namespace Elwig.Windows {
protected override async Task RenewContext() {
await base.RenewContext();
ControlUtils.RenewItemsSource(KgInput, await Context.WbKgs.Select(k => k.AtKg).OrderBy(k => k.Name).ToListAsync(), i => (i as AT_Kg)?.KgNr);
- ControlUtils.RenewItemsSource(WineVarietyInput, await Context.WineVarieties.OrderBy(v => v.Name).ToListAsync(), i => (i as WineVar)?.SortId);
- ControlUtils.RenewItemsSource(AttributesInput, await Context.WineAttributes.OrderBy(a => a.Name).ToListAsync(), i => (i as WineAttr)?.AttrId);
+ ControlUtils.RenewItemsSource(AreaComTypeInput, await Context.AreaCommitmentTypes.OrderBy(v => v.VtrgId).ToListAsync(), i => (i as AreaComType)?.VtrgId);
ControlUtils.RenewItemsSource(WineCultivationInput, await Context.WineCultivations.OrderBy(c => c.Name).ToListAsync(), i => (i as WineCult)?.CultId);
await RefreshAreaCommitmentList();
}
@@ -116,7 +105,6 @@ namespace Elwig.Windows {
HideAreaCommitmentNewEditDeleteButtons();
ShowAreaCommitmentSaveResetCancelButtons();
UnlockInputs();
- AttributesInput.IsEnabled = true;
InitInputs();
}
@@ -130,7 +118,6 @@ namespace Elwig.Windows {
HideAreaCommitmentNewEditDeleteButtons();
ShowAreaCommitmentSaveResetCancelButtons();
UnlockInputs();
- AttributesInput.IsEnabled = true;
}
private async void DeleteAreaCommitmentButton_Click(object sender, RoutedEventArgs evt) {
@@ -139,7 +126,7 @@ namespace Elwig.Windows {
var r = MessageBox.Show(
$"Soll die Flächenbindung {a.GstNr} ({a.Area} m²) wirklich unwiderruflich gelöscht werden?",
- "Parzelle löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No);
+ "Flächenbindung löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No);
if (r == MessageBoxResult.Yes) {
Context.Remove(a);
Context.SaveChanges();
@@ -156,8 +143,8 @@ namespace Elwig.Windows {
a.RdNr = RdInput.SelectedItem.GetType() == typeof(NullItem) ? null : ((WbRd)RdInput.SelectedItem).RdNr;
a.GstNr = GstNrInput.Text;
a.Area = int.Parse(AreaInput.Text);
- a.SortId = ((WineVar)WineVarietyInput.SelectedItem).SortId;
- a.CultId = ((WineCult)WineCultivationInput.SelectedItem).CultId;
+ a.VtrgId = (AreaComTypeInput.SelectedItem as AreaComType)?.VtrgId;
+ a.CultId = (WineCultivationInput.SelectedItem as WineCult)?.CultId;
EntityEntry? tr = null;
try {
@@ -168,23 +155,6 @@ namespace Elwig.Windows {
tr = (await Context.AddAsync(a));
}
-
- foreach (WineAttr attr in a.Attributes) {
- if (!AttributesInput.SelectedItems.Contains(attr)) {
- var aca = a.AttributeEntries.FirstOrDefault(h => h.AttrId == attr.AttrId);
- Context.Remove(aca);
- }
- }
-
- foreach (WineAttr attr in AttributesInput.SelectedItems) {
- if (!a.Attributes.Contains(attr)) {
- AreaComAttr aca = Context.CreateProxy();
- aca.FbNr = a.FbNr;
- aca.AttrId = attr.AttrId;
- await Context.AddAsync(aca);
- }
- }
-
await Context.SaveChangesAsync();
if (newFbNr != a.FbNr) {
@@ -211,7 +181,6 @@ namespace Elwig.Windows {
HideAreaCommitmentSaveResetCancelButtons();
ShowAreaCommitmentNewEditDeleteButtons();
LockInputs();
- AttributesInput.IsEnabled = false;
await RefreshAreaCommitmentList();
AreaCommitmentList.SelectedItem = a;
}
@@ -234,7 +203,6 @@ namespace Elwig.Windows {
RefreshInputs();
ClearInputStates();
LockInputs();
- AttributesInput.IsEnabled = false;
}
override protected void UpdateButtons() {
@@ -297,11 +265,13 @@ namespace Elwig.Windows {
}
private async void KgInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
- AT_Kg? curr_kg = (AT_Kg)KgInput.SelectedItem;
- if (curr_kg != null) {
+ if (KgInput.SelectedItem is AT_Kg curr_kg) {
var rdList = await Context.WbRde.Where(r => r.KgNr == curr_kg.KgNr).OrderBy(r => r.Name).Cast