Exemplo n.º 1
0
        private async Task CompleteWorkItemAnyAssigned(WorkItem item, IEnumerable <WorkItemAssignment> assignments, int userId, string workNotes)
        {
            var assignment = assignments.SingleOrDefault(x => x.UserId == userId);

            if (assignment == null)
            {
                assignment = new WorkItemAssignment()
                {
                    UserId     = userId,
                    WorkItemId = item.Id
                };
            }

            if (!assignment.CompletedAt.HasValue)
            {
                var now = _clock.UtcNow.UtcDateTime;
                assignment.CompletedAt = now;
                assignment.WorkNotes   = workNotes;

                if (assignment.Id == default(int))
                {
                    await _workItemRepository.InsertWorkItemAssignment(assignment);
                }
                else
                {
                    await _workItemRepository.UpdateWorkItemAssignment(assignment);
                }

                item.CompletedAt       = now;
                item.CompletedByUserId = userId;
                await _workItemRepository.UpdateWorkItem(item);
            }
        }
 public ActionResult UpdateWorkitem(FormCollection data, HttpPostedFileBase myFile)
 {
     try
     {
         if (!ModelState.IsValid)
         {
             return(Json("Error"));
         }
         else
         {
             WorkItemAssignment assignData = new WorkItemAssignment();
             int Workid   = Convert.ToInt32(data["Workid"].ToString());
             var fileName = Path.GetFileName(myFile.FileName);
             var path     = Path.Combine(Server.MapPath("~/work/Download/"), fileName);
             myFile.SaveAs(path);
             assignData.WorkItemID         = Workid;
             assignData.UserID             = Convert.ToInt32(Session["UserID"]);
             assignData.IsRewarded         = false;
             assignData.SubmissionDateTime = DateTime.Now;
             assignData.SubmissionPath     = path;
             var putAssignData = workbountyRepo.UpdateWorkitems(assignData);
             return(View());
         }
     }
     catch (Exception)
     {
         return(View());
     }
 }
Exemplo n.º 3
0
        public ActionResult UpdateWorkitem(FormCollection data, HttpPostedFileBase myFile)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return(Json("Error"));
                }
                else
                {
                    int currentUserID           = Convert.ToInt32(Session["UserID"]);
                    int currentWorkitemID       = Convert.ToInt32(Session["UploadWorkitemID"]);
                    var getDataofUploadDocument = workbountyRepo.UserUploadDocument(currentWorkitemID, currentUserID);
                    ViewBag.dateOfSubmittedWork = getDataofUploadDocument;

                    WorkItemAssignment assignData = new WorkItemAssignment();
                    int Workid   = Convert.ToInt32(data["Workid"].ToString());
                    var fileName = Path.GetFileName(myFile.FileName);
                    var path     = Path.Combine(Server.MapPath("~/work1/Download/"), fileName);
                    myFile.SaveAs(path);
                    assignData.WorkItemID         = Workid;
                    assignData.UserID             = Convert.ToInt32(Session["UserID"]);
                    assignData.IsRewarded         = false;
                    assignData.SubmissionDateTime = DateTime.Now;
                    assignData.SubmissionPath     = path;
                    var putAssignData = workbountyRepo.UpdateWorkitems(assignData);
                    return(RedirectToAction("dashboard", "home"));
                }
            }
            catch (Exception)
            {
                ViewBag.blankDataMessage = "Blank data";
                return(View());
            }
        }
Exemplo n.º 4
0
 public string ApplyReward(Rewards id)
 {
     try
     {
         using (WorkBountyDBEntities entities = new WorkBountyDBEntities())
         {
             entities.Configuration.ValidateOnSaveEnabled = false;
             string   remarks = id.Remarks.ToString();
             Workitem remark  = new Workitem()
             {
                 WorkitemID = id.WorkItemID, Remarks = id.Remarks
             };
             entities.Workitems.Attach(remark);
             entities.Entry(remark).Property(u => u.Remarks).IsModified = true;
             entities.SaveChanges();
         }
         List <WorkItemAssignment> checkUploadedWorkitem = entity.WorkItemAssignments.Where(s => s.WorkItemID == id.WorkItemID && s.UserID == id.UserID).ToList();
         foreach (var data in checkUploadedWorkitem)
         {
             WorkItemAssignment item = entity.WorkItemAssignments.Where(s => s.WorkItemID == id.WorkItemID && s.UserID == id.UserID).FirstOrDefault();
             item.IsRewarded = true;
             entity.SaveChanges();
         }
         return("Success");
     }
     catch (Exception)
     {
         return("Error");
     }
 }
        public async Task CanUpdateWorkItemAssignment()
        {
            var workItem = new WorkItem()
            {
                PatrolId          = 1,
                CreatedAt         = DateTime.Now,
                ScheduledAt       = DateTime.Now,
                CreatedByUserId   = 1,
                Name              = "Name",
                Location          = "Location",
                CompletionMode    = CompletionMode.Any,
                DescriptionMarkup = "Markup",
                AdminGroupId      = 1
            };
            await _workItemRepository.InsertWorkItem(workItem);

            var assignment = new WorkItemAssignment()
            {
                UserId     = 1,
                WorkItemId = workItem.Id,
            };

            await _workItemRepository.InsertWorkItemAssignment(assignment);

            assignment.UserId = 2;
            await _workItemRepository.UpdateWorkItemAssignment(assignment);


            var inserted = await _workItemRepository.GetWorkItemAssignment(assignment.Id);

            Assert.AreEqual(assignment.UserId, inserted.UserId);
            Assert.AreEqual(assignment.WorkItemId, inserted.WorkItemId);
        }
