Browse Source

Added "Picked" property to Requisition Item to allow for confirmation of requested items
Added "Select Holding" menu item to RequisitionItemGrid
Requisition Tracking Kanban statuses are now based on items picked instead of items existing
Moved Requisition "Update Stock" column to better mirror status buttons at right of screen

Frank van den Bos 2 years ago
parent
commit
702a7f280d

+ 2 - 1
prs.classes/Entities/Product/ProductLink.cs

@@ -47,6 +47,7 @@ namespace Comal.Classes
         public ProductStyleLink DefaultStyle { get; set; }
         public ProductStyleLink DefaultStyle { get; set; }
 
 
         [NullEditor]
         [NullEditor]
+        [RequiredColumn]
         public StockLocationLink DefaultLocation { get; set; }
         public StockLocationLink DefaultLocation { get; set; }
 
 
         [CurrencyEditor(Visible = Visible.Optional, Editable = Editable.Hidden)]
         [CurrencyEditor(Visible = Visible.Optional, Editable = Editable.Hidden)]
@@ -84,7 +85,7 @@ namespace Comal.Classes
             base.Init();
             base.Init();
             DefaultStyle = new ProductStyleLink(LinkedEntity);
             DefaultStyle = new ProductStyleLink(LinkedEntity);
             Units = new ProductUOMLink();
             Units = new ProductUOMLink();
-            DefaultLocation = new StockLocationLink();
+            DefaultLocation = new StockLocationLink(LinkedEntity);
             TaxCode = new TaxCodeLink(LinkedEntity);
             TaxCode = new TaxCodeLink(LinkedEntity);
             NonStock = true;
             NonStock = true;
             Image = new ImageDocumentLink();
             Image = new ImageDocumentLink();

+ 15 - 7
prs.classes/Entities/Requisition/RequisitionItem.cs

@@ -21,13 +21,11 @@ namespace Comal.Classes
         public JobLink Job { get; set; }
         public JobLink Job { get; set; }
 
 
         [EditorSequence(1)]
         [EditorSequence(1)]
+        [RequiredColumn]
         public override ProductLink Product { get; set; }
         public override ProductLink Product { get; set; }
         
         
-        [NullEditor]
-        public string BarCode { get; set; }
-
         [EditorSequence(3)]
         [EditorSequence(3)]
-        [CodeEditor(Visible = Visible.Hidden, Editable = Editable.Hidden)]
+        [CodeEditor(Visible = Visible.Optional)]
         public string Code { get; set; }
         public string Code { get; set; }
 
 
         [MemoEditor]
         [MemoEditor]
@@ -35,17 +33,27 @@ namespace Comal.Classes
         public string Description { get; set; }
         public string Description { get; set; }
 
 
         [EditorSequence(5)]
         [EditorSequence(5)]
+        [RequiredColumn]
         public ProductStyleLink Style { get; set; }
         public ProductStyleLink Style { get; set; }
 
 
         [EditorSequence(6)]
         [EditorSequence(6)]
+        [RequiredColumn]
         public override StockDimensions Dimensions { get; set; }
         public override StockDimensions Dimensions { get; set; }
 
 
         [EditorSequence(7)]
         [EditorSequence(7)]
         public double Quantity { get; set; }
         public double Quantity { get; set; }
 
 
         [EditorSequence(8)]
         [EditorSequence(8)]
+        [RequiredColumn]
         public StockLocationLink Location { get; set; }
         public StockLocationLink Location { get; set; }
