| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 | using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Comal.Classes;using Comal.Stores;using InABox.Core;using InABox.Scripting;namespace PRSStores{    internal class LeaveRequestStore : BaseStore<LeaveRequest>    {         protected override void OnSave(LeaveRequest entity, ref string auditnote)        {            base.OnSave(entity, ref auditnote);                        if (entity.HasOriginalValue(c => c.Status))                NotifyEmployee(                    entity,                    x => x.EmployeeLink.ID,                    e => e.HasOriginalValue(x => x.Status),                    e => $"Leave Request {e.Status}",                    e =>                    {                        var sb = new StringBuilder();                        sb.AppendLine(                            $"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}.");                        if (!string.IsNullOrWhiteSpace(e.StatusNotes))                            sb.AppendLine($"\nNotes:\n{e.StatusNotes?.Trim()}");                        return sb.ToString();                    }                );        }        protected override void AfterSave(LeaveRequest entity)        {            base.AfterSave(entity);            if (entity.HasOriginalValue(c => c.EmployeeLink.ID) || entity.HasOriginalValue(c=>c.ApprovalSet.ID))                UpdateLeaveRequestApprovals(entity);        }        private void ClearLeaveRequestApprovals(LeaveRequest request)        {            // We need to clear all automatic bill approvals.            var approvals = Provider.Query(                    new Filter<LeaveRequestApproval>(x => x.LeaveRequest.ID).IsEqualTo(request.ID)                        .And(x => x.IsCustom).IsEqualTo(false),                    Columns.Required<LeaveRequestApproval>().Add(x => x.ID))                .ToList<LeaveRequestApproval>();            Provider.Delete(approvals, UserID);        }                private void UpdateLeaveRequestApprovals(LeaveRequest request)        {            if (request.ID == Guid.Empty) return;            if(request.ApprovalSet.ID == Guid.Empty)            {                ClearLeaveRequestApprovals(request);                return;            }            var setEmployees = Provider.Query(                new Filter<LeaveRequestApprovalSetEmployee>(x => x.ApprovalSet.ID).IsEqualTo(request.ApprovalSet.ID),                Columns.None<LeaveRequestApprovalSetEmployee>().Add(x => x.Employee.ID),                new SortOrder<LeaveRequestApprovalSetEmployee>(x => x.Sequence))                .ToArray<LeaveRequestApprovalSetEmployee>();            var approvals = Provider.Query(                new Filter<LeaveRequestApproval>(x => x.LeaveRequest.ID).IsEqualTo(request.ID),                Columns.Required<LeaveRequestApproval>().Add(x => x.Employee.ID).Add(x => x.IsCustom).Add(x => x.Status))                .ToList<LeaveRequestApproval>();            try            {                var customApprovals = new List<LeaveRequestApproval>();                foreach(var approval in approvals)                {                    if (approval.IsCustom)                    {                        customApprovals.Add(approval);                    }                    else                    {                        if(approval.Status != LeaveRequestApprovalStatus.NotYetApproved)                        {                            // These really are custom approvals for our purposes, since they've been modified.                            customApprovals.Add(approval);                    }                        }                }                // Build up the automatic list.                var autoApprovals = new List<LeaveRequestApproval>();                foreach(var employee in setEmployees)                {                    var approval = new LeaveRequestApproval();                    approval.Employee.CopyFrom(employee.Employee);                    approval.IsCustom = false;                    autoApprovals.Add(approval);                }                if(LeaveRequestApprovalSetStore.GetUpdateApprovalsScript(request.ApprovalSet.ID) is ScriptDocument script)                {                    script.Execute(methodname: LeaveRequestApprovalSet.UpdateApprovalsMethodName, parameters: [request, autoApprovals]);                }                // Now, we have to merge the custom and auto lists, only saving auto approvals if there are no custom ones for that employee.                var toAdd = new List<LeaveRequestApproval>();                var toRemove = new List<LeaveRequestApproval>();                var newList = customApprovals.ToList();                foreach(var approval in autoApprovals)                {                    newList.Add(approval);                    if (!approvals.Any(x => x.Employee.ID == approval.Employee.ID))                    {                        toAdd.Add(approval);                    }                }                foreach(var approval in approvals)                {                    if (!newList.Any(x => x.Employee.ID == approval.Employee.ID))                    {                        toRemove.Add(approval);                    }                }                foreach(var approval in toAdd)                {                    approval.LeaveRequest.ID = request.ID;                }                Provider.Save(toAdd);                Provider.Delete(toRemove, UserID);            }            catch(Exception e)            {                CoreUtils.LogException(UserID, e, "Error running leave request approval script");            }        }    }}
 |