Sha256: 894c9897b8146545676ba566dbed0c9b41fc6d4fac1e4cfde4d5f8ddc8525f23

Contents?: true

Size: 1.45 KB

Versions: 1

Compression:

Stored size: 1.45 KB

Contents

class Date
  def self.q1(year)
    Date.new(year,1)
  end

  def self.q2(year)
    Date.new(year,4)
  end

  def self.q3(year)
    Date.new(year,7)
  end

  def self.q4(year)
    Date.new(year,10)
  end

  def quarter
    1 + ((month - 1) / 3)
  end

  def self.quarterly year, quarter = 1, qday = 1
    case quarter
    when 1
      self.q1(year) + (qday - 1)
    when 2
      self.q2(year) + (qday - 1)
    when 3
      self.q3(year) + (qday - 1)
    when 4
      self.q4(year) + (qday - 1)
    else
      raise ArgumentError, "quarter #{quarter} is not 1-4"
    end 
  end

  def qday
    1 + (self - Date.quarterly(self.year, quarter)).to_i
  end

  def next_quarter count = 1
    raise ArgumentError, "count #{count} is < 1" if count < 1
    
    quarter = self.quarter + count % 4
    year = self.year + count / 4
    
    if quarter > 4
      year += 1
      quarter = (quarter - 4)
    end

    Date.quarterly(year, quarter, self.qday)
  end
end

module Scheduling
class Quarterly < Struct.new(:qday)
  def occurances time_range
    raise RangeDecreasingError if time_range.decreasing?
    cur = Date.quarterly(time_range.min.year, time_range.min.quarter, qday)

    start = time_range.min
    if cur < start
      cur = cur.next_quarter
    end

    occurances = []

    stop = time_range.last
    if time_range.exclude_end?
      stop -= 1
    end

    while cur <= stop
      occurances.push cur
      cur = cur.next_quarter
    end

    return occurances
  end
end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
scheduling-0.1.2 lib/scheduling/regularity/quarterly.rb