pacing 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +33 -0
- data/lib/pacing/error.rb +1 -2
- data/lib/pacing/normalizer.rb +9 -7
- data/lib/pacing/pacer.rb +13 -3
- data/lib/pacing/version.rb +1 -1
- data/spec/pacing_spec.rb +77 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 11132b13902786c1b44efc9c3dc217f0e56675de6e9c90ee7f9e86ed8b8c297d
|
4
|
+
data.tar.gz: 5ecf36d92525e32a963cc1ec0739535c23085679fb40edb64ed4e354f2661dd7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8ba5d05efddeb02e010e036073b12faf2a9bc5ecf0ee9eabcae2004aa132388babdd07f7d11a290c84f8a389ddbe1ff9a7b809d3e70dc100937963557c7f877
|
7
|
+
data.tar.gz: b37f58965f1f2aac5f78c56b5e1b8144dc9f993387103bd28a51fc6f241d81ebd7bd4edef7cd002e9df0f29075db8a22a1a17218f7fb3e260ad7138e1bf755eb
|
data/README.md
CHANGED
@@ -117,6 +117,39 @@ paced.calculate
|
|
117
117
|
]
|
118
118
|
=end
|
119
119
|
|
120
|
+
# Optionally if we want to include the frequency of the discipline in the pacing output we can
|
121
|
+
# pass in the optional param `show_frequency`. This value defaults to false.
|
122
|
+
|
123
|
+
paced = Pacing::Pacer.new(school_plan: school_plan, date: date, non_business_days: non_business_days, mode: :liberal, summer_holidays: summer_holidays, state: state, show_frequency: true)
|
124
|
+
paced.calculate
|
125
|
+
|
126
|
+
# Below is the output we will get when in strict mode and also showing the frequency in the pacing output.
|
127
|
+
=begin
|
128
|
+
=> [
|
129
|
+
{
|
130
|
+
discipline: 'Speech Therapy',
|
131
|
+
remaining_visits: 0,
|
132
|
+
used_visits: 7,
|
133
|
+
expected_visits_at_date: 3,
|
134
|
+
reset_date: '05-11-2022',
|
135
|
+
pace: 4,
|
136
|
+
pace_indicator: "🐇",
|
137
|
+
pace_suggestion: "less than once per week".
|
138
|
+
frequency: "6Mx30ST"
|
139
|
+
}, {
|
140
|
+
discipline: 'Physical Therapy',
|
141
|
+
remaining_visits: 0,
|
142
|
+
expected_visits_at_date: 3,
|
143
|
+
used_visits: 7,
|
144
|
+
reset_date: '05-11-2022',
|
145
|
+
pace: 4,
|
146
|
+
pace_indicator: "🐇",
|
147
|
+
pace_suggestion: "less than once per week",
|
148
|
+
frequency: "6Mx30PT"
|
149
|
+
}
|
150
|
+
]
|
151
|
+
=end
|
152
|
+
|
120
153
|
paced.interval # Return current interval start and end dates
|
121
154
|
|
122
155
|
# Below is the result you will get
|
data/lib/pacing/error.rb
CHANGED
@@ -53,7 +53,7 @@ module Pacing
|
|
53
53
|
|
54
54
|
begin
|
55
55
|
@school_plan[:school_plan_services].each do |school_plan_service|
|
56
|
-
if (parse_date(school_plan_service[:start_date])
|
56
|
+
if (parse_date(school_plan_service[:start_date]) <= parse_date(@date) && parse_date(@date) <= parse_date(school_plan_service[:end_date]))
|
57
57
|
valid_range_or_exceptions = true
|
58
58
|
end
|
59
59
|
end
|
@@ -72,4 +72,3 @@ module Pacing
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
end
|
75
|
-
|
data/lib/pacing/normalizer.rb
CHANGED
@@ -32,7 +32,7 @@ module Pacing
|
|
32
32
|
discipline_services = services.filter do |service|
|
33
33
|
["pragmatic language", "speech and language", "language", "speech", "language therapy", "speech therapy", "speech and language therapy", "speech language therapy"].include?(service[:type_of_service].downcase)
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
return {} if discipline_services.empty?
|
37
37
|
|
38
38
|
discipline_services = normalize_to_monthly_frequency(discipline_services)
|
@@ -57,7 +57,7 @@ module Pacing
|
|
57
57
|
discipline_services = services.filter do |service|
|
58
58
|
["occupation therapy", "occupational therapy", "occupation"].include?(service[:type_of_service].downcase)
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
return {} if discipline_services.empty?
|
62
62
|
|
63
63
|
discipline_services = normalize_to_monthly_frequency(discipline_services)
|
@@ -82,7 +82,7 @@ module Pacing
|
|
82
82
|
discipline_services = services.filter do |service|
|
83
83
|
["physical therapy", "physical"].include?(service[:type_of_service].downcase)
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
return {} if discipline_services.empty?
|
87
87
|
|
88
88
|
discipline_services = normalize_to_monthly_frequency(discipline_services)
|
@@ -107,7 +107,7 @@ module Pacing
|
|
107
107
|
discipline_services = services.filter do |service|
|
108
108
|
["feeding therapy", "feeding"].include?(service[:type_of_service].downcase)
|
109
109
|
end
|
110
|
-
|
110
|
+
|
111
111
|
return {} if discipline_services.empty?
|
112
112
|
|
113
113
|
discipline_services = normalize_to_monthly_frequency(discipline_services)
|
@@ -155,8 +155,11 @@ module Pacing
|
|
155
155
|
# average business days for each interval
|
156
156
|
interval_average_days = {
|
157
157
|
"weekly" => 5,
|
158
|
+
"per week" => 5,
|
158
159
|
"monthly" => 22,
|
159
|
-
"
|
160
|
+
"per month" => 22,
|
161
|
+
"yearly" => 210,
|
162
|
+
"per year" => 210 # take away average holidays period with is 2.5 months
|
160
163
|
}
|
161
164
|
|
162
165
|
return services if same_interval(services)
|
@@ -164,7 +167,7 @@ module Pacing
|
|
164
167
|
services.map do |service|
|
165
168
|
if !(service[:interval] == "monthly")
|
166
169
|
# weekly(5 days) = frequency # weekly
|
167
|
-
# monthly(20 days) = frequency * monthly
|
170
|
+
# monthly(20 days) = frequency * monthly
|
168
171
|
# yearly(200 days)
|
169
172
|
|
170
173
|
f = service[:frequency]
|
@@ -207,4 +210,3 @@ module Pacing
|
|
207
210
|
end
|
208
211
|
end
|
209
212
|
end
|
210
|
-
|
data/lib/pacing/pacer.rb
CHANGED
@@ -4,13 +4,14 @@ require 'holidays'
|
|
4
4
|
module Pacing
|
5
5
|
class Pacer
|
6
6
|
COMMON_YEAR_DAYS_IN_MONTH = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
7
|
-
attr_reader :school_plan, :date, :non_business_days, :state, :mode, :interval, :summer_holidays
|
7
|
+
attr_reader :school_plan, :date, :non_business_days, :state, :mode, :interval, :summer_holidays, :show_frequency
|
8
8
|
|
9
|
-
def initialize(school_plan:, date:, non_business_days:, state: :us_tn, mode: :liberal, summer_holidays: [])
|
9
|
+
def initialize(school_plan:, date:, non_business_days:, state: :us_tn, mode: :liberal, summer_holidays: [], show_frequency: false)
|
10
10
|
@school_plan = school_plan
|
11
11
|
@non_business_days = non_business_days
|
12
12
|
@date = date
|
13
13
|
@state = state
|
14
|
+
@show_frequency = show_frequency
|
14
15
|
@mode = [:strict, :liberal].include?(mode) ? mode : :liberal
|
15
16
|
|
16
17
|
Pacing::Error.new(school_plan: school_plan, date: date, non_business_days: non_business_days, state: state, mode: mode, summer_holidays: summer_holidays)
|
@@ -86,6 +87,10 @@ module Pacing
|
|
86
87
|
discipline[:pace_indicator] = pace_indicator(discipline[:pace])
|
87
88
|
discipline[:pace_suggestion] = readable_suggestion(rate: discipline[:suggested_rate])
|
88
89
|
|
90
|
+
if show_frequency
|
91
|
+
discipline[:frequency] = discipline_frequency(service)
|
92
|
+
end
|
93
|
+
|
89
94
|
discipline.delete(:suggested_rate)
|
90
95
|
|
91
96
|
discipline
|
@@ -94,6 +99,11 @@ module Pacing
|
|
94
99
|
services
|
95
100
|
end
|
96
101
|
|
102
|
+
# discipline iep frequency
|
103
|
+
def discipline_frequency(service)
|
104
|
+
service[:frequency].to_s + service[:interval].gsub(/(per)|p/i, "").strip[0].upcase + "x" + service[:time_per_session_in_minutes].to_s + service[:type_of_service][0].upcase + "T"
|
105
|
+
end
|
106
|
+
|
97
107
|
# get a spreadout of visit dates over an interval by using simple proportion.
|
98
108
|
def expected_visits(start_date:, end_date:, frequency:, interval:)
|
99
109
|
reset_start = start_of_treatment_date(start_date, interval)
|
@@ -338,6 +348,6 @@ module Pacing
|
|
338
348
|
holidays_start += 1 until holidays_start.wday == 1
|
339
349
|
|
340
350
|
[holidays_start, holidays_end]
|
341
|
-
end
|
351
|
+
end
|
342
352
|
end
|
343
353
|
end
|
data/lib/pacing/version.rb
CHANGED
data/spec/pacing_spec.rb
CHANGED
@@ -5182,4 +5182,80 @@ RSpec.describe Pacing::Pacer do
|
|
5182
5182
|
expect(results).to eq([{:discipline=>"Occupational Therapy", :remaining_visits=>1, :used_visits=>0, :pace=>0, :pace_indicator=>"😁", :pace_suggestion=>"once a week", :expected_visits_at_date=>0, :reset_date=>"10-24-2022"}, {:discipline=>"Physical Therapy", :remaining_visits=>1, :used_visits=>0, :pace=>0, :pace_indicator=>"😁", :pace_suggestion=>"once a week", :expected_visits_at_date=>0, :reset_date=>"10-24-2022"}])
|
5183
5183
|
end
|
5184
5184
|
end
|
5185
|
-
end
|
5185
|
+
end
|
5186
|
+
|
5187
|
+
describe "should include frequency in the output if show frequency is true" do
|
5188
|
+
it "should correctly parse the pacing for patient 4558" do
|
5189
|
+
school_plan = {:school_plan_services=>[{:school_plan_type=>"IEP", :start_date=>"02-23-2022", :end_date=>"02-23-2023", :type_of_service=>"Speech Therapy", :frequency=>12, :interval=>"monthly", :time_per_session_in_minutes=>20, :completed_visits_for_current_interval=>3, :extra_sessions_allowable=>0, :interval_for_extra_sessions_allowable=>"monthly"}, {:school_plan_type=>"IEP", :start_date=>"05-19-2022", :end_date=>"11-01-2022", :type_of_service=>"Language Therapy", :frequency=>3, :interval=>"weekly", :time_per_session_in_minutes=>20, :completed_visits_for_current_interval=>0, :extra_sessions_allowable=>0, :interval_for_extra_sessions_allowable=>"weekly"}]}
|
5190
|
+
date = "10-17-2022"
|
5191
|
+
non_business_days = []
|
5192
|
+
results = Pacing::Pacer.new(school_plan: school_plan, date: date, non_business_days: non_business_days, show_frequency: true).calculate
|
5193
|
+
expect(results).to eq([{:discipline=>"Speech Therapy", :remaining_visits=>22, :used_visits=>3, :pace=>-10, :pace_indicator=>"🐢", :pace_suggestion=>"once a day", :expected_visits_at_date=>13, :reset_date=>"11-01-2022", :frequency=>"25Mx20ST"}])
|
5194
|
+
end
|
5195
|
+
|
5196
|
+
it "should correctly parse the pacing for patient 4559" do
|
5197
|
+
school_plan = {:school_plan_services=>[{:school_plan_type=>"IEP", :start_date=>"10-27-2021", :end_date=>"10-27-2022", :type_of_service=>"Speech Therapy", :frequency=>8, :interval=>"monthly", :time_per_session_in_minutes=>20, :completed_visits_for_current_interval=>1, :extra_sessions_allowable=>0, :interval_for_extra_sessions_allowable=>"monthly"}, {:school_plan_type=>"IEP", :start_date=>"10-27-2021", :end_date=>"10-27-2022", :type_of_service=>"Speech Therapy", :frequency=>1, :interval=>"weekly", :time_per_session_in_minutes=>45, :completed_visits_for_current_interval=>0, :extra_sessions_allowable=>0, :interval_for_extra_sessions_allowable=>"weekly"}]}
|
5198
|
+
date = "10-17-2022"
|
5199
|
+
non_business_days = []
|
5200
|
+
results = Pacing::Pacer.new(school_plan: school_plan, date: date, non_business_days: non_business_days, show_frequency: true).calculate
|
5201
|
+
expect(results).to eq([{:discipline=>"Speech Therapy", :remaining_visits=>11, :used_visits=>1, :pace=>-5, :pace_indicator=>"🐢", :pace_suggestion=>"about once every other day", :expected_visits_at_date=>6, :reset_date=>"11-01-2022", :frequency=>"12Mx45ST"}])
|
5202
|
+
end
|
5203
|
+
|
5204
|
+
it "should also accept 'Language' as a type of service 4560" do
|
5205
|
+
school_plan = {:school_plan_services=>[{:school_plan_type=>"IEP", :start_date=>"05-23-2022", :end_date=>"05-23-2023", :type_of_service=>"Speech Therapy", :frequency=>6, :interval=>"monthly", :time_per_session_in_minutes=>20, :completed_visits_for_current_interval=>4, :extra_sessions_allowable=>1, :interval_for_extra_sessions_allowable=>"monthly"}, {:school_plan_type=>"IEP", :start_date=>"05-23-2022", :end_date=>"05-23-2023", :type_of_service=>"Language", :frequency=>6, :interval=>"monthly", :time_per_session_in_minutes=>20, :completed_visits_for_current_interval=>4, :extra_sessions_allowable=>1, :interval_for_extra_sessions_allowable=>"monthly"}]}
|
5206
|
+
date = "10-17-2022"
|
5207
|
+
non_business_days = []
|
5208
|
+
results = Pacing::Pacer.new(school_plan: school_plan, date: date, non_business_days: non_business_days, show_frequency: true).calculate
|
5209
|
+
expect(results).to eq([{:discipline=>"Speech Therapy", :remaining_visits=>10, :used_visits=>4, :pace=>-2, :pace_indicator=>"🐢", :pace_suggestion=>"about once every other day", :expected_visits_at_date=>6, :reset_date=>"11-01-2022", :frequency=>"12Mx20ST"}])
|
5210
|
+
end
|
5211
|
+
|
5212
|
+
it "should correctly parse the pacing for patient 4561" do
|
5213
|
+
school_plan = {:school_plan_services=>[{:school_plan_type=>"IEP", :start_date=>"12-03-2021", :end_date=>"12-03-2022", :type_of_service=>"Speech and language", :frequency=>12, :interval=>"monthly", :time_per_session_in_minutes=>20, :completed_visits_for_current_interval=>4, :extra_sessions_allowable=>1, :interval_for_extra_sessions_allowable=>"monthly"}]}
|
5214
|
+
date = "10-17-2022"
|
5215
|
+
non_business_days = []
|
5216
|
+
results = Pacing::Pacer.new(school_plan: school_plan, date: date, non_business_days: non_business_days, show_frequency: true).calculate
|
5217
|
+
expect(results).to eq([{:discipline=>"Speech Therapy", :remaining_visits=>9, :used_visits=>4, :pace=>-2, :pace_indicator=>"🐢", :pace_suggestion=>"about once every other day", :expected_visits_at_date=>6, :reset_date=>"11-01-2022", :frequency=>"12Mx20ST"}])
|
5218
|
+
end
|
5219
|
+
|
5220
|
+
it "should correctly parse the pacing for patient 4562" do
|
5221
|
+
school_plan = {:school_plan_services=>[{:school_plan_type=>"IEP", :start_date=>"09-27-2022", :end_date=>"09-27-2023", :type_of_service=>"Language Therapy", :frequency=>30, :interval=>"yearly", :time_per_session_in_minutes=>20, :completed_visits_for_current_interval=>4, :extra_sessions_allowable=>0, :interval_for_extra_sessions_allowable=>"yearly"}]}
|
5222
|
+
date = "10-17-2022"
|
5223
|
+
non_business_days = []
|
5224
|
+
results = Pacing::Pacer.new(school_plan: school_plan, date: date, non_business_days: non_business_days, show_frequency: true).calculate
|
5225
|
+
expect(results).to eq([{:discipline=>"Speech Therapy", :remaining_visits=>26, :used_visits=>4, :pace=>2, :pace_indicator=>"🐇", :pace_suggestion=>"less than once per week", :expected_visits_at_date=>2, :reset_date=>"09-27-2023", :frequency=>"30Yx20ST"}])
|
5226
|
+
end
|
5227
|
+
|
5228
|
+
it "should correctly parse the pacing for patient 4563" do
|
5229
|
+
school_plan = {:school_plan_services=>[{:school_plan_type=>"IEP", :start_date=>"11-03-2021", :end_date=>"11-03-2022", :type_of_service=>"Speech Therapy", :frequency=>1, :interval=>"weekly", :time_per_session_in_minutes=>20, :completed_visits_for_current_interval=>0, :extra_sessions_allowable=>0, :interval_for_extra_sessions_allowable=>"weekly"}]}
|
5230
|
+
date = "10-17-2022"
|
5231
|
+
non_business_days = []
|
5232
|
+
results = Pacing::Pacer.new(school_plan: school_plan, date: date, non_business_days: non_business_days, show_frequency: true).calculate
|
5233
|
+
expect(results).to eq([{:discipline=>"Speech Therapy", :remaining_visits=>1, :used_visits=>0, :pace=>0, :pace_indicator=>"😁", :pace_suggestion=>"once a week", :expected_visits_at_date=>0, :reset_date=>"10-24-2022", :frequency=>"1Wx20ST"}])
|
5234
|
+
end
|
5235
|
+
|
5236
|
+
it "should correctly parse the pacing for patient 4564 when start_date is same as date" do
|
5237
|
+
school_plan = {:school_plan_services=>[{:school_plan_type=>"IEP", :start_date=>"01-09-2023", :end_date=>"03-30-2023", :type_of_service=>"Speech Therapy", :frequency=>1, :interval=>"weekly", :time_per_session_in_minutes=>20, :completed_visits_for_current_interval=>0, :extra_sessions_allowable=>0, :interval_for_extra_sessions_allowable=>"weekly"}]}
|
5238
|
+
date = "01-09-2023"
|
5239
|
+
non_business_days = []
|
5240
|
+
results = Pacing::Pacer.new(school_plan: school_plan, date: date, non_business_days: non_business_days, show_frequency: true).calculate
|
5241
|
+
expect(results).to eq([{:discipline=>"Speech Therapy", :remaining_visits=>1, :used_visits=>0, :pace=>0, :pace_indicator=>"😁", :pace_suggestion=>"once a week", :expected_visits_at_date=>0, :reset_date=>"01-16-2023", :frequency=>"1Wx20ST"}])
|
5242
|
+
end
|
5243
|
+
end
|
5244
|
+
|
5245
|
+
describe "should calculate pacing correctly when interval starts with 'per month, per week, and per year'" do
|
5246
|
+
it "should correctly parse the pacing for patient 4565" do
|
5247
|
+
school_plan = {:school_plan_services=>[{:school_plan_type=>"IEP", :start_date=>"02-23-2022", :end_date=>"02-23-2023", :type_of_service=>"Speech Therapy", :frequency=>12, :interval=>"per month", :time_per_session_in_minutes=>20, :completed_visits_for_current_interval=>3, :extra_sessions_allowable=>0, :interval_for_extra_sessions_allowable=>"per month"}, {:school_plan_type=>"IEP", :start_date=>"05-19-2022", :end_date=>"11-01-2022", :type_of_service=>"Language Therapy", :frequency=>3, :interval=>"per week", :time_per_session_in_minutes=>20, :completed_visits_for_current_interval=>0, :extra_sessions_allowable=>0, :interval_for_extra_sessions_allowable=>"per week"}]}
|
5248
|
+
date = "10-17-2022"
|
5249
|
+
non_business_days = []
|
5250
|
+
results = Pacing::Pacer.new(school_plan: school_plan, date: date, non_business_days: non_business_days, show_frequency: true).calculate
|
5251
|
+
expect(results).to eq([{:discipline=>"Speech Therapy", :remaining_visits=>22, :used_visits=>3, :pace=>-10, :pace_indicator=>"🐢", :pace_suggestion=>"once a day", :expected_visits_at_date=>13, :reset_date=>"11-01-2022", :frequency=>"25Mx20ST"}])
|
5252
|
+
end
|
5253
|
+
|
5254
|
+
it "should correctly parse the pacing for patient 4566" do
|
5255
|
+
school_plan = {:school_plan_services=>[{:school_plan_type=>"IEP", :start_date=>"09-27-2022", :end_date=>"09-27-2023", :type_of_service=>"Language Therapy", :frequency=>30, :interval=>"per year", :time_per_session_in_minutes=>20, :completed_visits_for_current_interval=>4, :extra_sessions_allowable=>0, :interval_for_extra_sessions_allowable=>"per year"}]}
|
5256
|
+
date = "10-17-2022"
|
5257
|
+
non_business_days = []
|
5258
|
+
results = Pacing::Pacer.new(school_plan: school_plan, date: date, non_business_days: non_business_days, show_frequency: true).calculate
|
5259
|
+
expect(results).to eq([{:discipline=>"Speech Therapy", :remaining_visits=>26, :used_visits=>4, :pace=>2, :pace_indicator=>"🐇", :pace_suggestion=>"less than once per week", :expected_visits_at_date=>2, :reset_date=>"09-27-2023", :frequency=>"30Yx20ST"}])
|
5260
|
+
end
|
5261
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pacing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin S. Dias
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2023-01-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|