/// <summary> /// Create an increment from the timespan. /// increment has of (+/-)nn(y|M|w|d|h|m) /// If the plus/minus(+/-) sign is omitted, plus is assumed. /// nn: number; y: year, M: month; w: week; d: day; h: hour; m: minute. /// </summary> /// <param name="timeSpan">TimeSpan to convert</param> /// <param name="timeTrackingConfiguration">TimeTrackingConfiguration for calculating the values</param> /// <returns>string</returns> public static string ToWorkingTime(this TimeSpan?timeSpan, TimeTrackingConfiguration timeTrackingConfiguration = null) { if (!timeSpan.HasValue) { return(""); } return(timeSpan.Value.ToWorkingTime(timeTrackingConfiguration)); }
public void TestTimeSpan_ToJiraTimeRange_RealWeek_7HalfHours_ToWorkingTime() { var timeTrackingConfiguration = new TimeTrackingConfiguration { WorkingHoursPerDay = 7.5f }; var testTimeSpan = TimeSpan.FromDays(7); var jiraTimeRange = testTimeSpan.ToWorkingTime(timeTrackingConfiguration); Assert.Equal("4w 2d 3h", jiraTimeRange); }
public void TestJiraTimeRangeToTimeSpan_RealWeek_7HalfHours_FromWorkingTime() { var timeTrackingConfiguration = new TimeTrackingConfiguration { WorkingHoursPerDay = 7.5f }; var testTimeSpan = TimeSpanExtensions.FromWorkingTime("1w 1d 1h 10m", timeTrackingConfiguration); // in hours => (5 (Working days per week) + 1 )* 7,5 (working hours per day) var testResult = TimeSpan.FromHours(6 * timeTrackingConfiguration.WorkingHoursPerDay); testResult = testResult.Add(TimeSpan.FromHours(1)); testResult = testResult.Add(TimeSpan.FromMinutes(10)); Assert.Equal(testResult, testTimeSpan); }
/// <summary> /// Create something that represents the jira working time format /// (+/-)nn(y|M|w|d|h|m) /// nn: number; y: year, M: month; w: week; d: day; h: hour; m: minute. /// </summary> /// <param name="timeSpan">TimeSpan to convert</param> /// <param name="timeTrackingConfiguration">TimeTrackingConfiguration for calculating the values</param> /// <returns>string</returns> public static string ToWorkingTime(this TimeSpan timeSpan, TimeTrackingConfiguration timeTrackingConfiguration = null) { timeTrackingConfiguration ??= new TimeTrackingConfiguration(); var hours = timeSpan.Hours + (timeSpan.Days * 24); var minutes = timeSpan.Minutes; // Calculate the days from the hours (one normal day has 24 hours, working hours can be 8 -> 3 working days) var workingDays = Math.Floor(hours / timeTrackingConfiguration.WorkingHoursPerDay); // Calculate the weeks from the working days (5 days a week) var workingWeeks = Math.Floor(workingDays / timeTrackingConfiguration.WorkingDaysPerWeek); // Modify the workingDays to the remainder -> 6 working days, 1w and 1d workingDays %= timeTrackingConfiguration.WorkingDaysPerWeek; // Calculate the working hours, by using the remainder of the division e.g 9 hours with 8 hour working day -> 1 hour leftover var workingHours = hours % timeTrackingConfiguration.WorkingHoursPerDay; var jiraTimeRange = new StringBuilder(); if (workingWeeks > 0) { jiraTimeRange.AppendFormat("{0}w ", workingWeeks); } if (workingDays > 0) { jiraTimeRange.AppendFormat("{0}d ", workingDays); } if (workingHours > 0) { jiraTimeRange.AppendFormat("{0}h ", workingHours); } if (minutes > 0) { jiraTimeRange.AppendFormat("{0}m ", minutes); } return(jiraTimeRange.ToString().Trim()); }
/// <summary> /// </summary> /// <param name="workingTime">string from Jira</param> /// <param name="timeTrackingConfiguration">TimeTrackingConfiguration</param> /// <returns></returns> public static TimeSpan FromWorkingTime(string workingTime, TimeTrackingConfiguration timeTrackingConfiguration = null) { timeTrackingConfiguration ??= new TimeTrackingConfiguration(); var result = TimeSpan.Zero; var weeksMatch = Regex.Match(workingTime, "(\\d+)w"); if (weeksMatch.Success) { var weeks = int.Parse(weeksMatch.Groups[1].Value); var realHours = weeks * timeTrackingConfiguration.WorkingDaysPerWeek * timeTrackingConfiguration.WorkingHoursPerDay; result = result.Add(TimeSpan.FromHours(realHours)); } var daysMatch = Regex.Match(workingTime, "(\\d+)d"); if (daysMatch.Success) { var days = int.Parse(daysMatch.Groups[1].Value); var realHours = days * timeTrackingConfiguration.WorkingHoursPerDay; result = result.Add(TimeSpan.FromHours(realHours)); } var hoursMatch = Regex.Match(workingTime, "(\\d+)h"); if (hoursMatch.Success) { var hours = int.Parse(hoursMatch.Groups[1].Value); result = result.Add(TimeSpan.FromHours(hours)); } var minutesMatch = Regex.Match(workingTime, "(\\d+)m"); if (minutesMatch.Success) { var minutes = int.Parse(minutesMatch.Groups[1].Value); result = result.Add(TimeSpan.FromMinutes(minutes)); } return(result); }
/// <summary> /// Admin ONLY!!! /// Set time tracking configuration (sub-set of the configuration) /// See /// <a /// href="https://docs.atlassian.com/jira/REST/cloud/#api/2/configuration/timetracking-getSharedTimeTrackingConfiguration"> /// get /// shared timetracking configuration /// </a> /// </summary> /// <param name="jiraClient">IServerDomain to bind the extension method to</param> /// <param name="timeTrackingConfiguration">TimeTrackingConfiguration to use</param> /// <param name="cancellationToken">CancellationToken</param> public static async Task SetTimeTrackingConfigurationAsync(this IServerDomain jiraClient, TimeTrackingConfiguration timeTrackingConfiguration, CancellationToken cancellationToken = default) { Log.Debug().WriteLine("Retrieving time tracking configuration"); var timeTrackingConfigurationUri = jiraClient.JiraRestUri.AppendSegments("configuration", "timetracking", "options"); jiraClient.Behaviour.MakeCurrent(); var response = await timeTrackingConfigurationUri.PutAsync <HttpResponse>(timeTrackingConfiguration, cancellationToken).ConfigureAwait(false); response.HandleStatusCode(); }