Esempio n. 1
0
        public void DeviceReadyForReturn(RepositoryMonitorEvent e)
        {
            var job           = (Job)e.Entity;
            var emailConfig   = new ConfigurationStore(e.Database).DeserializeConfiguration();
            var messageConfig = emailConfig.MessageConfig.First(z => z.EmailMessageType == MessageType.DeviceReadyForCollection);
            var user          = UserService.GetUser(job.UserId);

            if (!job.DeviceReadyForReturn.HasValue || !messageConfig.EmailAlertEnabled || user.EmailAddress == null)
            {
                return;
            }

            //Send Collection Email
            try
            {
                Internal.Email.SendEmailMessage(user, messageConfig, job);
                //Insert note into job log if email has been sent successfully
                e.Database.JobLogs.Add(new JobLog
                {
                    Job       = job,
                    Comments  = $"# Collection Email Sent.\r\n Collection email sent to {user.DisplayName}",
                    TechUser  = e.Database.Users.Find(UserService.CurrentUserId),
                    Timestamp = DateTime.Now
                });
                e.Database.SaveChanges();
            }
            catch (Exception message)
            {
                throw new Exception(message.ToString());
            }
        }
Esempio n. 2
0
        private static void RepositoryEventBefore(RepositoryMonitorEvent e)
        {
            if (e.EventType == RepositoryMonitorEventType.Deleted)
            {
                if (e.EntityType == typeof(JobLog))
                {
                    var repositoryLog = (JobLog)e.Entity;
                    int logJobId;

                    using (DiscoDataContext Database = new DiscoDataContext())
                        logJobId = Database.JobLogs.Where(l => l.Id == repositoryLog.Id).Select(a => a.JobId).First();

                    HubContext.Clients.Group(LogsGroupName(logJobId)).removeLog(repositoryLog.Id);
                }
                if (e.EntityType == typeof(JobAttachment))
                {
                    var repositoryAttachment = (JobAttachment)e.Entity;
                    int attachmentJobId;

                    using (DiscoDataContext Database = new DiscoDataContext())
                        attachmentJobId = Database.JobAttachments.Where(a => a.Id == repositoryAttachment.Id).Select(a => a.JobId).First();

                    HubContext.Clients.Group(AttachmentsGroupName(attachmentJobId)).removeAttachment(repositoryAttachment.Id);
                }
            }
        }
Esempio n. 3
0
        private static void RepositoryAfterEvent(RepositoryMonitorEvent e)
        {
            if (e.EventType == RepositoryMonitorEventType.Added)
            {
                if (e.EntityType == typeof(UserAttachment))
                {
                    var a = (UserAttachment)e.Entity;

                    HubContext.Clients.Group(GroupName(a.UserId)).addAttachment(a.Id);
                }
            }
        }
Esempio n. 4
0
        internal static void UpdateAfterEventFromEntryState(RepositoryMonitorEvent monitorEvent)
        {
            monitorEvent.afterCommit = true;

            if (monitorEvent.EventType == RepositoryMonitorEventType.Added)
            {
                // Update Entity Key for Added Events
                monitorEvent.EntityKey = DetermineEntityKey(monitorEvent.objectEntryState);
            }

            // Execute Deferred Actions
            if (monitorEvent.executeAfterCommit != null)
                foreach (var deferredAction in monitorEvent.executeAfterCommit)
                    deferredAction.Invoke(monitorEvent);
        }
