Example #1
0
        public async Task <IActionResult> GroupScheduleTask(GroupTaskSchedule groupTaskSchedule)
        {
            var dict = GetCookies();

            groupTaskSchedule.Id           = Guid.NewGuid().ToString();
            groupTaskSchedule.GroupTaskRun = 1;
            //get users
            var userList = await GetUsers(dict);

            //get tasks
            var taskList = await GetTasks(dict);

            //create the grouptaskschedule
            var jData = JsonConvert.SerializeObject(groupTaskSchedule);
            await _data.UpdateAndClearCache(dict, Enums.DataType.GroupSchedule, Enums.UpdateType.Add, jData);

            //create the usergroupschedule
            var kData = JsonConvert.SerializeObject(new { Id = groupTaskSchedule.Id, u = dict["uid"] });
            //use dataaccess instead of controller
            await DataAccess.ApiGoogle("PUT", kData, "/UserGroupSchedule/" + groupTaskSchedule.Id, dict, true);

            //magic
            //would need to figure out how to randomly schedule a task
            //something like OnScheduledTask but NextRandomTask
            await _ms.OnScheduledEvent(groupTaskSchedule.Id);

            await _data.UpdateAndClearCache(dict, Enums.DataType.UserTasks, Enums.UpdateType.Clear);

            return(RedirectToAction("ViewGroupScheduleTasks"));
        }
Example #2
0
        public List <Usertask> CreateGroupUserTaskLists(GroupTaskSchedule groupTaskSchedule, List <Usertask> userTasks = null)
        {
            var groupUserTasks = new List <Usertask>();

            var taskDict = new Dictionary <string, string>();

            var userList = new List <string>(groupTaskSchedule.Users);
            var taskList = new List <string>(groupTaskSchedule.Tasks);

            var longList  = new List <string>();
            var shortList = new List <string>();

            //this section is to figure out how many times the loop below has to run
            //and which list is the longest
            decimal d       = (decimal)userList.Count / (decimal)taskList.Count;
            decimal runs    = d < 1 ? Math.Ceiling(1 / d) : Math.Ceiling(d);
            var     flipped = d < 1;

            if (flipped)
            {
                longList  = taskList;
                shortList = userList;
            }
            else
            {
                longList  = userList;
                shortList = taskList;
            }
            //have initial time set to startdate and time
            var startDateTime = new DateTime(groupTaskSchedule.StartDate.Year,
                                             groupTaskSchedule.StartDate.Month,
                                             groupTaskSchedule.StartDate.Day,
                                             groupTaskSchedule.Time.Hour,
                                             groupTaskSchedule.Time.Minute,
                                             groupTaskSchedule.Time.Second);

            //random for the loop
            var rand = new Random();
            //making a new list since we're going to remove items from the long list
            var lng = new List <string>(longList);

            //loop x times over short list
            for (var i = 0; i < runs; i++)
            {
                //iterate over the short list
                foreach (var shrt in shortList)
                {
                    //break if no more left in the long list
                    if (lng.Count == 0)
                    {
                        break;
                    }
                    //get a random number
                    var r = int.Parse(rand.Next(lng.Count).ToString());
                    //add to dictionary
                    taskDict.Add(lng[r], shrt);

                    //remove from longer list
                    lng.RemoveAt(r);
                }
                foreach (var t in taskDict)
                {
                    groupUserTasks.Add(new Usertask()
                    {
                        Id               = Guid.NewGuid().ToString(),
                        TaskId           = flipped ? t.Key : t.Value,
                        SendTime         = startDateTime.AddDays(groupTaskSchedule.GroupTaskRun + i - 1),
                        UserIdAssigned   = flipped ? t.Value : t.Key,
                        AssignedDateTime = DateTime.Now,
                        SendNow          = false,
                        GroupTaskId      = groupTaskSchedule.Id,
                        GroupTaskRun     = groupTaskSchedule.GroupTaskRun + i,
                        LastScheduled    = lng.Count == 0
                    });
                }
                taskDict.Clear();
            }

            return(groupUserTasks);
        }