using System.Collections.Generic; using System.Linq; using Comal.Classes; using InABox.Core; using System; using ExCSS; using InABox.Database.Stores; using InABox.Database; using InABox.Configuration; using Comal.Stores; using PRSStores.AssignmentCosting; namespace PRSStores { internal class AssignmentStore : BaseStore { public override void Init() { base.Init(); GlobalSettingsStore.RegisterSubStore(); } private void CheckActivityForms(Assignment assignment) { if (!assignment.ActivityLink.HasOriginalValue(x => x.ID)) { return; } List assignmentForms; if(assignment.ID != Guid.Empty) { assignmentForms = Provider.Query( Filter.Where(x => x.Parent.ID).IsEqualTo(assignment.ID), Columns.None().Add(x => x.ID, x => x.FormData) ).Rows.Select(x => x.ToObject()).ToList(); } else { assignmentForms = new(); } var toDelete = assignmentForms.Where(x => string.IsNullOrWhiteSpace(x.FormData)); Provider.Delete(toDelete, UserID); var activityForms = Provider.Query( Filter.Where(x => x.Activity.ID).IsEqualTo(assignment.ActivityLink.ID) .And(x => x.Form.AppliesTo).IsEqualTo(nameof(Assignment))); var newForms = new List(); foreach (var row in activityForms.Rows) { var formID = row.Get(x => x.Form.ID); if (!(assignmentForms.Any(x => x.Form.ID == formID) && !toDelete.Any(x => x.Form.ID == formID))) { var assignmentForm = new AssignmentForm(); assignmentForm.Form.ID = formID; assignmentForm.Parent.ID = assignment.ID; newForms.Add(assignmentForm); } } Provider.Save(newForms); } protected override void AfterSave(Assignment entity) { base.AfterSave(entity); CheckActivityForms(entity); CheckAssignmentCosts(entity); } private void CheckAssignmentCosts(Assignment entity) { if(!entity.Actual.IsChanged() && !entity.Booked.IsChanged() && !entity.HasOriginalValue(x => x.EmployeeLink.ID) && !entity.HasOriginalValue(x => x.Date)) { // No change we care about. return; } var changedEmployee = entity.TryGetOriginalValue(x => x.EmployeeLink.ID, out var employeeID); if (!changedEmployee) { employeeID = entity.EmployeeLink.ID; } var changedDate = entity.TryGetOriginalValue(x => x.Date, out var date); if (!changedDate) { date = entity.Date; } if(changedEmployee || changedDate) { AssignmentCostingUtils.CheckAssignmentCosts(this, date, employeeID); } AssignmentCostingUtils.CheckAssignmentCosts(this, entity.Date, entity.EmployeeLink.ID); } } }