Exemplo n.º 6
0
 public string UpdateWorkitems(WorkItemAssignment data)
 {
     try
     {
         entity.WorkItemAssignments.Add(data);
         entity.SaveChanges();
         return("Success");
     }
     catch (Exception)
     {
         return("Error");
     }
 }
Exemplo n.º 7
0
 public string ApplyReward(Rewards id)
 {
     try
     {
         WorkItemAssignment item = entity.WorkItemAssignments.Where(s => s.WorkItemID == id.WorkItemID && s.UserID == id.UserID).First();
         item.IsRewarded = true;
         entity.SaveChanges();
         return("Success");
     }
     catch (Exception)
     {
         return("Error");
     }
 }
Exemplo n.º 8
0
        /// <summary>
        /// used when the work item is completion mode "admin only", and also used to do "admin completion" for any WI
        /// </summary>
        /// <param name="item"></param>
        /// <param name="assignments"></param>
        /// <param name="userId"></param>
        /// <param name="workNotes"></param>
        /// <param name="onBehalfOfUserId"></param>
        /// <returns></returns>
        private async Task CompleteWorkItemAdminOnly(WorkItem item, IEnumerable <WorkItemAssignment> assignments, int userId, string workNotes, int?onBehalfOfUserId = null)
        {
            if (!onBehalfOfUserId.HasValue)
            {
                onBehalfOfUserId = userId;
            }

            var assignment = assignments.SingleOrDefault(x => x.UserId == onBehalfOfUserId.Value);

            if (assignment == null)
            {
                assignment = new WorkItemAssignment()
                {
                    UserId     = onBehalfOfUserId.Value,
                    WorkItemId = item.Id
                };
            }
            var now = _clock.UtcNow.UtcDateTime;

            assignment.CompletedAt = now;
            assignment.WorkNotes   = workNotes;

            if (assignment.Id == default(int))
            {
                await _workItemRepository.InsertWorkItemAssignment(assignment);
            }
            else
            {
                await _workItemRepository.UpdateWorkItemAssignment(assignment);
            }

            if (onBehalfOfUserId.HasValue && onBehalfOfUserId != userId)
            {
                var assignment2 = assignments.SingleOrDefault(x => x.UserId == userId);
                if (assignment2 == null)
                {
                    assignment2 = new WorkItemAssignment()
                    {
                        UserId     = userId,
                        WorkItemId = item.Id
                    };
                }
                assignment2.CompletedAt = now;
                assignment2.WorkNotes   = workNotes;

                if (assignment2.Id == default(int))
                {
                    await _workItemRepository.InsertWorkItemAssignment(assignment2);
                }
                else
                {
                    await _workItemRepository.UpdateWorkItemAssignment(assignment2);
                }
            }



            item.CompletedAt       = now;
            item.CompletedByUserId = onBehalfOfUserId.Value;
            await _workItemRepository.UpdateWorkItem(item);
        }
