protected virtual bool UpdateToWaitTillServiceHours(TaskObject taskObject) { var now = DateTimeOffset.Now; if (taskObject.PlannedFor < now) { taskObject.PlannedFor = now; } //ServiceHours var currentTarget = taskObject.PlannedFor.ToLocalTime().TimeOfDay; if (currentTarget >= taskObject.TimeWindowStart && currentTarget <= taskObject.TimeWindowEnd) { return(false); } if (_bypassServiceHours) { _bypassServiceHours = false; return(false); } //out of Time window var haveToWait = taskObject.TimeWindowStart - currentTarget; if (currentTarget > taskObject.TimeWindowEnd) { haveToWait += TimeSpan.FromDays(1); } taskObject.PlannedFor = taskObject.PlannedFor.Add(haveToWait); return(true); }
protected virtual void PlanSingle(TaskObject taskObject, bool recurring = false) { if (_openTasks.FirstOrDefault(x => x.Name == taskObject.Name) is TaskObject planned) {//already planned OnNewLog("Warn", $"Task \"{planned.Name}\" already planned."); return; } //planning if (taskObject.SchedulingOptions.HasFlag(SchedulingOptions.RecurringByDynamicInterval)) { taskObject.PlannedFor = taskObject.LastStarted.Add(taskObject.DynamicInterval()); } else if (recurring && taskObject.SchedulingOptions.HasFlag(SchedulingOptions.RecurringByInterval)) { //only add interval after first performed taskObject.PlannedFor += taskObject.Interval; //no repeating for low PlannedFor´s if (taskObject.PlannedFor <= DateTimeOffset.Now) { taskObject.PlannedFor = DateTimeOffset.Now.Add(taskObject.Interval); } } //WaitTillServiceHours if (taskObject.SchedulingOptions.HasFlag(SchedulingOptions.DelayUntilNextTimeWindow)) { UpdateToWaitTillServiceHours(taskObject); } //adding _openTasks.Add(taskObject); OnNewLog("Info", $"Task {taskObject.Name} scheduled at {taskObject.PlannedFor.LocalDateTime.ToShortDateString()} {taskObject.PlannedFor.LocalDateTime.ToShortTimeString()}"); }