/// <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));
 }
Esempio n. 2
0
    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);
    }
Esempio n. 3
0
    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);
    }
Esempio n. 4
0
    /// <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());
    }
Esempio n. 5
0
    /// <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);
    }
Esempio n. 6
0
        /// <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();
        }