class RetailCalendar::Finder

Constants

QUARTER_LENGTH
SEASON_LENGTH
YEAR_LENGTH

Attributes

offset[RW]

Public Class Methods

new(offset = '+0000') click to toggle source
# File lib/retail_calendar/finder.rb, line 13
def initialize(offset = '+0000')
  @offset = offset
end

Public Instance Methods

determine_current_year(curr_date = DateTime.now.change(:offset => @offset)) click to toggle source
# File lib/retail_calendar/finder.rb, line 132
def determine_current_year(curr_date = DateTime.now.change(:offset => @offset))
  curr_date_year = DateTime.now.change(:offset => @offset).year
  if (curr_date >= year(curr_date_year).start_date && curr_date <= year(curr_date_year).end_date)
    return curr_date_year
  elsif curr_date < year(curr_date_year).start_date
    return curr_date_year - 1
  elsif curr_date > year(curr_date_year).end_date
    return curr_date_year + 1
  end
end
get_from_date(date) click to toggle source
# File lib/retail_calendar/finder.rb, line 163
def get_from_date(date)
  Dish({
    period: get_period(date),
    quarter: get_quarter(date),
    season: get_season(date)
  })
end
last_period() click to toggle source
# File lib/retail_calendar/finder.rb, line 119
def last_period
  current_year = determine_current_year
  current_period = get_period
  if current_period == 1
    previous_year = current_year - 1
    previous_period = 12
  else
    previous_year = current_year
    previous_period = current_period - 1
  end
  period(previous_year, previous_period)
end
last_quarter() click to toggle source
# File lib/retail_calendar/finder.rb, line 100
def last_quarter
  current_year = determine_current_year
  current_quarter = get_quarter
  if current_quarter == 1
    previous_year = current_year - 1
    previous_quarter = 4
  else
    previous_year = current_year
    previous_quarter = current_quarter - 1
  end
  quarter(previous_year, previous_quarter)
end
last_season() click to toggle source
# File lib/retail_calendar/finder.rb, line 81
def last_season
  current_year = determine_current_year
  current_season = get_season
  if current_season == 1
    previous_year = current_year - 1
    previous_season = 2
  else
    previous_year = current_year
    previous_season = current_season - 1
  end
  season(previous_year, previous_season)
end
last_week() click to toggle source
# File lib/retail_calendar/finder.rb, line 149
def last_week
  start_date = DateTime.now.change(:offset => @offset) - 1.week
  start_date = start_date.beginning_of_week(start_day = :sunday)
  end_date = start_date + 1.week - 1
  create_return_object(start_date,end_date)
end
last_year() click to toggle source
# File lib/retail_calendar/finder.rb, line 73
def last_year
  year(determine_current_year - 1)
end
period(year, period) click to toggle source
# File lib/retail_calendar/finder.rb, line 30
def period(year, period)
  period = period.to_i
  raise ArgumentError, 'invalid period' if (period > 12 or period < 1)
  start_date = start_time_for_year(year)
  for i in 1..(period - 1)
    start_date = start_date + weeks_in_month((i % 12) + 1).weeks
  end
  end_date = start_date + weeks_in_month((period % 12) + 1).weeks - 1
  if year_has_extra_week?(year) and period == 12
    end_date = end_date + 1.week
  end
  create_return_object(start_date,end_date)
end
quarter(year, quarter) click to toggle source
# File lib/retail_calendar/finder.rb, line 44
def quarter(year, quarter)
  quarter = quarter.to_i
  raise ArgumentError, 'invalid quarter' if (quarter > 4 or quarter < 1)
  start_date = start_time_for_year(year) + (QUARTER_LENGTH * (quarter - 1))
  end_date = start_date + QUARTER_LENGTH - 1
  if year_has_extra_week?(year) and quarter == 4
    end_date = end_date + 1.week
  end
  create_return_object(start_date,end_date)
end
season(year, season) click to toggle source
# File lib/retail_calendar/finder.rb, line 55
def season(year, season)
  season = season.to_i
  raise ArgumentError, 'invalid season' if (season > 2 or season < 1)
  start_date = start_time_for_year(year) + (SEASON_LENGTH * (season - 1))
  end_date = start_date + SEASON_LENGTH - 1
  if year_has_extra_week?(year) and season == 2
    end_date = end_date + 1.week
  end
  create_return_object(start_date,end_date)