Esempio n. 5
0
        private static void RepositoryEventBefore(RepositoryMonitorEvent e)
        {
            if (e.EventType == RepositoryMonitorEventType.Deleted)
            {
                if (e.EntityType == typeof(UserAttachment))
                {
                    var repositoryAttachment = (UserAttachment)e.Entity;
                    string attachmentUserId;

                    using (DiscoDataContext Database = new DiscoDataContext())
                        attachmentUserId = Database.UserAttachments.Where(a => a.Id == repositoryAttachment.Id).Select(a => a.UserId).First();

                    HubContext.Clients.Group(GroupName(attachmentUserId)).removeAttachment(repositoryAttachment.Id);
                }
            }
        }
        private void ProcessRepositoryEvent(RepositoryMonitorEvent Event)
        {
            var userFlagAssignment = (UserFlagAssignment)Event.Entity;

            switch (Event.EventType)
            {
                case RepositoryMonitorEventType.Added:
                    if (Configuration.FilterBeginDate.HasValue)
                    {
                        if (!userFlagAssignment.RemovedDate.HasValue && userFlagAssignment.AddedDate >= Configuration.FilterBeginDate)
                        {
                            AddMember(userFlagAssignment.UserId);
                        }
                    }
                    else
                    {
                        if (!userFlagAssignment.RemovedDate.HasValue)
                        {
                            AddMember(userFlagAssignment.UserId);
                        }
                    }
                    break;
                case RepositoryMonitorEventType.Modified:
                    if (Configuration.FilterBeginDate.HasValue)
                    {
                        if (userFlagAssignment.AddedDate >= Configuration.FilterBeginDate)
                        {
                            if (userFlagAssignment.RemovedDate.HasValue)
                            {
                                RemoveMember(userFlagAssignment.UserId);
                            }
                            else
                            {
                                AddMember(userFlagAssignment.UserId);
                            }
                        }
                    }
                    else
                    {
                        if (userFlagAssignment.RemovedDate.HasValue)
                        {
                            RemoveMember(userFlagAssignment.UserId);
                        }
                        else
                        {
                            AddMember(userFlagAssignment.UserId);
                        }
                    }
                    break;
                case RepositoryMonitorEventType.Deleted:
                    string userId = userFlagAssignment.UserId;
                    // Remove the user if no other (non-removed) assignments exist.
                    RemoveMember(userId, (database) =>
                    {
                        if (Configuration.FilterBeginDate.HasValue)
                        {
                            if (database.UserFlagAssignments.Any(a => a.UserFlagId == UserFlagId && a.UserId == userId && !a.RemovedDate.HasValue && a.AddedDate >= Configuration.FilterBeginDate))
                            {
                                return null;
                            }
                            else
                            {
                                return new string[] { userId };
                            }
                        }
                        else
                        {
                            if (database.UserFlagAssignments.Any(a => a.UserFlagId == UserFlagId && a.UserId == userId && !a.RemovedDate.HasValue))
                            {
                                return null;
                            }
                            else
                            {
                                return new string[] { userId };
                            }
                        }
                    });
                    break;
            }
        }
        private void ProcessRepositoryEvent(RepositoryMonitorEvent Event)
        {
            var device = (Device)Event.Entity;
            string previousUserId = Event.GetPreviousPropertyValue<string>("AssignedUserId");

            Event.ExecuteAfterCommit(e =>
            {
                switch (e.EventType)
                {
                    case RepositoryMonitorEventType.Added:
                        AddMember(device.AssignedUserId);
                        break;
                    case RepositoryMonitorEventType.Modified:
                        if (device.DeviceProfileId == this.DeviceProfileId)
                        {
                            if (device.AssignedUserId != null)
                                AddMember(device.AssignedUserId);

                            if (e.ModifiedProperties.Contains("AssignedUserId"))
                            {
                                if (previousUserId != null)
                                    RemoveMember(previousUserId, (database) =>
                                        !database.Devices.Any(d => d.DeviceProfileId == this.DeviceProfileId && d.AssignedUserId == previousUserId)
                                            ? new string[] { previousUserId }
                                            : null);
                            }
                        }
                        else
                        {
                            if (previousUserId != null)
                                RemoveMember(previousUserId, (database) =>
                                    !database.Devices.Any(d => d.DeviceProfileId == this.DeviceProfileId && d.AssignedUserId == previousUserId)
                                        ? new string[] { previousUserId }
                                        : null);
                        }
                        break;
                    case RepositoryMonitorEventType.Deleted:
                        if (previousUserId != null)
                            RemoveMember(previousUserId, (database) =>
                                !database.Devices.Any(d => d.DeviceProfileId == this.DeviceProfileId && d.AssignedUserId == previousUserId)
                                    ? new string[] { previousUserId }
                                    : null);
                        break;
                }
            });
        }
