Кок посчитать, сколько дней отпуска осталось?

Мне нужно посчитать, сколько у человека осталось дней отпуска. Например, он работает с 2020-05-13 по 2020-08-26.

  • Если его первый рабочий день был с 1 по 15 - он получает 2 дня отпуска;
  • С 15 по 25 - 1 день;
  • С 26 по 31 - 0 дней.

Дальше каждый месяц первого числа начисляется 2 дня.

Он может взять отпуск в этот период, тогда количество дней, что он взял, нужно отнять из общего числа дней отпуска.

Есть таблица с рабочими днями (1) и днями, когда он был в отпуске (3). По ней нужно почситать, сколько дней отпуска осталось.

введите сюда описание изображения


Ответы (2 шт):

Автор решения: MBo

Псевдокод для обхода таблицы может выглядеть примерно так:

month = -1
rest = 0 
for x in table:
    if x.month != month:
         if month >=0 || x.day <=15 :  
             rest +=2
         elif x.day <= 25:
             rest +=1
         month = x.month
    if x.reasonId = 3:
        rest -=1   
          
→ Ссылка
Автор решения: Johannes Krauser III

Если честно, я не до конца понял задачу. Но решение, думаю, будет таким:

DateTime[] workDays; //Рабочие дни в табличке, пусть формально она уже отсортирована по возрастанию
DateTime[] restDays; //Отпускные дни в табличке, тут уже сортировка не важна
int restCount = 0; //отпуск
DateTime tmp = new DateTime(); //Это для определения смены месяца
foreach (var item in workDays)
{
    if (item.Month != tmp.Month) //Если наступил следующий месяц
    {
        rest -= restDays.Where(d => d.Year == tmp.Year && d.Month == tmp.Month).Count(); //Вычитаем все отгуляные дни за этот месяц
        
        if (item.Day <= 15)
        {
            restCount += 2; //Если он вышел на работу до 15, то добавляем ему 2 дня отпуска
        }
        else if (item.Day <= 25)
        {
            restCount += 1; //Если он вышел на работу до 25, то добавляем ему 1 день отпуска
        }
        //Если не попал ни под одно условие, то ничего не добавляем
        tmp = item; //Зачитываем новый месяц
    }
}
→ Ссылка