Class: HealthCareApplication

Inherits:
ApplicationRecord show all
Includes:
SentryLogging, TempFormValidation, VA1010Forms::Utils
Defined in:
app/models/health_care_application.rb

Constant Summary collapse

FORM_ID =
'10-10EZ'
ACTIVEDUTY_ELIGIBILITY =
'TRICARE'
DISABILITY_THRESHOLD =
50
LOCKBOX =
Lockbox.new(key: Settings.lockbox.master_key, encode: true)
EE_DATA_SELECTED_KEYS =
%i[
  application_date
  enrollment_date
  preferred_facility
  effective_date
  primary_eligibility
  priority_group
  can_submit_financial_info
].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from VA1010Forms::Utils

#override_parsed_form, #soap

Methods included from SentryLogging

#log_exception_to_sentry, #log_message_to_sentry, #non_nil_hash?, #normalize_level, #rails_logger

Methods included from TempFormValidation

#parsed_form

Methods inherited from ApplicationRecord

descendants_using_encryption, lockbox_options, #timestamp_attributes_for_update_in_model, #valid?

Instance Attribute Details

#async_compatibleObject

Returns the value of attribute async_compatible.



20
21
22
# File 'app/models/health_care_application.rb', line 20

def async_compatible
  @async_compatible
end

#google_analytics_client_idObject

Returns the value of attribute google_analytics_client_id.



20
21
22
# File 'app/models/health_care_application.rb', line 20

def google_analytics_client_id
  @google_analytics_client_id
end

#userObject

Returns the value of attribute user.



20
21
22
# File 'app/models/health_care_application.rb', line 20

def user
  @user
end

Class Method Details

.determine_active_duty(primary_eligibility, veteran) ⇒ Object



114
115
116
# File 'app/models/health_care_application.rb', line 114

def self.determine_active_duty(primary_eligibility, veteran)
  primary_eligibility == ACTIVEDUTY_ELIGIBILITY && veteran == 'false'
end

.determine_non_military(primary_eligibility, veteran, parsed_status) ⇒ Object



118
119
120
121
122
123
124
125
# File 'app/models/health_care_application.rb', line 118

def self.determine_non_military(primary_eligibility, veteran, parsed_status)
  if parsed_status == HCA::EnrollmentEligibility::Constants::ACTIVEDUTY &&
     !determine_active_duty(primary_eligibility, veteran)
    HCA::EnrollmentEligibility::Constants::NON_MILITARY
  else
    parsed_status
  end
end

.enrollment_status(icn, loa3) ⇒ Object



158
159
160
161
162
163
# File 'app/models/health_care_application.rb', line 158

def self.enrollment_status(icn, loa3)
  parsed_ee_data(
    HCA::EnrollmentEligibility::Service.new.lookup_user(icn),
    loa3
  )
end

.get_user_identifier(user) ⇒ Hash

Parameters:

Returns:

  • (Hash)


37
38
39
40
41
42
43
44
# File 'app/models/health_care_application.rb', line 37

def self.get_user_identifier(user)
  return if user.nil?

  {
    'icn' => user.icn,
    'edipi' => user.edipi
  }
end

.parsed_ee_data(ee_data, loa3) ⇒ Object



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'app/models/health_care_application.rb', line 137

def self.parsed_ee_data(ee_data, loa3)
  if loa3
    parsed_status = HCA::EnrollmentEligibility::StatusMatcher.parse(
      ee_data[:enrollment_status], ee_data[:ineligibility_reason]
    )

    parsed_status = determine_non_military(
      ee_data[:primary_eligibility], ee_data[:veteran],
      parsed_status
    )

    ee_data.slice(*EE_DATA_SELECTED_KEYS).merge(parsed_status:)
  else
    { parsed_status: if ee_data[:enrollment_status].present?
                       HCA::EnrollmentEligibility::Constants::LOGIN_REQUIRED
                     else
                       HCA::EnrollmentEligibility::Constants::NONE_OF_THE_ABOVE
                     end }
  end
end

.user_attributes(form) ⇒ Object



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'app/models/health_care_application.rb', line 173

def self.user_attributes(form)
  form ||= {}
  full_name = form['veteranFullName'] || {}

  return_val = HCA::UserAttributes.new(
    first_name: full_name['first'],
    middle_name: full_name['middle'],
    last_name: full_name['last'],
    birth_date: form['veteranDateOfBirth'],
    ssn: form['veteranSocialSecurityNumber'],
    gender: form['gender']
  )

  raise Common::Exceptions::ValidationErrors, return_val unless return_val.valid?

  return_val
end

.user_icn(user_attributes) ⇒ Object



165
166
167
168
169
170
171
# File 'app/models/health_care_application.rb', line 165

def self.user_icn(user_attributes)
  HCA::RateLimitedSearch.create_rate_limited_searches(user_attributes) unless Settings.mvi_hca.skip_rate_limit
  MPI::Service.new.find_profile_by_attributes(first_name: user_attributes.first_name,
                                              last_name: user_attributes.last_name,
                                              birth_date: user_attributes.birth_date,
                                              ssn: user_attributes.ssn)&.profile&.icn
end

Instance Method Details

#failed?Boolean

Returns:

  • (Boolean)


54
55
56
# File 'app/models/health_care_application.rb', line 54

def failed?
  state == 'failed'
end

#form_idObject



46
47
48
# File 'app/models/health_care_application.rb', line 46

def form_id
  self.class::FORM_ID.upcase
end

#form_submission_idObject



200
201
202
# File 'app/models/health_care_application.rb', line 200

def form_submission_id
  form_submission_id_string&.to_i
end

#process!Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'app/models/health_care_application.rb', line 84

def process!
  prefill_fields

  unless valid?
    StatsD.increment("#{HCA::Service::STATSD_KEY_PREFIX}.validation_error")

    StatsD.increment("#{HCA::Service::STATSD_KEY_PREFIX}.validation_error_short_form") if short_form?

    Raven.extra_context(
      user_loa: user&.loa
    )

    PersonalInformationLog.create(
      data: parsed_form,
      error_class: 'HealthCareApplication ValidationError'
    )

    raise(Common::Exceptions::ValidationErrors, self)
  end

  has_email = parsed_form['email'].present?

  if has_email || async_compatible
    save!
    submit_async(has_email)
  else
    submit_sync
  end
end

#set_result_on_success!(result) ⇒ Object



191
192
193
194
195
196
197
198
# File 'app/models/health_care_application.rb', line 191

def set_result_on_success!(result)
  update!(
    state: 'success',
    # this is a string because it overflowed the postgres integer limit in one of the tests
    form_submission_id_string: result[:formSubmissionId].to_s,
    timestamp: result[:timestamp]
  )
end

#short_form?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'app/models/health_care_application.rb', line 58

def short_form?
  form.present? && parsed_form['lastServiceBranch'].blank?
end

#submit_syncObject



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'app/models/health_care_application.rb', line 62

def submit_sync
  @parsed_form = override_parsed_form(parsed_form)

  result = begin
    HCA::Service.new(user).submit_form(parsed_form)
  rescue Common::Client::Errors::ClientError => e
    log_exception_to_sentry(e)

    raise Common::Exceptions::BackendServiceException.new(
      nil, detail: e.message
    )
  end

  Rails.logger.info "SubmissionID=#{result[:formSubmissionId]}"

  result
rescue
  log_submission_failure

  raise
end

#success?Boolean

Returns:

  • (Boolean)


50
51
52
# File 'app/models/health_care_application.rb', line 50

def success?
  state == 'success'
end