Exemplo n.º 9
0
        public async Task PopulateTimedWorkItemOccurences(RecurringWorkItem workItem, int userId, List <int> assigneeUserIds, DateTime now, bool populateWorkItemAssignments = true)
        {
            var existingWorkItems = (await _workItemRepository.GetWorkItems(workItem.Id, now)).ToList();

            var calculatedWorkItems = new List <WorkItem>();

            for (var scheduledAt = workItem.RecurStart.Value; scheduledAt <= workItem.RecurEnd.Value; scheduledAt = AddInterval(scheduledAt, workItem.RecurInterval.Value, workItem.RecurIntervalCount.Value))
            {
                if (scheduledAt >= now)
                {
                    calculatedWorkItems.Add(new WorkItem()
                    {
                        AdminGroupId      = workItem.AdminGroupId,
                        CompletionMode    = workItem.CompletionMode,
                        CreatedAt         = now,
                        CreatedByUserId   = userId,
                        DescriptionMarkup = workItem.DescriptionMarkup,
                        Location          = workItem.Location,
                        Name                = workItem.Name,
                        PatrolId            = workItem.PatrolId,
                        RecurringWorkItemId = workItem.Id,
                        ScheduledAt         = scheduledAt,
                    });
                }
            }


            var allAssignments = await _workItemRepository.GetWorkItemAssignments(workItem.Id, now);

            var missing  = calculatedWorkItems.Where(x => !existingWorkItems.Any(y => y.ScheduledAt == x.ScheduledAt)).ToList();
            var toRemove = existingWorkItems.Where(x => x.ScheduledAt > now && !calculatedWorkItems.Any(y => y.ScheduledAt == x.ScheduledAt));
            var toUpdate = existingWorkItems.Where(x => x.ScheduledAt > now && calculatedWorkItems.Any(y => y.ScheduledAt == x.ScheduledAt));

            foreach (var wi in missing)
            {
                await _workItemRepository.InsertWorkItem(wi);

                if (populateWorkItemAssignments && assigneeUserIds != null)
                {
                    foreach (var uid in assigneeUserIds)
                    {
                        var assignment = new WorkItemAssignment()
                        {
                            WorkItemId = wi.Id,
                            UserId     = uid
                        };
                        await _workItemRepository.InsertWorkItemAssignment(assignment);
                    }
                }
            }

            foreach (var wi in toRemove)
            {
                var toRemoveAssignments = allAssignments.Where(x => x.WorkItemId == wi.Id).ToList();
                foreach (var wis in toRemoveAssignments)
                {
                    await _workItemRepository.DeleteWorkItemAssignment(wis);
                }
                await _workItemRepository.DeleteWorkItem(wi);
            }

            foreach (var wi in toUpdate)
            {
                wi.AdminGroupId      = workItem.AdminGroupId;
                wi.CompletionMode    = workItem.CompletionMode;
                wi.DescriptionMarkup = workItem.DescriptionMarkup;
                wi.Location          = workItem.Location;
                wi.Name = workItem.Name;
                await _workItemRepository.UpdateWorkItem(wi);

                if (populateWorkItemAssignments)
                {
                    var assignees = allAssignments.Where(x => x.WorkItemId == wi.Id).ToList();

                    if (assigneeUserIds != null)
                    {
                        await assignees.DifferenceWith(assigneeUserIds,
                                                       (a, id) => a.UserId == id,
                                                       id => _workItemRepository.InsertWorkItemAssignment(new WorkItemAssignment()
                        {
                            WorkItemId = wi.Id,
                            UserId     = id
                        }), wia => _workItemRepository.DeleteWorkItemAssignment(wia));
                    }
                }
            }
        }
