Просмотр исходного кода

Enforced 1:1 mapping between GPS Trackers and Equipment Items

frankvandenbos 3 месяцев назад
Родитель
Сommit
5764bce007

+ 1 - 1
prs.classes/Entities/Equipment/EquipmentLink.cs

@@ -5,7 +5,7 @@ namespace Comal.Classes
 {
     public class EquipmentLink : EntityLink<Equipment>, IEquipment
     {
-        [LookupEditor(typeof(Equipment))]
+        [CodePopupEditor(typeof(Equipment), CanAdd=true)]
         public override Guid ID { get; set; }
 
         [CodeEditor(Visible = Visible.Default, Editable = Editable.Hidden)]

+ 28 - 19
prs.stores/EquipmentStore.cs

@@ -19,33 +19,42 @@ namespace Comal.Stores
         {
             if (entity.TrackerLink.HasOriginalValue(x => x.ID))
             {
+               
                 var oldID = entity.TrackerLink.GetOriginalValue(x => x.ID);
                 var newID = entity.TrackerLink.ID;
 
-                var trackers = Provider.Query(
-                    new Filter<GPSTracker>(x => x.ID).IsEqualTo(oldID).Or(x => x.ID).IsEqualTo(newID),
-                    Columns.None<GPSTracker>().Add(x => x.ID, x => x.Equipment.ID)
-                );
-
-                var updates = new List<GPSTracker>();
-                var prev = trackers.Rows.FirstOrDefault(r => r.Get<GPSTracker, Guid>(c => c.ID).Equals(oldID));
-                if (prev != null)
+                // If there are any other equipment items with the same tracker
+                // blank them out - a tracker can only be attached to one equipment item
+                var equips = Provider.Query(
+                    new Filter<Equipment>(x => x.TrackerLink.ID).IsEqualTo(newID).And(x => x.ID)
+                        .IsNotEqualTo(entity.ID),
+                    Columns.None<Equipment>().Add(x => x.ID).Add(x => x.TrackerLink.ID)
+                ).ToList<Equipment>();
+                if (equips.Any())
                 {
-                    var tracker = prev.ToObject<GPSTracker>();
-                    tracker.Equipment.ID = Guid.Empty;
-                    updates.Add(tracker);
+                    foreach (var equip in equips)
+                        equip.TrackerLink.ID = Guid.Empty;
+                    Provider.Save(equips);
                 }
 
-                var curr = trackers.Rows.FirstOrDefault(r => r.Get<GPSTracker, Guid>(c => c.ID).Equals(newID));
+                var trackers = Provider.Query(
+                    new Filter<GPSTracker>(x => x.ID).IsEqualTo(oldID).Or(x => x.ID).IsEqualTo(newID).Or(x=>x.Equipment.ID).IsEqualTo(entity.ID),
+                    Columns.None<GPSTracker>().Add(x => x.ID, x => x.Equipment.ID)
+                ).ToList<GPSTracker>();
+                
+                // If there are any other trackers attached to this equipment item,
+                // clear them out - an equipment item can only have one tracker
+                foreach (var tracker in trackers)
+                    tracker.Equipment.ID = Guid.Empty;
+                
+                // Update the equipment item with the new Tracker ID
+                var curr = trackers.FirstOrDefault(x => x.ID.Equals(newID));
                 if (curr != null)
-                {
-                    var tracker = curr.ToObject<GPSTracker>();
-                    tracker.Equipment.ID = entity.ID;
-                    updates.Add(tracker);
-                }
+                    curr.Equipment.ID = entity.ID;
 
-                if (updates.Any())
-                    Provider.Save(updates);
+                // Save any changes
+                if (trackers.Any(x=>x.IsChanged()))
+                    Provider.Save(trackers);
             }
         }
     }

+ 26 - 18
prs.stores/GPSTrackerStore.cs

@@ -24,30 +24,38 @@ namespace Comal.Stores
                 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<Equipment>(x => x.ID).IsEqualTo(oldID).Or(x => x.ID).IsEqualTo(newID),
-                    Columns.None<Equipment>().Add(x => x.ID, x => x.TrackerLink.ID)
-                );
-
-                var updates = new List<Equipment>();
-                var prev = trackers.Rows.FirstOrDefault(r => r.Get<Equipment, Guid>(c => c.ID).Equals(oldID));
-                if (prev != null)
+                    new Filter<GPSTracker>(x => x.Equipment.ID).IsEqualTo(newID).And(x => x.ID)
+                        .IsNotEqualTo(entity.ID),
+                    Columns.None<GPSTracker>().Add(x => x.ID).Add(x => x.Equipment.ID)
+                ).ToList<GPSTracker>();
+                if (trackers.Any())
                 {
-                    var target = prev.ToObject<Equipment>();
-                    target.TrackerLink.ID = Guid.Empty;
-                    updates.Add(target);
+                    foreach (var tracker in trackers)
+                        tracker.Equipment.ID = Guid.Empty;
+                    Provider.Save(trackers);
                 }
 
-                var curr = trackers.Rows.FirstOrDefault(r => r.Get<Equipment, Guid>(c => c.ID).Equals(newID));
+                var equips = Provider.Query(
+                    new Filter<Equipment>(x => x.ID).IsEqualTo(oldID).Or(x => x.ID).IsEqualTo(newID).Or(x=>x.TrackerLink.ID).IsEqualTo(entity.ID),
+                    Columns.None<Equipment>().Add(x => x.ID, x => x.TrackerLink.ID)
+                ).ToList<Equipment>();
+                
+                // 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)
-                {
-                    var tracker = curr.ToObject<Equipment>();
-                    tracker.TrackerLink.ID = entity.ID;
-                    updates.Add(tracker);
-                }
+                    curr.TrackerLink.ID = entity.ID;
 
-                if (updates.Any())
-                    Provider.Save(updates);
+                // Save any changes
+                if (equips.Any(x=>x.IsChanged()))
+                    Provider.Save(equips);
             }
         }