Example #1
0
        public List <NtWorkItem> GetWorkItems([FromBody] WorkItemInput input)
        {
            var ntCloudWorkItems = GetNtWorkItemsInCollection(input, URL_COLLECTION_NTCLOUD, NAME_PROJECT_NTCLOUD);
            var miscWorkItems    = GetNtWorkItemsInCollection(input, URL_COLLECTION_NTSG, NAME_PROJECT_MISCSG);

            ntCloudWorkItems.AddRange(miscWorkItems);
            return(ntCloudWorkItems);
        }
Example #2
0
        public async Task <IActionResult> PostWorkItem(WorkItemInput input)
        {
            var email  = input.Email;
            var bounds = input.MapBounds;

            var status = await daService.SendWorkItem(bounds, email, this.baseUrl);

            return(Ok(status));
        }
Example #3
0
 private static Wiql ContructWiqlQuery(WorkItemInput workItemInput)
 {
     return(new Wiql()
     {
         Query = "Select [State], [Title] [Description]" +
                 "From WorkItems " +
                 $"Where [Work Item Type] = '{workItemInput.WorkItemType}' " +
                 $"And [System.TeamProject] = '{workItemInput.ProjectName}' " +
                 $"And [System.State] <> '{workItemInput.WorkItemStatus}' " +
                 "Order By [State] Asc, [Changed Date] Desc"
     });
 }
Example #4
0
        private static List <NtWorkItem> GetNtWorkItemsInCollection(WorkItemInput input, string collectionUri, string teamProjectName)
        {
            var startDate = DateTime.Parse(input.Start);
            var endDate   = DateTime.Parse(input.End);

            var witClient           = GetWitClient(collectionUri);
            var workHttpClient      = GetWorkHttpClient(collectionUri);
            var iterations          = workHttpClient.GetTeamIterationsAsync(new TeamContext(teamProjectName)).Result;
            var workItemQueryResult = GetWorkItemQueryResult(teamProjectName, endDate, startDate, input.NtTeamMembers, witClient, iterations, out var workItemLinks);

            if (!workItemLinks.Any())
            {
                return(new List <NtWorkItem>());
            }
            var ntWorkItems = GetNtWorkItems(workItemLinks, witClient, workItemQueryResult, teamProjectName, iterations, startDate, endDate);

            return(ntWorkItems);
        }
        private async Task <DialogTurnResult> GetProjectInfo(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            if (!(stepContext.Options is RecognizerResult))
            {
                return(await stepContext.EndDialogAsync(null, cancellationToken));
            }

            var recognizerResult = (RecognizerResult)stepContext.Options;
            var workItemType     = Utilities.GetWorkItemType(recognizerResult.Entities);
            var workItemInput    = new WorkItemInput {
                WorkItemType = workItemType
            };

            var activity    = stepContext.Result as Activity;
            var projectInfo = JObject.Parse(activity.Value.ToString());

            workItemInput.ProjectCollection = projectInfo["ProjectCollection"].ToString();
            workItemInput.ProjectName       = projectInfo["ProjectName"].ToString();
            await workItemInputAccessor.SetAsync(stepContext.Context, workItemInput, cancellationToken).ConfigureAwait(false);

            return(await stepContext.NextAsync(null, cancellationToken));
        }
        private async Task <DialogTurnResult> FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            if (stepContext.Result == null || !(stepContext.Result is Activity) || !(stepContext.Options is RecognizerResult))
            {
                return(await stepContext.EndDialogAsync(null, cancellationToken));
            }

            var recognizerResult = (RecognizerResult)stepContext.Options;
            // We need to get the result from the LUIS JSON which at every level returns an array.
            WorkItemInput workItemInput = new WorkItemInput();
            Match         match         = Regex.Match(recognizerResult.Entities["id"].ToString(), @"(\d+)");

            if (match.Success)
            {
                workItemInput.WorkItemId = match.Groups[1].Value;
            }

            try
            {
                var authenticatedProfile = await this.authHelper.GetAuthenticatedProfileAsync(stepContext.Context, cancellationToken).ConfigureAwait(false);

                var      activity    = stepContext.Result as Activity;
                var      projectInfo = JObject.Parse(activity.Value.ToString());
                WorkItem workItem    = await vsoApiController.GetWorkItemAsync(workItemInput.WorkItemId, projectInfo["ProjectCollection"].ToString(), projectInfo["ProjectName"].ToString(), authenticatedProfile.Token.AccessToken).ConfigureAwait(false);

                var replaceInfo = new Dictionary <string, string>();
                replaceInfo.Add("{{workitemId}}", workItem.Id.ToString());
                replaceInfo.Add("{{workitemUrl}}", $"https://{projectInfo["ProjectCollection"].ToString()}.visualstudio.com/{projectInfo["ProjectName"].ToString()}/_workitems/edit/{workItemInput.WorkItemId}");
                if (workItem.Fields.Count == 0)
                {
                    this.logger.LogWarning($"Work item details are miising for {workItem.Id}");
                }

                if (workItem.Fields.TryGetValue("System.Title", out object title))
                {
                    replaceInfo.Add("{{workitemTitle}}", title.ToString());
                }

                if (workItem.Fields.TryGetValue("System.WorkItemType", out object workItemType))
                {
                    replaceInfo.Add("{{workitemType}}", workItemType.ToString());
                }

                if (workItem.Fields.TryGetValue("System.State", out object status))
                {
                    replaceInfo.Add("{{workitemStatus}}", status.ToString());
                }

                if (workItem.Fields.TryGetValue("System.ChangedDate", out object lastUpdatedDate))
                {
                    replaceInfo.Add("{{lastUpdated}}", lastUpdatedDate.ToString());
                }

                var cardText = await CardProvider.GetCardText("WorkItemDetailsCard", replaceInfo).ConfigureAwait(false);

                var replyActivity = JsonConvert.DeserializeObject <Activity>(cardText);
                await stepContext.Context.SendActivityAsync(replyActivity, cancellationToken);

                return(await stepContext.EndDialogAsync(workItemInput, cancellationToken));
            }
            catch (Exception)
            {
                await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Sorry something went wrong when fetching {workItemInput.WorkItemId}."), cancellationToken);

                return(await stepContext.EndDialogAsync(null, cancellationToken));
            }
        }
