private DateTime GetNextSchedulingTime()

in src/PatchOrchestrationApplication/NodeAgentNTService/src/Manager/TimerManager.cs [621:712]


        private DateTime GetNextSchedulingTime()
        {         
            ServiceSettings settings = this._serviceSettings;
            DateTime currentTime = DateTime.UtcNow;
            DateTime settingsDateTime = settings.Date;

            switch (settings.Frequency)
            {
                case Frequency.Monthly:
                {
                    DateTime next;
                    if (settings.IsLastDayOfMonth)
                    {
                        next = new DateTime(currentTime.Year, currentTime.Month, 1, settingsDateTime.Hour,
                            settingsDateTime.Minute, settingsDateTime.Second);
                        next = next.AddMonths(1).AddDays(-1);

                        if (DateTime.Compare(next, currentTime) < 0)
                        {
                            next = next.AddDays(1).AddMonths(1).AddDays(-1);
                        }
                    }
                    else
                    {
                        next = new DateTime(currentTime.Year, currentTime.Month, settingsDateTime.Day,
                            settingsDateTime.Hour, settingsDateTime.Minute, settingsDateTime.Second);
                        if (DateTime.Compare(next, currentTime) < 0)
                        {
                            next = next.AddMonths(1);
                        }
                    }
                    
                    return next;
                }

                case Frequency.MonthlyByWeekAndDay:
                    {
                        var next = this.GetNextDateTimeForMonthlyByWeekAndDayFrequency(currentTime, settings);
                        
                        if (DateTime.Compare(next, currentTime) < 0)
                        {
                            next = this.GetNextDateTimeForMonthlyByWeekAndDayFrequency(currentTime.AddMonths(1), settings);
                        }

                        return next;
                    }

                case Frequency.Weekly:
                    {
                        DateTime next = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, settingsDateTime.Hour, settingsDateTime.Minute, settingsDateTime.Second);
                        next = next.AddDays((settings.DayOfWeek - next.DayOfWeek + 7) % 7);

                        if (DateTime.Compare(next, currentTime) < 0)
                        {
                            next = next.AddDays(7);
                        }
                        return next;
                    }

                case Frequency.Daily:
                    {
                        DateTime next = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, settingsDateTime.Hour, settingsDateTime.Minute, settingsDateTime.Second);                        

                        if (DateTime.Compare(next, currentTime) < 0)
                        {
                            next = next.AddDays(1);
                        }
                        return next;
                    }

                case Frequency.Once:
                    {
                        DateTime next = new DateTime(settingsDateTime.Year, settingsDateTime.Month, settingsDateTime.Day, settingsDateTime.Hour, settingsDateTime.Minute, settingsDateTime.Second);

                        if (DateTime.Compare(next, currentTime) < 0)
                        {                            
                            return _checkpointFileDefaultDateTime;
                        }
                        return next;
                    }
                case Frequency.None:
                    {                        
                        return _checkpointFileDefaultDateTime;
                    }
                case Frequency.Hourly:
                    {                        
                        return currentTime.AddMinutes(this._serviceSettings.HourlyFrequencyInMinutes);
                    }
                default:                    
                    return _checkpointFileDefaultDateTime;
            }
        }