Introduction
Introduction Statistics Contact Development Disclaimer Help
reporting_period.rb - reportable - Fork of reportable required by WarVox, from …
git clone git://jay.scot/reportable
Log
Files
Refs
README
---
reporting_period.rb (6711B)
---
1 module Saulabs
2
3 module Reportable
4
5 # A reporting period is a specific hour or a specific day etc. depen…
6 #
7 class ReportingPeriod
8
9 # The actual +DateTime the reporting period represents
10 #
11 attr_reader :date_time
12
13 # The {Saulabs::Reportable::Grouping} of the reporting period
14 #
15 attr_reader :grouping
16
17 # Initializes a new reporting period.
18 #
19 # @param [Saulabs::Reportable::Grouping] grouping
20 # the grouping the generate the reporting period for
21 # @param [DateTime] date_time
22 # the +DateTime+ to generate the reporting period for
23 #
24 def initialize(grouping, date_time = nil)
25 @grouping = grouping
26 @date_time = parse_date_time(date_time || DateTime.now)
27 end
28
29 # Gets a reporting period relative to the current one.
30 #
31 # @param [Fixnum] offset
32 # the offset to get the reporting period for
33 #
34 # @return [Saulabs::Reportable::ReportingPeriod]
35 # the reporting period relative by offset to the current one
36 #
37 # @example Getting the reporting period one week later
38 #
39 # reporting_period = Saulabs::Reportable::ReportingPeriod.new(:w…
40 # next_week = reporting_period.offset(1)
41 #
42 def offset(offset)
43 self.class.new(@grouping, @date_time + offset.send(@grouping.ide…
44 end
45
46 # Gets the first reporting period for a grouping and a limit (opti…
47 #
48 # @param [Saulabs::ReportingPeriod::Grouping] grouping
49 # the grouping to get the first reporting period for
50 # @param [Fixnum] limit
51 # the limit to get the first reporting period for
52 # @param [DateTime] end_date
53 # the end date to get the first reporting period for (the first …
54 #
55 # @return [Saulabs::Reportable::ReportingPeriod]
56 # the first reporting period for the grouping, limit and optiona…
57 #
58 def self.first(grouping, limit, end_date = nil)
59 self.new(grouping, end_date).offset(-limit)
60 end
61
62 # Gets a reporting period from a DB date string.
63 #
64 # @param [Saulabs::Reportable::Grouping] grouping
65 # the grouping to get the reporting period for
66 # @param [String] db_string
67 # the DB string to parse and get the reporting period for
68 #
69 # @return [Saulabs::Reportable::ReportingPeriod]
70 # the reporting period for the {Saulabs::Reportable::Grouping} a…
71 #
72 def self.from_db_string(grouping, db_string)
73 return self.new(grouping, db_string) if db_string.is_a?(Date) ||…
74 parts = grouping.date_parts_from_db_string(db_string.to_s)
75 case grouping.identifier
76 when :hour
77 self.new(grouping, DateTime.new(parts[0], parts[1], parts[2]…
78 when :day
79 self.new(grouping, Date.new(parts[0], parts[1], parts[2]))
80 when :week
81 self.new(grouping, Date.commercial(parts[0], parts[1], 1))
82 when :month
83 self.new(grouping, Date.new(parts[0], parts[1], 1))
84 end
85 end
86
87 # Gets the next reporting period.
88 #
89 # @return [Saulabs::Reportable::ReportingPeriod]
90 # the reporting period after the current one
91 #
92 def next
93 self.offset(1)
94 end
95
96 # Gets the previous reporting period.
97 #
98 # @return [Saulabs::Reportable::ReportingPeriod]
99 # the reporting period before the current one
100 #
101 def previous
102 self.offset(-1)
103 end
104
105 # Gets whether the reporting period +other+ is equal to the curren…
106 #
107 # @param [Saulabs::Reportable::ReportingPeriod] other
108 # the reporting period to check for whether it is equal to the c…
109 #
110 # @return [Boolean]
111 # true if +other+ is equal to the current reporting period, fals…
112 #
113 def ==(other)
114 if other.is_a?(Saulabs::Reportable::ReportingPeriod)
115 @date_time == other.date_time && @grouping.identifier == other…
116 elsif other.is_a?(Time) || other.is_a?(DateTime)
117 @date_time == parse_date_time(other)
118 else
119 raise ArgumentError.new("Can only compare instances of #{self.…
120 end
121 end
122
123 # Gets whether the reporting period +other+ is smaller to the curr…
124 #
125 # @param [Saulabs::Reportable::ReportingPeriod] other
126 # the reporting period to check for whether it is smaller to the…
127 #
128 # @return [Boolean]
129 # true if +other+ is smaller to the current reporting period, fa…
130 #
131 def <(other)
132 if other.is_a?(Saulabs::Reportable::ReportingPeriod)
133 return @date_time < other.date_time
134 elsif other.is_a?(Time) || other.is_a?(DateTime)
135 @date_time < parse_date_time(other)
136 else
137 raise ArgumentError.new("Can only compare instances of #{self.…
138 end
139 end
140
141 # Gets the latest point in time that is included the reporting per…
142 # for grouping hour would be that hour and 59 minutes and 59 secon…
143 #
144 # @return [DateTime]
145 # the latest point in time that is included in the reporting per…
146 #
147 def last_date_time
148 case @grouping.identifier
149 when :hour
150 DateTime.new(@date_time.year, @date_time.month, @date_time.d…
151 when :day
152 DateTime.new(@date_time.year, @date_time.month, @date_time.d…
153 when :week
154 date_time = (@date_time - @date_time.wday.days) + 7.days
155 Date.new(date_time.year, date_time.month, date_time.day)
156 when :month
157 Date.new(@date_time.year, @date_time.month, (Date.new(@date_…
158 end
159 end
160
161 private
162
163 def parse_date_time(date_time)
164 case @grouping.identifier
165 when :hour
166 DateTime.new(date_time.year, date_time.month, date_time.da…
167 when :day
168 date_time.to_date
169 when :week
170 date_time = (date_time - date_time.wday.days) + 1.day
171 Date.new(date_time.year, date_time.month, date_time.day)
172 when :month
173 Date.new(date_time.year, date_time.month, 1)
174 end
175 end
176
177 end
178
179 end
180
181 end
You are viewing proxied material from jay.scot. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.