Example #7
0
 public async Task <IEnumerable <WorkItem> > GetWorkItemsFromWorkItemInputAsync(string projectCollection, string projectName, WorkItemInput WorkItemInput, string accessToken)
 {
     return(await GetWorkItemByQueryAsync(projectCollection, projectName, ContructWiqlQuery(WorkItemInput), accessToken).ConfigureAwait(false));
 }
Example #8
0
        public Dictionary <string, List <NtCollapsedWorkItem> > GetCollapsedWorkItems([FromBody] WorkItemInput input)
        {
            var workItems          = GetWorkItems(input);
            var collapsedWorkItems = new Dictionary <string, List <NtCollapsedWorkItem> >();
            var workItemDates      = new Dictionary <string, Dictionary <string, int> >();

            foreach (var workItem in workItems)
            {
                if (!collapsedWorkItems.ContainsKey(workItem.AssignedTo))
                {
                    collapsedWorkItems[workItem.AssignedTo] = new List <NtCollapsedWorkItem>();
                    workItemDates[workItem.AssignedTo]      = new Dictionary <string, int>();
                }

                var dateKey = workItem.ClosedDate;
                var task    = $"{workItem.TeamProject}-{workItem.Id} {workItem.Title}";
                if (!workItemDates[workItem.AssignedTo].ContainsKey(dateKey))
                {
                    workItemDates[workItem.AssignedTo][dateKey] = collapsedWorkItems[workItem.AssignedTo].Count;
                    var collapsedWorkItem = new NtCollapsedWorkItem
                    {
                        Employee = workItem.AssignedTo,
                        Date     = workItem.ClosedDate,
                        Title    = workItem.Title,
                        //DurationDemonstration = 0,
                        DurationDeployment    = 0,
                        DurationDesign        = 0,
                        DurationDevelopment   = 0,
                        DurationDocumentation = 0,
                        DurationMarketing     = 0,
                        DurationRequirements  = 0,
                        DurationTesting       = 0,
                        DurationOthers        = 0,
                        DurationNA            = 0,
                        DurationTotal         = 0,
                        Product       = new Dictionary <string, double>(),
                        WorkTasksList = new List <string>()
                        {
                            task
                        }
                    };
                    collapsedWorkItems[workItem.AssignedTo].Add(collapsedWorkItem);
                }
                else
                {
                    collapsedWorkItems[workItem.AssignedTo][workItemDates[workItem.AssignedTo][dateKey]].Title +=
                        ", " + workItem.Title;
                    collapsedWorkItems[workItem.AssignedTo][workItemDates[workItem.AssignedTo][dateKey]].WorkTasksList.Add(task);
                }

                var itemIndex = workItemDates[workItem.AssignedTo][dateKey];

                if (workItem.Activity.IsNullOrEmpty())
                {
                    workItem.Activity = string.Empty;
                }
                workItem.Activity = workItem.Activity.Trim().ToLower();

                double duration = 0;
                if (workItem.Duration != null)
                {
                    duration = workItem.Duration.Value;
                }

                var isMisc = workItem.Product.ToUpper().Equals("MISC");
                if (!isMisc)
                {
                    var arr = workItem.Product.Split('.');
                    workItem.Product = String.Join(".", arr.Take(arr.Length - 1)).Trim();
                }

                if (!collapsedWorkItems[workItem.AssignedTo][itemIndex].Product.ContainsKey(workItem.Product) && !isMisc)
                {
                    collapsedWorkItems[workItem.AssignedTo][itemIndex].Product[workItem.Product] = 0;
                }

                collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationTotal += duration;
                if (workItem.Activity.Equals(string.Empty))
                {
                    collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationNA += duration;
                }
                else if (workItem.Activity.Equals("demonstration"))
                {
                    //collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationDemonstration += duration;
                    collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationMarketing += duration;
                }
                else if (workItem.Activity.Equals("deployment"))
                {
                    if (!isMisc)
                    {
                        collapsedWorkItems[workItem.AssignedTo][itemIndex].Product[workItem.Product] += duration;
                        collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationDeployment        += duration;
                    }
                    else
                    {
                        collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationOthers += duration;
                    }
                }
                else if (workItem.Activity.Equals("design"))
                {
                    if (!isMisc)
                    {
                        collapsedWorkItems[workItem.AssignedTo][itemIndex].Product[workItem.Product] += duration;
                        collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationDesign            += duration;
                    }
                    else
                    {
                        collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationOthers += duration;
                    }
                }
                else if (workItem.Activity.Equals("development"))
                {
                    if (!isMisc)
                    {
                        collapsedWorkItems[workItem.AssignedTo][itemIndex].Product[workItem.Product] += duration;
                        collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationDevelopment       += duration;
                    }
                    else
                    {
                        collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationOthers += duration;
                    }
                }
                else if (workItem.Activity.Equals("documentation"))
                {
                    if (!isMisc)
                    {
                        collapsedWorkItems[workItem.AssignedTo][itemIndex].Product[workItem.Product] += duration;
                        collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationDocumentation     += duration;
                    }
                    else
                    {
                        collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationOthers += duration;
                    }
                }
                else if (workItem.Activity.Equals("marketing"))
                {
                    collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationMarketing += duration;
                }
                else if (workItem.Activity.Equals("requirements"))
                {
                    collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationRequirements += duration;
                }
                else if (workItem.Activity.Equals("testing"))
                {
                    collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationTesting += duration;
                }
                else if (workItem.Activity.Equals("others"))
                {
                    collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationOthers += duration;
                }

                if (workItem.TeamProject.Trim().ToLower().Replace(" ", "").Equals("miscsg"))
                {
                    continue;
                }
            }
            return(collapsedWorkItems);
        }
