BillStore.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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 UpdateBillApprovals(Bill bill)
  41. {
  42. if (bill.ID == Guid.Empty || bill.ApprovalSet.ID == Guid.Empty) return;
  43. var setEmployees = Provider.Query(
  44. new Filter<BillApprovalSetEmployee>(x => x.ApprovalSet.ID).IsEqualTo(bill.ApprovalSet.ID),
  45. Columns.None<BillApprovalSetEmployee>().Add(x => x.Employee.ID),
  46. new SortOrder<BillApprovalSetEmployee>(x => x.Sequence))
  47. .ToArray<BillApprovalSetEmployee>();
  48. var approvals = Provider.Query(
  49. new Filter<BillApproval>(x => x.Bill.ID).IsEqualTo(bill.ID),
  50. Columns.Required<BillApproval>().Add(x => x.Employee.ID).Add(x => x.IsCustom).Add(x => x.Approved))
  51. .ToList<BillApproval>();
  52. try
  53. {
  54. var customApprovals = new List<BillApproval>();
  55. foreach(var approval in approvals)
  56. {
  57. if (approval.IsCustom)
  58. {
  59. customApprovals.Add(approval);
  60. }
  61. else
  62. {
  63. if(approval.Approved != DateTime.MinValue)
  64. {
  65. // These really are custom approvals for our purposes, since they've been modified.
  66. customApprovals.Add(approval);
  67. }
  68. }
  69. }
  70. // Build up the automatic list.
  71. var autoApprovals = new List<BillApproval>();
  72. foreach(var employee in setEmployees)
  73. {
  74. var approval = new BillApproval();
  75. approval.Employee.CopyFrom(employee.Employee);
  76. approval.IsCustom = false;
  77. autoApprovals.Add(approval);
  78. }
  79. if(BillApprovalSetStore.GetUpdateApprovalsScript(bill.ApprovalSet.ID) is ScriptDocument script)
  80. {
  81. script.Execute(methodname: BillApprovalSet.UpdateBillApprovalsMethodName, parameters: [bill, autoApprovals]);
  82. }
  83. // Now, we have to merge the custom and auto lists, only saving auto approvals if there are no custom ones for that employee.
  84. var toAdd = new List<BillApproval>();
  85. var toRemove = new List<BillApproval>();
  86. var newList = customApprovals.ToList();
  87. foreach(var approval in autoApprovals)
  88. {
  89. newList.Add(approval);
  90. if (!approvals.Any(x => x.Employee.ID == approval.Employee.ID))
  91. {
  92. toAdd.Add(approval);
  93. }
  94. }
  95. foreach(var approval in approvals)
  96. {
  97. if (!newList.Any(x => x.Employee.ID == approval.Employee.ID))
  98. {
  99. toRemove.Add(approval);
  100. }
  101. }
  102. foreach(var approval in toAdd)
  103. {
  104. approval.Bill.ID = bill.ID;
  105. }
  106. Provider.Save(toAdd);
  107. Provider.Delete(toRemove, UserID);
  108. }
  109. catch(Exception e)
  110. {
  111. CoreUtils.LogException(UserID, e, "Error running bill approval script");
  112. }
  113. }
  114. protected override void AfterSave(Bill entity)
  115. {
  116. base.AfterSave(entity);
  117. UpdateBillApprovals(entity);
  118. }
  119. protected override void BeforeDelete(Bill entity)
  120. {
  121. base.BeforeDelete(entity);
  122. entity.SupplierLink.ID = Guid.Empty;
  123. //UpdateAggregate<Supplier>(entity, entity.SupplierLink, Sum<Supplier>(b => b.Balance, s => s.Balance));
  124. }
  125. }