using System; using System.Collections.Generic; using System.Linq; using Comal.Classes; using InABox.Core; namespace Comal.Stores { internal class DeliveryNotificationStore : BaseStore { protected override void AfterSave(DeliveryNotification entity) { base.AfterSave(entity); if (!entity.Delivery.IsValid()) return; // If Necessary, Mark the Delivery as Delivered var delivery = FindSubStore().Query( new Filter(x => x.ID).IsEqualTo(entity.Delivery.ID), new Columns( x => x.ID, x => x.Delivered, x => x.Job.ID, x => x.Employee.ID, x => x.Number ) ).Rows.FirstOrDefault()?.ToObject(); if (delivery == null) return; if (delivery.Delivered.IsEmpty()) { delivery.Delivered = DateTime.Now; FindSubStore().Save(delivery, "Marked as Delivered"); } // Now process each of the deliveryitems on the delivery var items = Provider.Query( new Filter(x => x.Delivery.ID).IsEqualTo(entity.Delivery.ID), new Columns( x => x.ID, x => x.DeliveredDate, x => x.ShipmentLink.ID, x => x.ShipmentLink.Code, x => x.RequisitionLink.ID, x => x.RequisitionLink.Deleted, x => x.RequisitionLink.Number ) ).Rows.Select(x => x.ToObject()).ToArray(); var deliveredracks = new List(); var retainedracks = new List(); var deliveredrequis = new List(); var retainedrequis = new List(); foreach (var item in items) { // Commenting this out - the delivery driver may forget to scan the rack at collection time, // and if this is done back at the warehouse, then the final location of the items themselves // will be incorrect. Best to use the last known location of the rack itself. //item.Location = entity.Location; if (item.ShipmentLink.IsValid() && !deliveredracks.Contains(item.ShipmentLink.ID)) deliveredracks.Add(item.ShipmentLink.ID); var message = "Item has been delivered"; if (item.ShipmentLink.IsValid()) { if (entity.RetainedItems.Contains(item.ID)) { message = string.Format("Delivery: Item remains on Rack {0}", item.ShipmentLink.Code); retainedracks.Add(item.ShipmentLink.ID); } else { message = string.Format("Delivery: Item has been removed from Rack {0}", item.ShipmentLink.Code); item.ShipmentCode = item.ShipmentLink.Code; item.ShipmentLink.ID = Guid.Empty; if (item.DeliveredDate.IsEmpty()) item.DeliveredDate = entity.Created; } } if (item.RequisitionLink.IsValid() && !deliveredracks.Contains(item.RequisitionLink.ID)) deliveredrequis.Add(item.RequisitionLink.ID); if (item.RequisitionLink.IsValid()) { if (entity.RetainedItems.Contains(item.ID)) { message = string.Format("Delivery: Item remains with Requisition {0}", item.RequisitionLink.Number); retainedrequis.Add(item.RequisitionLink.ID); } else { message = string.Format("Delivery: Item has been removed from Requisition {0}", item.RequisitionLink.Number); if (item.DeliveredDate.IsEmpty()) item.DeliveredDate = entity.Created; } } } var delivereditems = items.Where(x => x.IsChanged()).ToArray(); var undelivereditems = items.Where(x => !x.IsChanged()).ToArray(); if (delivereditems.Any()) FindSubStore().Save(delivereditems, "Item was marked as delivered"); if (undelivereditems.Any()) FindSubStore().Save(undelivereditems, "Item was marked as NOT delivered"); // Only unlink Empty Racks - if there are retained items, leave the rack associated with the delivery foreach (var retainedshipment in retainedracks) deliveredracks.Remove(retainedshipment); // Unlink the Rack from the Delivery, so it can be re-used if (deliveredracks.Any()) { var shipments = FindSubStore().Load(Filter.List(x => x.ID, ListOperator.Includes, deliveredracks)); foreach (var shipment in shipments) shipment.Delivery.ID = Guid.Empty; FindSubStore().Save(shipments, "Marked As Delivered"); } // Archive completed requis - if there are retained items, leave the requi open foreach (var retainedrequi in retainedrequis) deliveredrequis.Remove(retainedrequi); if (deliveredrequis.Any()) { var requis = FindSubStore().Load(new Filter(x => x.ID).InList(deliveredrequis.ToArray())); foreach (var requi in requis) // Requis can remain associated with the delivery, bc they are one-shot (not reusable like racks) //requi.Delivery.ID = Guid.Empty; requi.Archived = DateTime.Now; FindSubStore().Save(requis, "Marked As Delivered"); } } } }