class MerchCalendar::MerchWeek

Represents the Merch Week for a specified date and calendar

Constants

MONTHS

Attributes

calendar[R]

The Merch Calendar that is being represented, either Fiscal or Retail

@!attribute [r] calendar

@return [Class] the calendar that determines the merch week
date[R]

The Julian date that is being represented

@!attribute [r] date

@return [Date] the date for this merch week

Public Class Methods

find(year, julian_month, week_number=nil, options={}) click to toggle source

Returns an array of merch weeks for a month, or a specific week.

@overload find(year, julian_month, week_number=nil, options)

Returns an array of +MerchWeek+s for a given month
@param year [Integer] the merch year to locate
@param julian_month [Integer] the month to find merch months for
@param week_number [Nil] set week_number to nil
@param options [Hash] options to set your calendar, if none it will default to RetailCalendar
@return [Array<MerchWeek>]

@overload find(year, julian_month, week_number)

@param year [Integer] the merch year to locate
@param julian_month [Integer] the month to find merch months for
@param week_number [Integer] the specific week number.
@param options [Hash] options to set your calendar, if none it will default to RetailCalendar
@return [MerchWeek] the specific merch week based on the week number
# File lib/merch_calendar/merch_week.rb, line 50
def self.find(year, julian_month, week_number=nil, options={})
  calendar = options.fetch(:calendar, RetailCalendar.new)
  if week_number.nil?
    calendar.weeks_for_month(year, julian_month)
  else
    calendar.weeks_for_month(year, julian_month)[week_number-1]
  end
end
from_date(julian_date, options = {}) click to toggle source

Locates the MerchWeek for a given Julian date.

@overload from_date(String)

@param julian_date [String] a julian date in the format of +YYYY-MM-DD+
@param options [Hash] opts the options to set your calendar, if none it will default to RetailCalendar
# @option opts [Class] :calendar The Calendar Class

@overload from_date(Date)

@param julian_date [Date] julian_date a +Date+ object
@param options [Hash] opts the options to set your calendar, if none it will default to RetailCalendar
# @option opts [Class] :calendar The Calendar Class

@return [MerchWeek]

# File lib/merch_calendar/merch_week.rb, line 31
def self.from_date(julian_date, options = {})
  MerchWeek.new(Date.parse("#{julian_date}"), options)
end
new(date, options = {}) click to toggle source

Pass in a date, make sure it is a valid date object @private

# File lib/merch_calendar/merch_week.rb, line 70
def initialize(date, options = {})
  @date = date
  
  #defaults to Retail Calendar if no other calendar is defined
  @calendar = options.fetch(:calendar, RetailCalendar.new)
  # Placeholders. These should be populated by functions if nil
  # week_start: nil, week_end: nil, week_number: nil
  @start_of_year = options[:start_of_year]
  @end_of_year = options[:end_of_year]

  @start_of_week = options[:start_of_week]
  @end_of_week = options[:end_of_week]
  @week = options[:week]

  @start_of_month = options[:start_of_month]
  @end_of_month = options[:end_of_month]
end
today(options={}) click to toggle source

Returns the MerchWeek for today's date

@param options [Hash] opts the options to set your calendar, if none it will default to RetailCalendar
# @option opts [Class] :calendar The Calendar Class

@return [MerchWeek]

# File lib/merch_calendar/merch_week.rb, line 64
def self.today(options={})
  MerchWeek.from_date(Date.today, options)
end

Public Instance Methods

end_of_month() click to toggle source

The end date of the merch month

@return [Date]

# File lib/merch_calendar/merch_week.rb, line 176
def end_of_month
  @end_of_month ||= calendar.end_of_month(year, merch_month)
end
end_of_week() click to toggle source

Returns the end date of this week

@return [Date]

# File lib/merch_calendar/merch_week.rb, line 140
def end_of_week
  @end_of_week ||= (start_of_week + 6)
end
end_of_year() click to toggle source

The end date of the corresponding merch year

@return [Date]

# File lib/merch_calendar/merch_week.rb, line 162
def end_of_year
  @end_of_year ||= calendar.end_of_year(year)
end
merch_month() click to toggle source

This returns the “merch month” number for a date Month 1 is Feb for the retail calendar Month 1 is August for the fiscal calendar

@return [Integer]

# File lib/merch_calendar/merch_week.rb, line 100
def merch_month
  # TODO: This is very inefficient, but less complex than strategic guessing
  # maybe switch to a binary search or something
  merch_year = calendar.merch_year_from_date(date)
  @merch_month ||= (1..12).detect do |num|
    calendar.end_of_month(merch_year, num) >= date && date >= calendar.start_of_month(merch_year, num)
  end
end
month() click to toggle source

Returns julian month where the merch week falls

@return [Integer]

# File lib/merch_calendar/merch_week.rb, line 119
def month
  @month ||= calendar.merch_to_julian(merch_month)
end
quarter() click to toggle source

Returns the quarter that this merch week falls

@return [Integer]

# File lib/merch_calendar/merch_week.rb, line 126
def quarter
  @quarter ||= calendar.quarter(merch_month)
end
season() click to toggle source

The merch season this date falls under. Returns a string of Fall/Winter or Spring/Summer

@return [String]

# File lib/merch_calendar/merch_week.rb, line 184
def season
  @season ||= calendar.season(merch_month)
end
start_of_month() click to toggle source

The start date of the merch month

@return [Date]

# File lib/merch_calendar/merch_week.rb, line 169
def start_of_month
  @start_of_month ||= calendar.start_of_month(year, merch_month)
end
start_of_week() click to toggle source

Returns the start date of this week

@return [Date]

# File lib/merch_calendar/merch_week.rb, line 133
def start_of_week
  @start_of_week ||= (start_of_month + (7 * (week - 1)))
end
start_of_year() click to toggle source

The start date of the corresponding merch year

@return [Date]

# File lib/merch_calendar/merch_week.rb, line 155
def start_of_year
  @start_of_year ||= calendar.start_of_year(year)
end
to_s(format = :short) click to toggle source

Outputs a text representation of this merch week

Format keys:

  • :short (default) “Dec W5”

  • :long “2012:48 Dec W5”

  • :elasticsearch (default) “2012-12w05”

@param format [Symbol] the format identifier to return. Default is :short @return [Date]

# File lib/merch_calendar/merch_week.rb, line 197
def to_s(format = :short)
  case format
  when :elasticsearch
    sprintf("%04d-%02dw%02d", year, month, week)
  when :long
    "#{year}:#{year_week} #{self.to_s(:short)}"
  else
    "#{MONTHS[month - 1]} W#{week}"
  end
end
week() click to toggle source

The number of the week within the given merch month will be between 1 and 5

@return [Integer]

# File lib/merch_calendar/merch_week.rb, line 148
def week
  @week ||= (((date-start_of_month)+1)/7.0).ceil
end
year() click to toggle source

Returns the Merch year depending whether it is from the Retail or Fiscal calendar

@return [Integer]

# File lib/merch_calendar/merch_week.rb, line 112
def year
  @year ||= calendar.merch_year_from_date(date)
end
year_week() click to toggle source

What week it is within the year from 1-53

@return [Integer] The week number of the year, from 1-53

# File lib/merch_calendar/merch_week.rb, line 91
def year_week
  @year_week ||= (((date-start_of_year)+1)/7.0).ceil
end