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

163 lines
7.6 KiB
C#

using Elwig.Helpers;
using Elwig.Models.Entities;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows;
namespace Elwig.Windows {
public partial class BaseDataWindow {
private Dictionary<string, string?>? _acts = null;
private Dictionary<AreaComType, string>? _actIds = null;
private ObservableCollection<AreaComType>? _actList = null;
private bool _actChanged = false;
private bool _actUpdate = false;
private async Task AreaCommitmentTypesInitEditing(AppDbContext ctx) {
_actList = new(await ctx.AreaCommitmentTypes
.OrderBy(v => v.VtrgId)
.Include(t => t.WineVar)
.Include(t => t.WineAttr)
.ToListAsync());
_acts = _actList.ToDictionary(v => v.VtrgId, v => (string?)v.VtrgId);
_actIds = _actList.ToDictionary(v => v, v => v.VtrgId);
ControlUtils.RenewItemsSource(AreaCommitmentTypeList, _actList);
AreaCommitmentTypeList_SelectionChanged(null, null);
}
private async Task AreaCommitmentTypesFinishEditing(AppDbContext ctx) {
ControlUtils.RenewItemsSource(AreaCommitmentTypeList, await ctx.AreaCommitmentTypes
.OrderBy(v => v.VtrgId)
.Include(t => t.WineVar)
.Include(t => t.WineAttr)
.ToListAsync());
_actList = null;
_acts = null;
_actIds = null;
_actChanged = false;
AreaCommitmentTypeAddButton.IsEnabled = false;
AreaCommitmentTypeDeleteButton.IsEnabled = false;
}
private async Task AreaCommitmentTypesSave(AppDbContext ctx) {
if (!_actChanged || _actList == null || _acts == null || _actIds == null)
return;
foreach (var (vtrgid, _) in _acts.Where(a => a.Value == null)) {
ctx.Remove(ctx.AreaCommitmentTypes.Find(vtrgid)!);
}
foreach (var (attr, old) in _actIds) {
attr.VtrgId = old;
}
foreach (var (old, vtrgid) in _acts.Where(a => a.Value != null)) {
ctx.Update(ctx.AreaCommitmentTypes.Find(old)!);
}
await ctx.SaveChangesAsync();
foreach (var (old, vtrgid) in _acts.Where(a => a.Value != null)) {
await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment_type SET vtrgid = {vtrgid} WHERE vtrgid = {old}");
}
await ctx.SaveChangesAsync();
foreach (var type in _actList.Where(a => !_actIds.ContainsKey(a))) {
if (type.VtrgId == null) continue;
ctx.Add(type);
}
await ctx.SaveChangesAsync();
}
private void AreaCommitmentTypeList_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) {
UpdateButtons();
_actUpdate = true;
if (AreaCommitmentTypeList.SelectedItem is AreaComType type) {
AreaCommitmentTypeIdInput.Text = $"{type.SortId}{type.AttrId}";
ControlUtils.SelectItemWithPk(AreaCommitmentTypeWineVariantInput, type.SortId);
ControlUtils.SelectItemWithPk(AreaCommitmentTypeWineAttributeInput, type.AttrId);
AreaCommitmentTypeMinKgPerHaInput.Text = $"{type.MinKgPerHa}";
AreaCommitmentTypePenaltyPerKgInput.Text = $"{type.PenaltyPerKg}";
AreaCommitmentTypePenaltyInput.Text = $"{type.PenaltyAmount}";
AreaCommitmentTypePenaltyNoneInput.Text = $"{type.PenaltyNone}";
} else {
AreaCommitmentTypeIdInput.Text = "";
AreaCommitmentTypeWineVariantInput.SelectedItem = null;
AreaCommitmentTypeWineAttributeInput.SelectedItem = null;
AreaCommitmentTypeMinKgPerHaInput.Text = "";
AreaCommitmentTypePenaltyPerKgInput.Text = "";
AreaCommitmentTypePenaltyInput.Text = "";
AreaCommitmentTypePenaltyNoneInput.Text = "";
}
_actUpdate = false;
}
private void AreaCommitmentTypeAddButton_Click(object sender, RoutedEventArgs evt) {
if (_actList == null) return;
_actChanged = true;
var item = new AreaComType { VtrgId = "", SortId = "" };
_actList.Add(item);
AreaCommitmentTypeList.SelectedItem = item;
UpdateButtons();
}
private void AreaCommitmentTypeDeleteButton_Click(object sender, RoutedEventArgs evt) {
if (_actList == null || _acts == null) return;
_actChanged = true;
var idx = AreaCommitmentTypeList.SelectedIndex;
var item = _actList[idx];
_acts[item.VtrgId] = null;
_actList.RemoveAt(idx);
AreaCommitmentTypeList.SelectedIndex = idx < _actList.Count ? idx : idx - 1;
UpdateButtons();
}
private void AreaCommitmentType_Changed(object? sender, RoutedEventArgs? evt) {
if (_actUpdate || (!IsEditing && !IsCreating) || AreaCommitmentTypeList.SelectedItem is not AreaComType attr || _acts == null || _actIds == null) return;
_actChanged = true;
var v = AreaCommitmentTypeWineVariantInput.SelectedItem as WineVar;
var a = AreaCommitmentTypeWineAttributeInput.SelectedItem as WineAttr;
AreaCommitmentTypeIdInput.Text = $"{v?.SortId}{a?.AttrId}";
var old = _actIds.GetValueOrDefault(attr);
var id = AreaCommitmentTypeIdInput.Text;
if (old != null) _acts[old] = id;
attr.VtrgId = id;
attr.SortId = v?.SortId;
attr.AttrId = a?.AttrId;
attr.MinKgPerHa = AreaCommitmentTypeMinKgPerHaInput.Text.Length > 0 ? int.Parse(AreaCommitmentTypeMinKgPerHaInput.Text) : null;
attr.PenaltyPerKg = AreaCommitmentTypePenaltyPerKgInput.Text.Length > 0 ? decimal.Parse(AreaCommitmentTypePenaltyPerKgInput.Text) : null;
attr.PenaltyAmount = AreaCommitmentTypePenaltyInput.Text.Length > 0 ? decimal.Parse(AreaCommitmentTypePenaltyInput.Text) : null;
attr.PenaltyNone = AreaCommitmentTypePenaltyNoneInput.Text.Length > 0 ? decimal.Parse(AreaCommitmentTypePenaltyNoneInput.Text) : null;
CollectionViewSource.GetDefaultView(_actList).Refresh();
UpdateButtons();
}
private void AreaCommitmentTypeIdInput_TextChanged(object sender, TextChangedEventArgs evt) {
UpperCaseInput_TextChanged(sender, evt);
AreaCommitmentType_Changed(sender, evt);
}
private void AreaCommitmentTypeMinKgPerHa_TextChanged(object sender, TextChangedEventArgs evt) {
InputTextChanged((TextBox)sender, Validator.CheckInteger((TextBox)sender, false, 5));
AreaCommitmentType_Changed(sender, evt);
}
private void AreaCommitmentTypePenaltyPerKgInput_TextChanged(object sender, TextChangedEventArgs evt) {
if (SeasonList.SelectedItem is not Season s) return;
InputTextChanged((TextBox)sender, Validator.CheckDecimal((TextBox)sender, false, 2, s.Precision));
AreaCommitmentType_Changed(sender, evt);
}
private void AreaCommitmentTypePenaltyInput_TextChanged(object sender, TextChangedEventArgs evt) {
InputTextChanged((TextBox)sender, Validator.CheckDecimal((TextBox)sender, false, 4, 2));
AreaCommitmentType_Changed(sender, evt);
}
}
}