Bladeren bron

Allow selecting job on issue screen

Kenric Nugteren 1 jaar geleden
bovenliggende
commit
74a5f014b1

+ 1 - 0
prs.classes/Entities/Stock/StockHolding/StockHolding.cs

@@ -207,6 +207,7 @@ namespace Comal.Classes
                     Columns.None<JobRequisitionItem>().Add(x => x.ID)
                         .Add(x => x.Job.ID)
                         .Add(x => x.Job.JobNumber)
+                        .Add(x => x.Job.Name)
                         .Add(x => x.Requisition.Number)
                         .Add(x => x.Requisition.Description)
                         .Add(x=>x.Status)

+ 8 - 2
prs.desktop/Panels/Products/Locations/StockHoldingGrid.cs

@@ -447,6 +447,12 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
             var win = new StockHoldingRelocationWindow(holding, requiitems)
             {
                 IsTargetEditable = false,
+                IsJobEditable = true,
+                Job = new Job
+                {
+                    ID = holding.Job.ID,
+                    JobNumber = holding.Job.JobNumber
+                },
                 Title = "Issue Items"
             };
             if (win.ShowDialog() == true)
@@ -456,10 +462,10 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
 
                 foreach(var requi in requiitems)
                 {
-                    if (!quantities.TryGetValue(requi.ID, out var qty)) continue;
+                    if (!quantities.TryGetValue(requi.ID, out var qty) || qty <= 0) continue;
 
                     var issue = new StockIssue();
-                    issue.Job.ID = requi.ID != Guid.Empty ? requi.Job.ID : holding.Job.ID;
+                    issue.Job.ID = win.Job.ID;
                     issue.Qty = qty;
 
                     updates.AddRange(CreateIssue(holding, issue, requi.ID));

+ 88 - 13
prs.desktop/Panels/Products/Locations/StockHoldingRelocationWindow.xaml

@@ -23,19 +23,50 @@
         <Grid.ColumnDefinitions>
             <ColumnDefinition Width="*"/>
         </Grid.ColumnDefinitions>
-        
-        <DockPanel 
-            Grid.Row="0" 
-            Margin="5">
-            
+
+        <Grid Grid.Row="0" Margin="5">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition>
+                    <ColumnDefinition.Style>
+                        <Style TargetType="ColumnDefinition">
+                            <Setter Property="Width" Value="0"/>
+                            <Style.Triggers>
+                                <DataTrigger Binding="{Binding IsJobEditable}" Value="True">
+                                    <Setter Property="Width" Value="*"/>
+                                </DataTrigger>
+                            </Style.Triggers>
+                        </Style>
+                    </ColumnDefinition.Style>
+                </ColumnDefinition>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition>
+                    <ColumnDefinition.Style>
+                        <Style TargetType="ColumnDefinition">
+                            <Setter Property="Width" Value="0"/>
+                            <Style.Triggers>
+                                <DataTrigger Binding="{Binding IsTargetEditable}" Value="True">
+                                    <Setter Property="Width" Value="*"/>
+                                </DataTrigger>
+                            </Style.Triggers>
+                        </Style>
+                    </ColumnDefinition.Style>
+                </ColumnDefinition>
+            </Grid.ColumnDefinitions>
             <Label 
-                DockPanel.Dock="Left"
+                Grid.Column="0"
                 VerticalAlignment="Center" 
                 Content="From:" 
                 FontWeight="Bold"/>
             
             <TextBox 
-                DockPanel.Dock="Left"
+                Grid.Column="1"
                 Margin="5,0,0,0"
                 Width="100"
                 IsEnabled="False" 
@@ -44,7 +75,46 @@
                 Background="WhiteSmoke"/>
             
             <Label 
-                DockPanel.Dock="Left"
+                Grid.Column="2"
+                Margin="5,0,0,0"
+                VerticalAlignment="Center" 
+                FontWeight="Bold" 
+                Content="Job:"
+                Visibility="{Binding IsJobEditable,Converter={StaticResource boolToVisibilityConverter}}"/>
+            
+            <TextBox 
+                Grid.Column="3"
+                Margin="5,0,0,0"
+                Width="100"
+                x:Name="JobBox" 
+                Text="{Binding Job.JobNumber}" 
+                Visibility="{Binding IsJobEditable,Converter={StaticResource boolToVisibilityConverter}}"
+                Background="LightYellow"
+                LostFocus="JobBox_LostFocus"
+                KeyUp="JobBox_OnKeyUp"
+                VerticalContentAlignment="Center"
+                BorderThickness="0.75,0.75,0,0.75"/>
+
+            <Button 
+                Grid.Column="4"
+                Width="35"
+                x:Name="JobButton" 
+                Click="JobButton_Click"
+                Visibility="{Binding IsJobEditable,Converter={StaticResource boolToVisibilityConverter}}"
+                Content="..." VerticalContentAlignment="Center"
+                BorderBrush="Silver"/>
+            
+            <TextBox 
+                Grid.Column="5"
+                Margin="5,0,0,0"
+                IsEnabled="False" 
+                Text="{Binding Job.Name}" 
+                Visibility="{Binding IsJobEditable,Converter={StaticResource boolToVisibilityConverter}}"
+                VerticalContentAlignment="Center"
+                Background="WhiteSmoke"/>
+            
+            <Label 
+                Grid.Column="6"
                 Margin="5,0,0,0"
                 VerticalAlignment="Center" 
                 FontWeight="Bold" 
@@ -52,7 +122,7 @@
                 Visibility="{Binding IsTargetEditable,Converter={StaticResource boolToVisibilityConverter}}"/>
             
             <TextBox 
-                DockPanel.Dock="Left"
+                Grid.Column="7"
                 Margin="5,0,0,0"
                 Width="100"
                 x:Name="ToBox" 
@@ -65,7 +135,7 @@
                 BorderThickness="0.75,0.75,0,0.75"/>
 
             <Button 
-                DockPanel.Dock="Left"
+                Grid.Column="8"
                 Width="35"
                 x:Name="ToButton" 
                 Click="ToButton_Click"
@@ -74,15 +144,14 @@
                 BorderBrush="Silver"/>
             
             <TextBox 
-                DockPanel.Dock="Left"
+                Grid.Column="9"
                 Margin="5,0,0,0"
                 IsEnabled="False" 
                 Text="{Binding To.Description}" 
                 Visibility="{Binding IsTargetEditable,Converter={StaticResource boolToVisibilityConverter}}"
                 VerticalContentAlignment="Center"
                 Background="WhiteSmoke"/>
-            
-        </DockPanel>
+        </Grid>
         
         <Border 
             Grid.Row="1"
@@ -160,6 +229,7 @@
                                         <syncfusion:DoubleTextBox 
                                             Grid.Column="2" 
                                             Value="{Binding Quantity}" 
+                                            IsEnabled="{Binding Editable}"
                                             IsReadOnly="True"
                                             HorizontalContentAlignment="Center"
                                             VerticalAlignment="Stretch"
@@ -172,6 +242,7 @@
                                             Content="None" 
                                             Tag="{Binding}" 
                                             Click="None_Click"
+                                            IsEnabled="{Binding Editable}"
                                             Margin="5,0,0,0"/>
                                         
                                         <Button 
@@ -179,6 +250,7 @@
                                             Content="-" 
                                             Tag="{Binding}" 
                                             Click="Minus_Click"
+                                            IsEnabled="{Binding Editable}"
                                             Margin="5,0,0,0"/>
                                         
                                         <syncfusion:DoubleTextBox 
@@ -190,6 +262,7 @@
                                             VerticalAlignment="Stretch"
                                             VerticalContentAlignment="Center"
                                             Margin="5,0,0,0"
+                                            IsEnabled="{Binding Editable}"
                                             Background="LightYellow"/>
                                         
                                         <Button 
@@ -197,6 +270,7 @@
                                             Content="+" 
                                             Tag="{Binding}" 
                                             Click="Plus_Click"
+                                            IsEnabled="{Binding Editable}"
                                             Margin="5,0,0,0"/>
                                         
                                         <Button 
@@ -204,6 +278,7 @@
                                             Content="All" 
                                             Tag="{Binding}" 
                                             Click="All_Click"
+                                            IsEnabled="{Binding Editable}"
                                             Margin="5,0,0,0"/>
                                         
                                     </Grid>

+ 151 - 22
prs.desktop/Panels/Products/Locations/StockHoldingRelocationWindow.xaml.cs

@@ -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();
+    }
+
 }