Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a62fb9ab16 | |||
| d06ea4f045 |
@@ -122,6 +122,14 @@ namespace Elwig.Helpers {
|
||||
return c + 1;
|
||||
}
|
||||
|
||||
public async Task<int> NextDId(int year) {
|
||||
return await Deliveries.Where(d => d.Year == year).Select(d => d.DId).MaxAsync() + 1;
|
||||
}
|
||||
|
||||
public async Task<int> NextDPNr(int year, int did) {
|
||||
return await DeliveryParts.Where(p => p.Year == year && p.DId == did).Select(d => d.DPNr).MaxAsync() + 1;
|
||||
}
|
||||
|
||||
public async Task<WineQualLevel> GetWineQualityLevel(double kmw) {
|
||||
return await WineQualityLevels
|
||||
.Where(q => !q.IsPredicate && (q.MinKmw == null || q.MinKmw <= kmw))
|
||||
|
||||
@@ -222,6 +222,7 @@ namespace Elwig.Windows {
|
||||
!IsValid ||
|
||||
TextBoxInputs.Any(InputHasChanged) ||
|
||||
ComboBoxInputs.Any(InputHasChanged) ||
|
||||
CheckComboBoxInputs.Any(InputHasChanged) ||
|
||||
CheckBoxInputs.Any(InputHasChanged) ||
|
||||
RadioButtonInputs.Any(InputHasChanged);
|
||||
|
||||
|
||||
@@ -104,6 +104,18 @@
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
|
||||
<Button x:Name="FinishButton" Content="Abschließen" IsEnabled="False" Visibility="Hidden"
|
||||
ToolTip="Übernahme abschließen und Lieferschein drucken"
|
||||
HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="5,5,2.5,10" Grid.Column="0" Grid.Row="2"
|
||||
Click="FinishButton_Click"/>
|
||||
<Button x:Name="NewDeliveryPartButton" Content="Neue Teil-Lfrg." IsEnabled="False" Visibility="Hidden"
|
||||
ToolTip="Neue Teillieferung auf selben Lieferschein hinzufügen"
|
||||
HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="2.5,5,2.5,10" Grid.Column="1" Grid.Row="2"
|
||||
Click="NewDeliveryPartButton_Click"/>
|
||||
<Button x:Name="CancelCreatingButton" Content="Abbrechen" IsEnabled="False" Visibility="Hidden"
|
||||
HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="2.5,5,5,10" Grid.Column="2" Grid.Row="2"
|
||||
Click="CancelCreatingButton_Click"/>
|
||||
|
||||
<Button x:Name="NewDeliveryButton" Content="Neu" IsEnabled="False" Visibility="Hidden"
|
||||
HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="5,5,2.5,10" Grid.Column="0" Grid.Row="2"
|
||||
Click="NewDeliveryButton_Click"/>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Elwig.Helpers;
|
||||
using Elwig.Models;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.ChangeTracking;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@@ -74,16 +75,28 @@ namespace Elwig.Windows {
|
||||
OnSecondPassed(null, null);
|
||||
Timer.Start();
|
||||
LockInputs();
|
||||
if (IsReceipt) NewDeliveryButton_Click(null, null);
|
||||
}
|
||||
|
||||
private void OnSecondPassed(object? sender, EventArgs? evt) {
|
||||
if (IsReceipt && (IsEditing || IsCreating)) {
|
||||
if (IsReceipt && IsCreating) {
|
||||
var now = DateTime.Now;
|
||||
TimeInput.Text = now.ToString("HH:mm");
|
||||
DateInput.Text = now.ToString("dd.MM.yyyy");
|
||||
}
|
||||
}
|
||||
|
||||
private void InitInputs() {
|
||||
ControlUtils.SelectComboBoxItem(BranchInput, i => (i as Branch)?.ZwstId, App.ZwstId);
|
||||
OnSecondPassed(null, null);
|
||||
UpdateLsNr().GetAwaiter().GetResult();
|
||||
HandPickedInput.IsChecked = null;
|
||||
// FIXME if Matzen
|
||||
GerebeltGewogenInput.IsChecked = true;
|
||||
FillOriginalValues();
|
||||
ValidateRequiredInputs();
|
||||
}
|
||||
|
||||
protected override void UpdateButtons() {
|
||||
if (!IsEditing && !IsCreating) return;
|
||||
bool ch = HasChanged, v = IsValid;
|
||||
@@ -214,6 +227,130 @@ namespace Elwig.Windows {
|
||||
FillOriginalValues();
|
||||
}
|
||||
|
||||
private async Task<DeliveryPart> UpdateDeliveryPart(Delivery? d, DeliveryPart? p) {
|
||||
int year, did, dpnr;
|
||||
bool deliveryNew = d == null;
|
||||
if (d == null) {
|
||||
d = Context.CreateProxy<Delivery>();
|
||||
year = Utils.CurrentNextSeason;
|
||||
did = await Context.NextDId(year);
|
||||
} else {
|
||||
year = d.Year;
|
||||
did = d.DId;
|
||||
}
|
||||
if (p == null) {
|
||||
p = Context.CreateProxy<DeliveryPart>();
|
||||
dpnr = await Context.NextDPNr(year, did);
|
||||
} else {
|
||||
dpnr = p.DPNr;
|
||||
}
|
||||
d.Year = year;
|
||||
d.DId = did;
|
||||
p.Year = year;
|
||||
p.DId = did;
|
||||
p.DPNr = dpnr;
|
||||
|
||||
d.DateString = string.Join("-", DateInput.Text.Split(".").Reverse());
|
||||
if (IsCreating || InputHasChanged(DateInput)) {
|
||||
d.LNr = await Context.NextLNr(d.Date);
|
||||
}
|
||||
if (IsCreating) {
|
||||
d.TimeString = DateTime.Now.ToString("HH:mm:SS");
|
||||
} else if (InputHasChanged(TimeInput)) {
|
||||
d.TimeString = TimeInput.Text + ":00";
|
||||
}
|
||||
d.ZwstId = (BranchInput.SelectedItem as Branch)?.ZwstId;
|
||||
d.LsNr = LsNrInput.Text;
|
||||
d.MgNr = int.Parse(MgNrInput.Text);
|
||||
d.Comment = (CommentInput.Text == "") ? null : CommentInput.Text;
|
||||
|
||||
p.SortId = (WineVarietyInput.SelectedItem as WineVar)?.SortId;
|
||||
p.Weight = int.Parse(WeightInput.Text);
|
||||
p.Kmw = double.Parse(GradationKmwInput.Text);
|
||||
p.QualId = (WineQualityLevelInput.SelectedItem as WineQualLevel)?.QualId;
|
||||
p.HkId = (WineOriginInput.SelectedItem as WineOrigin)?.HkId;
|
||||
p.KgNr = (WineKgInput.SelectedItem as AT_Kg)?.KgNr;
|
||||
p.RdNr = (WineRdInput.SelectedItem as WbRd)?.RdNr;
|
||||
|
||||
p.IsGerebelt = GerebeltGewogenInput.IsChecked ?? false;
|
||||
p.ManualWeighing = ManualWeighingInput.IsChecked ?? false;
|
||||
p.IsHandPicked = HandPickedInput.IsChecked;
|
||||
p.IsLesewagen = LesewagenInput.IsChecked;
|
||||
p.Temperature = (TemperatureInput.Text == "") ? null : double.Parse(TemperatureInput.Text);
|
||||
p.Acid = (TemperatureInput.Text == "") ? null : double.Parse(AcidInput.Text);
|
||||
p.Comment = (PartCommentInput.Text == "") ? null : PartCommentInput.Text;
|
||||
|
||||
// TODO weighing/scale id
|
||||
// p.ScaleId
|
||||
// p.WeighingId
|
||||
|
||||
EntityEntry<Delivery>? dEntry = null;
|
||||
EntityEntry<DeliveryPart>? pEntry = null;
|
||||
try {
|
||||
if (IsEditing) {
|
||||
dEntry = Context.Update(d);
|
||||
pEntry = Context.Update(p);
|
||||
} else if (IsCreating) {
|
||||
if (deliveryNew) {
|
||||
dEntry = await Context.AddAsync(d);
|
||||
} else {
|
||||
dEntry = Context.Update(d);
|
||||
}
|
||||
pEntry = await Context.AddAsync(p);
|
||||
}
|
||||
|
||||
foreach (var a in AttributesInput.ItemsSource.Cast<WineAttr>()) {
|
||||
var attr = p.PartAttributes.Where(pa => pa.AttrId == a.AttrId).FirstOrDefault();
|
||||
if (AttributesInput.SelectedItems.Contains(a)) {
|
||||
DeliveryPartAttr dpa = attr ?? Context.CreateProxy<DeliveryPartAttr>();
|
||||
dpa.Year = year;
|
||||
dpa.DId = did;
|
||||
dpa.DPNr = dpnr;
|
||||
dpa.AttrId = a.AttrId;
|
||||
if (attr == null) {
|
||||
await Context.AddAsync(dpa);
|
||||
} else {
|
||||
Context.Update(dpa);
|
||||
}
|
||||
} else {
|
||||
if (attr != null) {
|
||||
Context.Remove(attr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var m in ModifiersInput.ItemsSource.Cast<Modifier>()) {
|
||||
var mod = p.PartModifiers.Where(pa => pa.ModId == m.ModId).FirstOrDefault();
|
||||
if (ModifiersInput.SelectedItems.Contains(m)) {
|
||||
DeliveryPartModifier dpm = mod ?? Context.CreateProxy<DeliveryPartModifier>();
|
||||
dpm.Year = year;
|
||||
dpm.DId = did;
|
||||
dpm.DPNr = dpnr;
|
||||
dpm.ModId = m.ModId;
|
||||
if (mod == null) {
|
||||
await Context.AddAsync(dpm);
|
||||
} else {
|
||||
Context.Update(dpm);
|
||||
}
|
||||
} else {
|
||||
if (mod != null) {
|
||||
Context.Remove(mod);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await Context.SaveChangesAsync();
|
||||
} catch (Exception exc) {
|
||||
if (dEntry != null) await dEntry.ReloadAsync();
|
||||
if (pEntry != null) await pEntry.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, "Lieferung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
private async void SearchInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||
TextFilter = SearchInput.Text.ToLower().Split(" ").ToList().FindAll(e => e.Length > 0);
|
||||
await RefreshDeliveryListQuery(true);
|
||||
@@ -277,12 +414,41 @@ namespace Elwig.Windows {
|
||||
}
|
||||
}
|
||||
|
||||
private void NewDeliveryButton_Click(object sender, RoutedEventArgs evt) {
|
||||
private void FinishButton_Click(object sender, RoutedEventArgs evt) {
|
||||
// TODO finish (save) and print
|
||||
}
|
||||
|
||||
private void NewDeliveryPartButton_Click(object sender, RoutedEventArgs evt) {
|
||||
// TODO new delivery part
|
||||
}
|
||||
|
||||
private void CancelCreatingButton_Click(object sender, RoutedEventArgs evt) {
|
||||
IsCreating = false;
|
||||
IsEditing = false;
|
||||
DeliveryList.IsEnabled = true;
|
||||
DeliveryPartList.IsEnabled = true;
|
||||
HideFinishNewPartDeliveryCancelButtons();
|
||||
ShowNewEditDeleteButtons();
|
||||
RefreshInputs();
|
||||
ClearInputStates();
|
||||
LockInputs();
|
||||
UnlockSearchInputs();
|
||||
}
|
||||
|
||||
private void NewDeliveryButton_Click(object? sender, RoutedEventArgs? evt) {
|
||||
IsCreating = true;
|
||||
DeliveryList.IsEnabled = false;
|
||||
DeliveryPartList.IsEnabled = false;
|
||||
DeliveryList.SelectedItem = null;
|
||||
HideNewEditDeleteButtons();
|
||||
ShowFinishNewPartDeliveryCancelButtons();
|
||||
UnlockInputs();
|
||||
InitInputs();
|
||||
LockSearchInputs();
|
||||
}
|
||||
|
||||
private void AbwertenButton_Click(object sender, RoutedEventArgs evt) {
|
||||
|
||||
// TODO abwerten dialog
|
||||
}
|
||||
|
||||
private void EditDeliveryButton_Click(object sender, RoutedEventArgs evt) {
|
||||
@@ -304,11 +470,30 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
private void DeleteDeliveryButton_Click(object sender, RoutedEventArgs evt) {
|
||||
|
||||
// TODO delete dialog
|
||||
// TODO delete delivery
|
||||
}
|
||||
|
||||
private void SaveButton_Click(object sender, RoutedEventArgs evt) {
|
||||
private async void SaveButton_Click(object sender, RoutedEventArgs evt) {
|
||||
DeliveryPart p = await UpdateDeliveryPart(DeliveryList.SelectedItem as Delivery, DeliveryPartList.SelectedItem as DeliveryPart);
|
||||
|
||||
IsEditing = false;
|
||||
IsCreating = false;
|
||||
DeliveryList.IsEnabled = true;
|
||||
DeliveryPartList.IsEnabled = true;
|
||||
|
||||
HideSaveResetCancelButtons();
|
||||
ShowNewEditDeleteButtons();
|
||||
LockInputs();
|
||||
UnlockSearchInputs();
|
||||
FillOriginalValues();
|
||||
await RefreshDeliveryList();
|
||||
RefreshDeliveryParts();
|
||||
RefreshInputs();
|
||||
|
||||
AbwertenButton.IsEnabled = true;
|
||||
ExtractDeliveryPartButton.IsEnabled = true;
|
||||
DeleteDeliveryPartButton.IsEnabled = true;
|
||||
}
|
||||
|
||||
private void ResetButton_Click(object sender, RoutedEventArgs evt) {
|
||||
@@ -316,7 +501,7 @@ namespace Elwig.Windows {
|
||||
RefreshInputs();
|
||||
} else if (IsCreating) {
|
||||
ClearInputs();
|
||||
//InitInputs(); TODO
|
||||
InitInputs();
|
||||
}
|
||||
UpdateButtons();
|
||||
}
|
||||
@@ -340,14 +525,13 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
private void ExtractDeliveryPartButton_Click(object sender, RoutedEventArgs evt) {
|
||||
|
||||
// TODO extract delivery part
|
||||
}
|
||||
|
||||
private void DeleteDeliveryPartButton_Click(object sender, RoutedEventArgs evt) {
|
||||
|
||||
// TODO delete delivery part
|
||||
}
|
||||
|
||||
|
||||
private void ShowSaveResetCancelButtons() {
|
||||
SaveButton.IsEnabled = false;
|
||||
ResetButton.IsEnabled = false;
|
||||
@@ -388,6 +572,24 @@ namespace Elwig.Windows {
|
||||
DeleteDeliveryButton.Visibility = Visibility.Hidden;
|
||||
}
|
||||
|
||||
private void ShowFinishNewPartDeliveryCancelButtons() {
|
||||
FinishButton.IsEnabled = IsCreating && IsValid;
|
||||
NewDeliveryPartButton.IsEnabled = IsCreating && IsValid;
|
||||
CancelCreatingButton.IsEnabled = true;
|
||||
FinishButton.Visibility = Visibility.Visible;
|
||||
NewDeliveryPartButton.Visibility = Visibility.Visible;
|
||||
CancelCreatingButton.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
private void HideFinishNewPartDeliveryCancelButtons() {
|
||||
FinishButton.IsEnabled = false;
|
||||
NewDeliveryPartButton.IsEnabled = false;
|
||||
CancelCreatingButton.IsEnabled = false;
|
||||
FinishButton.Visibility = Visibility.Hidden;
|
||||
NewDeliveryPartButton.Visibility = Visibility.Hidden;
|
||||
CancelCreatingButton.Visibility = Visibility.Hidden;
|
||||
}
|
||||
|
||||
private void LockSearchInputs() {
|
||||
SearchInput.IsEnabled = false;
|
||||
TodayOnlyInput.IsEnabled = false;
|
||||
@@ -416,10 +618,14 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
private async Task UpdateLsNr() {
|
||||
var branch = (Branch)BranchInput.SelectedItem;
|
||||
var date = DateOnly.ParseExact(DateInput.Text, "dd.MM.yyyy");
|
||||
var lnr = await Context.NextLNr(date);
|
||||
LsNrInput.Text = $"{date:yyyyMMdd}{branch.ZwstId}{lnr:000}";
|
||||
if (DateInput.Text == "" || BranchInput.SelectedItem == null) {
|
||||
LsNrInput.Text = "";
|
||||
} else {
|
||||
var branch = (Branch)BranchInput.SelectedItem;
|
||||
var date = DateOnly.ParseExact(DateInput.Text, "dd.MM.yyyy");
|
||||
var lnr = await Context.NextLNr(date);
|
||||
LsNrInput.Text = $"{date:yyyyMMdd}{branch.ZwstId}{lnr:000}";
|
||||
}
|
||||
}
|
||||
|
||||
private void DateInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||
|
||||
@@ -137,7 +137,7 @@ namespace Elwig.Windows {
|
||||
inputs.Item3.Text = comment;
|
||||
}
|
||||
|
||||
private (string, string, string?)? GetPhonenrInput(int nr) {
|
||||
private (string, string, string?)? GetPhoneNrInput(int nr) {
|
||||
var inputs = PhoneNrInputs[nr];
|
||||
var number = inputs.Item2.Text;
|
||||
if (string.IsNullOrEmpty(number))
|
||||
@@ -206,7 +206,7 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
private async void SaveButton_Click(object sender, RoutedEventArgs evt) {
|
||||
Member m = await UpdateMember(IsEditing ? (Member)MemberList.SelectedItem : Context.CreateProxy<Member>());
|
||||
Member m = await UpdateMember(MemberList.SelectedItem as Member);
|
||||
IsEditing = false;
|
||||
IsCreating = false;
|
||||
MemberList.IsEnabled = true;
|
||||
@@ -215,7 +215,9 @@ namespace Elwig.Windows {
|
||||
LockInputs();
|
||||
UpdatePhoneNrInputVisibility();
|
||||
UnlockSearchInputs();
|
||||
FillOriginalValues();
|
||||
await RefreshMemberList();
|
||||
RefreshInputs();
|
||||
SearchInput.Text = "";
|
||||
MemberList.SelectedItem = m;
|
||||
}
|
||||
@@ -326,7 +328,9 @@ namespace Elwig.Windows {
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<Member> UpdateMember(Member m) {
|
||||
private async Task<Member> UpdateMember(Member? m) {
|
||||
m ??= Context.CreateProxy<Member>();
|
||||
|
||||
int newMgNr = int.Parse(MgNrInput.Text);
|
||||
m.PredecessorMgNr = (PredecessorMgNrInput.Text == "") ? null : int.Parse(PredecessorMgNrInput.Text);
|
||||
m.Prefix = (PrefixInput.Text == "") ? null : PrefixInput.Text;
|
||||
@@ -389,7 +393,7 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
for (int i = 0, j = 0; i < PhoneNrInputs.Length; i++) {
|
||||
var input = GetPhonenrInput(i);
|
||||
var input = GetPhoneNrInput(i);
|
||||
var phoneNr = m.TelephoneNumbers.FirstOrDefault(p => p.Nr - 1 == i);
|
||||
if (input == null) {
|
||||
if (phoneNr != null) {
|
||||
|
||||
Reference in New Issue
Block a user