Exemplo n.º 10
0
        private async Task RecalculateSingleShiftWorkItemAssignments(int scheduledShiftId, List <ScheduledShiftAssignmentDto> scheduledShiftAssignments, List <WorkItem> workItems, List <WorkItemAssignment> assignments, List <RecurringWorkItem> recurringWorkItems, List <ShiftRecurringWorkItem> shiftRecurringWorkItems)
        {
            var random = new Random();
            //find work items for shift
            var scheduledShiftWorkItems = workItems.Where(x => x.ScheduledShiftId == scheduledShiftId).ToList();
            //find auto assigned work items
            var autoShiftWorkItems = scheduledShiftWorkItems//.Where(wi => shiftRecurringWorkItems.Single(r => r.RecurringWorkItemId == wi.RecurringWorkItemId.Value).ShiftAssignmentMode == ShiftAssignmentMode.Random)
                                     .Select(x => new
            {
                WorkItem               = x,
                RecurringWorkItem      = recurringWorkItems.Single(y => y.Id == x.RecurringWorkItemId.Value),
                Assignments            = assignments.Where(z => z.WorkItemId == x.Id).ToList(),
                ShiftRecurringWorkItem = shiftRecurringWorkItems.First(y => y.RecurringWorkItemId == x.RecurringWorkItemId)
            })
                                     .ToList();

            //dictionary of user ids with assignments
            var shiftAssignments = scheduledShiftAssignments.Where(x => x.ScheduledShiftId == scheduledShiftId && x.AssignedUser != null)
                                   .Select(x => x.AssignedUser.Id).Distinct().Select(x => new { Id = x, Assignments = assignments.Where(y => y.UserId == x).ToList() })
                                   .ToDictionary(x => x.Id, x => x.Assignments.ToList());

            //assignments.Where(x => scheduledShiftWorkItems.Any(y => y.Id == x.WorkItemId)).GroupBy(x => new { x.UserId })
            //.ToDictionary(x=>x.Key.UserId,x=>x.ToList());

            var desiredUsersPerWorkItem = 0;

            if (scheduledShiftWorkItems.Count() > scheduledShiftAssignments.Count() && scheduledShiftAssignments.Any())
            {
                desiredUsersPerWorkItem = scheduledShiftWorkItems.Count() / scheduledShiftAssignments.Count();
            }
            else if (scheduledShiftWorkItems.Any())
            {
                desiredUsersPerWorkItem = scheduledShiftAssignments.Count() / scheduledShiftWorkItems.Count();
            }
            //round up / ensure nonzero
            desiredUsersPerWorkItem++;

            //loop through work items for the shift and assign users
            foreach (var wi in autoShiftWorkItems)
            {
                if (wi.ShiftRecurringWorkItem.ShiftAssignmentMode == ShiftAssignmentMode.Auto)
                {
                    for (var i = wi.Assignments.Count; i < desiredUsersPerWorkItem && (!wi.RecurringWorkItem.MaximumRandomCount.HasValue || wi.Assignments.Count < wi.RecurringWorkItem.MaximumRandomCount.Value); i++)
                    {
                        //find users not already used on this work item
                        var unusedUsers = shiftAssignments.Where(x => !wi.Assignments.Any(y => y.UserId == x.Key && x.Value.Any(z => z.WorkItemId == wi.WorkItem.Id)));
                        //find users with the least assignments
                        if (unusedUsers.Any())
                        {
                            var minAssigned = unusedUsers.Min(x => x.Value.Count);
                            //make a pool of the users with equal, least assignments
                            var userIdPool = unusedUsers.Where(x => x.Value.Count == minAssigned)
                                             .Select(x => x.Key).ToList();
                            if (userIdPool.Any())
                            {
                                var index      = random.Next(userIdPool.Count());
                                var assignment = new WorkItemAssignment()
                                {
                                    UserId     = userIdPool[index],
                                    WorkItemId = wi.WorkItem.Id
                                };
                                await _workItemRepository.InsertWorkItemAssignment(assignment);

                                shiftAssignments[userIdPool[index]].Add(assignment);
                                wi.Assignments.Add(assignment);
                            }
                            else
                            {
                                break;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                else if (wi.ShiftRecurringWorkItem.ShiftAssignmentMode == ShiftAssignmentMode.CopyPrevious)
                {
                    var previous = workItems.Where(x => x.RecurringWorkItemId == wi.WorkItem.RecurringWorkItemId && x.ScheduledAt < wi.WorkItem.ScheduledAt)
                                   .OrderByDescending(x => x.ScheduledAt).FirstOrDefault();

                    if (previous != null)
                    {
                        //find users assigned to most recent work item
                        var previousAssignments = assignments.Where(x => x.WorkItemId == previous.Id).ToList();
                        //find users in specified shift
                        var ssas = scheduledShiftAssignments.Where(x => x.ScheduledShiftId == scheduledShiftId).ToList();
                        //find users in previous work item assignment that exist in current shift
                        var assignUserIds = previousAssignments.Where(x => ssas.Any(y => y.AssignedUser != null && y.AssignedUser.Id == x.UserId)).Select(x => x.UserId).ToList();
                        //find users that already are assigned to the wi
                        var existingAssignments = assignments.Where(x => x.WorkItemId == wi.WorkItem.Id).Select(x => x.UserId).ToList();
                        //find users that need to be assigned that aren't already assigned
                        var missingUserIds = assignUserIds.Where(x => !existingAssignments.Any(y => y == x)).ToList();

                        foreach (var id in missingUserIds)
                        {
                            var assignment = new WorkItemAssignment()
                            {
                                WorkItemId = wi.WorkItem.Id,
                                UserId     = id
                            };
                            await _workItemRepository.InsertWorkItemAssignment(assignment);

                            wi.Assignments.Add(assignment);
                            shiftAssignments[id].Add(assignment);
                        }
                    }
                }
            }
        }
Exemplo n.º 11
0
 public Task UpdateWorkItemAssignment(WorkItemAssignment item)
 {
     return(_connection.UpdateAsync(item));
 }
Exemplo n.º 12
0
        public async Task InsertWorkItemAssignment(WorkItemAssignment item)
        {
            int id = (int)await _connection.InsertAsync(item);

            item.Id = id;
        }
Exemplo n.º 13
0
 public string UpdateWorkitems(WorkItemAssignment data)
 {
     try
     {
         entity.WorkItemAssignments.Add(data);
         entity.SaveChanges();
         return "Success";
     }
     catch (Exception)
     {
         return "Error";
     }
 }