예제 #1
0
        void CheckSyncGroup(IReadWritableGroupEntity groupEntity)
        {
            List <IReadWritableProcessState>
            processes = _stateManager.GetSubmittedGroupProcesses(groupEntity.Id)
                        .ToList(); //.GetPendingGroupProcess(groupEntity.Id).ToList();
            bool hasAnomaly = false;

            if (!_runningGroups.TryGetValue(groupEntity.Id, out var @group))
            {
                @group = new SubmittedGroup(groupEntity, processes);
                _runningGroups.TryAdd(groupEntity.Id, @group);
                hasAnomaly = true;
            }
            //todo update _runningGroups and check completed/incomplete processes and tasks

            var processRunning = processes.Where(p => p.IsExecuting()).ToList();

            foreach (var running in processRunning)
            {
                var countPendingTasksForProcess = _stateManager.CountPendingTasksForProcess(running.Id);
                if (countPendingTasksForProcess == 0)
                {
                    CheckProcessIdle(running.Id, running.GroupId, true);
                    hasAnomaly = true;
                }
            }

            if (hasAnomaly)
            {
                CheckGroupHealth(@group, false);
            }
        }
        public async Task <ActionResult> DeleteConfirmed(int id)
        {
            SubmittedGroup submittedGroup = await db.SubmittedGroups.FindAsync(id);

            db.SubmittedGroups.Remove(submittedGroup);
            await db.SaveChangesAsync();

            return(RedirectToAction("Index"));
        }
        public async Task <ActionResult> Edit([Bind(Include = "Id,GroupID,Approved,Denied,groupOwner,groupEvent")] SubmittedGroup submittedGroup)
        {
            if (ModelState.IsValid)
            {
                db.Entry(submittedGroup).State = EntityState.Modified;
                await db.SaveChangesAsync();

                return(RedirectToAction("Index"));
            }
            return(View(submittedGroup));
        }
        public async Task <ActionResult> Create([Bind(Include = "Id,GroupID,Approved,Denied,groupOwner,groupEvent")] SubmittedGroup submittedGroup)
        {
            if (ModelState.IsValid)
            {
                db.SubmittedGroups.Add(submittedGroup);
                await db.SaveChangesAsync();

                return(RedirectToAction("Index"));
            }

            return(View(submittedGroup));
        }
        // GET: SubmittedGroups/Edit/5
        public async Task <ActionResult> Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            SubmittedGroup submittedGroup = await db.SubmittedGroups.FindAsync(id);

            if (submittedGroup == null)
            {
                return(HttpNotFound());
            }
            return(View(submittedGroup));
        }
        public async Task <ActionResult> Approve(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            SubmittedGroup submittedGroup = await db.SubmittedGroups.FindAsync(id);

            if (submittedGroup == null)
            {
                return(HttpNotFound());
            }

            //find the group to approve
            int?  groupIdFind = db.Groups.Where(x => x.Id == submittedGroup.GroupID).SingleOrDefault()?.Id;
            Group foundGroup  = await db.Groups.FindAsync(groupIdFind);

            ViewBag.chosenGroup = foundGroup;
            return(View(submittedGroup));
        }
예제 #7
0
 public ProcessGroupRemovedMessage(SubmittedGroup @group, object sender)
 {
     Group  = @group;
     Sender = sender;
 }
