| 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");
 
-             }
 
-         }
 
-     }
 
- }
 
 
  |