ConsignmentStore.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using Comal.Classes;
  2. using System;
  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. Guid purchaseOrderID = Guid.Empty;
  18. //consignment has to be newly completed (usually done via receivals module) - checks further down as well to ensure no repeated saving of documents / batches
  19. if (entity.ActualWarehouseArrival == DateTime.MinValue)
  20. return;
  21. if (entity.HasOriginalValue(x => x.ActualWarehouseArrival) && entity.GetOriginalValue<Consignment, DateTime>("ActualWarehouseArrival") != DateTime.MinValue)
  22. return;
  23. //find previously saved PO Items attached to this consignment
  24. CoreTable purchaseOrderItemTable = Provider.Query<PurchaseOrderItem>(
  25. new Filter<PurchaseOrderItem>(x => x.Consignment.ID).IsEqualTo(entity.ID),
  26. new Columns<PurchaseOrderItem>(x => x.ID, x => x.PurchaseOrderLink.ID)
  27. );
  28. if (!purchaseOrderItemTable.Rows.Any())
  29. return;
  30. List<Guid> consignmentDocIDs = new List<Guid>();
  31. if (purchaseOrderItemTable.Rows.FirstOrDefault().Values[1] == null)
  32. purchaseOrderID = Guid.Empty;
  33. else
  34. purchaseOrderID = Guid.Parse(purchaseOrderItemTable.Rows.FirstOrDefault().Values[1].ToString());
  35. CoreTable table = Provider.Query<ConsignmentDocument>
  36. (
  37. new Filter<ConsignmentDocument>(x => x.EntityLink.ID).IsEqualTo(entity.ID),
  38. new Columns<ConsignmentDocument>(x => x.DocumentLink.ID)
  39. );
  40. if (table.Rows.Any())
  41. {
  42. consignmentDocIDs = SavePurchaseOrderDocuments(table, purchaseOrderID);
  43. }
  44. //build filter for querying stock movements attached to PO Items on this consignment
  45. Filter<StockMovement> filter =
  46. new Filter<StockMovement>(x => x.OrderItem.ID).IsEqualTo(Guid.Parse(purchaseOrderItemTable.Rows.FirstOrDefault().Values[0].ToString()));
  47. foreach (CoreRow row in purchaseOrderItemTable.Rows)
  48. {
  49. if (row != purchaseOrderItemTable.Rows.FirstOrDefault())
  50. {
  51. List<object> list = row.Values;
  52. filter = filter.Or(x => x.OrderItem.ID).IsEqualTo(Guid.Parse(list[0].ToString()));
  53. }
  54. }
  55. CoreTable stockMovementTable = Provider.Query<StockMovement>(
  56. filter,
  57. new Columns<StockMovement>(
  58. x => x.ID,
  59. x => x.Notes,
  60. x => x.Batch.ID
  61. ));
  62. if (stockMovementTable.Rows.Any())
  63. {
  64. //check if movements already have a batch.id - means photos would have already been saved
  65. if (Guid.Parse(stockMovementTable.Rows.FirstOrDefault().Values[2].ToString()) != Guid.Empty)
  66. return;
  67. //create new stockmovementbatch to attach new stockmovements to (movements created by server)
  68. StockMovementBatch batch = new StockMovementBatch();
  69. batch.Type = StockMovementBatchType.Receipt;
  70. Provider.Save(batch);
  71. //add found stockmovements to batch, add stockmovements to save
  72. List<StockMovement> movements = new List<StockMovement>();
  73. foreach (CoreRow row in stockMovementTable.Rows)
  74. {
  75. List<object> list1 = row.Values;
  76. StockMovement movement = new StockMovement
  77. {
  78. ID = Guid.Parse(list1[0].ToString()),
  79. Notes = list1[1].ToString()
  80. };
  81. movement.Batch.ID = batch.ID;
  82. movement.Employee.ID = entity.Employee.ID;
  83. movement.Notes = movement.Notes + " / Consignment " + entity.Number;
  84. movements.Add(movement);
  85. }
  86. Provider.Save(movements);
  87. List<StockMovementBatchDocument> stockMovementBatchDocuments = new List<StockMovementBatchDocument>();
  88. foreach (Guid id in consignmentDocIDs)
  89. {
  90. var smd = new StockMovementBatchDocument();
  91. smd.EntityLink.ID = batch.ID;
  92. smd.DocumentLink.ID = id;
  93. stockMovementBatchDocuments.Add(smd);
  94. }
  95. Provider.Save<StockMovementBatchDocument>(stockMovementBatchDocuments);
  96. }
  97. }
  98. private List<Guid> SavePurchaseOrderDocuments(CoreTable table, Guid purchaseOrderID)
  99. {
  100. List<Guid> consignmentDocIDs = new List<Guid>();
  101. List<PurchaseOrderDocument> purchaseOrderDocuments = new List<PurchaseOrderDocument>();
  102. foreach (CoreRow row in table.Rows)
  103. {
  104. List<object> list = row.Values;
  105. Guid docID = Guid.Parse(list[0].ToString());
  106. consignmentDocIDs.Add(docID);
  107. PurchaseOrderDocument PODocument = new PurchaseOrderDocument();
  108. PODocument.DocumentLink.ID = docID;
  109. PODocument.EntityLink.ID = purchaseOrderID;
  110. CoreTable existingPODocs = Provider.Query<PurchaseOrderDocument>(
  111. new Filter<PurchaseOrderDocument>(x => x.DocumentLink.ID).IsEqualTo(docID), //check that PO document doesn't already exist
  112. new Columns<PurchaseOrderDocument>(x => x.ID));
  113. if (existingPODocs.Rows.Count == 0)
  114. purchaseOrderDocuments.Add(PODocument);
  115. }
  116. if (purchaseOrderDocuments.Any())
  117. Provider.Save<PurchaseOrderDocument>(purchaseOrderDocuments);
  118. return consignmentDocIDs;
  119. }
  120. }
  121. }