Compare commits

..

2 Commits

Author SHA1 Message Date
lorenz.stechauner a62fb9ab16 Saving delivery now works 2023-07-31 15:42:46 +02:00
lorenz.stechauner d06ea4f045 Fix Buttons in DeliveryAdminWindow 2023-07-31 11:28:45 +02:00
5 changed files with 248 additions and 17 deletions
+8
View File
@@ -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))
+1
View File
@@ -222,6 +222,7 @@ namespace Elwig.Windows {
!IsValid ||
TextBoxInputs.Any(InputHasChanged) ||
ComboBoxInputs.Any(InputHasChanged) ||
CheckComboBoxInputs.Any(InputHasChanged) ||
CheckBoxInputs.Any(InputHasChanged) ||
RadioButtonInputs.Any(InputHasChanged);
+12
View File
@@ -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"/>
+219 -13
View File
@@ -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) {
+8 -4
View File
@@ -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) {