+
+        [EditorSequence(9)]
+        [TimestampEditor]
+        public DateTime Picked { get; set; }
         
         
+        [NullEditor]
+        public string BarCode { get; set; }
+
         public Expression<Func<RequisitionItem, int>> AutoIncrementField()
         public Expression<Func<RequisitionItem, int>> AutoIncrementField()
         {
         {
             return x => x.Sequence;
             return x => x.Sequence;
@@ -62,16 +70,16 @@ namespace Comal.Classes
             RequisitionLink = new RequisitionLink();
             RequisitionLink = new RequisitionLink();
             Job = new JobLink();
             Job = new JobLink();
             Location = new StockLocationLink();
             Location = new StockLocationLink();
-            Style = new ProductStyleLink();
+            Style = new ProductStyleLink(() => this);
         }
         }
 
 
         static RequisitionItem()
         static RequisitionItem()
         {
         {
             LinkedProperties.Register<RequisitionItem, ProductLink, String>(x => x.Product, x => x.Code, x => x.Code);
             LinkedProperties.Register<RequisitionItem, ProductLink, String>(x => x.Product, x => x.Code, x => x.Code);
             LinkedProperties.Register<RequisitionItem, ProductLink, String>(x => x.Product, x => x.Name, x => x.Description);
             LinkedProperties.Register<RequisitionItem, ProductLink, String>(x => x.Product, x => x.Name, x => x.Description);
-            StockEntity.LinkStockDimensions<RequisitionItem>();
             LinkedProperties.Register<RequisitionItem, ProductStyleLink, Guid>(x=>x.Product.DefaultStyle, x => x.ID, x => x.Style.ID);
             LinkedProperties.Register<RequisitionItem, ProductStyleLink, Guid>(x=>x.Product.DefaultStyle, x => x.ID, x => x.Style.ID);
-            
+            LinkedProperties.Register<RequisitionItem, StockLocationLink, Guid>(x=>x.Product.DefaultLocation, x => x.ID, x => x.Location.ID);
+            StockEntity.LinkStockDimensions<RequisitionItem>();
         }
         }
     }
     }
 }
 }

+ 9 - 0
prs.classes/Entities/Stock/StockLocation/StockLocationLink.cs

