using System.Collections.Generic; using System.Linq; using Comal.Classes; using InABox.Core; using System; namespace Comal.Stores { internal class GPSTrackerStore : BaseStore { protected override void AfterSave(GPSTracker entity) { UpdateLinkedEquipment(entity); UpdateLinkedJob(entity); base.AfterSave(entity); } private void UpdateLinkedEquipment(GPSTracker entity) { if (entity.Equipment.HasOriginalValue(x => x.ID)) { var oldID = entity.Equipment.GetOriginalValue(x => x.ID); var newID = entity.Equipment.ID; // If there are any other trackers linked to this new equipment item // blank them out - a tracker can only be attached to one equipment item var trackers = Provider.Query( new Filter(x => x.Equipment.ID).IsEqualTo(newID).And(x => x.ID) .IsNotEqualTo(entity.ID), Columns.None().Add(x => x.ID).Add(x => x.Equipment.ID) ).ToList(); if (trackers.Any()) { foreach (var tracker in trackers) tracker.Equipment.ID = Guid.Empty; Provider.Save(trackers); } var equips = Provider.Query( new Filter(x => x.ID).IsEqualTo(oldID).Or(x => x.ID).IsEqualTo(newID).Or(x=>x.TrackerLink.ID).IsEqualTo(entity.ID), Columns.None().Add(x => x.ID, x => x.TrackerLink.ID) ).ToList(); // If there are any other trackers attached to this equipment item, // clear them out - an equipment item can only have one tracker foreach (var equip in equips) equip.TrackerLink.ID = Guid.Empty; // Update the equipment item with the new Tracker ID var curr = equips.FirstOrDefault(x => x.ID.Equals(newID)); if (curr != null) curr.TrackerLink.ID = entity.ID; // Save any changes if (equips.Any(x=>x.IsChanged())) Provider.Save(equips); } } private void UpdateLinkedJob(GPSTracker entity) { if (entity.JobTracker.HasOriginalValue(x => x.ID)) { var oldID = entity.JobTracker.GetOriginalValue(x => x.ID); var newID = entity.JobTracker.ID; var trackers = Provider.Query( new Filter(x => x.ID).IsEqualTo(oldID).Or(x => x.ID).IsEqualTo(newID), Columns.None().Add(x => x.ID, x => x.TrackerLink.ID) ); var updates = new List(); var prev = trackers.Rows.FirstOrDefault(r => r.Get(c => c.ID).Equals(oldID)); if (prev != null) { var target = prev.ToObject(); target.TrackerLink.ID = Guid.Empty; updates.Add(target); } var curr = trackers.Rows.FirstOrDefault(r => r.Get(c => c.ID).Equals(newID)); if (curr != null) { var tracker = curr.ToObject(); tracker.TrackerLink.ID = entity.ID; updates.Add(tracker); } if (updates.Any()) Provider.Save(updates); } } } }