Class: MerchCalendar::MerchWeek

Inherits:
Object
  • Object
show all
Defined in:
lib/merch_calendar/merch_week.rb

Overview

Represents the Merch Week for a specified date and calendar

Constant Summary collapse

MONTHS =
%w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec).freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(date, options = {}) ⇒ MerchWeek

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



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# 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

Instance Attribute Details

#calendarObject (readonly)

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



18
19
20
# File 'lib/merch_calendar/merch_week.rb', line 18

def calendar
  @calendar
end

#dateObject (readonly)

The Julian date that is being represented



12
13
14
# File 'lib/merch_calendar/merch_week.rb', line 12

def date
  @date
end

Class Method Details

.find(year, julian_month, week_number = nil, options) ⇒ Array<MerchWeek> .find(year, julian_month, week_number) ⇒ MerchWeek

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

Overloads:

  • .find(year, julian_month, week_number = nil, options) ⇒ Array<MerchWeek>

    Returns an array of MerchWeeks for a given month

    Parameters:

    • year (Fixnum)

      the merch year to locate

    • julian_month (Fixnum)

      the month to find merch months for

    • week_number (Nil) (defaults to: nil)

      set week_number to nil

    • options (Hash)

      options to set your calendar, if none it will default to RetailCalendar

    Returns:

  • .find(year, julian_month, week_number) ⇒ MerchWeek

    Returns the specific merch week based on the week number.

    Parameters:

    • year (Fixnum)

      the merch year to locate

    • julian_month (Fixnum)

      the month to find merch months for

    • week_number (Fixnum)

      the specific week number.

    • options (Hash)

      options to set your calendar, if none it will default to RetailCalendar

    Returns:

    • (MerchWeek)

      the specific merch week based on the week number



50
51
52
53
54
55
56
57
# 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(String) ⇒ MerchWeek .from_date(Date) ⇒ MerchWeek

Locates the MerchWeek for a given Julian date.

Overloads:

  • .from_date(String) ⇒ MerchWeek

    # @option opts [Class] :calendar The Calendar Class

    Parameters:

    • julian_date (String)

      a julian date in the format of YYYY-MM-DD

    • options (Hash)

      opts the options to set your calendar, if none it will default to RetailCalendar

  • .from_date(Date) ⇒ MerchWeek

    # @option opts [Class] :calendar The Calendar Class

    Parameters:

    • julian_date (Date)

      julian_date a Date object

    • options (Hash)

      opts the options to set your calendar, if none it will default to RetailCalendar

Returns:



31
32
33
# File 'lib/merch_calendar/merch_week.rb', line 31

def self.from_date(julian_date, options = {})
  MerchWeek.new(Date.parse("#{julian_date}"), options)
end

.today(options = {}) ⇒ MerchWeek

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

Returns:



64
65
66
# File 'lib/merch_calendar/merch_week.rb', line 64

def self.today(options={})
  MerchWeek.from_date(Date.today, options)
end

Instance Method Details

#end_of_monthDate

The end date of the merch month

Returns:

  • (Date)


176
177
178
# 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_weekDate

Returns the end date of this week

Returns:

  • (Date)


140
141
142
# File 'lib/merch_calendar/merch_week.rb', line 140

def end_of_week
  @end_of_week ||= (start_of_week + 6)
end

#end_of_yearDate

The end date of the corresponding merch year

Returns:

  • (Date)


162
163
164
# File 'lib/merch_calendar/merch_week.rb', line 162

def end_of_year
  @end_of_year ||= calendar.end_of_year(year)
end

#merch_monthFixnum

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

Returns:

  • (Fixnum)


100
101
102
103
104
105
106
107
# 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

#monthFixnum

Returns julian month where the merch week falls

Returns:

  • (Fixnum)


119
120
121
# File 'lib/merch_calendar/merch_week.rb', line 119

def month
  @month ||= calendar.merch_to_julian(merch_month)
end

#quarterFixnum

Returns the quarter that this merch week falls

Returns:

  • (Fixnum)


126
127
128
# File 'lib/merch_calendar/merch_week.rb', line 126

def quarter
  @quarter ||= calendar.quarter(merch_month)
end

#seasonString

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

Returns:

  • (String)


184
185
186
# File 'lib/merch_calendar/merch_week.rb', line 184

def season
  @season ||= calendar.season(merch_month)
end

#start_of_monthDate

The start date of the merch month

Returns:

  • (Date)


169
170
171
# 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_weekDate

Returns the start date of this week

Returns:

  • (Date)


133
134
135
# 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_yearDate

The start date of the corresponding merch year

Returns:

  • (Date)


155
156
157
# 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) ⇒ Date

Outputs a text representation of this merch week

Format keys:

  • :short (default) “Dec W5”

  • :long “2012:48 Dec W5”

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

Parameters:

  • format (Symbol) (defaults to: :short)

    the format identifier to return. Default is :short

Returns:

  • (Date)


197
198
199
200
201
202
203
204
205
206
# 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

#weekFixnum

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

Returns:

  • (Fixnum)


148
149
150
# File 'lib/merch_calendar/merch_week.rb', line 148

def week
  @week ||= (((date-start_of_month)+1)/7.0).ceil
end

#yearFixnum

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

Returns:

  • (Fixnum)


112
113
114
# File 'lib/merch_calendar/merch_week.rb', line 112

def year
  @year ||= calendar.merch_year_from_date(date)
end

#year_weekFixnum

What week it is within the year from 1-53

Returns:

  • (Fixnum)

    The week number of the year, from 1-53



91
92
93
# File 'lib/merch_calendar/merch_week.rb', line 91

def year_week
  @year_week ||= (((date-start_of_year)+1)/7.0).ceil
end