Skip to content

Commit 5538cc5

Browse files
authored
Merge pull request #4843 from Sukhpreet-s/3067-add-indicator-fields-to-partner-export
Add indicator fields to partner export
2 parents b1e4750 + 4526e17 commit 5538cc5

File tree

4 files changed

+152
-3
lines changed

4 files changed

+152
-3
lines changed

app/models/distribution.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ class Distribution < ApplicationRecord
4646

4747
enum state: { scheduled: 5, complete: 10 }
4848
enum delivery_method: { pick_up: 0, delivery: 1, shipped: 2 }
49+
scope :active, -> { joins(:line_items).joins(:items).where(items: { active: true }) }
50+
scope :with_diapers, -> { joins(line_items: :item).merge(Item.disposable.or(Item.cloth_diapers)) }
51+
scope :with_period_supplies, -> { joins(line_items: :item).merge(Item.period_supplies) }
4952
# add item_id scope to allow filtering distributions by item
5053
scope :by_item_id, ->(item_id) { includes(:items).where(items: { id: item_id }) }
5154
# partner scope to allow filtering by partner
@@ -70,6 +73,10 @@ class Distribution < ApplicationRecord
7073
where("issued_at > :start_date AND issued_at <= :end_date",
7174
start_date: Time.zone.today.beginning_of_week.beginning_of_day, end_date: Time.zone.today.end_of_week.end_of_day)
7275
end
76+
scope :in_last_12_months, -> do
77+
where("issued_at > :start_date AND issued_at <= :end_date",
78+
start_date: 12.months.ago.beginning_of_day, end_date: Time.zone.today.end_of_day)
79+
end
7380

7481
delegate :name, to: :partner, prefix: true
7582

app/models/partner.rb

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,9 @@ def self.csv_export_headers
186186
"Contact Phone",
187187
"Contact Email",
188188
"Notes",
189-
"Counties Served"
189+
"Counties Served",
190+
"Providing Diapers",
191+
"Providing Period Supplies"
190192
]
191193
end
192194

@@ -204,10 +206,20 @@ def csv_export_attributes
204206
contact_person[:phone],
205207
contact_person[:email],
206208
notes,
207-
profile.county_list_by_region
209+
profile.county_list_by_region,
210+
providing_diapers,
211+
providing_period_supplies
208212
]
209213
end
210214

215+
def providing_diapers
216+
distributions.in_last_12_months.with_diapers.any? ? "Y" : "N"
217+
end
218+
219+
def providing_period_supplies
220+
distributions.in_last_12_months.with_period_supplies.any? ? "Y" : "N"
221+
end
222+
211223
def contact_person
212224
return @contact_person if @contact_person
213225

spec/models/distribution_spec.rb

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,34 @@
139139
end
140140
end
141141

142+
describe "in_last_12_months >" do
143+
context "when the current date is December 31, 2023" do
144+
before do
145+
travel_to Time.zone.local(2023, 12, 31)
146+
end
147+
148+
after do
149+
travel_back
150+
end
151+
152+
it "includes distributions issued within the last 12 months" do
153+
included_distribution = create(:distribution, organization: organization, issued_at: Time.zone.local(2023, 1, 1))
154+
excluded_distribution = create(:distribution, organization: organization, issued_at: Time.zone.local(2022, 12, 30))
155+
distributions = Distribution.in_last_12_months
156+
expect(distributions).to include(included_distribution)
157+
expect(distributions).not_to include(excluded_distribution)
158+
end
159+
160+
it "includes distributions up to the current date and excludes future ones" do
161+
current_distribution = create(:distribution, organization: organization, issued_at: Time.zone.local(2023, 12, 31))
162+
future_distribution = create(:distribution, organization: organization, issued_at: Time.zone.local(2024, 1, 1))
163+
distributions = Distribution.in_last_12_months
164+
expect(distributions).to include(current_distribution)
165+
expect(distributions).not_to include(future_distribution)
166+
end
167+
end
168+
end
169+
142170
describe "by_item_id >" do
143171
it "only returns distributions with given item id" do
144172
# create 2 items with unique ids
@@ -176,6 +204,39 @@
176204
expect(Distribution.by_location(location_1.id)).not_to include(dist2)
177205
end
178206
end
207+
208+
describe "with_diapers >" do
209+
let(:disposable_item) { create(:item, base_item: create(:base_item, category: "Diapers - Childrens")) }
210+
let(:cloth_diaper_item) { create(:item, base_item: create(:base_item, category: "Diapers - Cloth (Kids)")) }
211+
let(:non_diaper_item) { create(:item, base_item: create(:base_item, category: "Menstrual Supplies/Items")) }
212+
213+
it "only includes distributions with disposable or cloth_diaper items" do
214+
dist1 = create(:distribution, :with_items, item: disposable_item)
215+
dist2 = create(:distribution, :with_items, item: cloth_diaper_item)
216+
dist3 = create(:distribution, :with_items, item: non_diaper_item)
217+
218+
distributions = Distribution.with_diapers
219+
expect(distributions.count).to eq(2)
220+
expect(distributions).to include(dist1)
221+
expect(distributions).to include(dist2)
222+
expect(distributions).not_to include(dist3)
223+
end
224+
end
225+
226+
describe "with_period_supplies >" do
227+
let(:period_supplies_item) { create(:item, base_item: create(:base_item, category: "Menstrual Supplies/Items")) }
228+
let(:non_period_supplies_item) { create(:item, base_item: create(:base_item, category: "Diapers - Childrens")) }
229+
230+
it "only includes distributions with period supplies items" do
231+
dist1 = create(:distribution, :with_items, item: period_supplies_item)
232+
dist2 = create(:distribution, :with_items, item: non_period_supplies_item)
233+
234+
distributions = Distribution.with_period_supplies
235+
expect(distributions.count).to eq(1)
236+
expect(distributions).to include(dist1)
237+
expect(distributions).not_to include(dist2)
238+
end
239+
end
179240
end
180241

