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")); }
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); }