Esempio n. 8
0
        private void JobNotification(RepositoryMonitorEvent e)
        {
            List<int> jobIds = null;
            JobTableItemModel[] existingItems = null;

            if (e.EntityType == typeof(Job))
                jobIds = new List<int>() { ((Job)e.Entity).Id };
            else if (e.EntityType == typeof(JobLog))
            {
                if (e.EventType == RepositoryMonitorEventType.Added)
                {
                    var jobLog = ((JobLog)e.Entity);
                    var job = base.Items.FirstOrDefault(i => i.JobId == jobLog.JobId);
                    if (job != null && job.LastActivityDate < jobLog.Timestamp)
                        job.LastActivityDate = jobLog.Timestamp;
                    return;
                }
                else
                    jobIds = new List<int>() { ((JobLog)e.Entity).JobId };
            }
            else if (e.EntityType == typeof(JobAttachment))
            {
                if (e.EventType == RepositoryMonitorEventType.Added)
                {
                    var jobAttachment = ((JobAttachment)e.Entity);
                    var job = base.Items.FirstOrDefault(i => i.JobId == jobAttachment.JobId);
                    if (job != null && job.LastActivityDate < jobAttachment.Timestamp)
                        job.LastActivityDate = jobAttachment.Timestamp;
                    return;
                }
                else
                    jobIds = new List<int>() { ((JobAttachment)e.Entity).JobId };
            }
            else if (e.EntityType == typeof(JobQueueJob))
                jobIds = new List<int>() { ((JobQueueJob)e.Entity).JobId };
            else if (e.EntityType == typeof(JobMetaWarranty))
                jobIds = new List<int>() { ((JobMetaWarranty)e.Entity).JobId };
            else if (e.EntityType == typeof(JobMetaNonWarranty))
                jobIds = new List<int>() { ((JobMetaNonWarranty)e.Entity).JobId };
            else if (e.EntityType == typeof(JobMetaInsurance))
                jobIds = new List<int>() { ((JobMetaInsurance)e.Entity).JobId };
            else if (e.EntityType == typeof(DeviceProfile))
            {
                int deviceProfileId = ((DeviceProfile)e.Entity).Id;
                existingItems = base.Items.Where(i => i.DeviceProfileId == deviceProfileId).ToArray();
            }
            else if (e.EntityType == typeof(DeviceModel))
            {
                int deviceModelId = ((DeviceModel)e.Entity).Id;
                existingItems = base.Items.Where(i => i.DeviceModelId == deviceModelId).ToArray();
            }
            else if (e.EntityType == typeof(Device))
            {
                string deviceSerialNumber = ((Device)e.Entity).SerialNumber;
                existingItems = base.Items.Where(i => i.DeviceSerialNumber == deviceSerialNumber).ToArray();
            }
            else
                return;  // Subscription should never reach

            if (jobIds == null)
            {
                if (existingItems == null)
                    throw new InvalidOperationException("Notification algorithm didn't indicate any Jobs for update");
                else
                    jobIds = existingItems.Select(i => i.JobId).ToList();
            }

            if (jobIds.Count == 0)
                return;
            else
                UpdateJobs(e.Database, jobIds, existingItems);
        }
        private void ProcessDeviceAssignmentRepositoryEvent(RepositoryMonitorEvent Event)
        {
            var device = (Device)Event.Entity;
            var deviceSerialNumber = device.SerialNumber;
            var deviceAccountId = device.DeviceDomainId;

            if (ActiveDirectory.IsValidDomainAccountId(deviceAccountId))
            {
                var deviceCurrentAssignedUserId = device.AssignedUserId;
                var devicePreviousAssignedUserId = Event.GetPreviousPropertyValue<string>("AssignedUserId");

                Event.ExecuteAfterCommit(e =>
                {
                    bool previousUserHasTemplate = false;
                    bool currentUserHasTemplate = false;

                    if (devicePreviousAssignedUserId != null)
                    {
                        if (Configuration.FilterBeginDate.HasValue)
                        {
                            previousUserHasTemplate = e.Database.Users
                                .Where(u => u.UserId == devicePreviousAssignedUserId && u.UserAttachments.Any(ua => ua.DocumentTemplateId == this.DocumentTemplateId && ua.Timestamp >= Configuration.FilterBeginDate))
                                .Any();
                        }
                        else
                        {
                            previousUserHasTemplate = e.Database.Users
                                .Where(u => u.UserId == devicePreviousAssignedUserId && u.UserAttachments.Any(ua => ua.DocumentTemplateId == this.DocumentTemplateId))
                                .Any();
                        }
                    }

                    if (deviceCurrentAssignedUserId != null)
                    {
                        if (Configuration.FilterBeginDate.HasValue)
                        {
                            currentUserHasTemplate = e.Database.Users
                                .Where(u => u.UserId == deviceCurrentAssignedUserId && u.UserAttachments.Any(ua => ua.DocumentTemplateId == this.DocumentTemplateId && ua.Timestamp >= Configuration.FilterBeginDate))
                                .Any();
                        }
                        else
                        {
                            currentUserHasTemplate = e.Database.Users
                                .Where(u => u.UserId == deviceCurrentAssignedUserId && u.UserAttachments.Any(ua => ua.DocumentTemplateId == this.DocumentTemplateId))
                                .Any();
                        }
                    }

                    if (!previousUserHasTemplate && currentUserHasTemplate)
                        AddMember(deviceSerialNumber, (database) => new string[] { deviceAccountId + "$" });
                    else if (previousUserHasTemplate && !currentUserHasTemplate)
                        RemoveMember(deviceSerialNumber, (database) => new string[] { deviceAccountId + "$" });
                });
            }
        }
        private void ProcessDeviceRenameRepositoryEvent(RepositoryMonitorEvent Event)
        {
            var device = (Device)Event.Entity;
            var deviceSerialNumber = device.SerialNumber;
            var deviceAccountId = device.DeviceDomainId;
            var deviceAccountIdValid = ActiveDirectory.IsValidDomainAccountId(deviceAccountId);
            var devicePreviousAccountId = Event.GetPreviousPropertyValue<string>("DeviceDomainId");
            var devicePreviousAccountIdValid = ActiveDirectory.IsValidDomainAccountId(devicePreviousAccountId);

            if (deviceAccountIdValid || devicePreviousAccountIdValid)
            {
                Event.ExecuteAfterCommit(e =>
                {
                    switch (DocumentTemplateScope)
                    {
                        case DocumentTemplate.DocumentTemplateScopes.Device:
                            if (DeviceContainsAttachment(e.Database, device.SerialNumber, out deviceAccountId))
                            {
                                if (deviceAccountIdValid)
                                    AddMember(device.SerialNumber, (database) => new string[] { deviceAccountId });
                                if (devicePreviousAccountIdValid)
                                    RemoveMember(device.SerialNumber, (database) => new string[] { devicePreviousAccountId + "$" });
                            }
                            break;
                        case DocumentTemplate.DocumentTemplateScopes.Job:
                            bool jobsHaveTemplate;
                            if (Configuration.FilterBeginDate.HasValue)
                            {
                                jobsHaveTemplate = e.Database.Jobs
                                    .Where(j => j.DeviceSerialNumber == deviceSerialNumber)
                                    .Any(j => j.JobAttachments.Any(a => a.DocumentTemplateId == this.DocumentTemplateId && a.Timestamp >= Configuration.FilterBeginDate));
                            }
                            else
                            {
                                jobsHaveTemplate = e.Database.Jobs
                                    .Where(j => j.DeviceSerialNumber == deviceSerialNumber)
                                    .Any(j => j.JobAttachments.Any(a => a.DocumentTemplateId == this.DocumentTemplateId));
                            }

                            if (jobsHaveTemplate)
                            {
                                if (deviceAccountIdValid)
                                    AddMember(device.SerialNumber, (database) => new string[] { deviceAccountId + "$" });
                                if (devicePreviousAccountIdValid)
                                    RemoveMember(device.SerialNumber, (database) => new string[] { devicePreviousAccountId + "$" });
                            }
                            break;
                        case DocumentTemplate.DocumentTemplateScopes.User:
                            bool userHasTemplate;
                            if (Configuration.FilterBeginDate.HasValue)
                            {
                                userHasTemplate = e.Database.Devices
                                    .Where(d => d.SerialNumber == deviceSerialNumber)
                                    .Select(d => d.AssignedUser)
                                    .Any(u => u.UserAttachments.Any(a => a.DocumentTemplateId == this.DocumentTemplateId && a.Timestamp >= Configuration.FilterBeginDate));
                            }
                            else
                            {
                                userHasTemplate = e.Database.Devices
                                    .Where(d => d.SerialNumber == deviceSerialNumber)
                                    .Select(d => d.AssignedUser)
                                    .Any(u => u.UserAttachments.Any(a => a.DocumentTemplateId == this.DocumentTemplateId));
                            }

                            if (userHasTemplate)
                            {
                                if (deviceAccountIdValid)
                                    AddMember(device.SerialNumber, (database) => new string[] { deviceAccountId + "$" });
                                if (devicePreviousAccountIdValid)
                                    RemoveMember(device.SerialNumber, (database) => new string[] { devicePreviousAccountId + "$" });
                            }
                            break;
                    }
                });
            }
        }
        private void ProcessUserAttachmentAddEvent(RepositoryMonitorEvent e)
        {
            var attachment = (UserAttachment)e.Entity;

            List<Tuple<string, string>> devices;
            if (DeviceUserContainAttachment(e.Database, attachment.UserId, out devices) && devices != null)
                devices.ForEach(d => AddMember(d.Item2, (database) => new string[] { d.Item1 }));
        }