@@ -5,6 +5,15 @@ namespace Comal.Classes
 {
 {
     public class StockLocationLink : EntityLink<StockLocation>, IStockLocation
     public class StockLocationLink : EntityLink<StockLocation>, IStockLocation
     {
     {
+        
+        public StockLocationLink() : this(null)
+        {
+        }
+
+        public StockLocationLink(Func<Entity>? entity) : base(entity)
+        {
+        }
+        
         public StockAreaLink Area { get; set; }
         public StockAreaLink Area { get; set; }
 
 
         [CodePopupEditor(typeof(StockLocation))]
         [CodePopupEditor(typeof(StockLocation))]

+ 1 - 1
prs.classes/Entities/Stock/StockMovement.cs

@@ -165,7 +165,7 @@ namespace Comal.Classes
         protected override void Init()
         protected override void Init()
         {
         {
             base.Init();
             base.Init();
-            Style = new ProductStyleLink();
+            Style = new ProductStyleLink(() => this);
             Location = new StockLocationLink();
             Location = new StockLocationLink();
             Employee = new EmployeeLink();
             Employee = new EmployeeLink();
             Job = new JobLink();
             Job = new JobLink();

+ 1 - 1
prs.desktop/Panels/Requisitions/RequisitionGrid.cs

@@ -89,8 +89,8 @@ namespace PRSDesktop
 
 
             ActionColumns.Add(new DynamicImageColumn(DocumentsImage, DocumentsClick) { Position = DynamicActionColumnPosition.Start });
             ActionColumns.Add(new DynamicImageColumn(DocumentsImage, DocumentsClick) { Position = DynamicActionColumnPosition.Start });
             ActionColumns.Add(new DynamicImageColumn(FilledImage));
             ActionColumns.Add(new DynamicImageColumn(FilledImage));
-            ActionColumns.Add(new DynamicImageColumn(StockImage));
             ActionColumns.Add(new DynamicImageColumn(DeliveryImage));
             ActionColumns.Add(new DynamicImageColumn(DeliveryImage));
+            ActionColumns.Add(new DynamicImageColumn(StockImage));
             //ActionColumns.Add(new DynamicImageColumn() { Action = LabelClick, Image = GetLabelImage });
             //ActionColumns.Add(new DynamicImageColumn() { Action = LabelClick, Image = GetLabelImage });
             //ActionColumns.Add(new DynamicImageColumn() { Action = DeliveryDocketClick, Image = GetPrinterImage });
             //ActionColumns.Add(new DynamicImageColumn() { Action = DeliveryDocketClick, Image = GetPrinterImage });
 
 

+ 89 - 204
prs.desktop/Panels/Requisitions/RequisitionItemGrid.cs

@@ -18,12 +18,21 @@ namespace PRSDesktop
 
 
         public RequisitionItemGrid()
         public RequisitionItemGrid()
         {
         {
-            Options.AddRange(DynamicGridOption.RecordCount, DynamicGridOption.SelectColumns, DynamicGridOption.EditRows,
-                DynamicGridOption.MultiSelect);
+            Options.BeginUpdate()
+                .Add(DynamicGridOption.RecordCount)
+                .Add(DynamicGridOption.SelectColumns)
+                .Add(DynamicGridOption.AddRows)
+                .Add(DynamicGridOption.EditRows)
+                .Add(DynamicGridOption.DeleteRows)
+                .Add(DynamicGridOption.FilterRows)
+                .Add(DynamicGridOption.MultiSelect)
+                .EndUpdate();
             HiddenColumns.Add(x => x.Code);
             HiddenColumns.Add(x => x.Code);
             HiddenColumns.Add(x => x.BarCode);
             HiddenColumns.Add(x => x.BarCode);
             HiddenColumns.Add(x => x.RequisitionLink.JobLink.ID);
             HiddenColumns.Add(x => x.RequisitionLink.JobLink.ID);
             HiddenColumns.Add(x => x.RequisitionLink.ID);
             HiddenColumns.Add(x => x.RequisitionLink.ID);
+            HiddenColumns.Add(x => x.RequisitionLink.Filled);
+            HiddenColumns.Add(x => x.RequisitionLink.Archived);
             HiddenColumns.Add(x => x.Product.ID);
             HiddenColumns.Add(x => x.Product.ID);
             HiddenColumns.Add(x => x.Product.Deleted);
             HiddenColumns.Add(x => x.Product.Deleted);
             HiddenColumns.Add(x => x.Product.DefaultStyle.ID);
             HiddenColumns.Add(x => x.Product.DefaultStyle.ID);
@@ -47,8 +56,74 @@ namespace PRSDesktop
             HiddenColumns.Add(x => x.Location.Code);
             HiddenColumns.Add(x => x.Location.Code);
             HiddenColumns.Add(x => x.Location.Description);
             HiddenColumns.Add(x => x.Location.Description);
             HiddenColumns.Add(x => x.Location.Deleted);
             HiddenColumns.Add(x => x.Location.Deleted);
+            HiddenColumns.Add(x => x.Style.ID);
+            HiddenColumns.Add(x => x.Style.Code);
+            HiddenColumns.Add(x => x.Picked);
+            ActionColumns.Add(new DynamicMenuColumn(SelectHolding,
+                (row) => (row.Get<RequisitionItem,Guid>(c=>c.Product.ID) == Guid.Empty) || row.Get<RequisitionItem, bool>(c => c.Product.NonStock) == true
+                    ? DynamicMenuStatus.Hidden 
+                    : DynamicMenuStatus.Enabled)
+            );
         }
         }
 
 
+        private void SelectHolding(DynamicMenuColumn column, CoreRow? row)
+        {
+            using (new WaitCursor())
+            {
+                var holdings = new Client<StockHolding>().Query(
+                    new Filter<StockHolding>(x => x.Product.ID).IsEqualTo(row.Get<RequisitionItem, Guid>(c => c.Product.ID)),
+                    new Columns<StockHolding>(x => x.Location.ID)
+                        .Add(x => x.Location.Code)
+                        .Add(x => x.Style.ID)
+                        .Add(x => x.Style.Code)
+                        .Add(x => x.Job.ID)
+                        .Add(x => x.Job.JobNumber)
+                        .Add(x => x.Dimensions.Unit.ID)
+                        .Add(x => x.Dimensions.Length)
+                        .Add(x => x.Dimensions.Width)
+                        .Add(x => x.Dimensions.Height)
+                        .Add(x => x.Dimensions.Weight)
+                        .Add(x => x.Dimensions.UnitSize)
+                        .Add(x => x.Dimensions.Value)
+                        .Add(x => x.Dimensions.Unit.HasQuantity)
+                        .Add(x => x.Dimensions.Unit.HasLength)
+                        .Add(x => x.Dimensions.Unit.HasWidth)
+                        .Add(x => x.Dimensions.Unit.HasWeight)
+                        .Add(x => x.Dimensions.Unit.HasHeight)
+                        .Add(x => x.Dimensions.Unit.Formula)
+                        .Add(x => x.Dimensions.Unit.Format)
+                        .Add(x => x.Units),
+                    new SortOrder<StockHolding>(x => x.Location.Code).ThenBy(x => x.Style.Code).ThenBy(x => x.Dimensions.UnitSize)
+                );
+
+                foreach (var holding in holdings.Rows)
+                {
+                    String text =
+                        $"{holding.Get<StockHolding, String>(c => c.Location.Code)}: {holding.Get<StockHolding, double>(c => c.Units)} @ {holding.Get<StockHolding, String>(c => c.Dimensions.UnitSize)}";
+                    String style = holding.Get<StockHolding, String>(c => c.Style.Code);
+                    if (!String.IsNullOrWhiteSpace(style))
+                        text = $"{text} ({style})";
+                    column.AddItem(text, null, (sel) => SelectLocation(holding,sel));
+                }
+            }
+            
+        }
+
+        private void SelectLocation(CoreRow holdingrow, CoreRow itemrow)
+        {
+            var item = itemrow.ToObject<RequisitionItem>();
+            var holding = holdingrow.ToObject<StockHolding>();
+            item.Location.ID = holding.Location.ID;
+            item.Location.Code = holding.Location.Code;
+            item.Dimensions.CopyFrom(holding.Dimensions, true);
+            item.Style.ID = holding.Style.ID;
+            item.Style.Code = holding.Style.Code;
+            new Client<RequisitionItem>().Save(item, "Changed due to stock holding selection");
+            Data.LoadRow(itemrow, item);
+            InvalidateRow(itemrow);
+        }
+
+
         public Requisition Requisition { get; set; }
         public Requisition Requisition { get; set; }
 
 
         protected override void Reload(Filters<RequisitionItem> criteria, Columns<RequisitionItem> columns, ref SortOrder<RequisitionItem>? sort,
         protected override void Reload(Filters<RequisitionItem> criteria, Columns<RequisitionItem> columns, ref SortOrder<RequisitionItem>? sort,
@@ -104,6 +179,15 @@ namespace PRSDesktop
             return base.EditItems(items, PageDataHandler, PreloadPages);
             return base.EditItems(items, PageDataHandler, PreloadPages);
         }
         }
 
 
+        protected override RequisitionItem CreateItem()
+        {
+            var item = base.CreateItem();
+            item.RequisitionLink.ID = Requisition.ID;
+            item.RequisitionLink.Synchronise(Requisition);
+            item.Quantity = 1;
+            return item;
+        }
+
         protected override void DoAdd()
         protected override void DoAdd()
         {
         {
             if (Requisition == null || Requisition.ID.Equals(Guid.Empty))
             if (Requisition == null || Requisition.ID.Equals(Guid.Empty))
@@ -118,209 +202,10 @@ namespace PRSDesktop
                 return;
                 return;
             }
             }
 
 
-            var dialog = new MultiSelectDialog<Product>(
-                null, //new Filter<Product>(x=>x.DefaultLocation.ID).IsNotEqualTo(Guid.Empty),
-                new Columns<Product>(
-                    x => x.Code,
-                    x => x.Name,
-                    x => x.DefaultStyle.ID,
-                    x => x.Dimensions.Unit.ID,
-                    x => x.Dimensions.Length,
-                    x => x.Dimensions.Width,
-                    x => x.Dimensions.Height,
-                    x => x.Dimensions.Weight,
-                    x => x.Dimensions.UnitSize,
-                    x => x.Dimensions.Value,
-                    x => x.Dimensions.Unit.HasQuantity,
-                    x => x.Dimensions.Unit.HasLength,
-                    x => x.Dimensions.Unit.HasWidth,
-                    x => x.Dimensions.Unit.HasWeight,
-                    x => x.Dimensions.Unit.HasHeight,
-                    x => x.Dimensions.Unit.Formula,
-                    x => x.Dimensions.Unit.Format,
-                    //x => x.Units.ID,
-                    x => x.DefaultLocation.ID,
-                    x => x.UnitQty,
-                    x => x.NonStock
-                )
-            );
-            if (dialog.ShowDialog())
-            {
-                var products = dialog.Data();
-
-                Progress.Show("Adding Products");
-
-                var reqitems = new Client<RequisitionItem>().Load(
-                    new Filter<RequisitionItem>(x => x.RequisitionLink.ID).IsEqualTo(Requisition.ID) /*.And(x => x.BoxNumber).IsEqualTo(Boxes) */
-                );
-                var ritems = new List<RequisitionItem>();
-
-                foreach (var product in products.Rows)
-                {
-                    var p = product.ToObject<Product>();
-                    // var productid = product.Get<Product, Guid>(x => x.ID);
-                    // var code = product.Get<Product, string>(c => c.Code);
-                    // var name = product.Get<Product, string>(c => c.Name);
-                    // var styleid = product.Get<Product, Guid>(c => c.DefaultStyle.ID);
-                    // var locationid = product.Get<Product, Guid>(c => c.DefaultLocation.ID);
-                    // var unitid = product.Get<Product, Guid>(c => c.Units.ID);
-                    // var unitsize = product.Get<Product, double>(c => c.UnitSize);
-                    // var unitqty = product.Get<Product, double>(c => c.UnitQty);
-                    // var nonstock = product.Get<Product, bool>(c => c.NonStock);
-
-                    var item = reqitems.FirstOrDefault(x => x.Code.Equals(p.Code));
-                    if (item != null)
-                    {
-                        item.Quantity += 1;
-                        ritems.Add(item);
-                    }
-                    else
-                    {
-                        item = new RequisitionItem
-                        {
-                            //BoxNumber = Boxes,
-                            Code = p.Code,
-                            Description = p.Name,
-                            BarCode = p.Code,
-                            Quantity = 1
-                        };
-                        item.RequisitionLink.ID = Requisition.ID;
-                        item.RequisitionLink.Number = Requisition.Number;
-                        item.RequisitionLink.JobLink.ID = Requisition.JobLink.ID;
-                        item.Product.ID = p.ID;
-                        item.Product.DefaultStyle.ID = p.DefaultStyle.ID;
-                        item.Product.Dimensions.CopyFrom(p.Dimensions);
-                        item.Product.DefaultLocation.ID = p.DefaultLocation.ID;
-                        item.Product.NonStock = p.NonStock;
-                        item.Product.DefaultStyle.ID = p.DefaultStyle.ID;
-                        item.Style.ID = p.DefaultStyle.ID;
-
-                        if (!p.NonStock)
-                            FindHolding(p.ID, p.DefaultStyle.ID, Requisition.JobLink.ID, p.Dimensions.UnitSize, p.DefaultLocation.ID, item);
-
-
-                        ritems.Add(item);
-                    }
-                }
-
-                if (ritems.Any())
-                    new Client<RequisitionItem>().Save(ritems, "Manually Added to Requisition");
-                Refresh(false, true);
-                Progress.Close();
-                //MessageBox.Show(String.Format("{0} products added", products.Rows.Count));
-            }
-        }
-
-        private void FindHolding(Guid productid, Guid styleid, Guid jobid, String unitsize, Guid defaultlocationid, params RequisitionItem[] items)
-        {
-            if (Requisition == null)
-                return;
-
-            // Try and Find a suitable default holding for this item
-            var holdings = new Client<StockHolding>().Query(
-                new Filter<StockHolding>(x => x.Product.ID).IsEqualTo(productid)
-                    .And(x => x.Style.ID).IsEqualTo(styleid)
-                    .And(x => x.Dimensions.UnitSize).IsEqualTo(unitsize),
-                new Columns<StockHolding>(x => x.ID)
-                    .Add(x => x.Job.ID)
-                    .Add(x => x.Location.ID)
-                    .Add(x => x.Location.Code)
-            );
-
-            // Is there a job reserve in the default location?
-            var holdingrows = holdings.Rows.Where(r =>
-                r.Get<StockHolding, Guid>(c => c.Location.ID).Equals(defaultlocationid) &&
-                r.Get<StockHolding, Guid>(c => c.Job.ID).Equals(jobid)).ToArray();
-
-            // Is there a job reserve anywhere?
-            if (!holdingrows.Any())
-                holdingrows = holdings.Rows.Where(r => r.Get<StockHolding, Guid>(c => c.Job.ID).Equals(jobid)).ToArray();
-
-            // Is there Free Stock in the Default Location?
-            if (!holdingrows.Any())
-                holdingrows = holdings.Rows.Where(r =>
-                        r.Get<StockHolding, Guid>(c => c.Location.ID).Equals(defaultlocationid) &&
-                        !Entity.IsEntityLinkValid<StockHolding, JobLink>(x => x.Job, r))
-                    .ToArray();
-
-            // Is there Free Stock Anywhere?
-            if (!holdingrows.Any())
-                holdingrows = holdings.Rows.Where(r => !Entity.IsEntityLinkValid<StockHolding, JobLink>(x => x.Job, r)).ToArray();
-
-            // Only Update the Requi Holding if there is a single location
-            foreach (var item in items)
-            {
-                item.Location.ID = holdingrows.SingleOrDefault()?.Get<StockHolding, Guid>(c => c.Location.ID) ?? Guid.Empty;
-                item.Location.Code = holdingrows.SingleOrDefault()?.Get<StockHolding, String>(c => c.Location.Code) ?? "";
-            }
-        }
-
-        protected override Dictionary<string, object?> EditorValueChanged(IDynamicEditorForm editor, RequisitionItem[] items, string name, object value)
-        {
-            var result = base.EditorValueChanged(editor, items, name, value);
-            if (string.Equals(name, "Product.ID"))
-            {
-                var productid = (Guid)value;
-                var code = "";
-                var description = "";
-                var style = Guid.Empty;
-                var location = Guid.Empty;
-                var nonstock = true;
-                var unitsize = "";
-
-                if (productid != Guid.Empty)
-                {
-                    var lookup = new Client<Product>().Query(
-                        new Filter<Product>(x => x.ID).IsEqualTo(productid),
-                        new Columns<Product>(x => x.Code, x => x.Name, x => x.DefaultStyle.ID, x => x.DefaultLocation.ID, x => x.NonStock)
-                    ).Rows.FirstOrDefault();
-                    code = lookup != null ? lookup.Get<Product, string>(x => x.Code) : "";
-                    description = lookup != null ? lookup.Get<Product, string>(x => x.Name) : "";
-                    style = lookup != null ? lookup.Get<Product, Guid>(x => x.DefaultStyle.ID) : Guid.Empty;
-                    location = lookup != null ? lookup.Get<Product, Guid>(x => x.DefaultLocation.ID) : Guid.Empty;
-                    unitsize = lookup != null ? lookup.Get<Product, String>(x => x.Dimensions.UnitSize) : "";
-                    nonstock = lookup != null ? lookup.Get<Product, bool>(x => x.NonStock) : true;
-                    if (!nonstock)
-                    {
-                        location = lookup != null ? lookup.Get<Product, Guid>(x => x.DefaultStyle.ID) : Guid.Empty;
-                        FindHolding(productid, style, Requisition.JobLink.ID, unitsize, location, items);
-                    }
-                }
-
-                editor.FindEditor("Code").SetValue(code);
-                editor.FindEditor("Description").SetValue(description);
-                editor.FindEditor("Style.ID").SetValue(style);
-                foreach (var item in items)
-                    item.Location.ID = location;
-                editor.FindEditor("Location.ID").Configure();
-            }
-            else if (string.Equals(name, "Style.ID"))
-            {
-                var reqi = items.First();
-                var productid = reqi.Product.ID;
-                var nonstock = reqi.Product.NonStock;
-                var styleid = reqi.Style.ID;
-                var locationid = reqi.Product.DefaultLocation.ID;
-                var unitsize = reqi.Dimensions.UnitSize;
-                if (reqi.Product.IsValid() || !nonstock)
-                {
-                    FindHolding(productid, styleid, Requisition.JobLink.ID, unitsize, locationid, items);
-                    editor.FindEditor("Holding.ID").Configure();
-                }
-            }
+            base.DoAdd();
 
 
-            return result;
         }
         }
-
-        // protected override void LookupsDefined(ILookupEditorControl sender, RequisitionItem[] items)
-        // {
-        //     base.LookupsDefined(sender, items);
-        //     if (string.Equals(sender.ColumnName, "Holding.ID") && sender.Loaded)
-        //     {
-        //         var id = items.Select(x => x.Holding.ID).Distinct().SingleOrDefault();
-        //         if (!Equals(id, sender.GetValue()))
-        //             sender.SetValue(id);
-        //     }
-        // }
+        
+        
     }
     }
 }
 }

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

