class UkFinancialYear

Makes working with the UK financial or fiscal year easier.

Public Class Methods

from_s(s) click to toggle source

creates a new UkFinancialYear from a string in the form ‘2000/01’ @param [String] s the two years of the financial year in the form of the first year as four digits, a ‘/’, then the last year as two digits @raise [RuntimeError] if the string cannot be parsed to a financial year @return [UkFinancialYear] the financial year specified by the string

# File lib/uk_financial_year.rb, line 31
def UkFinancialYear.from_s s
  check_format s
  new(Date.new s.to(3).to_i, 4, 6)
end
new(date=Date.today) click to toggle source

creates a new UkFinancialYear as the financial year which includes the given date @param [Date] date the date to create a financial year for. If missing returns the current financial year @return [UkFinancialYear] the financial year which covers the date

# File lib/uk_financial_year.rb, line 12
def initialize date=Date.today
  start_date = start_date date
  @range = start_date...start_date.next_year
end

Private Class Methods

check_format(s) click to toggle source
# File lib/uk_financial_year.rb, line 113
def self.check_format s
  if /^(?<year1>\d{4})\/(?<year2>\d{2})$/ =~ s
    year1 = year1.to_i
    year1_century = year1 / 100
    year2_century = year1 % 100 == 99 ? year1_century + 1 : year1_century
    year2 = year2_century * 100 + year2.to_i
    raise %{"#{year1}" and "#{year2}" are not consecutive years} unless year1 + 1 == year2
  else
    raise %{"#{s}" does not match FY string format}
  end
end

Public Instance Methods

<=>(other) click to toggle source

lesser financial years are those which occur earliest

# File lib/uk_financial_year.rb, line 102
def <=> other
  self.first_day <=> other.first_day
end
==(other) click to toggle source

equality method

# File lib/uk_financial_year.rb, line 97
def == other
  self.first_day == other.first_day
end
adjacent?(other_financial_year) click to toggle source
# File lib/uk_financial_year.rb, line 67
def adjacent? other_financial_year
  other_financial_year.last_day.tomorrow == self.first_day or other_financial_year.first_day.yesterday == self.last_day
end
after?(date_or_fy) click to toggle source

tells if the given date or financial year is after this one @param (see UkFinancialYear#before?) @return [Boolean] to indicate if this financial year is after

# File lib/uk_financial_year.rb, line 81
def after? date_or_fy
  self.first_day > date_to_compare(date_or_fy)
end
before?(date_or_fy) click to toggle source

tells if the given date or financial year is before this one @param [Date] date_or_fy date or financial year to check @return [Boolean] to indicate if this financial year is before

# File lib/uk_financial_year.rb, line 74
def before? date_or_fy
  self.first_day < date_to_compare(date_or_fy)
end
first_day() click to toggle source

returns the date of the first day of the financial year @return [Date] the first day

# File lib/uk_financial_year.rb, line 38
def first_day
  @range.min
end
include?(date) click to toggle source

tells if the financial year includes the given date @param [Date] date the date to check @return [Boolean] to indicate if the date is within the financial year

# File lib/uk_financial_year.rb, line 51
def include? date
  @range.include? date
end
last_day() click to toggle source

returns the date of the last day of the financial year @return [Date] the last day

# File lib/uk_financial_year.rb, line 44
def last_day
  @range.max
end
next() click to toggle source

returns the next financial year @return [UkFinancialYear] the next financial year

# File lib/uk_financial_year.rb, line 57
def next
  UkFinancialYear.new self.first_day.next_year
end
period_before(date) click to toggle source

returns the period before this date in the financial year @param [Date] date a date in the financial year @return [Range<Date>] the period before this date in the the financial year

# File lib/uk_financial_year.rb, line 89
def period_before date
  raise "#{date} is before FY #{to_s} which starts on #{first_day}" if date < first_day
  raise "#{date} is after FY #{to_s} which ends on #{last_day}" if date > last_day

  first_day...date
end
previous() click to toggle source

returns the previous financial year @return [UkFinancialYear] the previous financial year

# File lib/uk_financial_year.rb, line 63
def previous
  UkFinancialYear.new self.first_day.prev_year
end
to_s() click to toggle source

returns string representation of the financial year in the form ‘2000/01’. This is the form HMRC use. @return [String] representation in the form of the first year as four digits, a ‘/’, then the last year as two digits

# File lib/uk_financial_year.rb, line 21
def to_s
  "#{first_day.year}/#{last_day.year.to_s.from 2}"
end

Private Instance Methods

date_to_compare(other) click to toggle source
# File lib/uk_financial_year.rb, line 125
def date_to_compare other
  other.is_a?(Date) ? other : other.first_day
end
start_date(date) click to toggle source
# File lib/uk_financial_year.rb, line 108
def start_date date
  swap_date_that_year = date.change day: 6, month: 4
  date < swap_date_that_year ? swap_date_that_year.prev_year : swap_date_that_year
end