Skip to content

Commit ffe0aad

Browse files
authored
Add provider's phone number to VAOS EPS appointment response (#21311)
1 parent 0ee21f1 commit ffe0aad

File tree

11 files changed

+412
-78
lines changed

11 files changed

+412
-78
lines changed

modules/vaos/app/controllers/vaos/v2/eps_appointments_controller.rb

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,51 @@ def show
1111

1212
raise Common::Exceptions::RecordNotFound, message: 'Record not found' if appointment[:state] == 'draft'
1313

14-
response = OpenStruct.new({
15-
id: appointment[:id],
16-
appointment:,
17-
provider: unless appointment[:provider_service_id].nil?
18-
provider_service.get_provider_service(
19-
provider_id: appointment[:provider_service_id]
20-
)
21-
end
22-
})
14+
referral_detail = fetch_referral_detail(appointment)
15+
provider = fetch_provider(appointment)
16+
enriched_provider = Eps::EnrichedProvider.from_referral(provider, referral_detail)
17+
18+
response = OpenStruct.new(
19+
id: appointment[:id],
20+
appointment:,
21+
provider: enriched_provider
22+
)
2323

2424
render json: Eps::EpsAppointmentSerializer.new(response)
2525
end
2626

2727
private
2828

29+
##
30+
# Retrieves referral details from CCRA service for the given appointment if a referral number is present.
31+
#
32+
# @param appointment [Hash] The appointment data containing referral information
33+
# @return [Ccra::ReferralDetail, nil] The referral details if found, nil otherwise
34+
def fetch_referral_detail(appointment)
35+
referral_number = appointment.dig(:referral, :referral_number)
36+
return nil if referral_number.blank?
37+
38+
begin
39+
# TODO: Need correct mode parameter, this one is hard-coded based on examples
40+
ccra_referral_service.get_referral(referral_number, '2')
41+
rescue => e
42+
Rails.logger.error "Failed to retrieve referral details: #{e.message}"
43+
nil
44+
end
45+
end
46+
47+
##
48+
# Fetches provider information for the given appointment.
49+
#
50+
# @param appointment [Hash] The appointment data containing provider service ID
51+
# @return [Object, nil] Provider object or nil if no provider ID is found
52+
def fetch_provider(appointment)
53+
provider_id = appointment[:provider_service_id]
54+
return nil if provider_id.nil?
55+
56+
provider_service.get_provider_service(provider_id:)
57+
end
58+
2959
def eps_appointment_id
3060
params.require(:id)
3161
end
@@ -42,6 +72,10 @@ def appointment_service
4272
@appointment_service ||= Eps::AppointmentService.new(current_user)
4373
end
4474

75+
def ccra_referral_service
76+
@ccra_referral_service ||= Ccra::ReferralService.new(current_user)
77+
end
78+
4579
def provider
4680
provider_service.get_provider_service(provider_id: params[:provider_id])
4781
end

modules/vaos/app/models/ccra/referral_detail.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module Ccra
44
# ReferralDetail represents the detailed information for a single referral from CCRA.
55
class ReferralDetail
66
attr_reader :expiration_date, :type_of_care, :provider_name, :location,
7-
:referral_number
7+
:referral_number, :phone_number
88

99
##
1010
# Initializes a new instance of ReferralDetail.
@@ -20,6 +20,7 @@ def initialize(attributes)
2020
@provider_name = referral['TreatingProvider']
2121
@location = referral['TreatingFacility']
2222
@referral_number = referral['ReferralNumber']
23+
@phone_number = referral['ProviderPhone'] || referral['FacilityPhone']
2324
end
2425
end
2526
end
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# frozen_string_literal: true
2+
3+
module Eps
4+
# Enriches provider data with additional information from referrals
5+
class EnrichedProvider
6+
# Creates a provider object enriched with referral information
7+
#
8+
# @param provider [Object] The base provider object to enrich
9+
# @param referral_detail [Ccra::ReferralDetail, nil] Optional referral details to merge
10+
# @return [OpenStruct] Enhanced provider with referral information
11+
def self.from_referral(provider, referral_detail)
12+
return provider if provider.nil? || referral_detail&.phone_number.blank?
13+
14+
enriched_data = provider.to_h
15+
enriched_data[:phone_number] = referral_detail.phone_number
16+
OpenStruct.new(enriched_data)
17+
end
18+
end
19+
end

modules/vaos/app/serializers/eps/eps_appointment_serializer.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ class EpsAppointmentSerializer
2525
appointment_types: object.provider.appointment_types,
2626
specialties: object.provider.specialties,
2727
visit_mode: object.provider.visit_mode,
28-
features: object.provider.features
29-
}
28+
features: object.provider.features,
29+
phone_number: object.provider.phone_number
30+
}.compact
3031
end
3132
end
3233
end

modules/vaos/spec/factories/ccra/referrals.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
location { 'VA Medical Center' }
2525
referral_number { 'VA0000005681' }
2626
expiration_date { '2024-05-27' }
27+
phone_number { '555-123-4567' }
2728

