164 lines
6.9 KiB
C#
164 lines
6.9 KiB
C#
using Elwig.Helpers;
|
|
using Elwig.Models.Entities;
|
|
using Elwig.Windows;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using System;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Data;
|
|
|
|
namespace Elwig.Dialogs {
|
|
public partial class DeliverySplittingDialog : ContextWindow {
|
|
|
|
public class Row {
|
|
public DeliveryPart Part { get; set; }
|
|
public bool SplitCompletely { get; set; }
|
|
public string? SplitWeightString { get; set; }
|
|
public int? SplitWeight {
|
|
get => int.TryParse(SplitWeightString, out var v) ? v : null;
|
|
set => SplitWeightString = $"{value}";
|
|
}
|
|
public bool SplitWeightEnabled { get; set; }
|
|
}
|
|
|
|
private readonly Delivery _delivery;
|
|
|
|
public int? MgNr { get; set; }
|
|
public string? LsNr { get; set; }
|
|
public int[]? Weights => DeliveryParts.Select(r => r.SplitCompletely ? r.Part.Weight : r.SplitWeight ?? 0).ToArray();
|
|
|
|
public ObservableCollection<Row> DeliveryParts { get; set; }
|
|
|
|
public DeliverySplittingDialog(Delivery d) {
|
|
_delivery = d;
|
|
DeliveryParts = new(d.Parts.Select(p => new Row {
|
|
Part = p,
|
|
SplitCompletely = false,
|
|
SplitWeight = null,
|
|
SplitWeightEnabled = true,
|
|
}).ToList());
|
|
InitializeComponent();
|
|
}
|
|
|
|
protected override async Task OnRenewContext(AppDbContext ctx) {
|
|
ControlUtils.RenewItemsSource(MemberInput, await ctx.Members
|
|
.Where(m => m.IsActive)
|
|
.OrderBy(m => m.Name)
|
|
.ThenBy(m => m.GivenName)
|
|
.ToListAsync());
|
|
ControlUtils.RenewItemsSource(DeliveryInput, await ctx.Deliveries
|
|
.Where(d => d.DateString == $"{_delivery.Date:yyyy-MM-dd}" && d.ZwstId == _delivery.ZwstId)
|
|
.OrderBy(d => d.LsNr)
|
|
.Include(d => d.Member)
|
|
.Include(d => d.Parts)
|
|
.ToListAsync());
|
|
if (DeliveryInput.SelectedItem == null)
|
|
ControlUtils.SelectItem(DeliveryInput, _delivery);
|
|
CheckValidity();
|
|
}
|
|
|
|
private void ConfirmButton_Click(object sender, RoutedEventArgs evt) {
|
|
if (DepreciateModeInput.IsChecked == true) {
|
|
MgNr = null;
|
|
LsNr = null;
|
|
} else if (MemberModeInput.IsChecked == true) {
|
|
MgNr = ((Member)MemberInput.SelectedItem).MgNr;
|
|
LsNr = null;
|
|
} else if (DeliveryModeInput.IsChecked == true) {
|
|
MgNr = null;
|
|
LsNr = ((Delivery)DeliveryInput.SelectedItem).LsNr;
|
|
}
|
|
DialogResult = true;
|
|
Close();
|
|
}
|
|
|
|
private void ModeInput_Changed(object sender, RoutedEventArgs evt) {
|
|
if (!IsLoaded) return;
|
|
CheckValidity();
|
|
if (DepreciateModeInput.IsChecked == true) {
|
|
MgNrInput.Visibility = Visibility.Hidden;
|
|
MemberInput.Visibility = Visibility.Hidden;
|
|
MemberReferenceButton.Visibility = Visibility.Hidden;
|
|
DeliveryInput.Visibility = Visibility.Hidden;
|
|
} else if (MemberModeInput.IsChecked == true) {
|
|
MgNrInput.Visibility = Visibility.Visible;
|
|
MemberInput.Visibility = Visibility.Visible;
|
|
MemberReferenceButton.Visibility = Visibility.Visible;
|
|
DeliveryInput.Visibility = Visibility.Hidden;
|
|
} else if (DeliveryModeInput.IsChecked == true) {
|
|
MgNrInput.Visibility = Visibility.Hidden;
|
|
MemberInput.Visibility = Visibility.Hidden;
|
|
MemberReferenceButton.Visibility = Visibility.Hidden;
|
|
DeliveryInput.Visibility = Visibility.Visible;
|
|
}
|
|
}
|
|
|
|
private void CheckValidity() {
|
|
var weight = DeliveryParts.Sum(r => r.SplitCompletely ? r.Part.Weight : r.SplitWeight ?? 0);
|
|
var total = DeliveryParts.Sum(r => r.Part.Weight);
|
|
InfoBlock.Text = $"Insgesamt {weight:N0} kg / {total:N0} kg ausgewählt.";
|
|
ConfirmButton.IsEnabled = DeliveryParts.Any(r => r.SplitCompletely || r.SplitWeight > 0) && (
|
|
DepreciateModeInput.IsChecked == true ||
|
|
(MemberModeInput.IsChecked == true && MemberInput.SelectedItem != null && !DeliveryParts.All(r => r.SplitCompletely)) ||
|
|
(DeliveryModeInput.IsChecked == true && DeliveryInput.SelectedItem != null));
|
|
}
|
|
|
|
private void MgNrInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
var res = Validator.CheckMgNr((TextBox)sender, true);
|
|
var text = MgNrInput.Text;
|
|
var caret = MgNrInput.CaretIndex;
|
|
ControlUtils.SelectItemWithPk(MemberInput, res.IsValid ? int.Parse(MgNrInput.Text) : null);
|
|
MgNrInput.Text = text;
|
|
MgNrInput.CaretIndex = caret;
|
|
}
|
|
|
|
private void MemberInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
|
var m = MemberInput.SelectedItem as Member;
|
|
MgNrInput.Text = m?.MgNr.ToString();
|
|
CheckValidity();
|
|
}
|
|
|
|
private void MemberReferenceButton_Click(object sender, RoutedEventArgs evt) {
|
|
if (MemberInput.SelectedItem is not Member m) return;
|
|
App.FocusMember(m.MgNr);
|
|
}
|
|
|
|
private void DeliveryInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
|
CheckValidity();
|
|
}
|
|
|
|
private void SplitCompletelyInput_Changed(object sender, RoutedEventArgs evt) {
|
|
var checkbox = (CheckBox)sender;
|
|
var dpnr = int.Parse(checkbox.Tag.ToString()!);
|
|
var row = DeliveryParts.First(d => d.Part.DPNr == dpnr);
|
|
if (checkbox.IsChecked == true) {
|
|
row.SplitWeightEnabled = false;
|
|
row.SplitWeight = row.Part.Weight;
|
|
} else if (checkbox.IsChecked == false) {
|
|
row.SplitWeightEnabled = true;
|
|
row.SplitWeight = null;
|
|
}
|
|
CollectionViewSource.GetDefaultView(DeliveryParts).Refresh();
|
|
CheckValidity();
|
|
}
|
|
|
|
private void SplitWeightInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
|
var textbox = (TextBox)sender;
|
|
Validator.CheckInteger(textbox, false, 6);
|
|
var dpnr = int.Parse(textbox.Tag.ToString()!);
|
|
var row = DeliveryParts.First(d => d.Part.DPNr == dpnr);
|
|
var w = int.TryParse(textbox.Text, out var v) ? v : (int?)null;
|
|
if (w >= row.Part.Weight) {
|
|
row.SplitCompletely = true;
|
|
row.SplitWeightEnabled = false;
|
|
row.SplitWeight = row.Part.Weight;
|
|
CollectionViewSource.GetDefaultView(DeliveryParts).Refresh();
|
|
}
|
|
CheckValidity();
|
|
}
|
|
}
|
|
}
|