BillStore.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. using com.sun.org.glassfish.external.statistics;
  2. using Comal.Classes;
  3. using InABox.Configuration;
  4. using InABox.Core;
  5. using InABox.Database.Stores;
  6. using InABox.Scripting;
  7. using PRSStores;
  8. using System;
  9. namespace Comal.Stores;
  10. internal class BillStore : BaseStore<Bill>
  11. {
  12. protected override void BeforeSave(Bill entity)
  13. {
  14. base.BeforeSave(entity);
  15. if(entity.HasOriginalValue(x => x.Number) || entity.SupplierLink.HasOriginalValue(x => x.ID))
  16. {
  17. var existing = Provider.Query<Bill>(
  18. new Filter<Bill>(x => x.Number).IsEqualTo(entity.Number)
  19. .And(x => x.SupplierLink.ID).IsEqualTo(entity.SupplierLink.ID)
  20. .And(x => x.ID).IsNotEqualTo(entity.ID),
  21. Columns.None<Bill>().Add(x => x.ID));
  22. if(existing.Rows.Count > 0)
  23. {
  24. throw new DuplicateCodeException(typeof(Bill), new Dictionary<string, object> {{ nameof(Bill.Number), entity.Number }});
  25. }
  26. }
  27. if (entity.ID == Guid.Empty)
  28. {
  29. var defaultApprovalSet = Provider.Query<BillApprovalSet>(
  30. new Filter<BillApprovalSet>(x => x.IsDefault).IsEqualTo(true),
  31. Columns.None<BillApprovalSet>().Add(x => x.ID))
  32. .ToObjects<BillApprovalSet>().FirstOrDefault();
  33. if (defaultApprovalSet is not null)
  34. {
  35. entity.ApprovalSet.ID = defaultApprovalSet.ID;
  36. }
  37. }
  38. //UpdateAggregate<Supplier>(entity, entity.SupplierLink, Sum<Supplier>(b => b.Balance, s => s.Balance));
  39. }
  40. private void ClearBillApprovals(Bill bill)
  41. {
  42. // We need to clear all automatic bill approvals.
  43. var approvals = Provider.Query(
  44. new Filter<BillApproval>(x => x.Bill.ID).IsEqualTo(bill.ID)
  45. .And(x => x.IsCustom).IsEqualTo(false),
  46. Columns.Required<BillApproval>().Add(x => x.ID))
  47. .ToList<BillApproval>();
  48. Provider.Delete(approvals, UserID);
  49. }
  50. private void UpdateBillApprovals(Bill bill)
  51. {
  52. if (bill.ID == Guid.Empty) return;
  53. if(bill.ApprovalSet.ID == Guid.Empty)
  54. {
  55. ClearBillApprovals(bill);
  56. return;
  57. }
  58. var setEmployees = Provider.Query(
  59. new Filter<BillApprovalSetEmployee>(x => x.ApprovalSet.ID).IsEqualTo(bill.ApprovalSet.ID),
  60. Columns.None<BillApprovalSetEmployee>().Add(x => x.Employee.ID),
  61. new SortOrder<BillApprovalSetEmployee>(x => x.Sequence))
  62. .ToArray<BillApprovalSetEmployee>();
  63. var approvals = Provider.Query(
  64. new Filter<BillApproval>(x => x.Bill.ID).IsEqualTo(bill.ID),
  65. Columns.Required<BillApproval>().Add(x => x.Employee.ID).Add(x => x.IsCustom).Add(x => x.Approved))
  66. .ToList<BillApproval>();
  67. try
  68. {
  69. var customApprovals = new List<BillApproval>();
  70. foreach(var approval in approvals)
  71. {
  72. if (approval.IsCustom)
  73. {
  74. customApprovals.Add(approval);
  75. }
  76. else
  77. {
  78. if(approval.Approved != DateTime.MinValue)
  79. {
  80. // These really are custom approvals for our purposes, since they've been modified.
  81. customApprovals.Add(approval);
  82. }
  83. }
  84. }
  85. // Build up the automatic list.
  86. var autoApprovals = new List<BillApproval>();
  87. foreach(var employee in setEmployees)
  88. {
  89. var approval = new BillApproval();
  90. approval.Employee.CopyFrom(employee.Employee);
  91. approval.IsCustom = false;
  92. autoApprovals.Add(approval);
  93. }
  94. if(BillApprovalSetStore.GetUpdateApprovalsScript(bill.ApprovalSet.ID) is ScriptDocument script)
  95. {
  96. script.Execute(methodname: BillApprovalSet.UpdateBillApprovalsMethodName, parameters: [bill, autoApprovals]);
  97. }
  98. // Now, we have to merge the custom and auto lists, only saving auto approvals if there are no custom ones for that employee.
  99. var toAdd = new List<BillApproval>();
  100. var toRemove = new List<BillApproval>();
  101. var newList = customApprovals.ToList();
  102. foreach(var approval in autoApprovals)
  103. {
  104. newList.Add(approval);
  105. if (!approvals.Any(x => x.Employee.ID == approval.Employee.ID))
  106. {
  107. toAdd.Add(approval);
  108. }
  109. }
  110. foreach(var approval in approvals)
  111. {
  112. if (!newList.Any(x => x.Employee.ID == approval.Employee.ID))
  113. {
  114. toRemove.Add(approval);
  115. }
  116. }
  117. foreach(var approval in toAdd)
  118. {
  119. approval.Bill.ID = bill.ID;
  120. }
  121. Provider.Save(toAdd);
  122. Provider.Delete(toRemove, UserID);
  123. }
  124. catch(Exception e)
  125. {
  126. CoreUtils.LogException(UserID, e, "Error running bill approval script");
  127. }
  128. }
  129. protected override void AfterSave(Bill entity)
  130. {
  131. base.AfterSave(entity);
  132. UpdateBillApprovals(entity);
  133. }
  134. protected override void BeforeDelete(Bill entity)
  135. {
  136. base.BeforeDelete(entity);
  137. entity.SupplierLink.ID = Guid.Empty;
  138. //UpdateAggregate<Supplier>(entity, entity.SupplierLink, Sum<Supplier>(b => b.Balance, s => s.Balance));
  139. }
  140. }