using PARR.BLL.Services.Interfaces; namespace PARR.BLL.Services.Implementations { internal class CalendarService : ICalendarService { private DateOnly GetEndPeriodDate(DateOnly startPeriod, TimeSpan distributionPeriod) { return startPeriod.AddDays(distributionPeriod.Days).AddDays(-1); } public List GetWorkDatesForPeriod(DateOnly startPeriod, TimeSpan distributionPeriod, GetWeekendsDelegate getWeekends) { var endPeriod = GetEndPeriodDate(startPeriod, distributionPeriod); //не получилось сделать асинхронным var weekends = getWeekends.Invoke(startPeriod, endPeriod).ToList(); //.ToListAsync(); //TODO: метод получения рабочих дней, получать актуальные рабочие дни за период //не стали добавлять праздничные и выходные дни сразу, так как повысится нагрузка на робота // на следующий месяц будет много изменений //временно сделаем список руками рабочих дней var workDays = GetDatesForPeriod(startPeriod, endPeriod); workDays = workDays.Where(t => weekends.Any(x => x != t)).ToList(); return workDays; } /// /// Временные данные пока не реализован сервис и логика /// /// /// /// private List GetDatesForPeriod(DateOnly startPeriod, DateOnly EndPeriod) { var workDaysList = new List(); var currentDay = startPeriod; while (currentDay <= EndPeriod) { // 29 дней, потому что в феврале 28, чтоб не париться, сделали так //if (currentDay.Day < 29) - не делаем, так как в таблице DistributionPeriods указали 28 дней workDaysList.Add(currentDay); currentDay = currentDay.AddDays(1); } return workDaysList.OrderBy(t => t).ToList(); } } //public class Test //{ // private readonly ICalendarService calendarService; // public Test(ICalendarService calendarService) // { // this.calendarService = calendarService; // } // public async void Ttt() // { // var tService = new TestService(); // // var endPeriod = calendarService.GetEndPeriodDate(new DateOnly(2024, 1, 1), TimeSpan.Parse("30:00:00:00")); // var workDays = await calendarService.GetWorkDatesForPeriodAsync(new DateOnly(2024, 1, 1), TimeSpan.Parse("30:00:00:00"), tService.GetWeekendsAsync); // } //} //public class TestService //{ // public async Task> GetWeekendsAsync(DateOnly start, DateOnly end) // { // await Task.Delay(1000); // return new List { new DateOnly(2024, 1, 12) }; // } //} }