Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 0 additions & 14 deletions app/forms/hub/zip_code_routing_form.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ class ZipCodeRoutingForm < Form
attr_accessor :vita_partner
delegate :edit_hub_organization_path, :edit_hub_site_path, to: 'Rails.application.routes.url_helpers'

validate :unused_zipcode
validate :valid_serviced_zip_code

def initialize(vita_partner, form_params = nil)
Expand All @@ -21,19 +20,6 @@ def vita_partner_id
vita_partner.id
end

def unused_zipcode
existing = VitaPartnerZipCode.includes(:vita_partner).find_by(zip_code: @params[:zip_code])
if existing.present?
if existing.vita_partner == vita_partner
errors.add(:zip_code, I18n.t("hub.zip_codes.already_applied", zip_code: existing.zip_code))
else
params = { anchor: "zip-code-routing-form", id: existing.vita_partner.id }
path = existing.vita_partner.organization? ? edit_hub_organization_path(params) : edit_hub_site_path(params)
errors.add(:zip_code, I18n.t("hub.zip_codes.already_taken", vita_partner_name: existing.vita_partner.name, vita_partner_path: path, zip_code: existing.zip_code))
end
end
end

def valid_serviced_zip_code
return if errors[:zip_code].present?
errors.merge!(@serviced_zip_code.errors) unless @serviced_zip_code.valid?
Expand Down
4 changes: 2 additions & 2 deletions app/models/vita_partner_zip_code.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
# Indexes
#
# index_vita_partner_zip_codes_on_vita_partner_id (vita_partner_id)
# index_vita_partner_zip_codes_on_zip_code (zip_code) UNIQUE
# index_vita_partner_zip_codes_on_zip_code (zip_code)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

needed to take out unique constraint

#
# Foreign Keys
#
Expand All @@ -22,7 +22,7 @@ class VitaPartnerZipCode < ApplicationRecord
belongs_to :organization, optional: true, foreign_key: 'vita_partner_id', class_name: 'Organization'
belongs_to :site, optional: true, foreign_key: 'vita_partner_id', class_name: 'Site'
validate :record_of_zip_code
validates :zip_code, uniqueness: true
validates :zip_code, uniqueness: { scope: :vita_partner_id }

def city_state
ZipCodes.details(zip_code)[:name]
Expand Down
3 changes: 2 additions & 1 deletion app/services/partner_routing_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ def vita_partner_from_zip_code

eligible_with_capacity = Organization.with_capacity.joins(:serviced_zip_codes).
where(vita_partner_zip_codes: { zip_code: @zip_code })
vita_partner = eligible_with_capacity.first

vita_partner = eligible_with_capacity.order(Arel.sql('RANDOM()')).first

if vita_partner.present?
@routing_method = :zip_code
Expand Down
13 changes: 13 additions & 0 deletions db/migrate/20251119181821_remove_zipcode_indexing_to_partner.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
class RemoveZipcodeIndexingToPartner < ActiveRecord::Migration[7.1]
disable_ddl_transaction!

def up
remove_index :vita_partner_zip_codes, :zip_code
add_index :vita_partner_zip_codes, :zip_code, algorithm: :concurrently
end

def down
remove_index :vita_partner_zip_codes, :zip_code
add_index :vita_partner_zip_codes, :zip_code, unique: true, algorithm: :concurrently
end
end
4 changes: 2 additions & 2 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[7.1].define(version: 2025_09_26_151436) do
ActiveRecord::Schema[7.1].define(version: 2025_11_19_181821) do
# These are extensions that must be enabled in order to support this database
enable_extension "citext"
enable_extension "plpgsql"
Expand Down Expand Up @@ -2906,7 +2906,7 @@
t.bigint "vita_partner_id", null: false
t.string "zip_code", null: false
t.index ["vita_partner_id"], name: "index_vita_partner_zip_codes_on_vita_partner_id"
t.index ["zip_code"], name: "index_vita_partner_zip_codes_on_zip_code", unique: true
t.index ["zip_code"], name: "index_vita_partner_zip_codes_on_zip_code"
end

create_table "vita_partners", force: :cascade do |t|
Expand Down
2 changes: 1 addition & 1 deletion spec/factories/vita_partner_zip_codes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
# Indexes
#
# index_vita_partner_zip_codes_on_vita_partner_id (vita_partner_id)
# index_vita_partner_zip_codes_on_zip_code (zip_code) UNIQUE
# index_vita_partner_zip_codes_on_zip_code (zip_code)
#
# Foreign Keys
#
Expand Down
26 changes: 0 additions & 26 deletions spec/forms/hub/zip_code_routing_form_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,32 +11,6 @@
}
end
describe "#valid?" do
context "when the zip code is already in use" do
context "when it belongs to current vita partner" do
before do
create :vita_partner_zip_code, vita_partner: vita_partner, zip_code: zip_code
end

it "is invalid with appropriate message" do
expect(subject.valid?).to eq false
expect(subject.errors[:zip_code]).to include "94606 is already routed to this partner."
end
end

context "when it belongs to a different vita partner" do
let(:other_vita_partner) { create :organization, name: "Oregano Org" }
before do
create :vita_partner_zip_code, vita_partner: other_vita_partner, zip_code: zip_code
end

it "is invalid with appropriate message" do
expect(subject.valid?).to eq false
expect(subject.errors[:zip_code]).to include "94606 is already routed to <a href=/en/hub/organizations/#{other_vita_partner.id}/edit#zip-code-routing-form>Oregano Org</a>."
end
end

end

context "when the zip code is not valid" do
let(:zip_code) { "A2345"}
it "is invalid" do
Expand Down
2 changes: 1 addition & 1 deletion spec/models/vita_partner_zip_code_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
# Indexes
#
# index_vita_partner_zip_codes_on_vita_partner_id (vita_partner_id)
# index_vita_partner_zip_codes_on_zip_code (zip_code) UNIQUE
# index_vita_partner_zip_codes_on_zip_code (zip_code)
#
# Foreign Keys
#
Expand Down
27 changes: 27 additions & 0 deletions spec/services/partner_routing_service_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -359,5 +359,32 @@
end
end
end

context "when multiple Vita Partners serve the same zip code" do
let(:vita_partner_2) { create :organization, name: "Partner 2" }
before do
create :vita_partner_zip_code, zip_code: "94606", vita_partner: vita_partner_2
end

subject { PartnerRoutingService.new(zip_code: "94606") }

it "routes to one of the partners with capacity" do
result = subject.determine_partner

expect([vita_partner, vita_partner_2]).to include(result)
expect(subject.routing_method).to eq :zip_code
end

context "when one partner is at capacity" do
before do
vita_partner.update(capacity_limit: 0)
end

it "routes only to partners with capacity" do
expect(subject.determine_partner).to eq vita_partner_2
expect(subject.routing_method).to eq :zip_code
end
end
end
end
end
Loading