Esempio n. 12
0
        private static void RepositoryEvent(RepositoryMonitorEvent i)
        {
            List<string> deviceSerialNumbers = new List<string>();
            List<string> userIds = new List<string>();

            if (i.EntityType == typeof(Job))
            {
                if (i.EventType == RepositoryMonitorEventType.Modified &&
                    i.ModifiedProperties.Contains("DeviceSerialNumber"))
                {
                    var p = i.GetPreviousPropertyValue<string>("DeviceSerialNumber");
                    if (p != null)
                        deviceSerialNumbers.Add(p);
                }

                var j = (Job)i.Entity;
                if (j.DeviceSerialNumber != null)
                    deviceSerialNumbers.Add(j.DeviceSerialNumber);
            }
            else if (i.EntityType == typeof(JobMetaNonWarranty))
            {
                var jmnw = (JobMetaNonWarranty)i.Entity;

                if (jmnw.Job != null)
                {
                    if (jmnw.Job.DeviceSerialNumber != null)
                        deviceSerialNumbers.Add(jmnw.Job.DeviceSerialNumber);
                }
                else
                {
                    var sn = i.Database.Jobs.Where(j => j.Id == jmnw.JobId).Select(j => j.DeviceSerialNumber).FirstOrDefault();
                    if (sn != null)
                        deviceSerialNumbers.Add(sn);
                }
            }
            else if (i.EntityType == typeof(Device))
            {
                var d = (Device)i.Entity;
                deviceSerialNumbers.Add(d.SerialNumber);

                if (i.EventType == RepositoryMonitorEventType.Modified &&
                    i.ModifiedProperties.Contains("AssignedUserId"))
                {
                    var p = i.GetPreviousPropertyValue<string>("AssignedUserId");
                    if (p != null)
                        userIds.Add(p);
                }
            }
            else if (i.EntityType == typeof(DeviceProfile))
            {
                var dp = (DeviceProfile)i.Entity;

                deviceSerialNumbers.AddRange(
                    i.Database.Jobs
                        .Where(j => !j.ClosedDate.HasValue && j.Device.DeviceProfileId == dp.Id)
                        .Select(j => j.DeviceSerialNumber)
                    );
            }
            else if (i.EntityType == typeof(User))
            {
                var u = (User)i.Entity;

                deviceSerialNumbers.AddRange(
                    i.Database.Jobs
                        .Where(j => !j.ClosedDate.HasValue && j.Device.AssignedUserId == u.UserId)
                        .Select(j => j.DeviceSerialNumber)
                    );
            }

            if (deviceSerialNumbers.Count > 0 || userIds.Count > 0)
            {
                i.ExecuteAfterCommit(e =>
                {
                    BufferedUpdateStream.OnNext(Tuple.Create(deviceSerialNumbers, userIds));
                });
            }
        }
        private void ProcessDeviceAttachmentAddEvent(RepositoryMonitorEvent e)
        {
            var attachment = (DeviceAttachment)e.Entity;

            string deviceAccountId;
            if (DeviceContainsAttachment(e.Database, attachment.DeviceSerialNumber, out deviceAccountId))
                AddMember(attachment.DeviceSerialNumber, (database) => new string[] { deviceAccountId });
        }
