private async void btnSync_Click(object sender, EventArgs e) { this.btnSync.Enabled = false; DateTime from = this.dtpFrom.Value; DateTime to = this.dtpTo.Value; var issueList = await JiraProxy.GetUpdatedIssueListByAssigneeList(from, to, GetSupportTeamMembers()); if (issueList == null || issueList.Count == 0) { this.btnSync.Enabled = true; return; } Dictionary <string, List <IndividualWorkLog> > IndividualWorkLogs = new Dictionary <string, List <IndividualWorkLog> >(); foreach (var issue in issueList) { if (issue == null) { continue; } /* * string taskKey = issue.fields.parent.key; * string taskSummary = issue.fields.parent.fields.summary; * string taskType = issue.fields.parent.fields.issuetype.name; * string subTaskkey = issue.key; * string subTaskSummary = issue.fields.summary; */ string issueType = issue.fields.issueType.name; IndividualWorkLog individualWorkLog = new IndividualWorkLog(); if ("Sub-task".Equals(issueType, StringComparison.InvariantCultureIgnoreCase)) { /* * issue.fields.assignee.name = "*****@*****.**" * issue.fields.assignee.emailAddress = "*****@*****.**" * issue.fields.assignee.displayName = "Gordon Chen" * issue.fields.issueType.name = "Sub-task" * issue.fields.issueType.subtask = true * issue.fields.parent.key = "ENGSUPP-14215" * issue.fields.parent.fields.summary = "Unable to delete logs in Batch Engine" * issue.fields.parent.fields.status.name = "In Progress" */ var workLogs = await JiraProxy.GetWorklogs(issue); if (workLogs != null && workLogs.Count > 0) { foreach (var worklog in workLogs) { if (DateTime.Compare(worklog.created, from) >= 0 && DateTime.Compare(worklog.created, to) <= 0) { individualWorkLog = new IndividualWorkLog(); individualWorkLog.subTaskKey = issue.key; individualWorkLog.subTaskSummary = issue.fields.summary; individualWorkLog.subTaskAssignee = issue.fields.assignee.displayName; individualWorkLog.jiraIssueKey = issue.fields.parent.key; individualWorkLog.jiraIssueSummary = issue.fields.parent.fields.summary; individualWorkLog.assignee = worklog.author.displayName; individualWorkLog.assigneeEmailAddress = worklog.author.emailAddress; individualWorkLog.timeSpent = worklog.timeSpent; individualWorkLog.comment = worklog.comment.Replace("\r\n", ";"); if (!IndividualWorkLogs.ContainsKey(individualWorkLog.jiraIssueKey)) { IndividualWorkLogs.Add(individualWorkLog.jiraIssueKey, new List <IndividualWorkLog>()); } List <IndividualWorkLog> individualWorkLogList = IndividualWorkLogs[individualWorkLog.jiraIssueKey]; individualWorkLogList.Add(individualWorkLog); IndividualWorkLogs[individualWorkLog.jiraIssueKey] = individualWorkLogList; } } } else { System.Console.WriteLine("No work log on " + issue.key); } } else { var workLogs = await JiraProxy.GetWorklogs(issue); if (workLogs != null && workLogs.Count > 0) { foreach (var worklog in workLogs) { System.Console.WriteLine("Work Log are created on " + worklog.created); if (DateTime.Compare(worklog.created, from) >= 0 && DateTime.Compare(worklog.created, to) <= 0) { individualWorkLog = new IndividualWorkLog(); //individualWorkLog.subTaskKey = issue.fields.parent.key; //individualWorkLog.subTaskSummary = issue.fields.summary; //individualWorkLog.subTaskAssignee = issue.fields.assignee.displayName; individualWorkLog.jiraIssueKey = issue.key; individualWorkLog.jiraIssueSummary = issue.fields.summary; individualWorkLog.assignee = worklog.author.displayName; individualWorkLog.assigneeEmailAddress = worklog.author.emailAddress; individualWorkLog.timeSpent = worklog.timeSpent; individualWorkLog.comment = worklog.comment.Replace("\r\n", ";"); if (!IndividualWorkLogs.ContainsKey(individualWorkLog.jiraIssueKey)) { IndividualWorkLogs.Add(individualWorkLog.jiraIssueKey, new List <IndividualWorkLog>()); } List <IndividualWorkLog> individualWorkLogList = IndividualWorkLogs[individualWorkLog.jiraIssueKey]; individualWorkLogList.Add(individualWorkLog); IndividualWorkLogs[individualWorkLog.jiraIssueKey] = individualWorkLogList; } else { System.Console.WriteLine("Work Log cannot be added."); } } } else { System.Console.WriteLine("No work log on " + issue.key); } } } if (IndividualWorkLogs.Count == 0) { this.btnSync.Enabled = true; return; } DataTable table = new DataTable("Daily Work Log Report"); table.Columns.Add("No", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("EmailAddress", typeof(string)); table.Columns.Add("Effort", typeof(string)); table.Columns.Add("SubTaskID", typeof(string)); table.Columns.Add("SubTaskSummary", typeof(string)); table.Columns.Add("SubTaskAssignee", typeof(string)); table.Columns.Add("SubTaskComment", typeof(string)); table.Columns.Add("JiraKey", typeof(string)); table.Columns.Add("JiraSummary", typeof(string)); int index = 1; foreach (string key in IndividualWorkLogs.Keys) { List <IndividualWorkLog> individualWorkLogList = IndividualWorkLogs[key]; foreach (var workLog in individualWorkLogList) { DataRow row = table.NewRow(); row["No"] = index; row["Name"] = workLog.assignee; row["EmailAddress"] = workLog.assigneeEmailAddress; row["Effort"] = workLog.timeSpent; row["SubTaskID"] = workLog.subTaskKey; row["SubTaskSummary"] = workLog.subTaskSummary; row["SubTaskAssignee"] = workLog.subTaskAssignee; row["SubTaskComment"] = workLog.comment; row["JiraKey"] = workLog.jiraIssueKey; row["JiraSummary"] = workLog.jiraIssueSummary; table.Rows.Add(row); index++; } } dgvWorkLogReport.AutoGenerateColumns = false; dgvWorkLogReport.DataSource = table; this.btnSync.Enabled = true; }
private async void btnListWorkLogList_Click(object sender, EventArgs e) { this.btnListWorkLogList.Enabled = false; DateTime from = this.dtpFrom.Value; DateTime to = this.dtpTo.Value; from = DateTime.Today.AddDays(-1); to = DateTime.Today.AddDays(1); var GetUpdatedIssueListByAssignee = JiraProxy.GetUpdatedIssueListByTimeslot(from, to); var issueList = await GetUpdatedIssueListByAssignee; if (issueList == null || issueList.Count == 0) { return; } Dictionary <string, JiraTask> workLogsStore = new Dictionary <string, JiraTask>(); foreach (var issue in issueList) { if (issue == null) { continue; } string taskKey = issue.fields.parent.key; string taskSummary = issue.fields.parent.fields.summary; string taskType = issue.fields.parent.fields.issuetype.name; string subTaskkey = issue.key; string subTaskSummary = issue.fields.summary; var workLogs = await JiraProxy.GetWorklogs(issue); if (workLogs != null && workLogs.Count > 0) { foreach (var worklog in workLogs) { if (worklog.created.Year == DateTime.Today.Year && worklog.created.Month == DateTime.Today.Month && worklog.created.Day == DateTime.Today.Day) { if (!workLogsStore.ContainsKey(taskKey)) { JiraTask jiraTask = new JiraTask(); jiraTask.Key = taskKey; jiraTask.summary = taskSummary; jiraTask.Type = taskType; jiraTask.subTasks = new Dictionary <string, SubTask>(); workLogsStore.Add(taskKey, jiraTask); } JiraTask jiraTask1 = workLogsStore[taskKey]; if (!jiraTask1.subTasks.ContainsKey(subTaskkey)) { SubTask subTask = new SubTask(); subTask.Key = subTaskkey; subTask.summary = subTaskSummary; jiraTask1.subTasks.Add(subTaskkey, subTask); } SubTask subTask1 = jiraTask1.subTasks[subTaskkey]; if (subTask1.worklogs == null) { subTask1.worklogs = new List <Worklog>(); } Worklog workLog = new Worklog(); workLog.displayName = worklog.author.displayName; workLog.timeSpent = worklog.timeSpent; workLog.comment = worklog.comment.Replace("\r\n", ";"); subTask1.worklogs.Add(workLog); jiraTask1.subTasks[subTaskkey] = subTask1; workLogsStore[taskKey] = jiraTask1; } } } } /* * string dailyWorkLogSummaryReport = ""; * int index1 = 1; * foreach (string taskKey in workLogsStore.Keys) * { * JiraTask jiraTask = workLogsStore[taskKey]; * * dailyWorkLogSummaryReport += index1 + " " + jiraTask.Type + " - " + taskKey + " " + jiraTask.summary + "<br/>"; * * int index2 = 1; * foreach (string subTaskkey in jiraTask.subTasks.Keys) * { * SubTask subTask = jiraTask.subTasks[subTaskkey]; * * dailyWorkLogSummaryReport += index1 + "." + index2 + " Sub Task: " + subTaskkey + " " + subTask.summary + "<br/>"; * * int index3 = 1; * foreach (var workLog in subTask.worklogs) * { * dailyWorkLogSummaryReport += index1 + "." + index2 + "." + index3 + " " + workLog.displayName + "[" + workLog.timeSpent + "]" + workLog.comment + "<br/>"; * * index3++; * } * * index2++; * } * * dailyWorkLogSummaryReport += "<br/><br/>"; * index1++; * } */ string dailyWorkLogSummaryReport = ""; Dictionary <string, List <IndividualWorkLog> > IndividualWorkLogs = new Dictionary <string, List <IndividualWorkLog> >(); foreach (string taskKey in workLogsStore.Keys) { JiraTask jiraTask = workLogsStore[taskKey]; foreach (string subTaskkey in jiraTask.subTasks.Keys) { SubTask subTask = jiraTask.subTasks[subTaskkey]; foreach (var workLog in subTask.worklogs) { IndividualWorkLog individualWorkLog = new IndividualWorkLog(); individualWorkLog.jiraKey = taskKey; individualWorkLog.summary = jiraTask.summary; individualWorkLog.subTaskSummary = subTask.summary; individualWorkLog.timeSpent = workLog.timeSpent; individualWorkLog.comment = workLog.comment; if (!IndividualWorkLogs.ContainsKey(workLog.displayName)) { IndividualWorkLogs.Add(workLog.displayName, new List <IndividualWorkLog>()); } List <IndividualWorkLog> workLogs = IndividualWorkLogs[workLog.displayName]; workLogs.Add(individualWorkLog); IndividualWorkLogs[workLog.displayName] = workLogs; } } } dailyWorkLogSummaryReport = @"<table cellspacing='1' cellpadding='1' border='0' bgcolor='111111' style='border-collapse:collapse;border-spacing:0;border-left:1px solid #888;border-top:1px solid #888;background:#efefef;'> <tr> <td align='center' style='border-right:1px solid #888;border-bottom:1px solid #888;padding:1px 10px;'>No</td> <td align='center' style='border-right:1px solid #888;border-bottom:1px solid #888;padding:1px 10px;'>Name</td> <td align='center' style='border-right:1px solid #888;border-bottom:1px solid #888;padding:1px 10px;'>Work Logs</td> </tr>"; int i = 1; foreach (string name in IndividualWorkLogs.Keys) { dailyWorkLogSummaryReport += " <tr>"; dailyWorkLogSummaryReport += " <td align='center' style='border-right:1px solid #888;border-bottom:1px solid #888;padding:1px 10px;'>" + i + "</td>"; dailyWorkLogSummaryReport += " <td align='center' style='border-right:1px solid #888;border-bottom:1px solid #888;padding:1px 10px;'>" + name + "</td>"; dailyWorkLogSummaryReport += " <td align='left' style='border-right:1px solid #888;border-bottom:1px solid #888;padding:1px 10px;'>"; int j = 1; List <IndividualWorkLog> workLogs = IndividualWorkLogs[name]; foreach (var worklog in workLogs) { dailyWorkLogSummaryReport += "" + j + ") " + worklog.jiraKey + " - " + worklog.summary + "<br/>"; dailyWorkLogSummaryReport += "[" + worklog.subTaskSummary + "] " + worklog.timeSpent + " - " + worklog.comment + "<br/>"; j++; } dailyWorkLogSummaryReport += " </td>"; dailyWorkLogSummaryReport += " </tr>"; i++; } dailyWorkLogSummaryReport += "</table>"; string content = @"Hi, All guys<br/><br/>Below is the work log summary report.<br/><br/>" + dailyWorkLogSummaryReport + "Thanks<br/>Accela Support Team"; string fromEmailAddress = "*****@*****.**"; string toEmailAddress = "[email protected];[email protected]"; string ccEmailAddress = "*****@*****.**"; string subject = "Daily Work Log Summary - " + DateTime.Now.Month + "/" + DateTime.Now.Day + "/" + DateTime.Now.Year; try { EmailUtil.SendEmail(fromEmailAddress, toEmailAddress, ccEmailAddress, subject, content); } catch (Exception ex) { MessageBox.Show(ex.Message, "Failed to send email"); } System.Console.WriteLine(dailyWorkLogSummaryReport); this.btnListWorkLogList.Enabled = true; }
private void btnSend_Click(object sender, EventArgs e) { this.btnSend.Enabled = false; DataTable dataTable = dgvWorkLogReport.DataSource as DataTable; DataView dataTableView = dataTable.DefaultView; dataTableView.Sort = "Name ASC"; dataTable = dataTableView.ToTable(); Dictionary <string, List <IndividualWorkLog> > IndividualWorkLogs = new Dictionary <string, List <IndividualWorkLog> >(); if (dataTable != null) { string Name = ""; string EmailAddress = ""; string Effort = ""; string SubTaskID = ""; string SubTaskSummary = ""; string SubTaskAssignee = ""; string SubTaskComment = ""; string JiraKey = ""; string JiraSummary = ""; int rowCount = dataTable.Rows.Count; for (int k = 0; k < rowCount; k++) { DataRow row = dataTable.Rows[k]; Name = row["Name"] as string; EmailAddress = row["EmailAddress"] as string; Effort = row["Effort"] as string; SubTaskID = row["SubTaskID"] as string; SubTaskSummary = row["SubTaskSummary"] as string; SubTaskAssignee = row["SubTaskAssignee"] as string; SubTaskComment = row["SubTaskComment"] as string; JiraKey = row["JiraKey"] as string; JiraSummary = row["JiraSummary"] as string; IndividualWorkLog workLog = new IndividualWorkLog(); workLog.assignee = Name; workLog.assigneeEmailAddress = EmailAddress; workLog.timeSpent = Effort; workLog.subTaskKey = SubTaskID; workLog.subTaskSummary = SubTaskSummary; workLog.subTaskAssignee = SubTaskAssignee; workLog.comment = SubTaskComment; workLog.jiraIssueKey = JiraKey; workLog.jiraIssueSummary = JiraSummary; if (!IndividualWorkLogs.ContainsKey(Name)) { IndividualWorkLogs.Add(Name, new List <IndividualWorkLog>()); } List <IndividualWorkLog> individualWorkList = IndividualWorkLogs[Name]; individualWorkList.Add(workLog); IndividualWorkLogs[Name] = individualWorkList; } } string dailyWorkLogSummaryReport = ""; dailyWorkLogSummaryReport = @"<table cellspacing='1' cellpadding='1' border='0' bgcolor='111111' style='border-collapse:collapse;border-spacing:0;border-left:1px solid #888;border-top:1px solid #888;background:#efefef;'> <tr> <td align='center' style='border-right:1px solid #888;border-bottom:1px solid #888;padding:1px 10px;'>No</td> <td align='center' style='border-right:1px solid #888;border-bottom:1px solid #888;padding:1px 10px;'>Name</td> <td align='center' style='border-right:1px solid #888;border-bottom:1px solid #888;padding:1px 10px;'>Work Logs</td> </tr>"; int i = 1; foreach (string name in IndividualWorkLogs.Keys) { dailyWorkLogSummaryReport += " <tr>"; dailyWorkLogSummaryReport += " <td align='center' style='border-right:1px solid #888;border-bottom:1px solid #888;padding:1px 10px;'>" + i + "</td>"; dailyWorkLogSummaryReport += " <td align='center' style='border-right:1px solid #888;border-bottom:1px solid #888;padding:1px 10px;'>" + name + "</td>"; dailyWorkLogSummaryReport += " <td align='left' style='border-right:1px solid #888;border-bottom:1px solid #888;padding:1px 10px;'>"; int j = 1; List <IndividualWorkLog> workLogs = IndividualWorkLogs[name]; foreach (var worklog in workLogs) { dailyWorkLogSummaryReport += "" + j + ") <a href='https://accelaeng.atlassian.net/browse/" + worklog.jiraIssueKey + "'>" + worklog.jiraIssueKey + "</a> - " + worklog.jiraIssueSummary + "<br/>"; if (String.IsNullOrEmpty(worklog.subTaskKey) || worklog.subTaskKey.Trim().Length == 0) { dailyWorkLogSummaryReport += " [No Sub Task] " + worklog.timeSpent + " - " + worklog.comment + "<br/>"; } else { dailyWorkLogSummaryReport += " [<a href='https://accelaeng.atlassian.net/browse/" + worklog.subTaskKey + "'>" + worklog.subTaskSummary + "</a>] " + worklog.timeSpent + " - " + worklog.comment + "<br/>"; } dailyWorkLogSummaryReport += "<br/>"; j++; } dailyWorkLogSummaryReport += " </td>"; dailyWorkLogSummaryReport += " </tr>"; i++; } dailyWorkLogSummaryReport += "</table>"; string content = @"Hi, All<br/><br/>Below is the work log summary report.<br/><br/>" + dailyWorkLogSummaryReport + "<br/><br/>Thanks<br/>Accela Support Team"; string fromEmailAddress = "*****@*****.**"; string toEmailAddress = "[email protected];"; if (DateTime.Now.Hour >= 17) { toEmailAddress += "[email protected];[email protected];[email protected]"; } string ccEmailAddress = "*****@*****.**"; string subject = "Daily Work Log Summary - [" + this.dtpFrom.Value.ToString("MM/dd/yyyy") + "-" + this.dtpTo.Value.ToString("MM/dd/yyyy") + "]"; try { EmailUtil.SendEmail(fromEmailAddress, toEmailAddress, ccEmailAddress, subject, content); } catch (Exception ex) { MessageBox.Show(ex.Message, "Failed to send email"); } System.Console.WriteLine(dailyWorkLogSummaryReport); this.btnSend.Enabled = true; }