Files
parr_api/PARR.BLL/Services/Implementations/CalendarService.cs
2024-07-02 10:52:15 +10:00

151 lines
5.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.Extensions.Logging;
using PARR.BLL.Services.Interfaces;
using PARR.Constants;
namespace PARR.BLL.Services.Implementations
{
internal class CalendarService : ICalendarService
{
private readonly ILogger<CalendarService> logger;
public CalendarService(ILogger<CalendarService> logger)
{
this.logger = logger;
}
private DateOnly GetEndPeriodDate(DateOnly startPeriod, DistributionPeriodTypeEnum periodType, string distributionPeriod)
{
//TODO: подходит для NextRun
switch (periodType)
{
case (DistributionPeriodTypeEnum.Day):
return startPeriod.AddDays(ParseInt(distributionPeriod)).AddDays(-1);
case (DistributionPeriodTypeEnum.Month):
return startPeriod.AddMonths(ParseInt(distributionPeriod)).AddDays(-1);
case (DistributionPeriodTypeEnum.Year):
return startPeriod.AddYears(ParseInt(distributionPeriod)).AddDays(-1);
//case (DistributionPeriodTypeEnum.TimeSpan):
// var timeSpan = ParseTimeSpan(distributionPeriod);
// return timeSpan.Days > 0 ? startPeriod.AddDays();
}
//return startPeriod.AddDays(duration.Days).AddDays(-1);
return startPeriod;
}
private int ParseInt(string value)
{
try
{
return int.Parse(value);
}
catch (Exception ex)
{
logger.LogError(ex, $"{nameof(CalendarService)}, получение конца периода. Не смог распарсить string в int для значения {value}.");
return 0;
}
}
//private TimeSpan ParseTimeSpan(string value)
//{
// try
// {
// return TimeSpan.Parse(value);
// }
// catch (Exception ex)
// {
// logger.LogError(ex, $"{nameof(CalendarService)}, получение конца периода. Не смог распарсить string в TimeSpan для значения {value}.");
// return new TimeSpan(0);
// }
//}
//public List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, TimeSpan duration, GetWeekendsDelegate getWeekends)
public List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, DistributionPeriodTypeEnum periodType, string distributionPeriod, GetWeekendsDelegate getWeekends)
{
var endPeriod = GetEndPeriodDate(startPeriod, periodType, distributionPeriod);
//не получилось сделать асинхронным
var weekends = getWeekends.Invoke(startPeriod, endPeriod).ToList(); //.ToListAsync();
//TODO: метод получения рабочих дней, получать актуальные рабочие дни за период
//не стали добавлять праздничные и выходные дни сразу, так как повысится нагрузка на робота
// на следующий месяц будет много изменений
//временно сделаем список руками рабочих дней
var workDays = GetDatesForPeriod(startPeriod, endPeriod);
if (weekends.Any())
workDays = workDays.Where(t => weekends.Any(x => x != t)).ToList();
return workDays;
}
/// <summary>
/// Временные данные пока не реализован сервис и логика
/// </summary>
/// <param name="startPeriod"></param>
/// <param name="EndPeriod"></param>
/// <returns></returns>
private List<DateOnly> GetDatesForPeriod(DateOnly startPeriod, DateOnly EndPeriod)
{
var workDaysList = new List<DateOnly>();
var currentDay = startPeriod;
while (currentDay <= EndPeriod)
{
//!!!!!!!! 29 дней, потому что в феврале 28, чтоб не париться, сделали так
if (currentDay.Day < 29)
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<List<DateOnly>> GetWeekendsAsync(DateOnly start, DateOnly end)
// {
// await Task.Delay(1000);
// return new List<DateOnly> { new DateOnly(2024, 1, 12) };
// }
//}
}