Esempio n. 14
0
        private static void RepositoryAfterEvent(RepositoryMonitorEvent e)
        {
            if (e.EventType == RepositoryMonitorEventType.Added)
            {
                if (e.EntityType == typeof(JobLog))
                {
                    var a = (JobLog)e.Entity;

                    HubContext.Clients.Group(LogsGroupName(a.JobId)).addLog(a.Id);
                }
                if (e.EntityType == typeof(JobAttachment))
                {
                    var a = (JobAttachment)e.Entity;

                    HubContext.Clients.Group(AttachmentsGroupName(a.JobId)).addAttachment(a.Id);
                }
            }
        }
        private void ProcessDeviceAssignmentRepositoryEvent(RepositoryMonitorEvent Event)
        {
            var device = (Device)Event.Entity;
            var deviceSerialNumber = device.SerialNumber;
            bool relevantDevice;

            if (Configuration.FilterBeginDate.HasValue)
            {
                relevantDevice = Event.Database.Devices
                    .Where(d => d.SerialNumber == deviceSerialNumber && d.DeviceAttachments.Any(ja => ja.DocumentTemplateId == this.DocumentTemplateId && ja.Timestamp >= Configuration.FilterBeginDate))
                    .Any();
            }
            else
            {
                relevantDevice = Event.Database.Devices
                    .Where(d => d.SerialNumber == deviceSerialNumber && d.DeviceAttachments.Any(ja => ja.DocumentTemplateId == this.DocumentTemplateId))
                    .Any();
            }

            if (relevantDevice)
            {
                var deviceCurrentAssignedUserId = device.AssignedUserId;
                var devicePreviousAssignedUserId = Event.GetPreviousPropertyValue<string>("AssignedUserId");

                Event.ExecuteAfterCommit(e =>
                {
                    if (devicePreviousAssignedUserId != null)
                        RemoveMember(devicePreviousAssignedUserId, (database) => new string[] { devicePreviousAssignedUserId });

                    if (deviceCurrentAssignedUserId != null)
                        AddMember(deviceCurrentAssignedUserId, (database) => new string[] { deviceCurrentAssignedUserId });
                });
            }
        }
        private void ProcessUserAttachmentAddEvent(RepositoryMonitorEvent e)
        {
            var attachment = (UserAttachment)e.Entity;
            var userId = attachment.UserId;

            if (UserContainAttachment(e.Database, userId) && userId != null)
                AddMember(userId, (database) => new string[] { userId });
        }
        private void ProcessJobAttachmentAddEvent(RepositoryMonitorEvent e)
        {
            var attachment = (JobAttachment)e.Entity;

            string userId;
            if (JobsContainAttachment(e.Database, attachment.JobId, out userId) && userId != null)
                AddMember(userId, (database) => new string[] { userId });
        }
        private void ProcessDeviceAttachmentAddEvent(RepositoryMonitorEvent e)
        {
            var attachment = (DeviceAttachment)e.Entity;

            string userId;
            if (DeviceContainsAttachment(e.Database, attachment.DeviceSerialNumber, out userId) && userId != null)
                AddMember(userId, (database) => new string[] { userId });
        }
        private void ProcessJobAttachmentAddEvent(RepositoryMonitorEvent e)
        {
            var attachment = (JobAttachment)e.Entity;

            string deviceAccountId;
            string deviceSerialNumber;
            if (JobsContainAttachment(e.Database, attachment.JobId, out deviceAccountId, out deviceSerialNumber))
                AddMember(deviceSerialNumber, (database) => new string[] { deviceAccountId });
        }
