ConsignmentStore.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. using Comal.Classes;
  3. using System.Collections.Generic;
  4. using InABox.Core;
  5. using System.Linq;
  6. namespace Comal.Stores
  7. {
  8. public class ConsignmentStore : BaseStore<Consignment>
  9. {
  10. protected override void BeforeSave(Consignment entity)
  11. {
  12. base.BeforeSave(entity);
  13. }
  14. protected override void AfterSave(Consignment entity)
  15. {
  16. base.AfterSave(entity);
  17. //consignment has to be newly completed (usually done via receivals module) - checks further down as well to ensure no repeated saving of documents / batches
  18. if (entity.ActualWarehouseArrival == DateTime.MinValue)
  19. return;
  20. if (entity.HasOriginalValue(x => x.ActualWarehouseArrival) && entity.GetOriginalValue<Consignment, DateTime>("ActualWarehouseArrival") != DateTime.MinValue)
  21. return;
  22. //find previously saved PO Items attached to this consignment
  23. var purchaseOrderItemTable = Provider.Query<PurchaseOrderItem>(
  24. new Filter<PurchaseOrderItem>(x => x.Consignment.ID).IsEqualTo(entity.ID),
  25. Columns.None<PurchaseOrderItem>().Add(x => x.ID, x => x.PurchaseOrderLink.ID)
  26. );
  27. var firstPOItem = purchaseOrderItemTable.Rows.FirstOrDefault();
  28. if (firstPOItem is null) // i.e., there are no PO Items, return
  29. return;
  30. var consignmentDocIDs = new List<Guid>();
  31. var purchaseOrderID = firstPOItem.Get<PurchaseOrderItem, Guid>(x => x.PurchaseOrderLink.ID);
  32. var table = Provider.Query<ConsignmentDocument>
  33. (
  34. new Filter<ConsignmentDocument>(x => x.EntityLink.ID).IsEqualTo(entity.ID),
  35. Columns.None<ConsignmentDocument>().Add(x => x.DocumentLink.ID)
  36. );
  37. if (table.Rows.Any())
  38. {
  39. consignmentDocIDs = SavePurchaseOrderDocuments(table, purchaseOrderID);
  40. }
  41. //build filter for querying stock movements attached to PO Items on this consignment
  42. var filter =
  43. new Filter<StockMovement>(x => x.OrderItem.ID).InList(purchaseOrderItemTable.Rows.Select(x => x.Get<PurchaseOrderItem, Guid>(x => x.ID)).ToArray());
  44. var stockMovementTable = Provider.Query<StockMovement>(
  45. filter,
  46. Columns.None<StockMovement>().Add(
  47. x => x.ID,
  48. x => x.Notes,
  49. x => x.Batch.ID
  50. ));
  51. if (stockMovementTable.Rows.Any())
  52. {
  53. //check if movements already have a batch.id - means photos would have already been saved
  54. var batchID = stockMovementTable.Rows.First().Get<StockMovement, Guid>(x => x.Batch.ID);
  55. if (batchID != Guid.Empty)
  56. return;
  57. //create new stockmovementbatch to attach new stockmovements to (movements created by server)
  58. var batch = new StockMovementBatch();
  59. batch.Type = StockMovementBatchType.Receipt;
  60. Provider.Save(batch);
  61. //add found stockmovements to batch, add stockmovements to save
  62. var movements = new List<StockMovement>();
  63. foreach (var movement in stockMovementTable.ToObjects<StockMovement>())
  64. {
  65. movement.Batch.ID = batch.ID;
  66. movement.Employee.ID = entity.Employee.ID;
  67. movement.Notes = movement.Notes + " / Consignment " + entity.Number;
  68. movements.Add(movement);
  69. }
  70. Provider.Save(movements);
  71. var stockMovementBatchDocuments = new List<StockMovementBatchDocument>();
  72. foreach (var id in consignmentDocIDs)
  73. {
  74. var smd = new StockMovementBatchDocument();
  75. smd.EntityLink.ID = batch.ID;
  76. smd.DocumentLink.ID = id;
  77. stockMovementBatchDocuments.Add(smd);
  78. }
  79. Provider.Save<StockMovementBatchDocument>(stockMovementBatchDocuments);
  80. }
  81. }
  82. private List<Guid> SavePurchaseOrderDocuments(CoreTable table, Guid purchaseOrderID)
  83. {
  84. var consignmentDocIDs = new List<Guid>();
  85. var purchaseOrderDocuments = new List<PurchaseOrderDocument>();
  86. foreach (var row in table.Rows)
  87. {
  88. var docID = row.Get<ConsignmentDocument, Guid>(x => x.DocumentLink.ID);
  89. consignmentDocIDs.Add(docID);
  90. var PODocument = new PurchaseOrderDocument();
  91. PODocument.DocumentLink.ID = docID;
  92. PODocument.EntityLink.ID = purchaseOrderID;
  93. var existingPODocs = Provider.Query<PurchaseOrderDocument>(
  94. new Filter<PurchaseOrderDocument>(x => x.DocumentLink.ID).IsEqualTo(docID), //check that PO document doesn't already exist
  95. Columns.None<PurchaseOrderDocument>().Add(x => x.ID));
  96. if (existingPODocs.Rows.Count == 0)
  97. purchaseOrderDocuments.Add(PODocument);
  98. }
  99. if (purchaseOrderDocuments.Any())
  100. Provider.Save<PurchaseOrderDocument>(purchaseOrderDocuments);
  101. return consignmentDocIDs;
  102. }
  103. }
  104. }