2829
initialize_with do
2930
attributes = {
@@ -32,7 +33,8 @@
3233
'TreatingProvider' => provider_name,
3334
'TreatingFacility' => location,
3435
'ReferralNumber' => referral_number,
35-
'ReferralExpirationDate' => expiration_date
36+
'ReferralExpirationDate' => expiration_date,
37+
'ProviderPhone' => phone_number
3638
}
3739
}
3840
Ccra::ReferralDetail.new(attributes)

modules/vaos/spec/models/ccra/referral_detail_spec.rb

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
'CategoryOfCare' => 'CARDIOLOGY',
1414
'TreatingProvider' => 'Dr. Smith',
1515
'TreatingFacility' => 'VA Medical Center',
16-
'ReferralNumber' => 'VA0000005681'
16+
'ReferralNumber' => 'VA0000005681',
17+
'ProviderPhone' => '555-123-4567'
1718
}
1819
}
1920
end
@@ -24,6 +25,48 @@
2425
expect(subject.provider_name).to eq('Dr. Smith')
2526
expect(subject.location).to eq('VA Medical Center')
2627
expect(subject.referral_number).to eq('VA0000005681')
28+
expect(subject.phone_number).to eq('555-123-4567')
29+
end
30+
31+
context 'with facility phone instead of provider phone' do
32+
let(:attributes_with_facility_phone) do
33+
{
34+
'Referral' => {
35+
'ReferralExpirationDate' => '2024-05-27',
36+
'CategoryOfCare' => 'CARDIOLOGY',
37+
'TreatingProvider' => 'Dr. Smith',
38+
'TreatingFacility' => 'VA Medical Center',
39+
'ReferralNumber' => 'VA0000005681',
40+
'FacilityPhone' => '555-987-6543'
41+
}
42+
}
43+
end
44+
45+
it 'uses facility phone when provider phone is not available' do
46+
detail = described_class.new(attributes_with_facility_phone)
47+
expect(detail.phone_number).to eq('555-987-6543')
48+
end
49+
end
50+
51+
context 'with both provider and facility phone' do
52+
let(:attributes_with_both_phones) do
53+
{
54+
'Referral' => {
55+
'ReferralExpirationDate' => '2024-05-27',
56+
'CategoryOfCare' => 'CARDIOLOGY',
57+
'TreatingProvider' => 'Dr. Smith',
58+
'TreatingFacility' => 'VA Medical Center',
59+
'ReferralNumber' => 'VA0000005681',
60+
'ProviderPhone' => '555-123-4567',
61+
'FacilityPhone' => '555-987-6543'
62+
}
63+
}
64+
end
65+
66+
it 'prefers provider phone over facility phone' do
67+
detail = described_class.new(attributes_with_both_phones)
68+
expect(detail.phone_number).to eq('555-123-4567')
69+
end
2770
end
2871

2972
context 'with missing Referral key' do
@@ -39,6 +82,7 @@
3982
expect(subject.provider_name).to be_nil
4083
expect(subject.location).to be_nil
4184
expect(subject.referral_number).to be_nil
85+
expect(subject.phone_number).to be_nil
4286
end
4387
end
4488

@@ -55,6 +99,7 @@
5599
expect(subject.provider_name).to be_nil
56100
expect(subject.location).to be_nil
57101
expect(subject.referral_number).to be_nil
102+
expect(subject.phone_number).to be_nil
58103
end
59104
end
60105
end
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
describe Eps::EnrichedProvider do
6+
describe '.from_referral' do
7+
let(:provider) do
8+
OpenStruct.new(
9+
id: 'test-id',
10+
name: 'Test Provider'
11+
)
12+
end
13+
14+
context 'when referral_detail has a phone number' do
15+
let(:phone_number) { '555-123-4567' }
16+
let(:referral_detail) { build(:ccra_referral_detail, phone_number:) }
17+
18+
it 'adds the phone number to the provider' do
19+
result = described_class.from_referral(provider, referral_detail)
20+
expect(result.id).to eq(provider.id)
21+
expect(result.name).to eq(provider.name)
22+
expect(result.phone_number).to eq(phone_number)
23+
end
24+
end
25+
26+
context 'when referral_detail has no phone number' do
27+
let(:referral_detail) { build(:ccra_referral_detail, phone_number: nil) }
28+
29+
it 'returns the original provider' do
30+
result = described_class.from_referral(provider, referral_detail)
31+
expect(result).to be(provider)
32+
expect(result.respond_to?(:phone_number)).to be false
33+
end
34+
end
35+
36+
context 'when referral_detail is nil' do
37+
it 'returns the original provider' do
38+
result = described_class.from_referral(provider, nil)
39+
expect(result).to be(provider)
40+
expect(result.respond_to?(:phone_number)).to be false
41+
end
42+
end
43+
44+
context 'when provider is nil' do
45+
it 'returns nil' do
46+
result = described_class.from_referral(nil, build(:ccra_referral_detail, phone_number: '555-555-5555'))
47+
expect(result).to be_nil
48+
end
49+
end
50+
end
51+
end

0 commit comments

Comments
 (0)