Esempio n. 20
0
        private static void RepositoryEvent_JobChange(RepositoryMonitorEvent e)
        {

            if (e.EventType == RepositoryMonitorEventType.Added)
            {
                // New Job
                var todaysStats = _data.Last();
                todaysStats.OpenedJobs += 1;
                todaysStats.TotalJobs += 1;
            }
            else
            {
                DateTime? previousValue = e.GetPreviousPropertyValue<DateTime?>("ClosedDate");

                if (previousValue.HasValue)
                {
                    // Remove Statistics
                    var statItem = _data.FirstOrDefault(i => i.Timestamp == previousValue.Value.Date);
                    if (statItem != null)
                    {
                        statItem.ClosedJobs -= 1;
                        statItem.TotalJobs += 1;
                    }
                    foreach (var affectedStat in _data.Where(i => i.Timestamp > previousValue))
                    {
                        affectedStat.TotalJobs += 1;
                    }
                }
            }

            DateTime? currentValue = e.GetCurrentPropertyValue<DateTime?>("ClosedDate");

            if (currentValue.HasValue)
            {
                // Add Statistics
                // Remove Statistics
                var statItem = _data.FirstOrDefault(i => i.Timestamp == currentValue.Value.Date);
                if (statItem != null)
                {
                    statItem.ClosedJobs += 1;
                    statItem.TotalJobs -= 1;
                }
                foreach (var affectedStat in _data.Where(i => i.Timestamp > currentValue))
                {
                    affectedStat.TotalJobs -= 1;
                }
            }
        }
        private void ProcessRepositoryEvent(RepositoryMonitorEvent Event)
        {
            var device = (Device)Event.Entity;
            string previousDeviceDomainId = Event.GetPreviousPropertyValue<string>("DeviceDomainId");

            Event.ExecuteAfterCommit(e =>
            {
                switch (e.EventType)
                {
                    case RepositoryMonitorEventType.Added:
                        AddMember(device.DeviceDomainId + "$");
                        break;
                    case RepositoryMonitorEventType.Modified:
                        if (device.DeviceBatchId == this.DeviceBatchId)
                        {
                            if (ActiveDirectory.IsValidDomainAccountId(device.DeviceDomainId))
                                AddMember(device.DeviceDomainId + "$");

                            if (e.ModifiedProperties.Contains("DeviceDomainId"))
                            {
                                if (ActiveDirectory.IsValidDomainAccountId(previousDeviceDomainId))
                                    RemoveMember(previousDeviceDomainId + "$");
                            }
                        }
                        else
                        {
                            if (e.ModifiedProperties.Contains("DeviceDomainId"))
                            {
                                if (ActiveDirectory.IsValidDomainAccountId(previousDeviceDomainId))
                                    RemoveMember(previousDeviceDomainId + "$");
                            }
                            else
                            {
                                if (ActiveDirectory.IsValidDomainAccountId(device.DeviceDomainId))
                                    RemoveMember(device.DeviceDomainId + "$");
                            }
                        }
                        break;
                    case RepositoryMonitorEventType.Deleted:
                        if (ActiveDirectory.IsValidDomainAccountId(previousDeviceDomainId))
                            RemoveMember(previousDeviceDomainId + "$");
                        break;
                }
            });
        }