Beispiel #1
0
 /// <summary>
 /// Maps all the non-primary key and tracking properties of a <see cref='Altask.Data.Dto.Occurrence'/> object to a <see cref='Altask.Data.Model.Occurrence'/> object.
 /// </summary>
 public static Altask.Data.Model.Occurrence FromDto(this Altask.Data.Model.Occurrence model, Altask.Data.Dto.Occurrence entity)
 {
     model.TaskId        = entity.TaskId;
     model.ScheduleId    = entity.ScheduleId;
     model.AssetId       = entity.AssetId;
     model.UserId        = entity.UserId;
     model.FormModel     = entity.FormModel;
     model.XmlResults    = entity.XmlResults;
     model.AsEarlyAsDate = entity.AsEarlyAsDate;
     model.Date          = entity.Date;
     model.Dismissed     = entity.Dismissed;
     model.DismissedBy   = entity.DismissedBy;
     model.DismissedOn   = entity.DismissedOn;
     model.Started       = entity.Started;
     model.StartedBy     = entity.StartedBy;
     model.StartedOn     = entity.StartedOn;
     model.StoppedBy     = entity.StoppedBy;
     model.StoppedOn     = entity.StoppedOn;
     model.ResumedBy     = entity.ResumedBy;
     model.ResumedOn     = entity.ResumedOn;
     model.Completed     = entity.Completed;
     model.CompletedBy   = entity.CompletedBy;
     model.CompletedOn   = entity.CompletedOn;
     model.TimeSpent     = entity.TimeSpent;
     return(model);
 }
Beispiel #2
0
        private async Task <EntityResult <TaskInstance> > AddSingleOccurrence(Data.Model.Task task, Data.Model.Schedule scheduleEntity, int?assetId, int?userId, DateTime date)
        {
            date = date.LessSeconds();
            Context.Entry(task).Reference(t => t.Form).Load();

            var newOccurrence = new Altask.Data.Model.Occurrence()
            {
                AsEarlyAsDate = date,
                Date          = date,
                FormModel     = task.Form.PublishedModel,
                TaskId        = task.Id,
                TimeSpent     = 0,
                ScheduleId    = scheduleEntity.Id,
            };

            var assetEntity = await Context.Assets.FindAsync(assetId);

            if (assetEntity != null)
            {
                newOccurrence.AssetId = assetEntity.Id;
            }

            var userEntity = await Context.Users.FindAsync(userId);

            if (userEntity != null)
            {
                newOccurrence.UserId = userEntity.Id;
            }

            if (assetEntity == null && userEntity == null)
            {
                return(EntityResult <TaskInstance> .Failed(ErrorDescriber.DefaultError("An occurrence must have either and asset or user associated to it.")));
            }

            newOccurrence.Logs.Add(new Data.Model.OccurrenceLog()
            {
                Type = "Created"
            });
            Context.Occurrences.Add(newOccurrence);
            BeforeCreate(newOccurrence, newOccurrence.ToDto());
            var result = await Context.SaveChangesAsync();

            if (result.Succeeded)
            {
                await AfterCreateAsync(newOccurrence, true);

                var instance = TaskInstance.FromSchedule(task, newOccurrence.Date, scheduleEntity).MergeOccurrence(newOccurrence);
                SignalRHub.NotifyOccurrenceCreate(null, instance, newOccurrence.ToDto());
                return(EntityResult <TaskInstance> .Succeded(instance));
            }
            else
            {
                return(EntityResult <TaskInstance> .Failed(result.Errors.ToArray()));
            }
        }
