module RussianProductionCalendar

Constants

CALENDAR_PATH

Звездочкой (*) отмечены предпраздничные (сокращенные) дни. Плюсом (+) отмечены перенесенные выходные дни

DAY_SEP
Error
MONTHS_MAP
NotFoundError
SHORTENED_POSTFIX
VERSION
WEEKEND_POSTPONED_POSTFIX

Public Instance Methods

gt_holiday(day) click to toggle source

@param [Date] @return [Date] следующий выходной день

# File lib/russian_production_calendar.rb, line 96
def gt_holiday(day)
  loop do
    day = day.next_day
    break day if holiday?(day)
  end
end
gt_workday(day) click to toggle source

@param [Date] @return [Date] следующий рабочий день

# File lib/russian_production_calendar.rb, line 62
def gt_workday(day)
  loop do
    day = day.next_day
    break day if workday?(day)
  end
end
gte_holiday(day) click to toggle source

@param [Date] @return [Date] следующий выходной день (или текущий, если он выходной)

# File lib/russian_production_calendar.rb, line 88
def gte_holiday(day)
  loop do
    holiday?(day) ? (break day) : (day = day.next_day)
  end
end
gte_workday(day) click to toggle source

@param [Date] @return [Date] следующий рабочий день (или текущий, если он рабочий)

# File lib/russian_production_calendar.rb, line 54
def gte_workday(day)
  loop do
    workday?(day) ? (break day) : (day = day.next_day)
  end
end
holiday?(date) click to toggle source

@return [Boolean] true/false - выходной/рабочий

# File lib/russian_production_calendar.rb, line 34
def holiday?(date)
  days = index.dig(date.year, date.month) || raise(NotFoundError, date)
  days.include?(date.day)
end
lt_holiday(day) click to toggle source

@param [Date] @return [Date] предыдущий рабочий день

# File lib/russian_production_calendar.rb, line 105
def lt_holiday(day)
  loop do
    day = day.prev_day
    break day if holiday?(day)
  end
end
lt_workday(day) click to toggle source

@param [Date] @return [Date] предыдущий рабочий день

# File lib/russian_production_calendar.rb, line 71
def lt_workday(day)
  loop do
    day = day.prev_day
    break day if workday?(day)
  end
end
lte_holiday(day) click to toggle source

@param [Date] @return [Date] предыдущий выходной день (или текущий, если он выходной)

# File lib/russian_production_calendar.rb, line 80
def lte_holiday(day)
  loop do
    holiday?(day) ? (break day) : (day = day.prev_day)
  end
end
lte_workday(day) click to toggle source

@param [Date] @return [Date] предыдущий рабочий день (или текущий, если он рабочий)

# File lib/russian_production_calendar.rb, line 46
def lte_workday(day)
  loop do
    workday?(day) ? (break day) : (day = day.prev_day)
  end
end
workday?(date) click to toggle source

@return [Boolean]

# File lib/russian_production_calendar.rb, line 40
def workday?(date)
  !holiday?(date)
end

Private Instance Methods

csv() click to toggle source
# File lib/russian_production_calendar.rb, line 128
def csv
  CSV.open(File.join(__dir__, CALENDAR_PATH), headers: true).map(&:to_h)
end
index() click to toggle source

@return [Hash( => Hash( => [Set]))] @example {“2018” => { 1 => [1, 2, 3] }}

# File lib/russian_production_calendar.rb, line 116
def index
  @index ||= csv.each_with_object({}) do |row, object|
    year = Integer(row.fetch('Год/Месяц'))

    object[year] = MONTHS_MAP.each_with_object({}) do |(ix, name), obj|
      obj[ix] = row.fetch(name).split(DAY_SEP).each_with_object(Set.new) do |day, result|
        result.add(Integer(day.delete(WEEKEND_POSTPONED_POSTFIX))) unless day[SHORTENED_POSTFIX]
      end
    end
  end
end