181242
context "Callbacks >" do

spec/models/partner_spec.rb

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,8 @@
299299
let(:agency_type) { Partner::AGENCY_TYPES["OTHER"] }
300300
let(:other_agency_type) { "Another Agency Name" }
301301
let(:notes) { "Some notes" }
302+
let(:providing_diapers) { {value: "N", index: 13} }
303+
let(:providing_period_supplies) { {value: "N", index: 14} }
302304

303305
before do
304306
partner.profile.update({
@@ -340,9 +342,76 @@
340342
contact_phone,
341343
contact_email,
342344
notes,
343-
correctly_ordered_counties
345+
correctly_ordered_counties,
346+
providing_diapers[:value],
347+
providing_period_supplies[:value]
344348
])
345349
end
350+
351+
context "when partner has a distribution in the last 12 months" do
352+
let(:distribution) { create(:distribution, partner: partner) }
353+
354+
shared_examples "providing_diapers check" do |scope|
355+
before do
356+
providing_diapers[:value] = "Y"
357+
358+
case scope
359+
when :disposable
360+
item = create(:item, base_item: create(:base_item, category: "Diapers - Childrens"))
361+
when :cloth_diapers
362+
item = create(:item, base_item: create(:base_item, category: "Diapers - Cloth (Kids)"))
363+
end
364+
365+
create(:line_item, item: item, itemizable: distribution)
366+
end
367+
368+
it "should have Y as providing_diapers" do
369+
expect(partner.csv_export_attributes[providing_diapers[:index]]).to eq(providing_diapers[:value])
370+
end
371+
end
372+
373+
context "with a disposable item" do
374+
include_examples "providing_diapers check", :disposable
375+
end
376+
377+
context "with a cloth diaper item" do
378+
include_examples "providing_diapers check", :cloth_diapers
379+
end
380+
381+
context "with a period supplies item" do
382+
before do
383+
providing_period_supplies[:value] = "Y"
384+
385+
item = create(:item, base_item: create(:base_item, category: "Menstrual Supplies/Items"))
386+
create(:line_item, item: item, itemizable: distribution)
387+
end
388+
389+
it "should have Y as providing_period_supplies" do
390+
expect(partner.csv_export_attributes[providing_period_supplies[:index]]).to eq(providing_period_supplies[:value])
391+
end
392+
end
393+
end
394+
395+
context "when partner only has distribution older than a 12 months" do
396+
let(:distribution) { create(:distribution, issued_at: (12.months.ago.beginning_of_day - 1.day), partner: partner) }
397+
let(:disposable_diapers_item) { create(:item, base_item: create(:base_item, category: "Diapers - Childrens")) }
398+
let(:cloth_diapers_item) { create(:item, base_item: create(:base_item, category: "Diapers - Cloth (Kids)")) }
399+
let(:period_supplies_item) { create(:item, base_item: create(:base_item, category: "Menstrual Supplies/Items")) }
400+
401+
before do
402+
create(:line_item, item: disposable_diapers_item, itemizable: distribution)
403+
create(:line_item, item: cloth_diapers_item, itemizable: distribution)
404+
create(:line_item, item: period_supplies_item, itemizable: distribution)
405+
end
406+
407+
it "should have N as providing_diapers" do
408+
expect(partner.csv_export_attributes[providing_diapers[:index]]).to eq(providing_diapers[:value])
409+
end
410+
411+
it "should have N as providing_period_supplies" do
412+
expect(partner.csv_export_attributes[providing_period_supplies[:index]]).to eq(providing_period_supplies[:value])
413+
end
414+
end
346415
end
347416

348417
describe '#quantity_year_to_date' do

0 commit comments

Comments
 (0)