Beispiel #3
0
        /// <summary>
        /// Maps a <see cref='Altask.Data.Model.Occurrence'/> object to a <see cref='Altask.Data.Dto.Occurrence'/> object.
        /// </summary>
        /// <param name="includeLogs">Indicates whether to load any logs associated with the object when mapping.</param>
        public static Altask.Data.Dto.Occurrence ToDto(this Altask.Data.Model.Occurrence entity, bool includeLogs = false)
        {
            var dto = new Altask.Data.Dto.Occurrence();

            dto.Id            = entity.Id;
            dto.TaskId        = entity.TaskId;
            dto.ScheduleId    = entity.ScheduleId;
            dto.AssetId       = entity.AssetId;
            dto.UserId        = entity.UserId;
            dto.FormModel     = entity.FormModel;
            dto.XmlResults    = entity.XmlResults;
            dto.AsEarlyAsDate = entity.AsEarlyAsDate;
            dto.Date          = entity.Date;
            dto.Dismissed     = entity.Dismissed;
            dto.DismissedBy   = entity.DismissedBy;
            dto.DismissedOn   = entity.DismissedOn;
            dto.Started       = entity.Started;
            dto.StartedBy     = entity.StartedBy;
            dto.StartedOn     = entity.StartedOn;
            dto.StoppedBy     = entity.StoppedBy;
            dto.StoppedOn     = entity.StoppedOn;
            dto.ResumedBy     = entity.ResumedBy;
            dto.ResumedOn     = entity.ResumedOn;
            dto.Completed     = entity.Completed;
            dto.CompletedBy   = entity.CompletedBy;
            dto.CompletedOn   = entity.CompletedOn;
            dto.TimeSpent     = entity.TimeSpent;
            dto.CreatedBy     = entity.CreatedBy;
            dto.CreatedOn     = entity.CreatedOn;
            dto.UpdatedBy     = entity.UpdatedBy;
            dto.UpdatedOn     = entity.UpdatedOn;

            if (entity.Asset != null)
            {
                dto.Asset = entity.Asset.ToDto();
            }

            if (entity.Schedule != null)
            {
                dto.Schedule = entity.Schedule.ToDto();
            }

            if (entity.Task != null)
            {
                dto.Task = entity.Task.ToDto();
            }

            if (entity.User != null)
            {
                dto.User = entity.User.ToDto();
            }

            dto.Logs = new List <Altask.Data.Dto.OccurrenceLog>();

            if (includeLogs)
            {
                if (entity.Logs != null)
                {
                    foreach (var item in entity.Logs)
                    {
                        dto.Logs.Add(item.ToDto());
                    }
                }
            }

            return(dto);
        }