Example #9
0
        public Dictionary <string, List <NtWeeklyWorkItem> > GetWeeklyWorkItems([FromBody] WorkItemInput input)
        {
            var workItems = GetWorkItems(input);

            workItems.Sort(CompareWorkItemByDate);
            var weeklyWorkItems    = new Dictionary <string, List <NtWeeklyWorkItem> >();
            var workItemStartDates = new Dictionary <string, Dictionary <string, int> >();

            foreach (var workItem in workItems)
            {
                if (!weeklyWorkItems.ContainsKey(workItem.AssignedTo))
                {
                    weeklyWorkItems[workItem.AssignedTo]    = new List <NtWeeklyWorkItem>();
                    workItemStartDates[workItem.AssignedTo] = new Dictionary <string, int>();
                }

                var curDate   = DateTime.Parse(workItem.ClosedDate);
                var startDate = curDate.StartOfWeek(DayOfWeek.Monday);
                var endDate   = curDate.EndOfWeek(DayOfWeek.Monday);

                var dateKey = startDate.ToString("yyyy MMMM dd");
                var task    = $"{workItem.TeamProject}-{workItem.Id} {workItem.Title}";
                if (!workItemStartDates[workItem.AssignedTo].ContainsKey(dateKey))
                {
                    workItemStartDates[workItem.AssignedTo][dateKey] = weeklyWorkItems[workItem.AssignedTo].Count;
                    var weeklyWorkItem = new NtWeeklyWorkItem
                    {
                        Employee      = workItem.AssignedTo,
                        WeekStartDate = dateKey,
                        WeekEndDate   = endDate.ToString("yyyy MMMM dd"),
                        Title         = workItem.Title,
                        //DurationDemonstration = 0,
                        DurationDeployment    = 0,
                        DurationDesign        = 0,
                        DurationDevelopment   = 0,
                        DurationDocumentation = 0,
                        DurationMarketing     = 0,
                        DurationRequirements  = 0,
                        DurationTesting       = 0,
                        DurationOthers        = 0,
                        DurationNA            = 0,
                        DurationTotal         = 0,
                        Product       = new Dictionary <string, double>(),
                        WorkTasksList = new List <string>()
                        {
                            task
                        }
                    };
                    weeklyWorkItems[workItem.AssignedTo].Add(weeklyWorkItem);
                }
                else
                {
                    weeklyWorkItems[workItem.AssignedTo][workItemStartDates[workItem.AssignedTo][dateKey]].Title +=
                        ", " + workItem.Title;
                    weeklyWorkItems[workItem.AssignedTo][workItemStartDates[workItem.AssignedTo][dateKey]].WorkTasksList.Add(task);
                }

                var itemIndex = workItemStartDates[workItem.AssignedTo][dateKey];

                if (workItem.Activity.IsNullOrEmpty())
                {
                    workItem.Activity = string.Empty;
                }
                workItem.Activity = workItem.Activity.Trim().ToLower();

                double duration = 0;
                if (workItem.Duration != null)
                {
                    duration = workItem.Duration.Value;
                }

                var isMisc = workItem.Product.ToUpper().Equals("MISC");
                if (!isMisc && workItem.Product.StartsWith("NtEdge"))
                {
                    var arr = workItem.Product.Split('.');
                    workItem.Product = string.Join(".", arr.Take(arr.Length - 1)).Trim();
                }
                if (!weeklyWorkItems[workItem.AssignedTo][itemIndex].Product.ContainsKey(workItem.Product) && !isMisc)
                {
                    weeklyWorkItems[workItem.AssignedTo][itemIndex].Product[workItem.Product] = 0;
                }

                weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationTotal += duration;
                if (workItem.Activity.Equals(string.Empty))
                {
                    weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationNA += duration;
                }
                else if (workItem.Activity.Equals("demonstration"))
                {
                    //collapsedWorkItems[workItem.AssignedTo][itemIndex].DurationDemonstration += duration;
                    weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationMarketing += duration;
                }
                else if (workItem.Activity.Equals("deployment"))
                {
                    if (!isMisc)
                    {
                        weeklyWorkItems[workItem.AssignedTo][itemIndex].Product[workItem.Product] += duration;
                        weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationDeployment        += duration;
                    }
                    else
                    {
                        weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationOthers += duration;
                    }
                }
                else if (workItem.Activity.Equals("design"))
                {
                    if (!isMisc)
                    {
                        weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationDesign            += duration;
                        weeklyWorkItems[workItem.AssignedTo][itemIndex].Product[workItem.Product] += duration;
                    }
                    else
                    {
                        weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationOthers += duration;
                    }
                }
                else if (workItem.Activity.Equals("development"))
                {
                    if (!isMisc)
                    {
                        weeklyWorkItems[workItem.AssignedTo][itemIndex].Product[workItem.Product] += duration;
                        weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationDevelopment       += duration;
                    }
                    else
                    {
                        weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationOthers += duration;
                    }
                }
                else if (workItem.Activity.Equals("documentation"))
                {
                    if (!isMisc)
                    {
                        weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationDocumentation     += duration;
                        weeklyWorkItems[workItem.AssignedTo][itemIndex].Product[workItem.Product] += duration;
                    }
                    else
                    {
                        weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationOthers += duration;
                    }
                }
                else if (workItem.Activity.Equals("marketing"))
                {
                    weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationMarketing += duration;
                }
                else if (workItem.Activity.Equals("requirements"))
                {
                    weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationRequirements += duration;
                }
                else if (workItem.Activity.Equals("testing"))
                {
                    weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationTesting += duration;
                }
                else if (workItem.Activity.Equals("others"))
                {
                    weeklyWorkItems[workItem.AssignedTo][itemIndex].DurationOthers += duration;
                }

                if (workItem.TeamProject.Trim().ToLower().Replace(" ", "").Equals("miscsg"))
                {
                    continue;
                }
            }
            return(weeklyWorkItems);
        }