DeliveryNotificationStore.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Comal.Classes;
  5. using InABox.Core;
  6. namespace Comal.Stores
  7. {
  8. internal class DeliveryNotificationStore : BaseStore<DeliveryNotification>
  9. {
  10. protected override void AfterSave(DeliveryNotification entity)
  11. {
  12. base.AfterSave(entity);
  13. if (!entity.Delivery.IsValid())
  14. return;
  15. // If Necessary, Mark the Delivery as Delivered
  16. var delivery = FindSubStore<Delivery>().Query(
  17. new Filter<Delivery>(x => x.ID).IsEqualTo(entity.Delivery.ID),
  18. new Columns<Delivery>(
  19. x => x.ID,
  20. x => x.Delivered,
  21. x => x.Job.ID,
  22. x => x.Employee.ID,
  23. x => x.Number
  24. )
  25. ).Rows.FirstOrDefault()?.ToObject<Delivery>();
  26. if (delivery == null)
  27. return;
  28. if (delivery.Delivered.IsEmpty())
  29. {
  30. delivery.Delivered = DateTime.Now;
  31. FindSubStore<Delivery>().Save(delivery, "Marked as Delivered");
  32. }
  33. // Now process each of the deliveryitems on the delivery
  34. var items = Provider.Query(
  35. new Filter<DeliveryItem>(x => x.Delivery.ID).IsEqualTo(entity.Delivery.ID),
  36. new Columns<DeliveryItem>(
  37. x => x.ID,
  38. x => x.DeliveredDate,
  39. x => x.ShipmentLink.ID,
  40. x => x.ShipmentLink.Code,
  41. x => x.RequisitionLink.ID,
  42. x => x.RequisitionLink.Deleted,
  43. x => x.RequisitionLink.Number
  44. )
  45. ).Rows.Select(x => x.ToObject<DeliveryItem>()).ToArray();
  46. var deliveredracks = new List<Guid>();
  47. var retainedracks = new List<Guid>();
  48. var deliveredrequis = new List<Guid>();
  49. var retainedrequis = new List<Guid>();
  50. foreach (var item in items)
  51. {
  52. // Commenting this out - the delivery driver may forget to scan the rack at collection time,
  53. // and if this is done back at the warehouse, then the final location of the items themselves
  54. // will be incorrect. Best to use the last known location of the rack itself.
  55. //item.Location = entity.Location;
  56. if (item.ShipmentLink.IsValid() && !deliveredracks.Contains(item.ShipmentLink.ID))
  57. deliveredracks.Add(item.ShipmentLink.ID);
  58. var message = "Item has been delivered";
  59. if (item.ShipmentLink.IsValid())
  60. {
  61. if (entity.RetainedItems.Contains(item.ID))
  62. {
  63. message = string.Format("Delivery: Item remains on Rack {0}", item.ShipmentLink.Code);
  64. retainedracks.Add(item.ShipmentLink.ID);
  65. }
  66. else
  67. {
  68. message = string.Format("Delivery: Item has been removed from Rack {0}", item.ShipmentLink.Code);
  69. item.ShipmentCode = item.ShipmentLink.Code;
  70. item.ShipmentLink.ID = Guid.Empty;
  71. if (item.DeliveredDate.IsEmpty())
  72. item.DeliveredDate = entity.Created;
  73. }
  74. }
  75. if (item.RequisitionLink.IsValid() && !deliveredracks.Contains(item.RequisitionLink.ID))
  76. deliveredrequis.Add(item.RequisitionLink.ID);
  77. if (item.RequisitionLink.IsValid())
  78. {
  79. if (entity.RetainedItems.Contains(item.ID))
  80. {
  81. message = string.Format("Delivery: Item remains with Requisition {0}", item.RequisitionLink.Number);
  82. retainedrequis.Add(item.RequisitionLink.ID);
  83. }
  84. else
  85. {
  86. message = string.Format("Delivery: Item has been removed from Requisition {0}", item.RequisitionLink.Number);
  87. if (item.DeliveredDate.IsEmpty())
  88. item.DeliveredDate = entity.Created;
  89. }
  90. }
  91. }
  92. var delivereditems = items.Where(x => x.IsChanged()).ToArray();
  93. var undelivereditems = items.Where(x => !x.IsChanged()).ToArray();
  94. if (delivereditems.Any())
  95. FindSubStore<DeliveryItem>().Save(delivereditems, "Item was marked as delivered");
  96. if (undelivereditems.Any())
  97. FindSubStore<DeliveryItem>().Save(undelivereditems, "Item was marked as NOT delivered");
  98. // Only unlink Empty Racks - if there are retained items, leave the rack associated with the delivery
  99. foreach (var retainedshipment in retainedracks)
  100. deliveredracks.Remove(retainedshipment);
  101. // Unlink the Rack from the Delivery, so it can be re-used
  102. if (deliveredracks.Any())
  103. {
  104. var shipments = FindSubStore<Shipment>().Load(Filter<Shipment>.List(x => x.ID, ListOperator.Includes, deliveredracks));
  105. foreach (var shipment in shipments)
  106. shipment.Delivery.ID = Guid.Empty;
  107. FindSubStore<Shipment>().Save(shipments, "Marked As Delivered");
  108. }
  109. // Archive completed requis - if there are retained items, leave the requi open
  110. foreach (var retainedrequi in retainedrequis)
  111. deliveredrequis.Remove(retainedrequi);
  112. if (deliveredrequis.Any())
  113. {
  114. var requis = FindSubStore<Requisition>().Load(new Filter<Requisition>(x => x.ID).InList(deliveredrequis.ToArray()));
  115. foreach (var requi in requis)
  116. // Requis can remain associated with the delivery, bc they are one-shot (not reusable like racks)
  117. //requi.Delivery.ID = Guid.Empty;
  118. requi.Archived = DateTime.Now;
  119. FindSubStore<Requisition>().Save(requis, "Marked As Delivered");
  120. }
  121. }
  122. }
  123. }