LeaveRequestStore.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Text;
  4. using System.Threading.Tasks;
  5. using Comal.Classes;
  6. using Comal.Stores;
  7. using InABox.Core;
  8. using InABox.Scripting;
  9. namespace PRSStores
  10. {
  11. internal class LeaveRequestStore : BaseStore<LeaveRequest>
  12. {
  13. protected override void OnSave(LeaveRequest entity, ref string auditnote)
  14. {
  15. base.OnSave(entity, ref auditnote);
  16. if (entity.HasOriginalValue(c => c.Status))
  17. NotifyEmployee(
  18. entity,
  19. x => x.EmployeeLink.ID,
  20. e => e.HasOriginalValue(x => x.Status),
  21. e => $"Leave Request {e.Status}",
  22. e =>
  23. {
  24. var sb = new StringBuilder();
  25. sb.AppendLine(
  26. $"Your Leave Request submitted {e.Created:dd MMM yyy} for {e.From:dd MMM yy} - {e.To:dd MMM yy} has changed from {e.GetOriginalValue(c => c.Status)} to {e.Status}.");
  27. if (!string.IsNullOrWhiteSpace(e.StatusNotes))
  28. sb.AppendLine($"\nNotes:\n{e.StatusNotes?.Trim()}");
  29. return sb.ToString();
  30. }
  31. );
  32. }
  33. protected override void AfterSave(LeaveRequest entity)
  34. {
  35. base.AfterSave(entity);
  36. if (entity.HasOriginalValue(c => c.EmployeeLink.ID) || entity.HasOriginalValue(c=>c.ApprovalSet.ID))
  37. UpdateLeaveRequestApprovals(entity);
  38. }
  39. private void ClearLeaveRequestApprovals(LeaveRequest request)
  40. {
  41. // We need to clear all automatic bill approvals.
  42. var approvals = Provider.Query(
  43. new Filter<LeaveRequestApproval>(x => x.LeaveRequest.ID).IsEqualTo(request.ID)
  44. .And(x => x.IsCustom).IsEqualTo(false),
  45. Columns.Required<LeaveRequestApproval>().Add(x => x.ID))
  46. .ToList<LeaveRequestApproval>();
  47. Provider.Delete(approvals, UserID);
  48. }
  49. private void UpdateLeaveRequestApprovals(LeaveRequest request)
  50. {
  51. if (request.ID == Guid.Empty) return;
  52. if(request.ApprovalSet.ID == Guid.Empty)
  53. {
  54. ClearLeaveRequestApprovals(request);
  55. return;
  56. }
  57. var setEmployees = Provider.Query(
  58. new Filter<LeaveRequestApprovalSetEmployee>(x => x.ApprovalSet.ID).IsEqualTo(request.ApprovalSet.ID),
  59. Columns.None<LeaveRequestApprovalSetEmployee>().Add(x => x.Employee.ID),
  60. new SortOrder<LeaveRequestApprovalSetEmployee>(x => x.Sequence))
  61. .ToArray<LeaveRequestApprovalSetEmployee>();
  62. var approvals = Provider.Query(
  63. new Filter<LeaveRequestApproval>(x => x.LeaveRequest.ID).IsEqualTo(request.ID),
  64. Columns.Required<LeaveRequestApproval>().Add(x => x.Employee.ID).Add(x => x.IsCustom).Add(x => x.Status))
  65. .ToList<LeaveRequestApproval>();
  66. try
  67. {
  68. var customApprovals = new List<LeaveRequestApproval>();
  69. foreach(var approval in approvals)
  70. {
  71. if (approval.IsCustom)
  72. {
  73. customApprovals.Add(approval);
  74. }
  75. else
  76. {
  77. if(approval.Status != LeaveRequestApprovalStatus.NotYetApproved)
  78. {
  79. // These really are custom approvals for our purposes, since they've been modified.
  80. customApprovals.Add(approval);
  81. }
  82. }
  83. }
  84. // Build up the automatic list.
  85. var autoApprovals = new List<LeaveRequestApproval>();
  86. foreach(var employee in setEmployees)
  87. {
  88. var approval = new LeaveRequestApproval();
  89. approval.Employee.CopyFrom(employee.Employee);
  90. approval.IsCustom = false;
  91. autoApprovals.Add(approval);
  92. }
  93. if(LeaveRequestApprovalSetStore.GetUpdateApprovalsScript(request.ApprovalSet.ID) is ScriptDocument script)
  94. {
  95. script.Execute(methodname: LeaveRequestApprovalSet.UpdateApprovalsMethodName, parameters: [request, autoApprovals]);
  96. }
  97. // Now, we have to merge the custom and auto lists, only saving auto approvals if there are no custom ones for that employee.
  98. var toAdd = new List<LeaveRequestApproval>();
  99. var toRemove = new List<LeaveRequestApproval>();
  100. var newList = customApprovals.ToList();
  101. foreach(var approval in autoApprovals)
  102. {
  103. newList.Add(approval);
  104. if (!approvals.Any(x => x.Employee.ID == approval.Employee.ID))
  105. {
  106. toAdd.Add(approval);
  107. }
  108. }
  109. foreach(var approval in approvals)
  110. {
  111. if (!newList.Any(x => x.Employee.ID == approval.Employee.ID))
  112. {
  113. toRemove.Add(approval);
  114. }
  115. }
  116. foreach(var approval in toAdd)
  117. {
  118. approval.LeaveRequest.ID = request.ID;
  119. }
  120. Provider.Save(toAdd);
  121. Provider.Delete(toRemove, UserID);
  122. }
  123. catch(Exception e)
  124. {
  125. CoreUtils.LogException(UserID, e, "Error running leave request approval script");
  126. }
  127. }
  128. }
  129. }