Beispiel #4
0
        /// <summary>
        /// Adds an <see cref="Altask.Data.Model.Occurrence"/> based on the <see cref="Altask.Data.Model.Schedule"/>.
        /// </summary>
        /// <param name="schedule"></param>
        /// <returns>Returns a <see cref="Altask.Data.EntityResult"/> indicating success or failure.</returns>
        public virtual async Task <ActionResult> AddAndStart(long scheduleId, int?assetId, int?userId, DateTime date, int startedByUserId)
        {
            date = date.LessSeconds();
            ThrowIfDisposed();

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var scheduleEntity = await Context.Schedules.FindAsync(scheduleId);

            if (scheduleEntity == null)
            {
                return(BadRequest(ErrorDescriber.DoesNotExist("Schedule")));
            }

            if (scheduleEntity.EndsOn.HasValue && scheduleEntity.EndsOn.Value < DateTime.Now)
            {
                return(BadRequest(ErrorDescriber.DefaultError("No more occurrences can be created for the associated Schedule.  The Schedule has ended.")));
            }

            if (scheduleEntity.EndsAfter.HasValue)
            {
                var pastOccurrences = await Context.Occurrences.Where(o => o.ScheduleId == scheduleEntity.Id && o.Date != date).ToListAsync();

                if (pastOccurrences.Count == scheduleEntity.EndsAfter.Value)
                {
                    return(BadRequest(ErrorDescriber.DefaultError("Not more occurrences can be created for the associated Schedule.  The maximum number of occurrences have been created.")));
                }
            }

            var taskEntity = await Context.Tasks.FindAsync(scheduleEntity.TaskId);

            await Context.Entry(taskEntity).Reference(t => t.Form).LoadAsync();

            if (taskEntity == null)
            {
                return(BadRequest(ErrorDescriber.DoesNotExistFor("Task", "Schedule")));
            }

            var startedByEntity = await Context.Users.FindAsync(startedByUserId);

            if (startedByEntity == null)
            {
                return(BadRequest(ErrorDescriber.DoesNotExist("User")));
            }

            date = date.Date.Add(scheduleEntity.StartsOn.TimeOfDay).LessSeconds();
            var occurrenceEntity = await Context.Occurrences.FirstOrDefaultAsync(o => o.ScheduleId == scheduleEntity.Id && o.Date == date &&
                                                                                 (assetId.HasValue ? (userId.HasValue ? o.AssetId == assetId && o.UserId == userId : o.AssetId == assetId && o.UserId == null) :
                                                                                  (userId.HasValue ? o.UserId == userId && o.AssetId == null : o.AssetId == null && o.UserId == null)));

            if (occurrenceEntity != null)
            {
                if (!occurrenceEntity.Started.GetValueOrDefault(false))
                {
                    occurrenceEntity.Started   = true;
                    occurrenceEntity.StartedBy = startedByEntity.UserName;
                    occurrenceEntity.StartedOn = DateTime.Now;
                    occurrenceEntity.TimeSpent = 0;
                    occurrenceEntity.Logs.Add(new Data.Model.OccurrenceLog()
                    {
                        Type = "Started"
                    });
                    Context.Entry(occurrenceEntity).State = EntityState.Modified;
                    var result = await Context.SaveChangesAsync();

                    if (result.Succeeded)
                    {
                        await AfterUpdateAsync(occurrenceEntity);

                        var instance = TaskInstance.FromSchedule(taskEntity, occurrenceEntity.Date, scheduleEntity).MergeOccurrence(occurrenceEntity);
                        SignalRHub.NotifyOccurrenceCreate(null, instance, occurrenceEntity.ToDto());
                        return(Ok(new { instance = instance }));
                    }
                    else
                    {
                        return(BadRequest(result));
                    }
                }

                var existing = TaskInstance.FromSchedule(taskEntity, occurrenceEntity.Date, scheduleEntity).MergeOccurrence(occurrenceEntity);
                SignalRHub.NotifyOccurrenceCreate(null, existing, occurrenceEntity.ToDto());
                return(Ok(new { instance = existing }));
            }
            else
            {
                var newOccurrence = new Altask.Data.Model.Occurrence()
                {
                    Date       = date,
                    FormModel  = taskEntity.Form.PublishedModel,
                    Started    = true,
                    StartedBy  = startedByEntity.UserName,
                    StartedOn  = DateTime.Now,
                    TaskId     = taskEntity.Id,
                    TimeSpent  = 0,
                    ScheduleId = scheduleEntity.Id
                };

                var assetEntity = await Context.Assets.FindAsync(assetId);

                if (assetEntity != null)
                {
                    newOccurrence.AssetId = assetEntity.Id;
                }

                var userEntity = await Context.Users.FindAsync(userId);

                if (userEntity != null)
                {
                    newOccurrence.UserId = userEntity.Id;
                }

                if (assetEntity == null && userEntity == null)
                {
                    return(BadRequest(ErrorDescriber.DefaultError("An occurrence must have either and asset or user associated to it.")));
                }

                newOccurrence.Logs.Add(new Data.Model.OccurrenceLog()
                {
                    Type = "Created"
                });
                newOccurrence.Logs.Add(new Data.Model.OccurrenceLog()
                {
                    Type = "Started"
                });
                Context.Occurrences.Add(newOccurrence);
                BeforeCreate(newOccurrence, newOccurrence.ToDto());
                var result = await Context.SaveChangesAsync();

                if (result.Succeeded)
                {
                    await AfterCreateAsync(newOccurrence);

                    var instance = TaskInstance.FromSchedule(taskEntity, newOccurrence.Date, scheduleEntity).MergeOccurrence(newOccurrence);
                    SignalRHub.NotifyOccurrenceCreate(null, instance, newOccurrence.ToDto());
                    return(Ok(new { instance = instance }));
                }
                else
                {
                    return(BadRequest(result));
                }
            }
        }