[#77] Entities: Add AreaComContract to group area commitments together
This commit is contained in:
@@ -25,19 +25,18 @@ namespace Elwig.Windows {
|
||||
ViewModel.FilterMember = ctx.Members.Find(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value");
|
||||
ViewModel.Title = $"Flächenbindungen - {ViewModel.FilterMember.AdministrativeName} - Elwig";
|
||||
ExemptInputs = [
|
||||
MgNrInput, AreaCommitmentList, NewAreaCommitmentButton,
|
||||
EditAreaCommitmentButton, DeleteAreaCommitmentButton, SaveButton,
|
||||
ResetButton, CancelButton, SearchInput, ActiveAreaCommitmentInput
|
||||
AreaCommitmentList, RevisionList,
|
||||
NewAreaCommitmentButton, EditAreaCommitmentButton, DeleteAreaCommitmentButton, SaveButton,
|
||||
ResetButton, CancelButton, SearchInput, SeasonInput
|
||||
];
|
||||
RequiredInputs = [
|
||||
FbNrInput, YearFromInput, KgInput, RdInput,
|
||||
FbNrInput, MgNrInput, MemberInput, YearFromInput, KgInput, RdInput,
|
||||
GstNrInput, AreaInput, AreaComTypeInput, WineCultivationInput
|
||||
];
|
||||
|
||||
ControlUtils.InitializeDelayTimer(SearchInput, SearchInput_TextChanged);
|
||||
SearchInput.TextChanged -= SearchInput_TextChanged;
|
||||
ActiveAreaCommitmentInput.Content = ((string)ActiveAreaCommitmentInput.Content).Replace("2020", $"{Utils.CurrentLastSeason}");
|
||||
ActiveAreaCommitmentInput.IsChecked = true;
|
||||
ViewModel.FilterSeason = Utils.CurrentYear;
|
||||
}
|
||||
|
||||
protected override async Task OnInit(AppDbContext ctx) {
|
||||
@@ -55,38 +54,46 @@ namespace Elwig.Windows {
|
||||
var vm = ViewModel;
|
||||
var cursor = Mouse.OverrideCursor != null;
|
||||
if (!cursor) Mouse.OverrideCursor = Cursors.Wait;
|
||||
var query = (vm.SearchQuery, vm.ShowOnlyActiveAreaComs);
|
||||
var (filter, areaComs, areaComCount, stat) = await Task.Run(async () => {
|
||||
var query = (vm.SearchQuery, vm.FilterSeason);
|
||||
var (filter, contracts, areaComs, areaComCount, stat) = await Task.Run(async () => {
|
||||
using var ctx = new AppDbContext();
|
||||
var (_, areaComQuery, filter) = await vm.GetFilters(ctx);
|
||||
var (_, contractQuery, areaComQuery, filter) = await vm.GetFilters(ctx);
|
||||
var contracts = await contractQuery
|
||||
.Include(c => c.Kg.AtKg)
|
||||
.Include(c => c.Rd!.Kg.AtKg)
|
||||
.Include(c => c.Revisions).ThenInclude(a => a.WineCult)
|
||||
.Include(c => c.Revisions).ThenInclude(a => a.AreaComType.WineAttr)
|
||||
.Include(c => c.Revisions).ThenInclude(a => a.AreaComType.WineVar)
|
||||
.Include(c => c.Revisions).ThenInclude(a => a.Member)
|
||||
.ToListAsync();
|
||||
var areaComs = await areaComQuery
|
||||
.Include(a => a.Kg.AtKg)
|
||||
.Include(a => a.Rd!.Kg.AtKg)
|
||||
.Include(c => c.Contract.Kg.AtKg)
|
||||
.Include(c => c.Contract.Rd!.Kg.AtKg)
|
||||
.Include(a => a.WineCult)
|
||||
.Include(a => a.AreaComType.WineAttr)
|
||||
.Include(a => a.AreaComType.WineVar)
|
||||
.ToListAsync();
|
||||
|
||||
if (filter.Count > 0 && areaComs.Count > 0) {
|
||||
var dict = areaComs.AsParallel()
|
||||
if (filter.Count > 0 && contracts.Count > 0) {
|
||||
var dict = contracts.AsParallel()
|
||||
.ToDictionary(d => d, d => d.SearchScore(vm.TextFilter))
|
||||
.OrderByDescending(c => c.Value);
|
||||
var threshold = dict.Max(a => a.Value) * 3 / 4;
|
||||
areaComs = [.. dict
|
||||
.Where(a => a.Value > threshold)
|
||||
.Select(a => a.Key)];
|
||||
contracts = [.. dict
|
||||
.Where(a => a.Value > threshold)
|
||||
.Select(a => a.Key)];
|
||||
}
|
||||
|
||||
var areaComCount = await areaComQuery.CountAsync();
|
||||
var season = await ctx.Seasons.FindAsync(await ctx.Seasons.MaxAsync(s => s.Year));
|
||||
var stat = await AreaComService.GenerateToolTipData(areaComQuery, season?.MaxKgPerHa ?? 10_000);
|
||||
|
||||
return (filter, areaComs, areaComCount, stat);
|
||||
return (filter, contracts, areaComs, areaComCount, stat);
|
||||
});
|
||||
if (!cursor) Mouse.OverrideCursor = null;
|
||||
if (query != (ViewModel.SearchQuery, ViewModel.ShowOnlyActiveAreaComs)) return;
|
||||
if (query != (ViewModel.SearchQuery, ViewModel.FilterSeason)) return;
|
||||
|
||||
ControlUtils.RenewItemsSource(AreaCommitmentList, areaComs,
|
||||
ControlUtils.RenewItemsSource(AreaCommitmentList, contracts,
|
||||
AreaCommitmentList_SelectionChanged, ViewModel.TextFilter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort);
|
||||
RefreshInputs();
|
||||
|
||||
@@ -96,8 +103,8 @@ namespace Elwig.Windows {
|
||||
ViewModel.StatusArea = text;
|
||||
ViewModel.StatusAreaToolTip = AreaComService.GenerateToolTip(gridData);
|
||||
} else {
|
||||
ViewModel.StatusAreaCommitments = $"{areaComs.Count:N0}";
|
||||
ViewModel.StatusArea = $"{areaComs.Select(a => a.Area).Sum():N0} m²";
|
||||
ViewModel.StatusAreaCommitments = $"{contracts.Count:N0}";
|
||||
ViewModel.StatusArea = $"{areaComs.Sum(a => a.Area):N0} m²";
|
||||
ViewModel.StatusAreaToolTip = null;
|
||||
}
|
||||
var groups = areaComs.GroupBy(a => $"{a.AreaComType.SortId}{a.AreaComType.AttrId}").Select(a => (a.Key, a.Sum(b => b.Area))).OrderByDescending(a => a.Item2).ToList();
|
||||
@@ -106,12 +113,25 @@ namespace Elwig.Windows {
|
||||
ViewModel.StatusContracts += $" ({string.Join(", ", groups.Select(g => g.Key))})";
|
||||
}
|
||||
|
||||
private async Task RefreshRevisions() {
|
||||
using var ctx = new AppDbContext();
|
||||
if (AreaCommitmentList.SelectedItem is AreaComContract c) {
|
||||
ControlUtils.RenewItemsSource(RevisionList, c.Revisions.OrderByDescending(p => p.RevNr).ToList(), RevisionList_SelectionChanged, ControlUtils.RenewSourceDefault.First);
|
||||
} else {
|
||||
RevisionList.ItemsSource = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void RefreshInputs(bool validate = false) {
|
||||
ClearInputStates();
|
||||
if (AreaCommitmentList.SelectedItem is AreaCom a) {
|
||||
if (RevisionList.SelectedItem is AreaCom a) {
|
||||
EditAreaCommitmentButton.IsEnabled = true;
|
||||
DeleteAreaCommitmentButton.IsEnabled = true;
|
||||
FillInputs(a);
|
||||
} else if (AreaCommitmentList.SelectedItem is AreaComContract c) {
|
||||
EditAreaCommitmentButton.IsEnabled = true;
|
||||
DeleteAreaCommitmentButton.IsEnabled = true;
|
||||
FillInputs(c);
|
||||
} else {
|
||||
EditAreaCommitmentButton.IsEnabled = false;
|
||||
DeleteAreaCommitmentButton.IsEnabled = false;
|
||||
@@ -123,7 +143,15 @@ namespace Elwig.Windows {
|
||||
GC.Collect();
|
||||
}
|
||||
|
||||
private void FillInputs(AreaComContract c) {
|
||||
ClearOriginalValues();
|
||||
ClearDefaultValues();
|
||||
ViewModel.FillInputs(c);
|
||||
FinishInputFilling();
|
||||
}
|
||||
|
||||
private void FillInputs(AreaCom a) {
|
||||
FillInputs(a.Contract);
|
||||
ClearOriginalValues();
|
||||
ClearDefaultValues();
|
||||
ViewModel.FillInputs(a);
|
||||
@@ -138,6 +166,11 @@ namespace Elwig.Windows {
|
||||
ValidateRequiredInputs();
|
||||
}
|
||||
|
||||
new protected void ClearInputs(bool validate = false) {
|
||||
ViewModel.ClearInputs();
|
||||
base.ClearInputs(validate);
|
||||
}
|
||||
|
||||
protected override async Task OnRenewContext(AppDbContext ctx) {
|
||||
await base.OnRenewContext(ctx);
|
||||
|
||||
@@ -158,6 +191,9 @@ namespace Elwig.Windows {
|
||||
.Include(c => c.WineAttr)
|
||||
.OrderBy(v => v.VtrgId)
|
||||
.ToListAsync());
|
||||
ControlUtils.RenewItemsSource(MemberInput, await ctx.Members
|
||||
.OrderBy(m => m.Name).ThenBy(m => m.GivenName).ThenBy(m => m.MgNr)
|
||||
.ToListAsync());
|
||||
var cultList = await ctx.WineCultivations
|
||||
.OrderBy(c => c.Name)
|
||||
.Cast<object>().ToListAsync();
|
||||
@@ -176,6 +212,7 @@ namespace Elwig.Windows {
|
||||
IsCreating = true;
|
||||
AreaCommitmentList.IsEnabled = false;
|
||||
AreaCommitmentList.SelectedItem = null;
|
||||
RevisionList.IsEnabled = false;
|
||||
HideNewEditDeleteButtons();
|
||||
ShowSaveResetCancelButtons();
|
||||
UnlockInputs();
|
||||
@@ -196,6 +233,7 @@ namespace Elwig.Windows {
|
||||
|
||||
IsEditing = true;
|
||||
AreaCommitmentList.IsEnabled = false;
|
||||
RevisionList.IsEnabled = false;
|
||||
|
||||
HideNewEditDeleteButtons();
|
||||
ShowSaveResetCancelButtons();
|
||||
@@ -210,10 +248,10 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
private async void DeleteAreaCommitmentButton_Click(object? sender, RoutedEventArgs? evt) {
|
||||
if (AreaCommitmentList.SelectedItem is not AreaCom a)
|
||||
if (RevisionList.SelectedItem is not AreaCom a)
|
||||
return;
|
||||
|
||||
var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, true);
|
||||
var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, true, RevisionList.ItemsSource.Cast<object>().FirstOrDefault() != a);
|
||||
if (d.ShowDialog() != true)
|
||||
return;
|
||||
|
||||
@@ -221,7 +259,7 @@ namespace Elwig.Windows {
|
||||
try {
|
||||
if (d.YearTo is int yearTo) {
|
||||
ViewModel.YearTo = yearTo;
|
||||
await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaCom)?.FbNr);
|
||||
await ViewModel.UpdateAreaCommitment(a.FbNr, a.RevNr);
|
||||
} else {
|
||||
await AreaComService.DeleteAreaCom(a.FbNr);
|
||||
}
|
||||
@@ -244,42 +282,38 @@ namespace Elwig.Windows {
|
||||
SaveButton.IsEnabled = false;
|
||||
|
||||
int? yearTo = null;
|
||||
if (InputHasChanged(AreaInput) || InputHasChanged(AreaComTypeInput)) {
|
||||
var a = (AreaCommitmentList.SelectedItem as AreaCom)!;
|
||||
var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, false);
|
||||
if (d.ShowDialog() != true)
|
||||
if (InputHasChanged(AreaInput) || InputHasChanged(AreaComTypeInput) || InputHasChanged(MgNrInput)) {
|
||||
var a = (RevisionList.SelectedItem as AreaCom)!;
|
||||
var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, false, RevisionList.ItemsSource.Cast<object>().FirstOrDefault() != a);
|
||||
if (d.ShowDialog() != true) {
|
||||
SaveButton.IsEnabled = true;
|
||||
return;
|
||||
}
|
||||
yearTo = d.YearTo;
|
||||
}
|
||||
|
||||
int fbnr;
|
||||
int fbnr, revnr;
|
||||
Mouse.OverrideCursor = Cursors.Wait;
|
||||
try {
|
||||
AreaCom? temp = null;
|
||||
if (yearTo != null && (!ViewModel.YearTo.HasValue || yearTo < ViewModel.YearTo)) {
|
||||
temp = new AreaCom {
|
||||
FbNr = ViewModel.FbNr!.Value,
|
||||
MgNr = ViewModel.MgNr!.Value,
|
||||
YearFrom = ViewModel.YearFrom,
|
||||
YearTo = ViewModel.YearTo,
|
||||
VtrgId = ViewModel.AreaComType!.VtrgId,
|
||||
CultId = ViewModel.WineCult?.CultId,
|
||||
Comment = ViewModel.Comment,
|
||||
KgNr = ViewModel.Kg!.KgNr,
|
||||
RdNr = ViewModel.Rd?.RdNr,
|
||||
GstNr = ViewModel.GstNr?.Trim() ?? "-",
|
||||
Area = ViewModel.Area!.Value,
|
||||
};
|
||||
RefreshInputs();
|
||||
ViewModel.YearTo = yearTo;
|
||||
}
|
||||
fbnr = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaCom)?.FbNr);
|
||||
(fbnr, revnr) = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaComContract)?.FbNr, (RevisionList.SelectedItem as AreaCom)?.RevNr);
|
||||
if (temp is AreaCom t) {
|
||||
await ViewModel.InitInputs();
|
||||
t.FbNr = ViewModel.FbNr!.Value;
|
||||
t.YearFrom = yearTo + 1;
|
||||
ViewModel.FillInputs(t);
|
||||
fbnr = await ViewModel.UpdateAreaCommitment(null);
|
||||
(fbnr, revnr) = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaComContract)?.FbNr, null);
|
||||
}
|
||||
App.HintContextChange();
|
||||
} catch (Exception exc) {
|
||||
@@ -294,6 +328,7 @@ namespace Elwig.Windows {
|
||||
IsEditing = false;
|
||||
IsCreating = false;
|
||||
AreaCommitmentList.IsEnabled = true;
|
||||
RevisionList.IsEnabled = true;
|
||||
HideSaveResetCancelButtons();
|
||||
ShowNewEditDeleteButtons();
|
||||
LockInputs();
|
||||
@@ -302,7 +337,9 @@ namespace Elwig.Windows {
|
||||
await EnsureContextRenewed();
|
||||
Mouse.OverrideCursor = null;
|
||||
ViewModel.SearchQuery = "";
|
||||
ControlUtils.SelectItem(AreaCommitmentList, AreaCommitmentList.ItemsSource.Cast<AreaCom>().Where(a => a.FbNr == fbnr).FirstOrDefault());
|
||||
ViewModel.FilterSeason = ViewModel.YearTo ?? ViewModel.YearFrom ?? ViewModel.FilterSeason;
|
||||
ControlUtils.SelectItemWithPk(AreaCommitmentList, fbnr);
|
||||
ControlUtils.SelectItemWithPk(RevisionList, fbnr, revnr);
|
||||
}
|
||||
|
||||
protected override void ShortcutReset() {
|
||||
@@ -324,6 +361,7 @@ namespace Elwig.Windows {
|
||||
IsEditing = false;
|
||||
IsCreating = false;
|
||||
AreaCommitmentList.IsEnabled = true;
|
||||
RevisionList.IsEnabled = true;
|
||||
HideSaveResetCancelButtons();
|
||||
ShowNewEditDeleteButtons();
|
||||
RefreshInputs();
|
||||
@@ -385,22 +423,46 @@ namespace Elwig.Windows {
|
||||
|
||||
private void LockSearchInputs() {
|
||||
SearchInput.IsEnabled = false;
|
||||
ActiveAreaCommitmentInput.IsEnabled = false;
|
||||
SeasonInput.IsEnabled = false;
|
||||
}
|
||||
|
||||
private void UnlockSearchInputs() {
|
||||
SearchInput.IsEnabled = true;
|
||||
ActiveAreaCommitmentInput.IsEnabled = true;
|
||||
SeasonInput.IsEnabled = true;
|
||||
}
|
||||
|
||||
private void AreaCommitmentList_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
||||
private async void AreaCommitmentList_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
||||
if (AreaCommitmentList.SelectedItem != null)
|
||||
AreaCommitmentList.ScrollIntoView(AreaCommitmentList.SelectedItem);
|
||||
RefreshInputs();
|
||||
await RefreshRevisions();
|
||||
}
|
||||
|
||||
private void AttributesInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
||||
private void RevisionList_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) {
|
||||
RefreshInputs();
|
||||
if (RevisionList.SelectedItem is AreaCom c) {
|
||||
EditAreaCommitmentButton.IsEnabled = true;
|
||||
} else {
|
||||
EditAreaCommitmentButton.IsEnabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void MgNrInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||
var valid = InputTextChanged((TextBox)sender, Validator.CheckMgNr);
|
||||
var text = MgNrInput.Text;
|
||||
var caret = MgNrInput.CaretIndex;
|
||||
ControlUtils.SelectItemWithPk(MemberInput, valid ? ViewModel.MgNr : null);
|
||||
MgNrInput.Text = text;
|
||||
MgNrInput.CaretIndex = caret;
|
||||
}
|
||||
|
||||
private void MgNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||
var valid = InputLostFocus((TextBox)sender, Validator.CheckMgNr);
|
||||
ControlUtils.SelectItemWithPk(MemberInput, valid ? ViewModel.MgNr : null);
|
||||
}
|
||||
|
||||
private void MemberInput_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) {
|
||||
var m = MemberInput.SelectedItem as Member;
|
||||
ViewModel.MgNr = m?.MgNr;
|
||||
}
|
||||
|
||||
private async void ActiveAreaCommitmentInput_Changed(object sender, RoutedEventArgs evt) {
|
||||
@@ -413,6 +475,11 @@ namespace Elwig.Windows {
|
||||
await RefreshList(true);
|
||||
}
|
||||
|
||||
private async void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||
if (ViewModel.FilterSeason == null) return;
|
||||
await RefreshList();
|
||||
}
|
||||
|
||||
private void KgInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
||||
if (KgInput.SelectedItem is AT_Kg kg) {
|
||||
var rdList = kg.WbKg!.Rds.OrderBy(r => r.Name).Cast<object>().ToList();
|
||||
@@ -450,12 +517,12 @@ namespace Elwig.Windows {
|
||||
RdInput.SelectedIndex = s.Count();
|
||||
}
|
||||
|
||||
protected void InputTextChanged(TextBox input, Func<TextBox, bool, AreaCom?, ValidationResult> checker) {
|
||||
InputTextChanged(input, checker(input, SenderIsRequired(input), (AreaCom)AreaCommitmentList.SelectedItem));
|
||||
protected void InputTextChanged(TextBox input, Func<TextBox, bool, AreaComContract?, ValidationResult> checker) {
|
||||
InputTextChanged(input, checker(input, SenderIsRequired(input), (AreaComContract)AreaCommitmentList.SelectedItem));
|
||||
}
|
||||
|
||||
protected void InputLostFocus(TextBox input, Func<TextBox, bool, AreaCom?, ValidationResult> checker, string? msg = null) {
|
||||
InputLostFocus(input, checker(input, SenderIsRequired(input), (AreaCom)AreaCommitmentList.SelectedItem), msg);
|
||||
protected void InputLostFocus(TextBox input, Func<TextBox, bool, AreaComContract?, ValidationResult> checker, string? msg = null) {
|
||||
InputLostFocus(input, checker(input, SenderIsRequired(input), (AreaComContract)AreaCommitmentList.SelectedItem), msg);
|
||||
}
|
||||
|
||||
private void FbNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||
@@ -465,5 +532,10 @@ namespace Elwig.Windows {
|
||||
private void FbNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||
InputLostFocus((TextBox)sender, Validator.CheckFbNr);
|
||||
}
|
||||
|
||||
private void MemberReferenceButton_Click(object sender, RoutedEventArgs evt) {
|
||||
if (MemberInput.SelectedItem is not Member m) return;
|
||||
App.FocusMember(m.MgNr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user