| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 | using System;using System.Collections.Generic;using System.Linq;using Comal.Classes;using InABox.Core;namespace Comal.Stores{    internal class DeliveryNotificationStore : BaseStore<DeliveryNotification>    {        protected override void AfterSave(DeliveryNotification entity)        {            base.AfterSave(entity);            if (!entity.Delivery.IsValid())                return;            // If Necessary, Mark the Delivery as Delivered            var delivery = FindSubStore<Delivery>().Query(                new Filter<Delivery>(x => x.ID).IsEqualTo(entity.Delivery.ID),                new Columns<Delivery>(                    x => x.ID,                    x => x.Delivered,                    x => x.Job.ID,                    x => x.Employee.ID,                    x => x.Number                )            ).Rows.FirstOrDefault()?.ToObject<Delivery>();            if (delivery == null)                return;            if (delivery.Delivered.IsEmpty())            {                delivery.Delivered = DateTime.Now;                FindSubStore<Delivery>().Save(delivery, "Marked as Delivered");            }            // Now process each of the deliveryitems on the delivery            var items = Provider.Query(                new Filter<DeliveryItem>(x => x.Delivery.ID).IsEqualTo(entity.Delivery.ID),                new Columns<DeliveryItem>(                    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<DeliveryItem>()).ToArray();            var deliveredracks = new List<Guid>();            var retainedracks = new List<Guid>();            var deliveredrequis = new List<Guid>();            var retainedrequis = new List<Guid>();            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<DeliveryItem>().Save(delivereditems, "Item was marked as delivered");            if (undelivereditems.Any())                FindSubStore<DeliveryItem>().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<Shipment>().Load(Filter<Shipment>.List(x => x.ID, ListOperator.Includes, deliveredracks));                foreach (var shipment in shipments)                    shipment.Delivery.ID = Guid.Empty;                FindSubStore<Shipment>().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<Requisition>().Load(new Filter<Requisition>(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<Requisition>().Save(requis, "Marked As Delivered");            }        }    }}
 |