module RussianProductionCalendar
Constants
- CALENDAR_PATH
Звездочкой (*) отмечены предпраздничные (сокращенные) дни. Плюсом (+) отмечены перенесенные выходные дни
- DAY_SEP
- Error
- MONTHS_MAP
- NotFoundError
- SHORTENED_POSTFIX
- VERSION
- WEEKEND_POSTPONED_POSTFIX
Public Instance Methods
@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
@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
@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
@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
@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
@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
@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
@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
@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
@return [Boolean]
# File lib/russian_production_calendar.rb, line 40 def workday?(date) !holiday?(date) end
Private Instance Methods
# File lib/russian_production_calendar.rb, line 128 def csv CSV.open(File.join(__dir__, CALENDAR_PATH), headers: true).map(&:to_h) end
@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