瀏覽代碼

Improved QuickPick module

Frank van den Bos 10 月之前
父節點
當前提交
bfa1ee472d

+ 1 - 1
prs.mobile.new/PRS.Mobile.Droid/Properties/AndroidManifest.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="824200" android:versionName="8.24.2" package="comal.timesheets.Android">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="824300" android:versionName="8.24.3" package="comal.timesheets.Android">
 	<uses-sdk android:minSdkVersion="28" android:targetSdkVersion="34" />
 	<queries>
 		<intent>

+ 1 - 0
prs.mobile.new/PRS.Mobile.Droid/Resources/Resource.designer.cs

@@ -2,6 +2,7 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.

+ 1 - 1
prs.mobile.new/PRS.Mobile.iOS/Info.plist

@@ -27,7 +27,7 @@
 	<key>CFBundleIdentifier</key>
 	<string>com.prsdigital.prssiteapp</string>
 	<key>CFBundleVersion</key>
-	<string>8.24.2</string>
+	<string>8.24.3</string>
 	<key>UILaunchStoryboardName</key>
 	<string>LaunchScreen</string>
 	<key>CFBundleName</key>

+ 24 - 2
prs.mobile.new/PRS.Mobile/Modules/Requisitions/Edit/Views/Items/SelectFromHoldingView.xaml.cs

@@ -4,6 +4,7 @@ using System.Collections.ObjectModel;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using InABox.Core;
 using InABox.Mobile;
 using Xamarin.Forms;
 using Xamarin.Forms.Xaml;
