Ver código fonte

PRS DESKTOP - Job Requisitions Review Changes

Nick-PRSDigital@bitbucket.org 2 anos atrás
pai
commit
4a8dcc1298

+ 22 - 7
prs.classes/Entities/Job/Requisitions/JobRequisitionItem.cs

@@ -2,13 +2,14 @@
 using System.ComponentModel;
 using System.Linq;
 using System.Linq.Expressions;
+using InABox.Clients;
 using InABox.Core;
 using PRSClasses;
 
 namespace Comal.Classes
 {
     public enum JobRequisitionItemStatus
-    { 
+    {
         NotChecked,
         Reserved,
         TreatmentRequired,
@@ -30,12 +31,12 @@ namespace Comal.Classes
 
     [Caption("Items")]
     [UserTracking(typeof(Job))]
-    public class JobRequisitionItem : StockEntity, IRemotable, IPersistent, IOneToMany<JobRequisition>, 
+    public class JobRequisitionItem : StockEntity, IRemotable, IPersistent, IOneToMany<JobRequisition>,
         ILicense<ProjectManagementLicense>, IJobMaterial, ISequenceable
-    {        
+    {
         [EntityRelationship(DeleteAction.Cascade)]
         public JobLink Job { get; set; }
-        
+
         [EntityRelationship(DeleteAction.Cascade)]
         public JobRequisitionLink Requisition { get; set; }
 
@@ -57,7 +58,7 @@ namespace Comal.Classes
         [NullEditor]
         [Obsolete("Replaced with Dimensions", true)]
         public double UnitSize { get; set; }
-        
+
         [EditorSequence(4)]
         [RequiredColumn]
         [DimensionsEditor(typeof(StockDimensions), AllowEditingUnit = false)]
@@ -70,11 +71,15 @@ namespace Comal.Classes
         [Formula(typeof(JobRequisitionItemTotalQtyFormula))]
         public double TotalQty { get; set; }
 
-        [EnumLookupEditor(typeof(JobRequisitionItemStatus))]      
+        [EnumLookupEditor(typeof(JobRequisitionItemStatus))]
         public JobRequisitionItemStatus Status { get; set; }
-       
+
         public PurchaseOrderItemLink PurchaseOrderItem { get; set; }
 
+        public DateTime Cancelled { get; set; }
+        public DateTime Archived { get; set; }
+        public DateTime Ordered { get; set; }
+
         [NullEditor]
         public long Sequence { get; set; }
 
@@ -87,6 +92,11 @@ namespace Comal.Classes
             Status = JobRequisitionItemStatus.NotChecked;
             PurchaseOrderItem = new PurchaseOrderItemLink();
             Supplier = new SupplierLink();
+            Cancelled = DateTime.MinValue;
+            Archived = DateTime.MinValue;
+            Ordered = DateTime.MinValue;
+
+            
         }
 
         static JobRequisitionItem()
@@ -95,5 +105,10 @@ namespace Comal.Classes
             LinkedProperties.Register<JobRequisitionItem, ProductStyleLink, Guid>(x => x.Product.DefaultStyle, x => x.ID, x => x.Style.ID);
         }
 
+        private void CheckPurchaseOrder()
+        { 
+            
+        }
+
     }
 }

+ 47 - 0
prs.desktop/JobRequisitionHoldingsReview.xaml

@@ -0,0 +1,47 @@
+<UserControl x:Class="PRSDesktop.JobRequisitionHoldingsReview"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:PRSDesktop"
+             mc:Ignorable="d" 
+             d:DesignHeight="450" d:DesignWidth="800">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="auto"/>
+            <RowDefinition Height="*"/>
+        </Grid.RowDefinitions>
+
+        <Grid Grid.Row="0">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="*"/>
+                <ColumnDefinition Width="*"/>
+                <ColumnDefinition Width="*"/>
+                <ColumnDefinition Width="*"/>
+            </Grid.ColumnDefinitions>
+            <TextBlock Grid.Column="0" Text="Job" HorizontalAlignment="Center"/>
+            <TextBlock Grid.Column="1" x:Name="CurrentStyleText" HorizontalAlignment="Center"/>
+            <TextBlock Grid.Column="2" Text="Stock of Mill/No Style" HorizontalAlignment="Center"/>
+            <TextBlock Grid.Column="3" Text="Other Styles" HorizontalAlignment="Center"/>
+        </Grid>
+
+        <ListView x:Name="listView" Grid.Row="1" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch">
+            <ListView.ItemTemplate>
+                <DataTemplate>
+                    <Grid HorizontalAlignment="Stretch">
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="*"/>
+                            <ColumnDefinition Width="*"/>
+                            <ColumnDefinition Width="*"/>
+                            <ColumnDefinition Width="*"/>
+                        </Grid.ColumnDefinitions>
+                        <TextBlock Grid.Column="0" HorizontalAlignment="Center" Text="{Binding JobName}"/>
+                        <local:JobRequisitionTakeStockUserControl Grid.Column="1" HorizontalAlignment="Center" Value="100"/>
+                        <local:JobRequisitionTakeStockUserControl Grid.Column="2" HorizontalAlignment="Center" Value="100"/>
+                        <local:JobRequisitionTakeStockUserControl Grid.Column="3" HorizontalAlignment="Center" Value="100"/>
+                    </Grid>
+                </DataTemplate>
+            </ListView.ItemTemplate>
+        </ListView>
+    </Grid>
+</UserControl>

+ 47 - 0
prs.desktop/JobRequisitionHoldingsReview.xaml.cs

@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace PRSDesktop
+{
+    /// <summary>
+    /// Interaction logic for JobRequisitionHoldingsReview.xaml
+    /// </summary>
+    public partial class JobRequisitionHoldingsReview : UserControl
+    {
+        public JobRequisitionHoldingsReview()
+        {
+            InitializeComponent();
+
+            List<JobRequiHoldingsReviewModel> list = new List<JobRequiHoldingsReviewModel>()             
+            {
+                new JobRequiHoldingsReviewModel() {JobName = "A"},
+                new JobRequiHoldingsReviewModel() {JobName = "B"},
+                new JobRequiHoldingsReviewModel() {JobName = "C"},
+                new JobRequiHoldingsReviewModel() {JobName = "D"},
+            };
+
+            listView.ItemsSource = list;
+        }
+    }
+
+    public class JobRequiHoldingsReviewModel
+    { 
+        public string JobName { get; set; }
+        public JobRequiHoldingsReviewModel() 
+        {
+            JobName = "";
+        }
+    }
+}

+ 17 - 0
prs.desktop/JobRequisitionTakeStockUserControl.xaml

@@ -0,0 +1,17 @@
+<UserControl x:Class="PRSDesktop.JobRequisitionTakeStockUserControl"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:PRSDesktop"
+             mc:Ignorable="d" 
+             d:DesignHeight="450" d:DesignWidth="800">
+    <Grid>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="*"/>
+            <ColumnDefinition Width="*"/>
+        </Grid.ColumnDefinitions>
+        <TextBlock Grid.Column="0" x:Name="stockCountLbl" Text="{Binding Value}" HorizontalAlignment="Right"/>
+        <Button Grid.Column="1" Content="Take" Click="Button_Click" HorizontalAlignment="Left"/>
+    </Grid>
+</UserControl>

+ 34 - 0
prs.desktop/JobRequisitionTakeStockUserControl.xaml.cs

@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace PRSDesktop
+{
+    /// <summary>
+    /// Interaction logic for JobRequisitionTakeStockUserControl.xaml
+    /// </summary>
+    public partial class JobRequisitionTakeStockUserControl : UserControl
+    {
+        public double Value { get; set; }
+        public JobRequisitionTakeStockUserControl()
+        {
+            InitializeComponent();           
+        }
+
+        private void Button_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+    }
+}

+ 0 - 5
prs.desktop/Panels/Products/Job Requisitions/JobRequiItemAvailableStockGrid.cs

@@ -3,14 +3,9 @@ using InABox.Clients;
 using InABox.Core;
 using InABox.DynamicGrid;
 using InABox.WPF;
-using jdk.nashorn.@internal.ir.debug;
-using NPOI.SS.Formula.Functions;
-using org.omg.PortableInterceptor;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
 

+ 87 - 3
prs.desktop/Panels/Products/Job Requisitions/JobRequisitionReviewGrid.cs

@@ -3,6 +3,8 @@ using InABox.Clients;
 using InABox.Core;
 using InABox.DynamicGrid;
 using InABox.WPF;
+using NPOI.OpenXmlFormats.Dml;
+using Syncfusion.Windows.Shared;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -26,7 +28,7 @@ namespace PRSDesktop
         bool bIncludeArchived = false;
         bool bViewCancelled = false;
         public Guid JobID = Guid.Empty;
-
+        Dictionary<Guid, double> JobRequisReservedQty = new Dictionary<Guid, double>();
         public JobRequisitionReviewGrid()
         {
             Options.AddRange(
@@ -71,12 +73,15 @@ namespace PRSDesktop
             HiddenColumns.Add(x => x.Dimensions.Unit.Code);
             HiddenColumns.Add(x => x.Dimensions.Unit.Description);
 
+            LoadStockMovements();
+            ActionColumns.Add(new DynamicTextColumn(CreateStatus));
+
             if (Security.CanEdit<JobRequisitionItem>())
                 ActionColumns.Add(new DynamicMenuColumn(BuildMenu, EmptyReturnFunction));
             if (Security.CanEdit<PurchaseOrder>())
                 AddButton("Create Purchase Order", null, CreatePurchaseOrder);
             if (Security.CanEdit<PurchaseOrder>())
-                AddButton("Create Treatment PO", null, CreateTreatmentPO);
+                AddButton("Create Treatment PO", null, CreateTreatmentPO);           
 
             AddButton("Include Archived", null, ViewArchived);
             AddButton("Include Cancelled", null, ViewCancelled);
@@ -91,6 +96,85 @@ namespace PRSDesktop
                 empID = Guid.Parse(table.Rows.FirstOrDefault().Values[0].ToString());
                 empName = table.Rows.FirstOrDefault().Values[1].ToString();
             }
+
+            //Migrate();
+        }
+
+        private void Migrate()
+        {
+            CoreTable table = new Client<JobRequisitionItem>().Query(null, new Columns<JobRequisitionItem>(x => x.ID, x => x.PurchaseOrderItem.PurchaseOrderLink.ID));
+            Dictionary<Guid, Guid> reqPOids = new Dictionary<Guid, Guid>();
+            List<JobRequisitionItem> affected = new List<JobRequisitionItem>();
+            foreach(CoreRow row in table.Rows) 
+            {
+                var item = row.ToObject<JobRequisitionItem>();
+                if (item.PurchaseOrderItem.PurchaseOrderLink.ID != Guid.Empty)
+                {
+                    reqPOids.Add(row.Get<JobRequisitionItem, Guid>(x => x.ID), item.PurchaseOrderItem.PurchaseOrderLink.ID);
+                    affected.Add(row.ToObject<JobRequisitionItem>());
+                }
+                }
+                List<JobRequisitionItem> list = new List<JobRequisitionItem>();
+            CoreTable POs = new Client<PurchaseOrder>().Query(new Filter<PurchaseOrder>(x => x.ID).InList(reqPOids.Values.ToArray()), new Columns<PurchaseOrder>(x => x.ID, x => x.Created));
+            foreach (CoreRow row in POs.Rows)
+            {
+                var items = affected.Where(x => x.PurchaseOrderItem.PurchaseOrderLink.ID == row.Get<PurchaseOrder, Guid>(x => x.ID));
+                foreach (var item in items)
+                {
+                    item.Ordered = row.Get<PurchaseOrder, DateTime>(x => x.Created);
+                    list.Add(item);
+                }
+            }
+            new Client<JobRequisitionItem>().Save(list, "Migrate");
+        }
+
+        private void LoadStockMovements()
+        {
+            CoreTable table = new Client<StockMovement>().Query(
+                new Filter<StockMovement>(x => x.JobRequisitionItem.ID).IsNotEqualTo(Guid.Empty),
+                new Columns<StockMovement>(
+                    x => x.JobRequisitionItem.ID,
+                    x => x.Received
+                    )
+                );
+            foreach (CoreRow row in table.Rows)
+            {
+                var requiID = row.Get<StockMovement, Guid>(x => x.JobRequisitionItem.ID);
+                var qty = row.Get<StockMovement, double>(x => x.Received);
+                if (!JobRequisReservedQty.ContainsKey(requiID))
+                    JobRequisReservedQty.Add(requiID, qty);
+                else
+                {
+                    double newQty = JobRequisReservedQty[requiID] + qty;
+                    JobRequisReservedQty.Remove(requiID);
+                    JobRequisReservedQty.Add(requiID, newQty);
+                }
+            }
+        }
+
+        private string? CreateStatus(CoreRow? row)
+        {
+            Guid id = row.Get<JobRequisitionItem, Guid>(x => x.ID);
+
+            string status = "Not Checked";
+
+            if (row.Get<JobRequisitionItem, DateTime>(x => x.Cancelled) != DateTime.MinValue)
+                return "Cancelled";
+
+            if (row.Get<JobRequisitionItem, DateTime>(x => x.Archived) != DateTime.MinValue)
+                return "Archived";
+
+            if (row.Get<JobRequisitionItem, DateTime>(x => x.Ordered) != DateTime.MinValue && !JobRequisReservedQty.ContainsKey(id))
+                return "On Order";
+
+            if (row.Get<JobRequisitionItem, JobRequisitionItemStatus>(x => x.Status) == JobRequisitionItemStatus.OrderRequired)
+                return "Order Required";
+
+            if (JobRequisReservedQty.ContainsKey(id))
+                if (JobRequisReservedQty[id] == row.Get<JobRequisitionItem, double>(x => x.Qty))
+                    return "Reserved";
+
+            return status;
         }
 
         protected override DynamicGridStyle GetRowStyle(CoreRow row, DynamicGridStyle style)
@@ -529,7 +613,7 @@ namespace PRSDesktop
 
             if (JobID != Guid.Empty)
                 criteria.Add(new Filter<JobRequisitionItem>(x => x.Requisition.Job.ID).IsEqualTo(JobID));
-            
+
 
             sort = new SortOrder<JobRequisitionItem>(x => x.Requisition.Number, SortDirection.Descending);
             base.Reload(criteria, columns, ref sort, action);

+ 2 - 40
prs.desktop/Panels/Products/Job Requisitions/JobRequisitionsPanel.xaml

@@ -15,29 +15,7 @@
         </dynamicgrid:DynamicSplitPanel.Header>
 
         <dynamicgrid:DynamicSplitPanel.Master>
-            <Grid>
-                <Grid.RowDefinitions>
-                    <RowDefinition Height="*"/>
-                    <RowDefinition Height="*"/>
-                </Grid.RowDefinitions>
-                <Grid.ColumnDefinitions>
-                    <ColumnDefinition Width="*"/>
-                    <ColumnDefinition Width="4*"/>
-                </Grid.ColumnDefinitions>
-
-                <DockPanel Grid.Row="0" Grid.Column="0">
-                    <local:JobGrid x:Name="jobsGrid"/>
-                </DockPanel>
-
-                <DockPanel Grid.Row="0" Grid.Column="1"  >
-                    <local:JobRequisitionReviewGrid  x:Name="unProcessedJobRequiItems" Margin="0,2,0,0"/>
-                </DockPanel>
-
-                <DockPanel Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" >
-                    <local:JobRequisitionReviewGrid x:Name="processedJobRequiItems" Margin="0,2,0,0"/>
-                </DockPanel>
-            </Grid>
-
+            <local:JobRequisitionReviewGrid  x:Name="unProcessedJobRequiItems" Margin="0,2,0,0"/>
         </dynamicgrid:DynamicSplitPanel.Master>
 
         <dynamicgrid:DynamicSplitPanel.DetailHeader>
@@ -48,24 +26,8 @@
         </dynamicgrid:DynamicSplitPanel.DetailHeader>
 
         <dynamicgrid:DynamicSplitPanel.Detail>
-            <local:JobRequiItemAvailableStockGrid x:Name="availableHoldingsGrid" Margin="0,2,0,0"/>
+            <local:JobRequisitionHoldingsReview Margin="0,2,0,0"/>
         </dynamicgrid:DynamicSplitPanel.Detail>
 
-        <dynamicgrid:DynamicSplitPanel.DetailHeight>
-           500
-        </dynamicgrid:DynamicSplitPanel.DetailHeight>
-
-        <dynamicgrid:DynamicSplitPanel.SecondaryDetail>
-            <DockPanel Grid.Row="0">
-                <Border CornerRadius="0,0,0,0" BorderBrush="Gray" BorderThickness="0.75" DockPanel.Dock="Top"
-                    Background="WhiteSmoke">
-                    <Label Content="Stock Movement History For Item" HorizontalContentAlignment="Center" />
-                </Border>
-                <local:JobRequiItemMovementsGrid x:Name="movementHistoryGrid" Margin="0,2,0,0"/>
-            </DockPanel>
-        </dynamicgrid:DynamicSplitPanel.SecondaryDetail>
-
-        
-
     </dynamicgrid:DynamicSplitPanel>
 </UserControl>

+ 4 - 54
prs.desktop/Panels/Products/Job Requisitions/JobRequisitionsPanel.xaml.cs

@@ -54,10 +54,6 @@ namespace PRSDesktop
         public void Refresh()
         {
             unProcessedJobRequiItems.Refresh(true, true);
-            processedJobRequiItems.Refresh(true, true);
-            availableHoldingsGrid.Refresh(true, true);
-            movementHistoryGrid.Refresh(true, true); 
-            jobsGrid.Refresh(true, true);
         }
 
         public Dictionary<string, object[]> Selected()
@@ -70,69 +66,31 @@ namespace PRSDesktop
         public void Setup()
         {
             SetupJobRequiItemGrids();
-            availableHoldingsGrid.empID = unProcessedJobRequiItems.empID;
-            availableHoldingsGrid.OnStockReserved += AvailableHoldingsGrid_OnStockReserved;
-            SetupJobsGrid();
         }
 
-        private void SetupJobsGrid()
-        {
-            jobsGrid.Options.Remove(InABox.DynamicGrid.DynamicGridOption.AddRows);
-            jobsGrid.Options.Remove(InABox.DynamicGrid.DynamicGridOption.DeleteRows);
-            jobsGrid.Options.Remove(InABox.DynamicGrid.DynamicGridOption.DirectEdit);
-            jobsGrid.Options.Remove(InABox.DynamicGrid.DynamicGridOption.EditRows);
-            jobsGrid.Options.Remove(InABox.DynamicGrid.DynamicGridOption.MultiSelect);
-            jobsGrid.Options.Remove(InABox.DynamicGrid.DynamicGridOption.ExportData);
-            jobsGrid.Options.Remove(InABox.DynamicGrid.DynamicGridOption.ImportData);
-
-            jobsGrid.OnReload += (object sender, Filters<Job> criteria, Columns<Job> columns, ref SortOrder<Job>? sortby) => 
-            {
-                criteria.Add(new Filter<Job>(x => x.JobStatus.Active).IsEqualTo(true));
-                criteria.Add(new Filter<Job>(x => x.JobStatus.Description).IsEqualTo("Active Projects"));
-            };
-
-            jobsGrid.OnSelectItem += (object sender, InABox.DynamicGrid.DynamicGridSelectionEventArgs e) => 
-            {
-                var jobid = jobsGrid.SelectedRows[0].Get<Job, Guid>(x => x.ID);
-                unProcessedJobRequiItems.JobID = jobid;
-                processedJobRequiItems.JobID = jobid;
-                RefreshJobRequiGrids();
-            };
-        }
+        
 
         private void RefreshJobRequiGrids()
         {
-            unProcessedJobRequiItems.bRefreshing = false;
-            processedJobRequiItems.bRefreshing = false;
+            unProcessedJobRequiItems.bRefreshing = false;           
             unProcessedJobRequiItems.Refresh(false, true);
-            processedJobRequiItems.Refresh(false, true);
         }
 
         private void AvailableHoldingsGrid_OnStockReserved()
         {
             unProcessedJobRequiItems.Refresh(false, true);
-            processedJobRequiItems.Refresh(true, true);
-            availableHoldingsGrid.Refresh(false, true);
-            movementHistoryGrid.Refresh(false, true);
         }
 
         private void SetupJobRequiItemGrids()
         {
-            unProcessedJobRequiItems.OnJobRequiItemSelected += JobRequiItemGrid_OnJobRequiItemSelected;
             unProcessedJobRequiItems.OnGridRefresh += JobRequiItems_OnGridRefresh;
-            processedJobRequiItems.OnJobRequiItemSelected += JobRequiItemGrid_OnJobRequiItemSelected;
-            processedJobRequiItems.OnGridRefresh += JobRequiItems_OnGridRefresh;
+    
             unProcessedJobRequiItems.OnReload += (object sender, Filters<JobRequisitionItem> criteria, Columns<JobRequisitionItem> columns, ref SortOrder<JobRequisitionItem>? sortby) => 
             {
                 criteria.Add(new Filter<JobRequisitionItem>(x => x.Status).IsEqualTo(JobRequisitionItemStatus.NotChecked));
             };
-            processedJobRequiItems.OnReload += (object sender, Filters<JobRequisitionItem> criteria, Columns<JobRequisitionItem> columns, ref SortOrder<JobRequisitionItem>? sortby) =>
-            {
-                criteria.Add(new Filter<JobRequisitionItem>(x => x.Status).IsNotEqualTo(JobRequisitionItemStatus.NotChecked));
-            };
 
             unProcessedJobRequiItems.Refresh(true, true);
-            processedJobRequiItems.Refresh(true, true);
         }
 
         private void JobRequiItems_OnGridRefresh()
@@ -140,15 +98,7 @@ namespace PRSDesktop
             RefreshJobRequiGrids();
         }
 
-        private void JobRequiItemGrid_OnJobRequiItemSelected(JobRequisitionItem item)
-        {
-            availableHoldingsGrid.Item = item;
-            availableHoldingsGrid.ProductID = item.Product.ID;
-            availableHoldingsGrid.Refresh(true, true);
-            movementHistoryGrid.JobRequiItemID = item.ID;
-            movementHistoryGrid.Refresh(true, true);
-        }
-
+       
         public void Shutdown()
         {
 

+ 6 - 1
prs.desktop/Panels/Requisitions/RequisitionPanel.xaml.cs

@@ -526,7 +526,12 @@ namespace PRSDesktop
                 item.Picked = picked;
                 list.Add(item);
             }
-            new Client<RequisitionItem>().Save(list, "Picked changed to " + picked.ToString("dd MMM yy"));
+            string audittrail;
+            if (picked == DateTime.MinValue)
+                audittrail = "Item unpicked";
+            else
+                audittrail = "Item picked " + picked.ToString("dd MMM yy");
+            new Client<RequisitionItem>().Save(list, audittrail);
 
             UnPickedItems.Refresh(false, true);
             Items.Refresh(false, true);