end
this_period() click to toggle source
# File lib/retail_calendar/finder.rb, line 143
def this_period
  current_year = determine_current_year
  current_period = get_period
  period(current_year, current_period)
end
this_quarter() click to toggle source
# File lib/retail_calendar/finder.rb, line 113
def this_quarter
  current_year = determine_current_year
  current_quarter = get_quarter
  quarter(current_year, current_quarter)
end
this_season() click to toggle source
# File lib/retail_calendar/finder.rb, line 94
def this_season
  current_year = determine_current_year
  current_season = get_season
  season(current_year, current_season)
end
this_week() click to toggle source
# File lib/retail_calendar/finder.rb, line 156
def this_week
  start_date = DateTime.now.change(:offset => @offset)
  start_date = start_date.beginning_of_week(start_day = :sunday)
  end_date = start_date + 1.week - 1
  create_return_object(start_date,end_date)
end
this_year() click to toggle source
# File lib/retail_calendar/finder.rb, line 77
def this_year
  year(determine_current_year)
end
week(year, period, week) click to toggle source
# File lib/retail_calendar/finder.rb, line 17
def week(year, period, week)
  period = period.to_i
  raise ArgumentError, 'invalid period' if (period > 12 or period < 1)
  week = week.to_i
  raise ArgumentError, 'invalid week' if (week > 5 or week < 1)
  start_date = period(year, period).start_date
  for i in 1..(week - 1)
    start_date = start_date + 7
  end
  end_date = start_date + 1.week - 1
  create_return_object(start_date,end_date)
end
year(year) click to toggle source
# File lib/retail_calendar/finder.rb, line 66
def year(year)
  start_date = start_time_for_year(year)
  end_date = start_date + YEAR_LENGTH - 1
  end_date = year_has_extra_week?(year) ? (end_date + 1.week) : end_date
  create_return_object(start_date,end_date)
end

Private Instance Methods

create_return_object(start_date, end_date) click to toggle source
# File lib/retail_calendar/finder.rb, line 205
def create_return_object(start_date, end_date)
  Dish({
    start_date: start_date,
    end_date: end_date
  })
end
get_period(curr_date = DateTime.now.change(:offset => @offset)) click to toggle source
# File lib/retail_calendar/finder.rb, line 194
def get_period(curr_date = DateTime.now.change(:offset => @offset))
  start_date = start_time_for_year(determine_current_year(curr_date))
  period = 1
  while start_date < curr_date
    no_weeks = weeks_in_month(period + 1)
    start_date += no_weeks.weeks
    period += 1
  end
  period - 1
end
get_quarter(curr_date = DateTime.now.change(:offset => @offset)) click to toggle source
# File lib/retail_calendar/finder.rb, line 179
def get_quarter(curr_date = DateTime.now.change(:offset => @offset))
  start_date = start_time_for_year(determine_current_year(curr_date))
  days_passed = (curr_date.to_date - start_date.to_date).to_i
  case days_passed
  when 0..91
    1
  when 92..182
    2
  when 183..273
    3
  else
    4
  end
end
get_season(curr_date = DateTime.now.change(:offset => @offset)) click to toggle source
# File lib/retail_calendar/finder.rb, line 173
def get_season(curr_date = DateTime.now.change(:offset => @offset))
  start_date = start_time_for_year(determine_current_year(curr_date))
  days_passed = (curr_date.to_date - start_date.to_date).to_i
  days_passed < SEASON_LENGTH ? 1 : 2
end
start_time_for_year(year) click to toggle source
# File lib/retail_calendar/finder.rb, line 217
def start_time_for_year(year)
  year = year.to_i
  jan31 = DateTime.new(year,1,31).change(:offset => @offset)
  jan31day = jan31.cwday
  if jan31day < 3
    start = jan31 - jan31day
  elsif jan31day < 7
    start = jan31 + (7 - jan31day)
  elsif jan31day == 7
    start = jan31
  end
  start
end
weeks_in_month(month) click to toggle source
# File lib/retail_calendar/finder.rb, line 212
def weeks_in_month(month)
  month = month.to_i
  month % 3 == 0 ? 5 : 4
end
year_has_extra_week?(year) click to toggle source
# File lib/retail_calendar/finder.rb, line 231
def year_has_extra_week?(year)
  year = year.to_i
  expected = start_time_for_year(year) + 364
  actual = start_time_for_year(year + 1)
  actual > expected ? true : false
end