@@ -388,11 +388,40 @@ namespace PRSDesktop
                 return;
                 return;
             }
             }
 
 
-            _requisition.Filled = _requisition.Filled.IsEmpty() ? DateTime.Now : DateTime.MinValue;
+            DateTime filltime = DateTime.Now;
+            
+            var unpickeditems = Items.Data.Rows.Where(r =>
+                _requisition.Filled.IsEmpty()
+                && (r.Get<RequisitionItem, Guid>(x => x.Product.ID) != Guid.Empty)
+                && (r.Get<RequisitionItem, bool>(x => x.Product.NonStock) != true)
+                && (r.Get<RequisitionItem, DateTime>(x => x.Picked).IsEmpty())
+            );
+            if (unpickeditems.Any())
+            {
+                var confirm = MessageBox.Show("Unpicked items exist on this requisition!\n\nDo you want to mark them as picked now?",
+                    "Unpicked Items", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
+                if (confirm == MessageBoxResult.Cancel)
+                    return;
+                filltime = DateTime.Now;
+                if (confirm == MessageBoxResult.Yes)
+                {
+                    List<RequisitionItem> updates = new List<RequisitionItem>();
+                    foreach (var row in unpickeditems)
+                    {
+                        var item = row.ToObject<RequisitionItem>();
+                        item.Picked = filltime;
+                        updates.Add(item);
+                    }
+                    new Client<RequisitionItem>().Save(updates, "Marked as Picked because Requisition was marked as filled");
+                }
+            }
+
+            _requisition.Filled = _requisition.Filled.IsEmpty() ? filltime : DateTime.MinValue;
             Progress.Show(_requisition.Filled.IsEmpty() ? "Clearing Delivery Items" : "Creating Delivery Items");
             Progress.Show(_requisition.Filled.IsEmpty() ? "Clearing Delivery Items" : "Creating Delivery Items");
             new Client<Requisition>().Save(_requisition, "Updated Filled Flag");
             new Client<Requisition>().Save(_requisition, "Updated Filled Flag");
             Requisitions.UpdateRow<Requisition, DateTime>(Requisitions.SelectedRows.First(), x => x.Filled, _requisition.Filled);
             Requisitions.UpdateRow<Requisition, DateTime>(Requisitions.SelectedRows.First(), x => x.Filled, _requisition.Filled);
             LoadRequisition();
             LoadRequisition();
+            Items.Refresh(false, true);
             Progress.Close();
             Progress.Close();
         }
         }
 
 