@@ -37,6 +38,9 @@ namespace PRS.Mobile
     
     public class SelectFromHoldingViewModel : BindableObject
     {
+        
+        public RequisitionItemModel? RequisitionItems { get; set; } 
+        
         private StockHoldingShell? _holding;
 
         private bool bChanging;
@@ -52,8 +56,25 @@ namespace PRS.Mobile
                 {
                     foreach (var alloc in _holding.Allocations)
                     {
+                        
+                        var picked = RequisitionItems?.Items.Where(x =>
+                            x.LocationID == _holding.LocationID
+                            && x.ProductID == _holding.ProductID
+                            && x.StyleID == _holding.StyleID
+                            && x.JobID == _holding.JobID
+                            && x.DimensionsLength.IsEffectivelyEqual(_holding.DimensionsLength)
+                            && x.DimensionsWidth.IsEffectivelyEqual(_holding.DimensionsWidth)
+                            && x.DimensionsHeight.IsEffectivelyEqual(_holding.DimensionsHeight)
+                            && x.DimensionsWeight .IsEffectivelyEqual(_holding.DimensionsWeight)
+                            && x.DimensionsQuantity.IsEffectivelyEqual(_holding.DimensionsQuantity)
+                            && x.ID == alloc.ID)
+                            .Sum(x => x.ActualQuantity) ?? 0.0;
+                        
+                        if (!alloc.Maximum.IsEffectivelyGreaterThan(picked))
+                            continue;
+                        
                         var allocation = new SelectFromHoldingAllocation()
-                            { JobID = alloc.JobID, JobRequisitionItemID = alloc.ID, Description = alloc.Description, Quantity = alloc.Maximum };
+                            { JobID = alloc.JobID, JobRequisitionItemID = alloc.ID, Description = alloc.Description, Quantity = alloc.Maximum - picked };
                         allocation.PropertyChanged += (sender, args) =>
                         {
                             if (bChanging)
@@ -106,9 +127,10 @@ namespace PRS.Mobile
         public event RequisitionItemScannerSaveEvent? OnSave;
         public event EventHandler? OnCancel;
 
-        public SelectFromHoldingView(StockHoldingShell? holding, double requestedquantity)
+        public SelectFromHoldingView(StockHoldingShell? holding, double requestedquantity, RequisitionItemModel? requisitionItems = null)
         {
             InitializeComponent();
+            _viewModel.RequisitionItems = requisitionItems;
             _viewModel.Holding = holding;
             _viewModel.RequestedQuantity = requestedquantity;
         }

+ 44 - 20
prs.mobile.new/PRS.Mobile/Modules/Warehousing/QuickPick/QuickPickModule.xaml

@@ -18,6 +18,7 @@
         <mobile:IntToBooleanConverter x:Key="SummaryPageVisible" Value="1" Result="True" />
         <mobile:BooleanMatcher x:Key="MatchAll" Type="All" Value="True" />
         <mobile:StringWithDefaultValueConverter x:Key="JobNameConverter" Default="(Select Job)" />
+        <local:HoldingUnitCalculator x:Key="UnitCalculator" x:Name="UnitCalculator" />
         <!-- <mobile:GuidToBooleanConverter x:Key="GuidToBooleanConverter" EmptyValue="False"></mobile:GuidToBooleanConverter> -->
         
         <DataTemplate x:Key="_locationTemplate" x:Name="_locationTemplate" x:DataType="local:StockHoldingShell">
@@ -52,31 +53,46 @@
                         
                         <BoxView Grid.Row="0" Grid.RowSpan="3" Grid.Column="1" BackgroundColor="Gray" WidthRequest="1" HorizontalOptions="Start"/>
 
-                        <Label 
+                        <views:DockLayout
                             Grid.Row="0"
-                            Grid.Column="2"
-                            views:DockLayout.Dock="Left"
-                            FontSize="{StaticResource Theme.Text.Small.Size}"
-                            TextColor="{StaticResource Theme.OnSurface}"
-                            VerticalTextAlignment="Center"
-                            Text="{Binding ProductName}"/>
+                            Grid.Column="2">
+                            
+                            <Label 
+                                views:DockLayout.Dock="Right"
+                                FontSize="{StaticResource Theme.Text.Small.Size}"
+                                TextColor="{StaticResource Theme.OnSurface}"
+                                Margin="5,0,5,0"
+                                VerticalTextAlignment="Center"
+                                Text="{Binding LocationCode}"/>
+                            
+                            <Label 
+                                views:DockLayout.Dock="Left"
+                                FontSize="{StaticResource Theme.Text.Small.Size}"
+                                TextColor="{StaticResource Theme.OnSurface}"
+                                VerticalTextAlignment="Center"
+                                Text="{Binding ProductName}"/>
+                            
+                        </views:DockLayout>
                         
                         <views:DockLayout
                             Grid.Row="1"
                             Grid.Column="2">
+                            
                             <Label 
-                                views:DockLayout.Dock="Left"
+                                views:DockLayout.Dock="Right"
                                 FontSize="{StaticResource Theme.Text.Micro.Size}"
                                 TextColor="{StaticResource Theme.OnSurface}"
+                                Margin="5,0,5,0"
                                 VerticalTextAlignment="Center"
-                                Text="{Binding DimensionsUnitSize}"/>
+                                Text="{Binding StyleDescription}"/>
+                            
                             <Label 
                                 views:DockLayout.Dock="Left"
                                 FontSize="{StaticResource Theme.Text.Micro.Size}"
                                 TextColor="{StaticResource Theme.OnSurface}"
-                                Margin="5,0,0,0"
                                 VerticalTextAlignment="Center"
-                                Text="{Binding StyleDescription}"/>
+                                Text="{Binding DimensionsUnitSize}"/>
+
                         </views:DockLayout>
                         
                         <Label 
@@ -97,7 +113,7 @@
                             TextColor="{StaticResource Theme.OnSurface}"
                             VerticalTextAlignment="Center"
                             HorizontalTextAlignment="Center"
-                            Text="{Binding Units}"/>
+                            Text="{Binding ., Converter={StaticResource UnitCalculator}}"/>
                         
                     </Grid>
                 </mobile:MobileCard>
@@ -109,7 +125,7 @@
             x:DataType="local:RequisitionItemShell">
             <ViewCell>
                 <mobile:MobileCard
-                    IsClickable="True"
+                    IsClickable="false"
                     Margin="0,0,0,5"
                     Padding="0"
                     Background="LightYellow">
@@ -117,36 +133,44 @@
                     <Grid ColumnSpacing="5">
                 
                         <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="40"/>
+                            <ColumnDefinition Width="1"/>
                             <ColumnDefinition Width="50"/>
                             <ColumnDefinition Width="1"/>
                             <ColumnDefinition Width="*"/>
                             <ColumnDefinition Width="1"/>
                             <ColumnDefinition Width="60"/>
+                            
                         </Grid.ColumnDefinitions>
                         
+                        <mobile:MobileMenuButton
+                            Grid.Column="0"
+                            Image="trash" 
+                            Clicked="DeleteRequisitionItem" />
+                        
+                        <BoxView Grid.Column="1" BackgroundColor="Gray"/>
                         
                         <Image
-                            Grid.Row="0"
+                            Grid.Column="2"
                             Source="{Binding Image, Converter={StaticResource ByteArrayToImageSourceConverter}}"
                             HorizontalOptions="Center"
                             VerticalOptions="Center"
                             Margin="5,0,0,0"/>
                 
-                        <BoxView Grid.Column="1" BackgroundColor="Gray"/>
+                        <BoxView Grid.Column="3" BackgroundColor="Gray"/>
                         
                         <Label
-                            Grid.Column="2"
+                            Grid.Column="4"
                             FontSize="Small"
                             TextColor="Black"
                             Text="{Binding Description}"
                             VerticalTextAlignment="Center"
                         />
-
-                        <BoxView Grid.Column="3" BackgroundColor="Gray"/>
                         
-
+                        <BoxView Grid.Column="5" BackgroundColor="Gray"/>
+                        
                         <Label
-                            Grid.Column="4"
+                            Grid.Column="6"
                             HorizontalOptions="Center" 
                             VerticalOptions="Center"
                             Margin="0,0,5,0"

+ 74 - 31
prs.mobile.new/PRS.Mobile/Modules/Warehousing/QuickPick/QuickPickModule.xaml.cs

@@ -16,6 +16,34 @@ using Result = ZXing.Result;
 namespace PRS.Mobile
 {
 
+    public class HoldingUnitCalculator : AbstractConverter<StockHoldingShell, double>
+    {
+
+        public RequisitionItemModel RequisitionItems { get; set; }
+
+        protected override double Convert(StockHoldingShell shell, object? parameter = null)
+        {
+            return Calculate(shell, RequisitionItems);
+        }
+
+        public static double Calculate(StockHoldingShell holding, RequisitionItemModel? items)
+        {
+            var instock = holding.Units;
+            var picked = items?.Items.Where(x =>
+                x.LocationID == holding.LocationID
+                && x.ProductID == holding.ProductID
+                && x.StyleID == holding.StyleID
+                && x.JobID == holding.JobID
+                && x.DimensionsLength == holding.DimensionsLength
+                && x.DimensionsWidth == holding.DimensionsWidth
+                && x.DimensionsHeight == holding.DimensionsHeight
+                && x.DimensionsWeight == holding.DimensionsWeight
+                && holding.DimensionsQuantity == x.DimensionsQuantity)
+                .Sum(x => x.ActualQuantity) ?? 0.0;
+            return instock - picked;
+        }
+    }
+
     public class QuickPickViewModel : BindableObject
     {
         public bool HasItems { get; set; }
@@ -38,6 +66,7 @@ namespace PRS.Mobile
         public QuickPickModule()
         {
             InitializeComponent();
+            UnitCalculator.RequisitionItems = _viewModel.RequisitionItems;
             var options = new ZXing.Mobile.MobileBarcodeScanningOptions()
             {
                 PossibleFormats = new List<ZXing.BarcodeFormat>() { ZXing.BarcodeFormat.QR_CODE },
@@ -124,38 +153,43 @@ namespace PRS.Mobile
                 return;
             ShowPopup(() =>
                 {
-                    var editor = new SelectFromHoldingView(holding, holding.Units);
+
+                    var qty = HoldingUnitCalculator.Calculate(holding, _viewModel.RequisitionItems);
+                    var editor = new SelectFromHoldingView(holding, qty, _viewModel.RequisitionItems);
                     editor.OnSave += (o, args) =>
                     {
-                        var requiItem = _viewModel.RequisitionItems.CreateItem();
-                        requiItem.LocationID = args.Holding.LocationID;
-                        requiItem.ProductID = args.Holding.ProductID;
-                        requiItem.ProductCode = args.Holding.ProductCode;
-                        requiItem.ProductName = args.Holding.ProductName;
-                        requiItem.StyleID = args.Holding.StyleID;
-                        requiItem.StyleCode = args.Holding.StyleCode;
-                        requiItem.StyleDescription = args.Holding.StyleDescription;
-                        requiItem.JobID = args.Holding.JobID;
-                        requiItem.DimensionsUnitID = args.Holding.DimensionsUnitID;
-                        requiItem.DimensionsHeight = args.Holding.DimensionsHeight;
-                        requiItem.DimensionsWidth = args.Holding.DimensionsWidth;
-                        requiItem.DimensionsLength = args.Holding.DimensionsLength;
-                        requiItem.DimensionsQuantity = args.Holding.DimensionsQuantity;
-                        requiItem.DimensionsWeight = args.Holding.DimensionsWeight;
-                        requiItem.DimensionsValue = args.Holding.DimensionsValue;
-                        requiItem.DimensionsUnitSize = args.Holding.DimensionsUnitSize;
-                        requiItem.ImageID = args.Holding.ImageID;
-                        if (args.Holding.Parent.Images.TryGetValue(args.Holding.ImageID, out var _image))
-                            _viewModel.RequisitionItems.Images[args.Holding.ImageID] = _image;
-                        requiItem.SourceJRI = args.JobRequisitionItemID;
-                        requiItem.TargetJRI = args.JobRequisitionItemID;
-                        requiItem.Quantity = args.Quantity;
-                        requiItem.ActualQuantity = args.Quantity;
-                        requiItem.Cost = args.Holding.AverageCost;
-                        requiItem.Done = true;
-                        _viewModel.RequisitionItems.CommitItem(requiItem);
-                        _viewModel.Holdings.Refresh(false);
-                        DismissPopup();
+                        if (args.Quantity.IsEffectivelyGreaterThan(0.0))
+                        {
+                            var requiItem = _viewModel.RequisitionItems.CreateItem();
+                            requiItem.LocationID = args.Holding.LocationID;
+                            requiItem.ProductID = args.Holding.ProductID;
+                            requiItem.ProductCode = args.Holding.ProductCode;
+                            requiItem.ProductName = args.Holding.ProductName;
+                            requiItem.StyleID = args.Holding.StyleID;
+                            requiItem.StyleCode = args.Holding.StyleCode;
+                            requiItem.StyleDescription = args.Holding.StyleDescription;
+                            requiItem.JobID = args.Holding.JobID;
+                            requiItem.DimensionsUnitID = args.Holding.DimensionsUnitID;
+                            requiItem.DimensionsHeight = args.Holding.DimensionsHeight;
+                            requiItem.DimensionsWidth = args.Holding.DimensionsWidth;
+                            requiItem.DimensionsLength = args.Holding.DimensionsLength;
+                            requiItem.DimensionsQuantity = args.Holding.DimensionsQuantity;
+                            requiItem.DimensionsWeight = args.Holding.DimensionsWeight;
+                            requiItem.DimensionsValue = args.Holding.DimensionsValue;
+                            requiItem.DimensionsUnitSize = args.Holding.DimensionsUnitSize;
+                            requiItem.ImageID = args.Holding.ImageID;
+                            if (args.Holding.Parent.Images.TryGetValue(args.Holding.ImageID, out var _image))
+                                _viewModel.RequisitionItems.Images[args.Holding.ImageID] = _image;
+                            requiItem.SourceJRI = args.JobRequisitionItemID;
+                            requiItem.TargetJRI = args.JobRequisitionItemID;
+                            requiItem.Quantity = args.Quantity;
+                            requiItem.ActualQuantity = args.Quantity;
+                            requiItem.Cost = args.Holding.AverageCost;
+                            requiItem.Done = true;
+                            _viewModel.RequisitionItems.CommitItem(requiItem);
+                            _viewModel.Holdings.Refresh(false);
+                            DismissPopup();
+                        }
                     };
                     editor.OnCancel += (o, args) => DismissPopup();
                     return editor;
@@ -236,6 +270,15 @@ namespace PRS.Mobile
             Navigation.PopAsync();
         }
 
-
+        private async void DeleteRequisitionItem(object sender, MobileMenuButtonClickedEventArgs args)
+        {
+            var shell = ((sender as MobileMenuButton)?.BindingContext as RequisitionItemShell);
+            if (shell == null)
+                return;
+            if (await MaterialDialog.Instance.ConfirmAsync("Delete Picked Item?", "Confirm") == true)
+            {
+                _viewModel.RequisitionItems.DeleteItem(shell);
+            }
+        }
     }
 }