|
@@ -42,8 +42,21 @@ public class StockHoldingRelocationItem : INotifyPropertyChanged
|
|
|
|
|
|
public double MaxValue { get; set; }
|
|
|
|
|
|
+ private bool _editable = true;
|
|
|
+ public bool Editable
|
|
|
+ {
|
|
|
+ get => _editable;
|
|
|
+ set
|
|
|
+ {
|
|
|
+ _editable = value;
|
|
|
+ OnPropertyChanged();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public Guid ID { get; set; }
|
|
|
|
|
|
+ public JobRequisitionItem JRI { get; set; }
|
|
|
+
|
|
|
public event PropertyChangedEventHandler? PropertyChanged;
|
|
|
|
|
|
protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
|
|
@@ -83,7 +96,7 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public StockHolding From { get; set; }
|
|
|
+ public StockHolding From { get; private init; }
|
|
|
|
|
|
private bool _isTargetEditable = true;
|
|
|
public bool IsTargetEditable
|
|
@@ -96,6 +109,50 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private bool _isJobEditable = false;
|
|
|
+ public bool IsJobEditable
|
|
|
+ {
|
|
|
+ get => _isJobEditable;
|
|
|
+ set
|
|
|
+ {
|
|
|
+ _isJobEditable = value;
|
|
|
+ OnPropertyChanged();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private Job? _job;
|
|
|
+ public Job? Job
|
|
|
+ {
|
|
|
+ get => _job;
|
|
|
+ set
|
|
|
+ {
|
|
|
+ _job = value;
|
|
|
+ OnPropertyChanged();
|
|
|
+ OnPropertyChanged(nameof(CanSave));
|
|
|
+ OnPropertyChanged($"{nameof(Job)}.{nameof(Job.JobNumber)}");
|
|
|
+ OnPropertyChanged($"{nameof(Job)}.{nameof(Job.Name)}");
|
|
|
+
|
|
|
+ SetObserving(false);
|
|
|
+
|
|
|
+ var jobID = value?.ID ?? Guid.Empty;
|
|
|
+ foreach(var item in Items)
|
|
|
+ {
|
|
|
+ if(item.JRI.ID != Guid.Empty && item.JRI.Job.ID != jobID)
|
|
|
+ {
|
|
|
+ item.Editable = false;
|
|
|
+ item.Issued = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ item.Editable = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ SetObserving(true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private StockLocation? _to;
|
|
|
public StockLocation? To
|
|
|
{
|
|
@@ -169,7 +226,8 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
|
|
|
Text = item.ID == Guid.Empty
|
|
|
? "Unrequisitioned Items"
|
|
|
: $"{item.Job.JobNumber}:{item.Requisition.Number} {item.Requisition.Description} ({qty})",
|
|
|
- ID = item.ID
|
|
|
+ ID = item.ID,
|
|
|
+ JRI = item
|
|
|
};
|
|
|
newItem.PropertyChanged += (o, e) => Recalculate();
|
|
|
if(item.ID == Guid.Empty)
|
|
@@ -216,6 +274,8 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
|
|
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
|
|
}
|
|
|
|
|
|
+ #region Quantity Buttons
|
|
|
+
|
|
|
private void Minus_Click(object sender, RoutedEventArgs e)
|
|
|
{
|
|
|
if (sender is not FrameworkElement element || element.Tag is not StockHoldingRelocationItem item) return;
|
|
@@ -249,7 +309,11 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
|
|
|
item.Issued = Math.Max(0, item.Quantity);
|
|
|
}
|
|
|
|
|
|
- private bool DoLookup(string? column, string? value)
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region Target Location
|
|
|
+
|
|
|
+ private bool DoLookupLocation(string? column, string? value)
|
|
|
{
|
|
|
var grid = new MultiSelectDialog<StockLocation>(
|
|
|
LookupFactory.DefineFilter<StockLocation>(),
|
|
@@ -266,29 +330,17 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void ToButton_Click(object sender, RoutedEventArgs e)
|
|
|
- {
|
|
|
- DoLookup(null, null);
|
|
|
- }
|
|
|
-
|
|
|
- private void OKButton_Click(object sender, RoutedEventArgs e)
|
|
|
- {
|
|
|
- DialogResult = true;
|
|
|
- Close();
|
|
|
- }
|
|
|
-
|
|
|
- private void CancelButton_Click(object sender, RoutedEventArgs e)
|
|
|
+ private void ToBox_LostFocus(object sender, RoutedEventArgs e)
|
|
|
{
|
|
|
- DialogResult = false;
|
|
|
- Close();
|
|
|
+ DoSearchLocation();
|
|
|
}
|
|
|
|
|
|
- private void ToBox_LostFocus(object sender, RoutedEventArgs e)
|
|
|
+ private void ToButton_Click(object sender, RoutedEventArgs e)
|
|
|
{
|
|
|
- DoSearch();
|
|
|
+ DoLookupLocation(null, null);
|
|
|
}
|
|
|
|
|
|
- private void DoSearch()
|
|
|
+ private void DoSearchLocation()
|
|
|
{
|
|
|
if (ToBox.Text.IsNullOrWhiteSpace() || ToBox.Text == To?.Code)
|
|
|
{
|
|
@@ -306,7 +358,7 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if(!DoLookup(nameof(To.Code), ToBox.Text))
|
|
|
+ if(!DoLookupLocation(nameof(To.Code), ToBox.Text))
|
|
|
{
|
|
|
To = null;
|
|
|
}
|
|
@@ -316,6 +368,83 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
|
|
|
private void ToBox_OnKeyUp(object sender, KeyEventArgs e)
|
|
|
{
|
|
|
if (e.Key == Key.Enter)
|
|
|
- DoSearch();
|
|
|
+ DoSearchLocation();
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region Job
|
|
|
+
|
|
|
+ private bool DoLookupJob(string? column, string? value)
|
|
|
+ {
|
|
|
+ var grid = new MultiSelectDialog<Job>(
|
|
|
+ LookupFactory.DefineFilter<Job>(),
|
|
|
+ Columns.None<Job>().Add(x => x.ID).Add(x => x.JobNumber).Add(x => x.Name),
|
|
|
+ multiselect: false);
|
|
|
+ if (grid.ShowDialog(column, value))
|
|
|
+ {
|
|
|
+ Job = grid.Data().Rows.First().ToObject<Job>();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void JobBox_LostFocus(object sender, RoutedEventArgs e)
|
|
|
+ {
|
|
|
+ DoSearchJob();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void JobButton_Click(object sender, RoutedEventArgs e)
|
|
|
+ {
|
|
|
+ DoLookupJob(null, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void DoSearchJob()
|
|
|
+ {
|
|
|
+ if (JobBox.Text.IsNullOrWhiteSpace() || JobBox.Text == To?.Code)
|
|
|
+ {
|
|
|
+ Job = null;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ var job = Client.Query(
|
|
|
+ new Filter<Job>(x => x.JobNumber).IsEqualTo(JobBox.Text),
|
|
|
+ Columns.None<Job>().Add(x => x.ID).Add(x => x.JobNumber).Add(x => x.Name))
|
|
|
+ .ToObjects<Job>().FirstOrDefault();
|
|
|
+ if(job is not null)
|
|
|
+ {
|
|
|
+ Job = job;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(!DoLookupJob(nameof(Job.JobNumber), JobBox.Text))
|
|
|
+ {
|
|
|
+ Job = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void JobBox_OnKeyUp(object sender, KeyEventArgs e)
|
|
|
+ {
|
|
|
+ if (e.Key == Key.Enter)
|
|
|
+ DoSearchJob();
|
|
|
}
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ private void OKButton_Click(object sender, RoutedEventArgs e)
|
|
|
+ {
|
|
|
+ DialogResult = true;
|
|
|
+ Close();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void CancelButton_Click(object sender, RoutedEventArgs e)
|
|
|
+ {
|
|
|
+ DialogResult = false;
|
|
|
+ Close();
|
|
|
+ }
|
|
|
+
|
|
|
}
|