+ 2 - 1
prs.stores/RequisitionItemStore.cs

@@ -19,7 +19,8 @@ namespace Comal.Stores
                 if (!r.Filled.Equals(DateTime.MinValue))
                 if (!r.Filled.Equals(DateTime.MinValue))
                     return KanbanCategory.Waiting;
                     return KanbanCategory.Waiting;
                 if (Provider.Query(
                 if (Provider.Query(
-                        new Filter<RequisitionItem>(x => x.RequisitionLink.ID).IsEqualTo(r.ID),
+                        new Filter<RequisitionItem>(x => x.RequisitionLink.ID).IsEqualTo(r.ID)
+                            .And(x=>x.Picked).IsNotEqualTo(DateTime.MinValue),
                         new Columns<RequisitionItem>(x => x.ID)
                         new Columns<RequisitionItem>(x => x.ID)
                     ).Rows.Any()
                     ).Rows.Any()
                    )
                    )

+ 4 - 4
prs.stores/RequisitionStore.cs

@@ -5,6 +5,7 @@ using System.Linq.Expressions;
 using Comal.Classes;
 using Comal.Classes;
 using H.Pipes.Extensions;
 using H.Pipes.Extensions;
 using InABox.Core;
 using InABox.Core;
+using Syncfusion.Windows.Tools.Controls;
 
 
 namespace Comal.Stores
 namespace Comal.Stores
 {
 {
@@ -119,7 +120,7 @@ namespace Comal.Stores
 
 
             IEnumerable<RequisitionItem> requisitionitems = null;
             IEnumerable<RequisitionItem> requisitionitems = null;
             IEnumerable<DeliveryItem> deliveryitems = null;
             IEnumerable<DeliveryItem> deliveryitems = null;
-
+            
             UpdateDeliveryItems(entity, ref requisitionitems, ref deliveryitems);
             UpdateDeliveryItems(entity, ref requisitionitems, ref deliveryitems);
             UpdateTakenBy(entity, ref requisitionitems, ref deliveryitems);
             UpdateTakenBy(entity, ref requisitionitems, ref deliveryitems);
             UpdateStockBatches(entity, ref requisitionitems);
             UpdateStockBatches(entity, ref requisitionitems);
@@ -146,13 +147,12 @@ namespace Comal.Stores
                 return KanbanCategory.Open;
                 return KanbanCategory.Open;
             });
             });
         }
         }
-
-
+        
         protected override void BeforeDelete(Requisition entity)
         protected override void BeforeDelete(Requisition entity)
         {
         {
             UnlinkTrackingKanban<RequisitionKanban, Requisition, RequisitionLink>(entity);
             UnlinkTrackingKanban<RequisitionKanban, Requisition, RequisitionLink>(entity);
         }
         }
-
+        
         #region Delivery Items
         #region Delivery Items
 
 
         private void CreateDeliveryItems(Requisition entity, ref IEnumerable<RequisitionItem> requisitionitems,
         private void CreateDeliveryItems(Requisition entity, ref IEnumerable<RequisitionItem> requisitionitems,