예제 #8
0
        public async Task <ActionResult> SubmitGroup([Bind(Include = "Id,groupName,groupSize,groupOwner,member1,member2,member3,member4,submitted,groupDescription,groupEvent,eventId")]  Group subGroup)
        {
            if (ModelState.IsValid)
            {
                //Sending messages to the inbox of users in the relevent fields to say that the group has been submitted
                if (subGroup.groupOwner != null)
                {
                    var message = new Message
                    {
                        User     = subGroup.groupOwner,
                        Message1 = "Hi " + subGroup.groupOwner + ", " + "Your group " + subGroup.groupName + " for event " + subGroup.groupEvent + " has been submitted for approval",
                        Seen     = false,
                        Subject  = "Group submitted",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                }
                if (subGroup.member1 != null)
                {
                    var message = new Message
                    {
                        User     = subGroup.member1,
                        Message1 = "Hi " + subGroup.groupOwner + ", " + "Your group " + subGroup.groupName + " for event " + subGroup.groupEvent + " has been submitted for approval",
                        Seen     = false,
                        Subject  = "Group submitted",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                }
                if (subGroup.member2 != null)
                {
                    var message = new Message
                    {
                        User     = subGroup.member2,
                        Message1 = "Hi " + subGroup.groupOwner + ", " + "Your group " + subGroup.groupName + " for event " + subGroup.groupEvent + " has been submitted for approval",
                        Seen     = false,
                        Subject  = "Group submitted",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                }
                if (subGroup.member3 != null)
                {
                    var message = new Message
                    {
                        User     = subGroup.member3,
                        Message1 = "Hi " + subGroup.groupOwner + ", " + "Your group " + subGroup.groupName + " for event " + subGroup.groupEvent + " has been submitted for approval",
                        Seen     = false,
                        Subject  = "Group submitted",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                }
                if (subGroup.member4 != null)
                {
                    var message = new Message
                    {
                        User     = subGroup.member4,
                        Message1 = "Hi " + subGroup.groupOwner + ", " + "Your group " + subGroup.groupName + " for event " + subGroup.groupEvent + " has been submitted for approval",
                        Seen     = false,
                        Subject  = "Group submitted",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                }

                //create submitted group to enter to table
                var submitted = new SubmittedGroup
                {
                    GroupID    = subGroup.Id,
                    groupOwner = subGroup.groupOwner,
                    groupEvent = subGroup.groupEvent,
                    eventId    = subGroup.eventId
                };


                subGroup.submitted       = true;
                db.Entry(subGroup).State = EntityState.Modified;
                db.SubmittedGroups.Add(submitted);
                await db.SaveChangesAsync();

                return(RedirectToAction("Index"));
            }
            return(View(subGroup));
        }
        public async Task <ActionResult> Deny([Bind(Include = "Id,GroupID,Approved,Denied,groupOwner,groupEvent,eventId")] SubmittedGroup groupSubmitted)
        {
            if (ModelState.IsValid)
            {
                //find event and group
                int?eventIdFind = db.Events.Where(x => x.Id == groupSubmitted.eventId).SingleOrDefault()?.Id;

                Event foundEvent = await db.Events.FindAsync(eventIdFind);

                int?groupIdFind = db.Groups.Where(x => x.Id == groupSubmitted.GroupID).SingleOrDefault()?.Id;

                Group foundGroup = await db.Groups.FindAsync(groupIdFind);

                //message users that group has been denied
                if (foundGroup.groupOwner != null)
                {
                    var message = new Message
                    {
                        User     = foundGroup.groupOwner,
                        Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been denied.",
                        Seen     = false,
                        Subject  = "Group denied",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                }
                if (foundGroup.member1 != null)
                {
                    var message = new Message
                    {
                        User     = foundGroup.member1,
                        Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been denied",
                        Seen     = false,
                        Subject  = "Group denied",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                }
                if (foundGroup.member2 != null)
                {
                    var message = new Message
                    {
                        User     = foundGroup.member2,
                        Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been denied.",
                        Seen     = false,
                        Subject  = "Group denied",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                }
                if (foundGroup.member3 != null)
                {
                    var message = new Message
                    {
                        User     = foundGroup.member3,
                        Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been denied",
                        Seen     = false,
                        Subject  = "Group denied",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                }
                if (foundGroup.member4 != null)
                {
                    var message = new Message
                    {
                        User     = foundGroup.member4,
                        Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been denied",
                        Seen     = false,
                        Subject  = "Group denied",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                }

                groupSubmitted.Denied          = true;
                db.Entry(groupSubmitted).State = EntityState.Modified;
                await db.SaveChangesAsync();

                return(RedirectToAction("Index"));
            }
            return(View(groupSubmitted));
        }
        public async Task <ActionResult> Approve([Bind(Include = "Id,GroupID,Approved,Denied,groupOwner,groupEvent,eventId")] SubmittedGroup groupSubmitted)
        {
            if (ModelState.IsValid)
            {
                //find the event the group is attending
                int?eventIdFind = db.Events.Where(x => x.Id == groupSubmitted.eventId).SingleOrDefault()?.Id;

                Event foundEvent = await db.Events.FindAsync(eventIdFind);

                //find the group
                int?groupIdFind = db.Groups.Where(x => x.Id == groupSubmitted.GroupID).SingleOrDefault()?.Id;

                Group foundGroup = await db.Groups.FindAsync(groupIdFind);



                int available = foundEvent.Tickets_available;
                int deduction = 0;

                //count tickets to decuct from event total and message the members of the group that the group has been approved
                if (foundGroup.groupOwner != null)
                {
                    var message = new Message
                    {
                        User     = foundGroup.groupOwner,
                        Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been approved",
                        Seen     = false,
                        Subject  = "Group approved",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                    deduction = deduction + 1;
                }
                if (foundGroup.member1 != null)
                {
                    var message = new Message
                    {
                        User     = foundGroup.member1,
                        Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been approved",
                        Seen     = false,
                        Subject  = "Group approved",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                    deduction = deduction + 1;
                }
                if (foundGroup.member2 != null)
                {
                    var message = new Message
                    {
                        User     = foundGroup.member2,
                        Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been approved",
                        Seen     = false,
                        Subject  = "Group approved",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                    deduction = deduction + 1;
                }
                if (foundGroup.member3 != null)
                {
                    var message = new Message
                    {
                        User     = foundGroup.member3,
                        Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been approved",
                        Seen     = false,
                        Subject  = "Group approved",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                    deduction = deduction + 1;
                }
                if (foundGroup.member4 != null)
                {
                    var message = new Message
                    {
                        User     = foundGroup.member4,
                        Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been approved",
                        Seen     = false,
                        Subject  = "Group approved",
                        From     = "Admin",
                        Time     = DateTime.Now
                    };
                    db.Messages.Add(message);
                    deduction = deduction + 1;
                }

                //deduct tickets and modify group to approved
                foundEvent.Tickets_available   = available - deduction;
                groupSubmitted.Approved        = true;
                db.Entry(groupSubmitted).State = EntityState.Modified;
                db.Entry(foundEvent).State     = EntityState.Modified;
                await db.SaveChangesAsync();

                int remainingCheck = foundEvent.Tickets_available;

                //if the remaining tickets for the event is less than 5
                if (remainingCheck <= 5)
                {
                    //get groups
                    var eventGroups = from g in db.Groups where g.eventId == foundEvent.Id select g.Id;

                    //find groups for the event
                    foreach (var grp in eventGroups)
                    {
                        int?findGroupToCheck = db.Groups.Where(x => x.Id == groupSubmitted.GroupID).SingleOrDefault()?.Id;

                        Group groupFound = await db.Groups.FindAsync(findGroupToCheck);

                        //check if group size is more than the available tickets and purge the group and message members that the group has been denied
                        if (groupFound.groupSize > remainingCheck)
                        {
                            var purgedGroup = new SubmittedGroup
                            {
                                GroupID    = groupFound.Id,
                                Approved   = false,
                                Denied     = true,
                                groupOwner = foundGroup.groupOwner,
                                groupEvent = foundGroup.groupEvent,
                                eventId    = foundGroup.eventId
                            };
                            groupFound.submitted = true;
                            db.SubmittedGroups.Add(purgedGroup);
                            db.Entry(groupFound).State = EntityState.Modified;
                        }
                        if (groupFound.groupOwner != null)
                        {
                            var message = new Message
                            {
                                User     = groupFound.groupOwner,
                                Message1 = "Hi " + groupFound.groupOwner + ", " + "Your group " + groupFound.groupName + " for event " + groupFound.groupEvent + " has been closed due to there not being enough tickets to provide to a group of your selected size.",
                                Seen     = false,
                                Subject  = "Group too large",
                                From     = "Admin",
                                Time     = DateTime.Now
                            };
                            db.Messages.Add(message);
                        }
                        if (groupFound.member1 != null)
                        {
                            var message = new Message
                            {
                                User     = groupFound.member1,
                                Message1 = "Hi " + groupFound.groupOwner + ", " + "Your group " + groupFound.groupName + " for event " + groupFound.groupEvent + " has been closed due to there not being enough tickets to provide to a group of your selected size.",
                                Seen     = false,
                                Subject  = "Group too large",
                                From     = "Admin",
                                Time     = DateTime.Now
                            };
                            db.Messages.Add(message);
                        }
                        if (groupFound.member2 != null)
                        {
                            var message = new Message
                            {
                                User     = groupFound.member2,
                                Message1 = "Hi " + groupFound.groupOwner + ", " + "Your group " + groupFound.groupName + " for event " + groupFound.groupEvent + " has been closed due to there not being enough tickets to provide to a group of your selected size.",
                                Seen     = false,
                                Subject  = "Group too large",
                                From     = "Admin",
                                Time     = DateTime.Now
                            };
                            db.Messages.Add(message);
                        }
                        if (groupFound.member3 != null)
                        {
                            var message = new Message
                            {
                                User     = groupFound.member3,
                                Message1 = "Hi " + groupFound.groupOwner + ", " + "Your group " + groupFound.groupName + " for event " + groupFound.groupEvent + " has been closed due to there not being enough tickets to provide to a group of your selected size.",
                                Seen     = false,
                                Subject  = "Group too large",
                                From     = "Admin",
                                Time     = DateTime.Now
                            };
                            db.Messages.Add(message);
                        }
                        if (groupFound.member4 != null)
                        {
                            var message = new Message
                            {
                                User     = groupFound.member4,
                                Message1 = "Hi " + groupFound.groupOwner + ", " + "Your group " + groupFound.groupName + " for event " + groupFound.groupEvent + " has been closed due to there not being enough tickets to provide to a group of your selected size.",
                                Seen     = false,
                                Subject  = "Group too large",
                                From     = "Admin",
                                Time     = DateTime.Now
                            };
                            db.Messages.Add(message);
                        }
                    }
                }
                await db.SaveChangesAsync();


                return(RedirectToAction("Index"));
            }
            return(View(groupSubmitted));
        }
예제 #11
0
        private void CheckGroupHealth(SubmittedGroup groupDetails, bool refresh = true)
        {
            if (refresh)
            {
                groupDetails.Refresh(_stateManager);
            }

            if (groupDetails.GroupEntity.IsFinished)
            {
                _runningGroups.TryRemove(groupDetails.GroupEntity.Id, out groupDetails);
                _eventAggregator.Broadcast(new ProcessGroupRemovedMessage(groupDetails, this));
            }
            else
            {
                //if (!groupDetails.GroupEntity.IsGenerated)
                //{
                //    HandleNewGroup(groupDetails.GroupEntity.Id);
                //    return;
                //}

                //any process running right now
                var groupProcesses = groupDetails.ProcessEntities;// _stateManager.GetConfiguredGroupProcessKeys(groupDetails.GroupEntity.Id).ToList();

                if (groupProcesses.Any(p => p.IsExecuting()))
                {
                    Logger.Trace($"Group id {groupDetails.GroupEntity.Id} is running");

                    return;
                }

                if (groupProcesses.Any(p => p.IsStopped))
                {
                    Logger.Trace($"Group id {groupDetails.GroupEntity.Id} is stopped");
                    groupDetails.GroupEntity.MarkGroupStatus(CompletionStatus.Stopped, ResultStatus.Error, "Execution stopped. Process stopped", _stateManager);
                    _eventAggregator.Broadcast(new ProcessGroupRemovedMessage(groupDetails, this));
                    return;
                }

                //have any process not yet started
                //var processNotGeneratedYet = groupProcesses.Where(p => p.IsVolumeGenerated == false).ToList();
                //if (processNotGeneratedYet.Count != 0)
                //{
                //    SubmitVolumeRequest(processNotGeneratedYet, groupDetails.GroupEntity);
                //}

                var processesNotStartedYet = groupProcesses.Where(p => (p.IsVolumeGenerated == false || p.StartTime.HasValue == false) && p.Status.Id == CompletionStatus.Pending.Id && p.IsStopped == false).ToList();// && processNotGeneratedYet.Exists(g=>g.Id==p.Id)==false).ToList();
                if (processesNotStartedYet.Count == 0)
                {
                    //group processes completed i.e. no process executing and no to start

                    ResultStatus     status;
                    CompletionStatus completionStatus = CompletionStatus.Finished;
                    if (groupProcesses.Any(p => p.IsStopped))
                    {
                        status           = ResultStatus.Empty;
                        completionStatus = CompletionStatus.Stopped;
                    }
                    else
                    {
                        status = groupProcesses.Any(p => ResultStatus.Error.Id == p.Status.Id)
                            ? ResultStatus.Error
                            : ResultStatus.Success;
                    }
                    groupDetails.GroupEntity.MarkGroupStatus(completionStatus, status, "Execution end", _stateManager);
                    //todo cleanup group
                    _eventAggregator.Broadcast(new ProcessGroupRemovedMessage(groupDetails, this));
                }
                else
                {
                    var process2Start = new List <IReadWritableProcessState>();
                    var rootProcess   = groupProcesses.Where(p => p.ParentId == null).ToList();
                    TraverseInComplete(rootProcess, process2Start, groupProcesses);
                    if (process2Start.Any())
                    {
                        SubmitVolumeRequest(process2Start, groupDetails.GroupEntity);
                    }
                    else
                    {
                        groupDetails.GroupEntity.MarkGroupStatus(CompletionStatus.Stopped, ResultStatus.Invalid, "Execution faulted. No process found", _stateManager);
                        _eventAggregator.Broadcast(new ProcessGroupRemovedMessage(groupDetails, this));
                    }
                }
            }
        }