diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c6dad6f4fe6..7f68dbe9202 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -64,7 +64,6 @@ app/controllers/v0/backend_statuses_controller.rb @department-of-veterans-affair app/controllers/v0/benefits_claims_controller.rb @department-of-veterans-affairs/benefits-management-tools-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/benefits-admin app/controllers/v0/benefits_documents_controller.rb @department-of-veterans-affairs/benefits-management-tools-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/benefits-admin app/controllers/v0/benefits_reference_data_controller.rb @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group -app/controllers/v0/burial_claims_controller.rb @department-of-veterans-affairs/mbs-core-team @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group app/controllers/v0/caregivers_assistance_claims_controller.rb @department-of-veterans-affairs/vfs-10-10 @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group app/controllers/v0/claim_documents_controller.rb @department-of-veterans-affairs/Disability-Experience @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group app/controllers/v0/claim_letters_controller.rb @department-of-veterans-affairs/benefits-management-tools-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/benefits-admin @@ -144,7 +143,6 @@ app/controllers/v0/user @department-of-veterans-affairs/octo-identity app/controllers/v0/users_controller.rb @department-of-veterans-affairs/octo-identity app/controllers/v0/veteran_readiness_employment_claims_controller.rb @department-of-veterans-affairs/benefits-non-disability @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group app/controllers/v0/virtual_agent @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group -app/controllers/v0/virtual_agent_claim_letters_controller.rb @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group app/controllers/v0/virtual_agent_jwt_token_controller.rb @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group app/controllers/v0/virtual_agent/jwt_token.rb @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group app/controllers/v0/virtual_agent/report_to_cxdw.rb @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @@ -152,7 +150,6 @@ app/controllers/v0/virtual_agent_speech_token_controller.rb @department-of-veter app/controllers/v0/virtual_agent_token_controller.rb @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group app/controllers/v0/virtual_agent_token_msft_controller.rb @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group app/controllers/v0/virtual_agent_token_nlu_controller.rb @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group -app/controllers/v0/virtual_agent/virtual_agent_appeal_controller.rb @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group app/controllers/v0/virtual_agent/virtual_agent_claim_status_controller.rb @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group app/controllers/v0/veteran_onboardings_controller.rb @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/va-iir app/controllers/v1/apidocs_controller.rb @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @@ -1134,7 +1131,6 @@ spec/controllers/v0/ask_va @department-of-veterans-affairs/ask-va-team @departme spec/controllers/v0/average_days_for_claim_completion_controller_spec.rb @department-of-veterans-affairs/benefits-microservices @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group spec/controllers/v0/benefits_claims_controller_spec.rb @department-of-veterans-affairs/benefits-management-tools-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/benefits-admin spec/controllers/v0/benefits_reference_data_controller_spec.rb @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group -spec/controllers/v0/burial_claims_controller_spec.rb @department-of-veterans-affairs/mbs-core-team @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group spec/controllers/v0/caregivers_assistance_claims_controller_spec.rb @department-of-veterans-affairs/vfs-10-10 spec/controllers/v0/claim_letters_controller_spec.rb @department-of-veterans-affairs/benefits-management-tools-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/benefits-admin spec/controllers/v0/contact_us @department-of-veterans-affairs/ask-va-team @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @@ -1177,7 +1173,6 @@ spec/controllers/v0/veteran_onboardings_controller_spec.rb @department-of-vetera spec/controllers/v0/virtual_agent @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group spec/controllers/v0/virtual_agent_token_msft_controller_spec.rb @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group spec/controllers/v0/virtual_agent_token_nlu_controller_spec.rb @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group -spec/controllers/v0/virtual_agent_claim_letters_controller_spec.rb @department-of-veterans-affairs/vfs-virtual-agent-chatbot @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group spec/controllers/v1/decision_review_notification_callbacks_controller_spec.rb @department-of-veterans-affairs/benefits-decision-reviews-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/benefits-admin spec/controllers/v1/gids @department-of-veterans-affairs/govcio-vfep-codereviewers @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group spec/controllers/v1/post911_gi_bill_statuses_controller_spec.rb @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/govcio-vfep-codereviewers diff --git a/.github/workflows/deploy-template.yml b/.github/workflows/deploy-template.yml index 16f20bc85dd..315092a8f8e 100644 --- a/.github/workflows/deploy-template.yml +++ b/.github/workflows/deploy-template.yml @@ -59,12 +59,12 @@ jobs: ssm_parameter: /devops/VA_VSP_BOT_GITHUB_TOKEN env_variable_name: VA_VSP_BOT_GITHUB_TOKEN - - name: Install yq if needed + - name: Install yq run: | - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CC86BB64 - sudo add-apt-repository ppa:rmescandon/yq - sudo apt update - sudo apt install yq -y + wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O yq + chmod +x yq + sudo mv yq /usr/local/bin/ + yq --version - name: Check out Manifest Repo uses: actions/checkout@v4 diff --git a/app/controllers/concerns/vet360/transactionable.rb b/app/controllers/concerns/vet360/transactionable.rb index 424fc380194..e3b833259e1 100644 --- a/app/controllers/concerns/vet360/transactionable.rb +++ b/app/controllers/concerns/vet360/transactionable.rb @@ -23,7 +23,7 @@ def check_transaction_status! private def service - if Flipper.enabled?(:va_v3_contact_information_service, @current_user) + if Flipper.enabled?(:remove_pciu, @current_user) VAProfile::V2::ContactInformation::Service.new @current_user else VAProfile::ContactInformation::Service.new @current_user diff --git a/app/controllers/concerns/vet360/writeable.rb b/app/controllers/concerns/vet360/writeable.rb index f90231bced4..65e718b4219 100644 --- a/app/controllers/concerns/vet360/writeable.rb +++ b/app/controllers/concerns/vet360/writeable.rb @@ -27,7 +27,7 @@ def write_to_vet360_and_render_transaction!(type, params, http_verb: 'post') end def invalidate_cache - if Flipper.enabled?(:va_v3_contact_information_service, @current_user) + if Flipper.enabled?(:remove_pciu, @current_user) VAProfileRedis::V2::Cache.invalidate(@current_user) else VAProfileRedis::Cache.invalidate(@current_user) @@ -38,7 +38,7 @@ def invalidate_cache def build_record(type, params) # This needs to be refactored after V2 upgrade is complete - if type == 'address' && Flipper.enabled?(:va_v3_contact_information_service, @current_user) + if type == 'address' && Flipper.enabled?(:remove_pciu, @current_user) model = 'VAProfile::Models::V3::Address' # Ensures the address_pou is valid params[:address_pou] = 'RESIDENCE' if params[:address_pou] == 'RESIDENCE/CHOICE' @@ -61,7 +61,7 @@ def validate!(record) end def service - if Flipper.enabled?(:va_v3_contact_information_service, @current_user) + if Flipper.enabled?(:remove_pciu, @current_user) VAProfile::V2::ContactInformation::Service.new @current_user else VAProfile::ContactInformation::Service.new @current_user diff --git a/app/controllers/v0/burial_claims_controller.rb b/app/controllers/v0/burial_claims_controller.rb deleted file mode 100644 index f73490e6cac..00000000000 --- a/app/controllers/v0/burial_claims_controller.rb +++ /dev/null @@ -1,100 +0,0 @@ -# frozen_string_literal: true - -require 'burials/benefits_intake/submit_claim_job' -require 'burials/monitor' -require 'common/exceptions/validation_errors' - -module V0 - class BurialClaimsController < ApplicationController - skip_before_action(:authenticate) - before_action :load_user, only: :create - - service_tag 'burial-application' - - def show - claim = claim_class.find_by!(guid: params[:id]) - render json: SavedClaimSerializer.new(claim) - rescue ActiveRecord::RecordNotFound => e - monitor.track_show404(params[:id], current_user, e) - render(json: { error: e.to_s }, status: :not_found) - rescue => e - monitor.track_show_error(params[:id], current_user, e) - raise e - end - - def create - claim = claim_class.new(form: filtered_params[:form]) - monitor.track_create_attempt(claim, current_user) - - in_progress_form = current_user ? InProgressForm.form_for_user(claim.form_id, current_user) : nil - claim.form_start_date = in_progress_form.created_at if in_progress_form - - unless claim.save - Sentry.set_tags(team: 'benefits-memorial-1') # tag sentry logs with team name - monitor.track_create_validation_error(in_progress_form, claim, current_user) - log_validation_error_to_metadata(in_progress_form, claim) - raise Common::Exceptions::ValidationErrors, claim.errors - end - - process_and_upload_to_lighthouse(in_progress_form, claim) - - monitor.track_create_success(in_progress_form, claim, current_user) - - clear_saved_form(claim.form_id) - render json: SavedClaimSerializer.new(claim) - rescue => e - monitor.track_create_error(in_progress_form, claim, current_user, e) - raise e - end - - private - - # an identifier that matches the parameter that the form will be set as in the JSON submission. - def short_name - 'burial_claim' - end - - # a subclass of SavedClaim, runs json-schema validations and performs any storage and attachment processing - def claim_class - SavedClaim::Burial - end - - def process_and_upload_to_lighthouse(in_progress_form, claim) - claim.process_attachments! - - Burials::BenefitsIntake::SubmitClaimJob.perform_async(claim.id) - rescue => e - monitor.track_process_attachment_error(in_progress_form, claim, current_user) - raise e - end - - # Filters out the parameters to form access. - def filtered_params - params.require(short_name.to_sym).permit(:form) - end - - ## - # include validation error on in_progress_form metadata. - # `noop` if in_progress_form is `blank?` - # - # @param in_progress_form [InProgressForm] - # @param claim [Pensions::SavedClaim] - # - def log_validation_error_to_metadata(in_progress_form, claim) - return if in_progress_form.blank? - - metadata = in_progress_form.metadata - metadata['submission']['error_message'] = claim&.errors&.errors&.to_s - in_progress_form.update(metadata:) - end - - ## - # retreive a monitor for tracking - # - # @return [Burials::Monitor] - # - def monitor - @monitor ||= Burials::Monitor.new - end - end -end diff --git a/app/controllers/v0/health_care_applications_controller.rb b/app/controllers/v0/health_care_applications_controller.rb index 5240475f04d..c8899b7fc0c 100644 --- a/app/controllers/v0/health_care_applications_controller.rb +++ b/app/controllers/v0/health_care_applications_controller.rb @@ -12,7 +12,7 @@ class HealthCareApplicationsController < ApplicationController service_tag 'healthcare-application' FORM_ID = '1010ez' - skip_before_action(:authenticate, only: %i[create show enrollment_status healthcheck facilities]) + skip_before_action(:authenticate, only: %i[create show enrollment_status healthcheck facilities download_pdf]) before_action :record_submission_attempt, only: :create before_action :load_user, only: %i[create enrollment_status] @@ -83,8 +83,28 @@ def facilities render(json: active_facilities(lighthouse_facilities)) end + # If we were unable to submit the user's claim digitally, we allow them to the download + # the 10-10EZ PDF, pre-filled with their data, for them to mail in. + def download_pdf + source_file_path = PdfFill::Filler.fill_form(health_care_application, SecureRandom.uuid) + + client_file_name = file_name_for_pdf(health_care_application.parsed_form) + file_contents = File.read(source_file_path) + + send_data file_contents, filename: client_file_name, type: 'application/pdf', disposition: 'attachment' + ensure + File.delete(source_file_path) if source_file_path && File.exist?(source_file_path) + end + private + def file_name_for_pdf(parsed_form) + veteran_name = parsed_form.try(:[], 'veteranFullName') + first_name = veteran_name.try(:[], 'first') || 'First' + last_name = veteran_name.try(:[], 'last') || 'Last' + "10-10EZ_#{first_name}_#{last_name}.pdf" + end + def active_facilities(lighthouse_facilities) active_ids = active_ves_facility_ids lighthouse_facilities.select { |facility| active_ids.include?(facility.unique_id) } diff --git a/app/controllers/v0/profile/address_validation_controller.rb b/app/controllers/v0/profile/address_validation_controller.rb index 5e19b3652da..92ef6a068e0 100644 --- a/app/controllers/v0/profile/address_validation_controller.rb +++ b/app/controllers/v0/profile/address_validation_controller.rb @@ -13,7 +13,7 @@ class AddressValidationController < ApplicationController skip_before_action :authenticate, only: [:create] def create - address = if Flipper.enabled?(:va_v3_contact_information_service) + address = if Flipper.enabled?(:remove_pciu) VAProfile::Models::V3::ValidationAddress.new(address_params) else VAProfile::Models::ValidationAddress.new(address_params) @@ -49,7 +49,7 @@ def address_params end def service - @service ||= if Flipper.enabled?(:va_v3_contact_information_service) + @service ||= if Flipper.enabled?(:remove_pciu) VAProfile::V3::AddressValidation::Service.new else VAProfile::AddressValidation::Service.new diff --git a/app/controllers/v0/profile/persons_controller.rb b/app/controllers/v0/profile/persons_controller.rb index 5307b3b0af0..ba32c589e9f 100644 --- a/app/controllers/v0/profile/persons_controller.rb +++ b/app/controllers/v0/profile/persons_controller.rb @@ -12,7 +12,7 @@ class PersonsController < ApplicationController after_action :invalidate_mpi_cache def initialize_vet360_id - response = if Flipper.enabled?(:va_v3_contact_information_service, @current_user) + response = if Flipper.enabled?(:remove_pciu, @current_user) VAProfile::V2::Person::Service.new(@current_user).init_vet360_id else VAProfile::Person::Service.new(@current_user).init_vet360_id diff --git a/app/controllers/v0/profile/transactions_controller.rb b/app/controllers/v0/profile/transactions_controller.rb index e89f111fe3c..fbe6b9a363d 100644 --- a/app/controllers/v0/profile/transactions_controller.rb +++ b/app/controllers/v0/profile/transactions_controller.rb @@ -29,7 +29,7 @@ def transaction_params end def service - if Flipper.enabled?(:va_v3_contact_information_service, @current_user) + if Flipper.enabled?(:remove_pciu, @current_user) VAProfile::V2::ContactInformation::Service.new @current_user else VAProfile::ContactInformation::Service.new @current_user diff --git a/app/controllers/v0/veteran_readiness_employment_claims_controller.rb b/app/controllers/v0/veteran_readiness_employment_claims_controller.rb index 7c8f41149b2..7b2cf315658 100644 --- a/app/controllers/v0/veteran_readiness_employment_claims_controller.rb +++ b/app/controllers/v0/veteran_readiness_employment_claims_controller.rb @@ -46,7 +46,7 @@ def encrypted_user uuid: current_user.uuid, icn: current_user.icn, first_name: current_user.first_name, - va_profile_email: current_user.va_profile_email || current_user.va_profile_v2_email + va_profile_email: current_user.va_profile_email ) KmsEncrypted::Box.new.encrypt(user_struct.to_h.to_json) end diff --git a/app/controllers/v0/virtual_agent/virtual_agent_appeal_controller.rb b/app/controllers/v0/virtual_agent/virtual_agent_appeal_controller.rb deleted file mode 100644 index 5f613a5a158..00000000000 --- a/app/controllers/v0/virtual_agent/virtual_agent_appeal_controller.rb +++ /dev/null @@ -1,199 +0,0 @@ -# frozen_string_literal: true - -require 'date' - -module V0 - module VirtualAgent - class VirtualAgentAppealController < AppealsBaseController - service_tag 'virtual-agent' - - def index - if Settings.vsp_environment == 'staging' - Rails.logger.info 'Getting appeals from Lighthouse for staging environment' - @user_ssan, @user_name = set_user_credentials - appeals_response = get_staging_appeals_from_lighthouse(@user_ssan, @user_name) - appeals_data_array = appeals_response['data'] - Rails.logger.info "Retrieved #{appeals_data_array.count} appeals from Lighthouse for staging environment" - else - appeals_response = appeals_service.get_appeals(current_user) - appeals_data_array = appeals_response.body['data'] - end - data = data_for_first_comp_appeal(appeals_data_array) - render json: { - data: - } - rescue => e - service_exception_handler(e) - end - - def get_staging_appeals_from_lighthouse(ssan, user_name) - uri = URI(Settings.virtual_agent.lighthouse_api_uri) - - req = Net::HTTP::Get.new(uri) - req['apikey'] = Settings.virtual_agent.lighthouse_api_key - req['X-VA-SSN'] = ssan - req['X-VA-User'] = user_name - - http = Net::HTTP.new(uri.hostname, uri.port) - - http.use_ssl = true - - response = http.request(req) - if response.code != '200' - Rails.logger.error "Lighthouse API returned #{response.code}: #{response.body}" - raise "#{response.code}: #{response.body}" if Settings.vsp_environment == 'staging' - end - - JSON.parse(response.body) - end - - def data_for_first_comp_appeal(appeals) - open_comp_appeals = first_five_open_comp_appeals(appeals) - - return [] if open_comp_appeals.nil? - - transform_appeals_to_response(open_comp_appeals) - end - - def transform_appeals_to_response(appeals) - appeals.map { |appeal| transform_single_appeal_to_response(appeal) } - end - - def transform_single_appeal_to_response(appeal) - aoj = appeal['attributes']['aoj'] - { - appeal_type: appeal['attributes']['programArea'].capitalize, - filing_date: get_submission_date(appeal).strftime('%m/%d/%Y'), - appeal_status: get_status_type_text(appeal['attributes']['status']['type'], aoj), - updated_date: get_last_updated_date(appeal).strftime('%m/%d/%Y'), - description: appeal['attributes']['description'] == '' ? ' ' : " (#{appeal['attributes']['description']}) ", - appeal_or_review: get_appeal_or_review(appeal) - } - end - - def first_five_open_comp_appeals(appeals) - appeals - .sort_by { |appeal| get_last_updated_date appeal } - .reverse - .select { |appeal| open_compensation? appeal } - .take(5) - end - - def get_appeal_or_review(appeal) - case appeal['type'] - when 'legacyAppeal', 'appeal' - 'appeal' - when 'higherLevelReview', 'supplementalClaim' - 'review' - end - end - - def get_submission_date(appeal) - events = appeal['attributes']['events'] - submission_event = {} - case appeal['type'] - when 'legacyAppeal' - submission_event = events.detect { |event| event['type'] == 'nod' } - when 'appeal' - submission_event = events.detect { |event| event['type'] == 'ama_nod' } - when 'higherLevelReview' - submission_event = events.detect { |event| event['type'] == 'hlr_request' } - when 'supplementalClaim' - submission_event = events.detect { |event| event['type'] == 'sc_request' } - end - DateTime.parse submission_event['date'] - end - - def get_last_updated_date(appeal) - events = appeal['attributes']['events'] - DateTime.parse events - .max_by { |event| DateTime.parse event['date'] }['date'] - end - - def open_compensation?(appeal) - appeal['attributes']['programArea'] == 'compensation' and appeal['attributes']['active'] - end - - APPEAL_DESCRIPTIONS = { - 'pending_soc' => 'A Decision Review Officer is reviewing your appeal', - 'pending_form9' => 'Please review your Statement of the Case', - 'pending_certification' => 'The Decision Review Officer is finishing their review of your appeal', - 'pending_certification_ssoc' => 'Please review your Supplemental Statement of the Case', - 'remand_ssoc' => 'Please review your Supplemental Statement of the Case', - 'pending_hearing_scheduling' => 'You’re waiting for your hearing to be scheduled', - 'scheduled_hearing' => 'Your hearing has been scheduled', - 'on_docket' => 'Your appeal is waiting to be sent to a judge', - 'at_vso' => 'Your appeal is with your Veterans Service Organization', - 'decision_in_progress' => 'A judge is reviewing your appeal', - 'bva_development' => 'The judge is seeking more information before making a decision', - 'stayed' => 'The Board is waiting until a higher court makes a decision', - 'remand' => 'The Board made a decision on your appeal', - 'ama_remand' => 'The Board made a decision on your appeal', - 'bva_decision' => 'The Board made a decision on your appeal', - 'field_grant' => 'The {aoj_desc} granted your appeal', - 'withdrawn' => 'You withdrew your appeal', - 'ftr' => 'Your appeal was closed', - 'ramp' => 'You opted in to the Rapid Appeals Modernization Program (RAMP)', - 'reconsideration' => 'Your Motion for Reconsideration was denied', - 'death' => 'The appeal was closed', - 'other_close' => 'Your appeal was closed', - 'merged' => 'Your appeal was merged', - 'statutory_opt_in' => 'You requested a decision review under the Appeals Modernization Act', - 'evidentiary_period' => 'Your appeals file is open for new evidence', - 'post_bva_dta_decision' => 'The {aoj_desc} corrected an error', - 'bva_decision_effectuation' => 'The {aoj_desc} corrected an error', - 'sc_received' => 'A reviewer is examining your new evidence', - 'sc_recieved' => 'A reviewer is examining your new evidence', - 'hlr_received' => 'A senior reviewer is taking a new look at your case', - 'sc_decision' => 'The {aoj_desc} made a decision', - 'hlr_decision' => 'The {aoj_desc} made a decision', - 'hlr_dta_error' => 'The {aoj_desc} is correcting an error', - 'sc_closed' => 'Your Supplemental Claim was closed', - 'hlr_closed' => 'Your Higher-Level Review was closed', - 'remand_return' => 'Your appeal was returned to the Board of Veterans’ Appeals' - }.freeze - - AOJ_DESCRIPTIONS = { 'vba' => 'Veterans Benefits Administration', - 'vha' => 'Veterans Health Administration', - 'nca' => 'National Cemetery Administration', - 'other' => 'Agency of Original Jurisdiction' }.freeze - - def get_status_type_text(appeal_status, aoj) - appeal_status_description = APPEAL_DESCRIPTIONS[appeal_status] - - if appeal_status_description.nil? - appeal_status_description = 'Unknown Status' - unknown_status_error = StandardError.new("Unknown status: #{appeal_status} with AOJ: #{aoj}") - log_exception_to_sentry(unknown_status_error, { appeal_status => appeal_status, aoj => aoj }) - end - - if appeal_status_description.include? '{aoj_desc}' - appeal_status_description.gsub('{aoj_desc}', AOJ_DESCRIPTIONS[aoj]) - else - appeal_status_description - end - end - - def set_user_credentials - case @current_user.email - when 'vets.gov.user+228@gmail.com' - ['796104437', 'vets.gov.user+228@gmail.com'] - when 'vets.gov.user+54@gmail.com' - ['796378881', 'vets.gov.user+54@gmail.com'] - when 'vets.gov.user+36@gmail.com' - ['796043735', 'vets.gov.user+36@gmail.com'] - else - [@current_user.ssn, @current_user.email] - end - end - - private - - def service_exception_handler(exception) - context = 'An error occurred while attempting to retrieve the appeal(s)' - log_exception_to_sentry(exception, 'context' => context) - render nothing: true, status: :internal_server_error - end - end - end -end diff --git a/app/controllers/v0/virtual_agent_claim_letters_controller.rb b/app/controllers/v0/virtual_agent_claim_letters_controller.rb deleted file mode 100644 index 8de5d50b7fa..00000000000 --- a/app/controllers/v0/virtual_agent_claim_letters_controller.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -require 'claim_letters/claim_letter_downloader' - -module V0 - class VirtualAgentClaimLettersController < ApplicationController - Sentry.set_tags(feature: 'claim-letters') - service_tag 'virtual-agent' - - def index - docs = service.get_letters - - render json: docs - end - - def show - document_id = CGI.unescape(params[:document_id]) - - service.get_letter(document_id) do |data, mime_type, disposition, filename| - send_data(data, type: mime_type, disposition:, filename:) - end - end - - private - - def service - @service ||= ClaimStatusTool::ClaimLetterDownloader.new(@current_user) - end - end -end diff --git a/app/models/async_transaction/va_profile/base.rb b/app/models/async_transaction/va_profile/base.rb index a4db7da9268..f5b93938771 100644 --- a/app/models/async_transaction/va_profile/base.rb +++ b/app/models/async_transaction/va_profile/base.rb @@ -43,7 +43,7 @@ def self.last_requested_for_user(user) # def self.start(user, response) # vet360_id is no longer required for Contact Information API V2 - source_id = if Flipper.enabled?(:va_v3_contact_information_service, + source_id = if Flipper.enabled?(:remove_pciu, user) user.vet360_id || user.uuid else diff --git a/app/models/form_profile.rb b/app/models/form_profile.rb index 89d4231b43c..14df3ccb23e 100644 --- a/app/models/form_profile.rb +++ b/app/models/form_profile.rb @@ -127,7 +127,7 @@ class FormProfile '21P-0516-1-UPLOAD' => ::FormProfiles::FormUpload, '21P-0518-1-UPLOAD' => ::FormProfiles::FormUpload, '21P-527EZ' => ::FormProfiles::VA21p527ez, - '21P-530EZ' => ::FormProfiles::VA21p530ez, + '21P-530EZ' => Burials::FormProfiles::VA21p530ez, '22-0993' => ::FormProfiles::VA0993, '22-0994' => ::FormProfiles::VA0994, '22-10203' => ::FormProfiles::VA10203, @@ -182,8 +182,7 @@ def self.prefill_enabled_forms # def self.prepend_module(form_class, form_id) namespaces = { - '21P-527EZ' => 'Pensions', - '21P-530EZ' => 'Burials' + '21P-527EZ' => 'Pensions' } namespace = namespaces[form_id] diff --git a/app/models/form_profiles/va_21686c.rb b/app/models/form_profiles/va_21686c.rb index 28e5a35dd0e..69008946f5f 100644 --- a/app/models/form_profiles/va_21686c.rb +++ b/app/models/form_profiles/va_21686c.rb @@ -108,7 +108,7 @@ def metadata end def prefill - if Flipper.enabled?(:va_v3_contact_information_service, user) + if Flipper.enabled?(:remove_pciu, user) return {} unless user.authorize :va_profile, :access_to_v2? else return {} unless user.authorize :evss, :access? diff --git a/app/models/form_profiles/va_21p530ez.rb b/app/models/form_profiles/va_21p530ez.rb deleted file mode 100644 index d1e8cc53309..00000000000 --- a/app/models/form_profiles/va_21p530ez.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -require 'iso_country_codes' - -class FormProfiles::VA21p530ez < FormProfile - def metadata - { - version: 0, - prefill: true, - returnUrl: '/claimant-information' - } - end - - def prefill - @identity_information = initialize_identity_information - @contact_information = initialize_contact_information - if @contact_information&.address&.country.present? - @contact_information.address.country = convert_to_iso2(@contact_information.address.country) - end - mappings = self.class.mappings_for_form(form_id) - - form_data = generate_prefill(mappings) if FormProfile.prefill_enabled_forms.include?(form_id) - - { form_data:, metadata: } - end - - private - - def convert_to_iso2(country_code) - code = IsoCountryCodes.find(country_code) - code.alpha3 - end -end diff --git a/app/models/form_profiles/va_526ez.rb b/app/models/form_profiles/va_526ez.rb index e53fa98b21c..168271fb64a 100644 --- a/app/models/form_profiles/va_526ez.rb +++ b/app/models/form_profiles/va_526ez.rb @@ -186,7 +186,7 @@ def initialize_vets360_contact_info end def initialize_veteran_contact_information - if Flipper.enabled?(:disability_compensation_remove_pciu, user) + if Flipper.enabled?(:remove_pciu, user) return {} unless user.authorize :va_profile, :access_to_v2? contact_info = initialize_vets360_contact_info @@ -202,11 +202,10 @@ def initialize_veteran_contact_information end # Logging was added below to contrast/compare completeness of contact information returned # from VA Profile alone versus VA Profile + PCIU. This logging will be removed when the Flipper flag is. - Rails.logger.info("disability_compensation_remove_pciu=#{Flipper.enabled?(:disability_compensation_remove_pciu, - user)}," \ - "mailing_address=#{contact_info[:mailing_address].present?}," \ - "email_address=#{contact_info[:email_address].present?}," \ - "primary_phone=#{contact_info[:primary_phone].present?}") + Rails.logger.info("remove_pciu=#{Flipper.enabled?(:remove_pciu, user)}," \ + "mailing_address=#{contact_info[:mailing_address].present?}," \ + "email_address=#{contact_info[:email_address].present?}," \ + "primary_phone=#{contact_info[:primary_phone].present?}") contact_info = VA526ez::FormContactInformation.new(contact_info) diff --git a/app/models/user.rb b/app/models/user.rb index 9cdc0ff4b0e..4a65711487f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -410,11 +410,15 @@ def onboarding delegate :show_onboarding_flow_on_login, to: :onboarding, allow_nil: true def vet360_contact_info - return nil unless VAProfile::Configuration::SETTINGS.contact_information.enabled && vet360_id.present? + return nil unless VAProfile::Configuration::SETTINGS.contact_information.enabled && + ( + (!Flipper.enabled?(:remove_pciu, self) && vet360_id.present?) || + (Flipper.enabled?(:remove_pciu, self) && icn.present?) + ) - @vet360_contact_info ||= if Flipper.enabled?(:remove_pciu, self) + @vet360_contact_info ||= if Flipper.enabled?(:remove_pciu, self) && icn.present? VAProfileRedis::V2::ContactInformation.for_user(self) - else + elsif !Flipper.enabled?(:remove_pciu, self) && vet360_id.present? VAProfileRedis::ContactInformation.for_user(self) end end diff --git a/app/policies/va_profile_policy.rb b/app/policies/va_profile_policy.rb index e274fb63d0b..50d7ead7841 100644 --- a/app/policies/va_profile_policy.rb +++ b/app/policies/va_profile_policy.rb @@ -6,7 +6,7 @@ def access? end def access_to_v2? - if Flipper.enabled?(:va_v3_contact_information_service, user) + if Flipper.enabled?(:remove_pciu, user) user.icn.present? else user.vet360_id.present? diff --git a/app/services/users/profile.rb b/app/services/users/profile.rb index 159a3603b8b..1b412489e46 100644 --- a/app/services/users/profile.rb +++ b/app/services/users/profile.rb @@ -119,8 +119,7 @@ def form_526_required_identifiers end def vet360_contact_information - contact_info_v2_enabled = Flipper.enabled?(:va_v3_contact_information_service, user) - person = contact_info_v2_enabled ? user.vaprofile_contact_info : user.vet360_contact_info + person = user.vet360_contact_info return {} if person.blank? { diff --git a/app/sidekiq/form1095/delete_old1095_bs_job.rb b/app/sidekiq/form1095/delete_old1095_bs_job.rb new file mode 100644 index 00000000000..8781e4b9730 --- /dev/null +++ b/app/sidekiq/form1095/delete_old1095_bs_job.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module Form1095 + class DeleteOld1095BsJob + include Sidekiq::Job + + # This job deletes Form1095B forms for years prior to the current tax year. + # Limiting the number of records deleted in a single batch to prevent database impact. + # This limit can be overriden when running manually. + def perform(limit = 100_000) + forms_to_delete = Form1095B.where('tax_year < ?', Form1095B.current_tax_year).limit(limit) + if forms_to_delete.none? + Rails.logger.info('No old Form1095B records to delete') + return + end + + Rails.logger.info("Begin deleting #{forms_to_delete.count} old Form1095B files") + start_time = Time.now.to_f + forms_to_delete.in_batches(&:delete_all) + duration = Time.now.to_f - start_time + Rails.logger.info("Finished deleting old Form1095B files in #{duration} seconds") + end + end +end diff --git a/app/sidekiq/form1095/new1095_bs_job.rb b/app/sidekiq/form1095/new1095_bs_job.rb index 8f5f100a992..fa1eb82e24d 100644 --- a/app/sidekiq/form1095/new1095_bs_job.rb +++ b/app/sidekiq/form1095/new1095_bs_job.rb @@ -7,7 +7,7 @@ class New1095BsJob include Sidekiq::Job include SentryLogging - sidekiq_options(unique_for: 4.hours) + sidekiq_options(retry: false) def bucket @bucket ||= Aws::S3::Resource.new( diff --git a/app/sidekiq/lighthouse/evidence_submissions/delete_evidence_submission_records_job.rb b/app/sidekiq/lighthouse/evidence_submissions/delete_evidence_submission_records_job.rb index 21034685dba..75bbdc752bd 100644 --- a/app/sidekiq/lighthouse/evidence_submissions/delete_evidence_submission_records_job.rb +++ b/app/sidekiq/lighthouse/evidence_submissions/delete_evidence_submission_records_job.rb @@ -20,7 +20,7 @@ def perform upload_status: BenefitsDocuments::Constants::UPLOAD_STATUS[:SUCCESS] ).destroy_all - StatsD.increment("#{STATSD_KEY_PREFIX}.count") + StatsD.increment("#{STATSD_KEY_PREFIX}.count", deleted_records.size) Rails.logger.info("#{self.class} deleted #{deleted_records.size} of #{record_count} EvidenceSubmission records") nil diff --git a/app/swagger/swagger/requests/burial_claims.rb b/app/swagger/swagger/requests/burial_claims.rb index d0d5b9593a6..9f5bb896d46 100644 --- a/app/swagger/swagger/requests/burial_claims.rb +++ b/app/swagger/swagger/requests/burial_claims.rb @@ -5,7 +5,7 @@ module Requests class BurialClaims include Swagger::Blocks - swagger_path '/v0/burial_claims' do + swagger_path '/burials/v0/claims' do operation :post do extend Swagger::Responses::ValidationError extend Swagger::Responses::SavedForm diff --git a/app/swagger/swagger/requests/health_care_applications.rb b/app/swagger/swagger/requests/health_care_applications.rb index 17a5f941047..11c1f7c7924 100644 --- a/app/swagger/swagger/requests/health_care_applications.rb +++ b/app/swagger/swagger/requests/health_care_applications.rb @@ -309,6 +309,31 @@ class HealthCareApplications end end + swagger_path '/v0/health_care_applications/download_pdf' do + operation :post do + key :description, 'Download a pre-filled 10-10EZ PDF form.' + key :tags, %w[benefits_forms] + + parameter do + key :name, :form + key :in, :body + key :description, 'The form data used to fill the PDF form.' + key :required, true + schema do + key :type, :string + end + end + + response 200 do + key :description, 'PDF form download' + + schema do + property :data, type: :string, format: 'binary' + end + end + end + end + swagger_schema :HealthCareApplicationSubmissionResponse do key :required, %i[formSubmissionId timestamp success] diff --git a/app/swagger/swagger/schemas/travel_pay.rb b/app/swagger/swagger/schemas/travel_pay.rb index c842057bb0f..a697d6824f4 100644 --- a/app/swagger/swagger/schemas/travel_pay.rb +++ b/app/swagger/swagger/schemas/travel_pay.rb @@ -17,26 +17,26 @@ class TravelPay property :id, type: :string, example: '33333333-5555-4444-bbbb-222222444444' property :claimNumber, type: :string, example: 'TC1234123412341234' property :claimStatus, type: :string, enum: [ - 'Pre Approved For Payment', + 'Pre approved for payment', 'Saved', - 'In Process', + 'In process', 'Pending', - 'On Hold', - 'In Manual Review', - 'Submitted For Payment', - 'Claim Paid', + 'On hold', + 'In manual review', + 'Submitted for payment', + 'Claim paid', 'Incomplete', 'Appeal', 'Denied', - 'Closed With No Payment', - 'Claim Submitted', - 'Approved For Payment', - 'Approved For Payment Incomplete', - 'Payment Canceled', - 'Partial Payment', - 'Fiscal Rescinded', + 'Closed with no payment', + 'Claim submitted', + 'Approved for payment', + 'Approved for payment incomplete', + 'Payment canceled', + 'Partial payment', + 'Fiscal rescinded', 'Unspecified' - ], example: 'Claim Paid' + ], example: 'Claim paid' property :appointmentDateTime, type: :string, example: '2024-06-13T13:57:07.291Z' property :facilityName, type: :string, example: 'Cheyenne VA Medical Center' property :createdOn, type: :string, example: '2024-06-13T13:57:07.291Z' diff --git a/config/betamocks/services_config.yml b/config/betamocks/services_config.yml index 9030152ec16..8fbdbd0c2b0 100644 --- a/config/betamocks/services_config.yml +++ b/config/betamocks/services_config.yml @@ -970,3 +970,22 @@ - :method: :post :path: "/profile-service/profile/v3/*/*" :file_path: "vet360/profile-service/default" + +# MHV Unified Health Data security service +- :name: "MHV UHD Security" + :base_uri: <%= "#{URI(Settings.mhv.uhd.security_host).host}:#{URI(Settings.mhv.uhd.security_host).port}" %> + :endpoints: + - :method: :post + :path: "/mhvapi/security/v1/login" + :file_path: "mhv/uhd/security-service/default" + +# MHV Unified Health Data service +- :name: "MHV UHD" + :base_uri: <%= "#{URI(Settings.mhv.uhd.host).host}:#{URI(Settings.mhv.uhd.host).port}" %> + :endpoints: + - :method: :get + :path: "/mhvapi/v1/medicalrecords/labs" + :file_path: "mhv/uhd/labs" + :cache_multiple_responses: + :uid_location: "query" + :uid_locator: "patient-id" diff --git a/config/features.yml b/config/features.yml index dd612c19784..43ecb8b44be 100644 --- a/config/features.yml +++ b/config/features.yml @@ -151,6 +151,14 @@ features: actor_type: user description: Correctly formats the `va:attachments` XML for file uploads enable_in_development: true + ezr_route_guard_enabled: + actor_type: user + description: Enables the route guard authentication for 10-10EZR application + enable_in_development: true + ezr_form_prefill_with_providers_and_dependents: + actor_type: user + description: Adds insurance providers and dependents to ezr prefill data + enable_in_development: true cerner_override_653: actor_type: user description: This will show the Cerner facility 653 as `isCerner`. @@ -534,10 +542,6 @@ features: actor_type: user description: enables new version of add disabilities page, with updates to content and search functionality enable_in_development: true - disability_526_max_cfi_service_switch: - actor_type: user - description: Enables the use of the new Max Ratings CFI service instead of the VRO client for fetching max ratings. - enable_in_development: true disability_compensation_flashes: actor_type: user description: enables sending flashes to BGS for disability_compensation submissions. @@ -947,6 +951,14 @@ features: actor_type: user description: Control fetching OH vitals data enable_in_development: false + mhv_accelerated_delivery_uhd_enabled: + actor_type: user + description: Control whether vets-api allows fetching any MR data from MHV UHD + enable_in_development: false + mhv_accelerated_delivery_uhd_sp_enabled: + actor_type: user + description: Control whether vets-api allows fetching Surgical Pathology data from MHV UHD + enable_in_development: false mhv_va_health_chat_enabled: actor_type: user description: Enables the VA Health Chat link at /my-health @@ -1598,14 +1610,6 @@ features: actor_type: user enable_in_development: true description: Toggle for warning user of appointment conflicts on the direct scheduling calendar during booking. - va_v2_person_service: - actor_type: user - description: When enabled, the VAProfile::V2::Person::Service will be enabled - enable_in_development: true - va_v3_contact_information_service: - actor_type: user - description: When enabled, the VAProfile::V3::ContactInformation will be enabled - enable_in_development: true veteran_onboarding_beta_flow: actor_type: user description: Conditionally display the new veteran onboarding flow to user @@ -1721,9 +1725,6 @@ features: mobile_appeal_model: actor_type: user description: For mobile app, enables use of strict models for parsing appeals - mobile_v2_contact_info: - actor_type: user - description: For mobile app, enables ContactInformationV2 Service. mobile_push_register_logging: actor_type: user description: For mobile app, logs push register errors for debugging @@ -1745,9 +1746,6 @@ features: disability_compensation_prevent_submission_job: actor_type: user description: If enabled, the submission form526 record will be created, but there will be submission job - disability_compensation_remove_pciu: - actor_type: user - description: If enabled, VA Profile is used to populate contact information- without PCIU calls (status quo) disability_compensation_use_api_provider_for_bdd_instructions: actor_type: user description: Provide a temporary killswitch for using the ApiProviderFactory to select an API for uploading BDD instructions @@ -1831,10 +1829,6 @@ features: burial_form_enabled: actor_type: user description: Enable the burial form - burial_module_enabled: - actor_type: user - description: Enables new Burial module - enable_in_development: true burial_document_upload_update: actor_type: user description: Show updated document upload page @@ -1857,9 +1851,6 @@ features: burial_browser_monitoring_enabled: actor_type: user description: Burial Datadog RUM monitoring - burial_form_profile_module_enabled: - actor_type: user - description: Use the module version of the FormProfile pension_form_enabled: actor_type: user description: Enable the pension form @@ -1975,9 +1966,6 @@ features: remove_pciu: actor_type: user description: If enabled, VA Profile is used to populate contact information with PCIU backup calls - remove_pciu_2: - actor_type: user - description: If enabled, removes all PCIU requests in form pre-fill. show_yellow_ribbon_table: actor_type: user description: Used to show yellow ribbon table in Comparison Tool diff --git a/config/form_profile_mappings/10-10EZR.yml b/config/form_profile_mappings/10-10EZR.yml index 6adc1e390f1..8dbf9552500 100644 --- a/config/form_profile_mappings/10-10EZR.yml +++ b/config/form_profile_mappings/10-10EZR.yml @@ -5,7 +5,7 @@ veteranDateOfBirth: [identity_information, date_of_birth] homePhone: [contact_information, us_phone] veteranAddress: [contact_information, address] email: [contact_information, email] -# providers: [ezr_data, providers] +providers: [ezr_data, providers] isMedicaidEligible: [ezr_data, isMedicaidEligible] isEnrolledMedicarePartA: [ezr_data, isEnrolledMedicarePartA] medicarePartAEffectiveDate: [ezr_data, medicarePartAEffectiveDate] @@ -16,4 +16,6 @@ spouseDateOfBirth: [ezr_data, spouseDateOfBirth] dateOfMarriage: [ezr_data, dateOfMarriage] cohabitedLastYear: [ezr_data, cohabitedLastYear] maritalStatus: [ezr_data, maritalStatus] -# dependents: [ezr_data, dependents] +dependents: [ezr_data, dependents] +nonPrefill: + previousFinancialInfo: [ezr_data, previousFinancialInfo] diff --git a/config/routes.rb b/config/routes.rb index 1896a3c3e66..9c3187feb28 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -124,6 +124,7 @@ get(:enrollment_status) get(:rating_info) get(:facilities) + post(:download_pdf) end end @@ -149,8 +150,6 @@ resources :dependents_verifications, only: %i[create index] - resources :burial_claims, only: %i[create show] if Settings.central_mail.upload.enabled - post 'form0969', to: 'income_and_assets_claims#create' get 'form0969', to: 'income_and_assets_claims#show' @@ -164,9 +163,6 @@ get 'average_days_for_claim_completion', to: 'average_days_for_claim_completion#index' - get 'virtual_agent_claim_letters', to: 'virtual_agent_claim_letters#index' - get 'virtual_agent_claim_letters/:document_id', to: 'virtual_agent_claim_letters#show' - resources :efolder, only: %i[index show] resources :evss_claims, only: %i[index show] do @@ -184,14 +180,6 @@ get 'claims/:id', to: 'virtual_agent_claim_status#show' end - resources :virtual_agent_claim, only: %i[index] - - namespace :virtual_agent do - get 'appeal', to: 'virtual_agent_appeal#index' - end - - resources :virtual_agent_appeal, only: %i[index] - get 'intent_to_file', to: 'intent_to_files#index' post 'intent_to_file/:type', to: 'intent_to_files#submit' diff --git a/config/settings.yml b/config/settings.yml index 1b5b61f429c..b3bfa0fa108 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -641,15 +641,15 @@ ivc_forms: aws_access_key_id: <%= ENV['ivc_forms__s3__aws_access_key_id'] %> aws_secret_access_key: <%= ENV['ivc_forms__s3__aws_secret_access_key'] %> bucket: <%= ENV['ivc_forms__s3__bucket'] %> - region: us-east-2 + region: us-gov-west-1 sidekiq: missing_form_status_job: enabled: true kafka_producer: aws_region: "us-gov-west-1" - aws_role_arn: <%= ENV['KAFKA_PRODUCER__AWS_ROLE_ARN'] %> - broker_urls: <%= ENV['KAFKA_PRODUCER__BROKER_URLS'] %> - schema_registry_url: <%= ENV['KAFKA_PRODUCER__SCHEMA_REGISTRY_URL'] %> + aws_role_arn: <%= ENV['kafka_producer__aws_role_arn'] %> + broker_urls: <%= ENV['kafka_producer__broker_urls'] %> + schema_registry_url: <%= ENV['kafka_proudcer__schema_registry_url'] %> kms_key_id: <%= ENV['kms_key_id'] %> lgy: api_key: <%= ENV['lgy__api_key'] %> @@ -938,6 +938,14 @@ mhv: host: <%= ENV['mhv__sm__host'] %> mhv_sm_x_api_key: <%= ENV['mhv__sm__mhv_sm_x_api_key'] %> mock: <%= ENV['mhv__sm__mock'] %> + uhd: + app_id: <%= ENV['mhv__uhd__app_id'] %> + app_token: <%= ENV['mhv__uhd__app_token'] %> + host: <%= ENV['mhv__uhd__host'] %> + mock: false + security_host: <%= ENV['mhv__uhd__security_host'] %> + subject: "Proxy Client" + user_type: <%= ENV['mhv__uhd__user_type'] %> mhv_mobile: sm: app_token: <%= ENV['mhv_mobile__sm__app_token'] %> @@ -1462,7 +1470,7 @@ vanotify: ivc_champva: api_key: <%= ENV['vanotify__services__ivc_champva__api_key'] %> failure_email_threshold_days: 7 - pega_inbox_address: fake_email_address + pega_inbox_address: <%= ENV['vanotify__services__ivc_champva__pega_inbox_address'] %> template_id: form_10_10d_email: <%= ENV['vanotify__services__ivc_champva__template_id__form_10_10d_email'] %> form_10_10d_failure_email: <%= ENV['vanotify__services__ivc_champva__template_id__form_10_10d_failure_email'] %> @@ -1473,9 +1481,9 @@ vanotify: form_10_7959f_1_email: <%= ENV['vanotify__services__ivc_champva__template_id__form_10_7959f_1_email'] %> form_10_7959f_1_failure_email: <%= ENV['vanotify__services__ivc_champva__template_id__form_10_7959f_1_failure_email'] %> form_10_7959f_2_email: <%= ENV['vanotify__services__ivc_champva__template_id__form_10_7959f_2_email'] %> - form_10_7959f_2_failure_email: form_10_7959f_2_failure_email - pega_team_missing_status_email: pega_team_missing_status_email - pega_team_zsf_email: pega_team_zsf_email + form_10_7959f_2_failure_email: <%= ENV['vanotify__services__ivc_champva__template_id__form_10_7959f_2_failure_email'] %> + pega_team_missing_status_email: <%= ENV['vanotify__services__ivc_champva__template_id__pega_team_missing_status_email'] %> + pega_team_zsf_email: <%= ENV['vanotify__services__ivc_champva__template_id__pega_team_zsf_email'] %> lighthouse: api_key: <%= ENV['vanotify__services__lighthouse__api_key'] %> template_id: diff --git a/config/settings/development.yml b/config/settings/development.yml index b2121c0cb86..5b975cda211 100644 --- a/config/settings/development.yml +++ b/config/settings/development.yml @@ -953,6 +953,14 @@ mhv: host: https://mhv-api.example.com mhv_sm_x_api_key: ~ mock: true + uhd: + app_id: 1000 + app_token: faketoken + host: https://example.myhealth.va.gov + mock: true + security_host: https://security.example.myhealth.va.gov + subject: "Proxy Client" + user_type: usertype mhv_mobile: sm: app_token: fake-app-token diff --git a/config/settings/test.yml b/config/settings/test.yml index 903ec0f62f1..d8c9791358a 100644 --- a/config/settings/test.yml +++ b/config/settings/test.yml @@ -947,6 +947,14 @@ mhv: host: https://mhv-api.example.com mhv_sm_x_api_key: ~ mock: true + uhd: + app_id: 1000 + app_token: faketoken + host: https://example.myhealth.va.gov + mock: false + security_host: https://security.example.myhealth.va.gov + subject: "Proxy Client" + user_type: usertype mhv_mobile: sm: app_token: fake-app-token diff --git a/db/migrate/20250304165503_create_ar_power_of_attorney_request_notifications.rb b/db/migrate/20250304165503_create_ar_power_of_attorney_request_notifications.rb new file mode 100644 index 00000000000..f3941c448a8 --- /dev/null +++ b/db/migrate/20250304165503_create_ar_power_of_attorney_request_notifications.rb @@ -0,0 +1,10 @@ +class CreateArPowerOfAttorneyRequestNotifications < ActiveRecord::Migration[7.2] + def change + create_table :ar_power_of_attorney_request_notifications do |t| + t.references :power_of_attorney_request, type: :uuid, foreign_key: { to_table: :ar_power_of_attorney_requests }, null: false + t.references :notification, type: :uuid + t.string 'type', null: false + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index f53dd7e1996..21861bc5fd0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.2].define(version: 2025_02_27_192104) do +ActiveRecord::Schema[7.2].define(version: 2025_03_04_165503) do # These are extensions that must be enabled in order to support this database enable_extension "btree_gin" enable_extension "fuzzystrmatch" @@ -304,6 +304,16 @@ create_table "ar_power_of_attorney_request_expirations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| end + create_table "ar_power_of_attorney_request_notifications", force: :cascade do |t| + t.uuid "power_of_attorney_request_id", null: false + t.uuid "notification_id" + t.string "type", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["notification_id"], name: "idx_on_notification_id_2402e9daad" + t.index ["power_of_attorney_request_id"], name: "idx_on_power_of_attorney_request_id_b7c74f46e5" + end + create_table "ar_power_of_attorney_request_resolutions", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.uuid "power_of_attorney_request_id", null: false t.string "resolving_type", null: false @@ -1812,6 +1822,7 @@ add_foreign_key "appeal_submissions", "user_accounts" add_foreign_key "ar_power_of_attorney_forms", "ar_power_of_attorney_requests", column: "power_of_attorney_request_id" add_foreign_key "ar_power_of_attorney_request_decisions", "user_accounts", column: "creator_id" + add_foreign_key "ar_power_of_attorney_request_notifications", "ar_power_of_attorney_requests", column: "power_of_attorney_request_id" add_foreign_key "ar_power_of_attorney_request_resolutions", "ar_power_of_attorney_requests", column: "power_of_attorney_request_id" add_foreign_key "ar_power_of_attorney_request_withdrawals", "ar_power_of_attorney_requests", column: "superseding_power_of_attorney_request_id" add_foreign_key "ar_power_of_attorney_requests", "user_accounts", column: "claimant_id" diff --git a/lib/evss/disability_compensation_form/data_translation_all_claim.rb b/lib/evss/disability_compensation_form/data_translation_all_claim.rb index 3545490a798..9e40ccaa867 100644 --- a/lib/evss/disability_compensation_form/data_translation_all_claim.rb +++ b/lib/evss/disability_compensation_form/data_translation_all_claim.rb @@ -390,7 +390,7 @@ def translate_change_of_address(address) end def translate_mailing_address(address) - pciu_address = { + va_profile_address = { 'country' => address['country'], 'addressLine1' => address['addressLine1'], 'addressLine2' => address['addressLine2'], @@ -399,20 +399,20 @@ def translate_mailing_address(address) 'endingDate' => address.dig('effectiveDate', 'to') } - pciu_address['type'] = get_address_type(address) + va_profile_address['type'] = get_address_type(address) zip_code = split_zip_code(address['zipCode']) if address['zipCode'] - case pciu_address['type'] + case va_profile_address['type'] when 'DOMESTIC' - pciu_address.merge!(set_domestic_address(address, zip_code)) + va_profile_address.merge!(set_domestic_address(address, zip_code)) when 'MILITARY' - pciu_address.merge!(set_military_address(address, zip_code)) + va_profile_address.merge!(set_military_address(address, zip_code)) when 'INTERNATIONAL' - pciu_address.merge!(set_international_address(address)) + va_profile_address.merge!(set_international_address(address)) end - pciu_address.compact + va_profile_address.compact end def get_address_type(address) diff --git a/lib/hca/enrollment_eligibility/service.rb b/lib/hca/enrollment_eligibility/service.rb index 3987d3024c7..8685582c8f9 100644 --- a/lib/hca/enrollment_eligibility/service.rb +++ b/lib/hca/enrollment_eligibility/service.rb @@ -28,12 +28,12 @@ class Service < Common::Client::Base 'groupNumber' => 'insuranceGroupCode' }.freeze - MARITAL_STATUSES = %w[ - Married - Never Married - Separated - Widowed - Divorced + MARITAL_STATUSES = [ + 'Married', + 'Never Married', + 'Separated', + 'Widowed', + 'Divorced' ].freeze MEDICARE = 'Medicare' @@ -43,17 +43,22 @@ def get_ezr_data(icn) lookup_user_req(icn) end + financial_info = parse_financial_info(response) providers = parse_insurance_providers(response) dependents = parse_dependents(response) spouse = parse_spouse(response) - OpenStruct.new( - convert_insurance_hash( - response, providers - ).merge( - dependents.present? ? { dependents: } : {} - ).merge(spouse) - ) + if Flipper.enabled?(:ezr_form_prefill_with_providers_and_dependents) + OpenStruct.new( + financial_info.merge(convert_insurance_hash(response, providers)).merge( + dependents.present? ? { dependents: } : {} + ).merge(spouse) + ) + else + OpenStruct.new( + financial_info.merge(convert_insurance_hash(response, providers).except!(:providers)).merge(spouse) + ) + end end # rubocop:disable Metrics/MethodLength @@ -135,6 +140,74 @@ def get_marital_status(response) marital_status end + def find_financial_node(parent_node, node_value) + parent_node.nodes.select { |node| node.value == node_value }.first&.nodes&.first + end + + def get_income(response, xpath) + income = {} + + response.locate(xpath)&.each do |i| + type = find_financial_node(i, 'type') + amount = find_financial_node(i, 'amount') + + case type + when 'Total Employment Income' + income[:grossIncome] = amount + when 'Net Income from Farm, Ranch, Property, Business' + income[:netIncome] = amount + when 'All Other Income' + income[:otherIncome] = amount + end + end + + income + end + + def get_expenses(response, xpath) + expenses = {} + + response.locate(xpath)&.each do |i| + type = find_financial_node(i, 'expenseType') + amount = find_financial_node(i, 'amount') + + case type + when 'Funeral and Burial Expenses' + expenses[:deductibleFuneralExpenses] = amount + when 'Total Non-Reimbursed Medical Expenses' + expenses[:deductibleMedicalExpenses] = amount + when "Veteran's Educational Expenses" + expenses[:deductibleEducationExpenses] = amount + end + end + + expenses + end + + def parse_financial_info(response) + financial_info_xpath = "#{XPATH_PREFIX}financialsInfo/financialStatement/" + spouse_financial_info_xpath = "#{financial_info_xpath}spouseFinancialsList/spouseFinancials/" + + Common::HashHelpers.deep_compact( + { + previousFinancialInfo: { + veteranFinancialInfo: get_income( + response, "#{financial_info_xpath}incomes/income" + ).merge( + get_expenses(response, "#{financial_info_xpath}expenses/expense").merge( + incomeYear: get_locate_value(response, "#{financial_info_xpath}incomeYear") + ) + ), + spouseFinancialInfo: get_income( + response, "#{spouse_financial_info_xpath}incomes/income" + ).merge( + incomeYear: get_locate_value(response, "#{spouse_financial_info_xpath}incomeYear") + ) + } + } + ) + end + # rubocop:disable Metrics/MethodLength def parse_spouse(response) spouse_financials_xpath = diff --git a/lib/periodic_jobs.rb b/lib/periodic_jobs.rb index 6c9896c5b59..f88e212574b 100644 --- a/lib/periodic_jobs.rb +++ b/lib/periodic_jobs.rb @@ -258,4 +258,7 @@ # Daily cron job to send Failure Notification Emails to Veterans for their failed evidence submissions. mgr.register('5 0 * * *', 'Lighthouse::EvidenceSubmissions::FailureNotificationEmailJob') + + # Daily cron job to delete Form1095B forms for years prior to the current tax year. + mgr.register('0 4 * * *', 'Form1095::DeleteOld1095BsJob') } diff --git a/lib/unified_health_data/configuration.rb b/lib/unified_health_data/configuration.rb new file mode 100644 index 00000000000..2bc548e54bd --- /dev/null +++ b/lib/unified_health_data/configuration.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require 'common/client/configuration/rest' +require 'common/client/middleware/request/camelcase' +require 'common/client/middleware/response/json_parser' +require 'common/client/middleware/response/raise_custom_error' +require 'common/client/middleware/response/snakecase' +require 'faraday/multipart' + +module UnifiedHealthData + class Configuration < Common::Client::Configuration::REST + def settings + Settings.mhv.uhd + end + + delegate :app_id, :app_token, :subject, :user_type, to: :settings + + def base_path + "#{settings.host}/mhvapi/v1/medicalrecords/" + end + + def service_name + 'UnifiedHealthData' + end + + def token_path + "#{settings.security_host}/mhvapi/security/v1/login" + end + + def connection + Faraday.new(base_path) do |conn| + conn.request :json + conn.response :json_parser + + # Uncomment this if you want curl command equivalent or response output to log + # conn.request(:curl, ::Logger.new($stdout), :warn) unless Rails.env.production? + # conn.response(:logger, ::Logger.new($stdout), bodies: true) unless Rails.env.production? + + conn.response :betamocks if settings.mock + conn.response :raise_custom_error, error_prefix: 'UHD' + conn.adapter Faraday.default_adapter + end + end + end +end diff --git a/lib/unified_health_data/models/lab_or_test.rb b/lib/unified_health_data/models/lab_or_test.rb new file mode 100644 index 00000000000..f824b4fdb2a --- /dev/null +++ b/lib/unified_health_data/models/lab_or_test.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require 'vets/model' + +module UnifiedHealthData + class Observation + include Vets::Model + + attribute :test_code, String + attribute :value_quantity, String + attribute :reference_range, String + attribute :status, String + attribute :comments, String + end + + class Attributes + include Vets::Model + + attribute :display, String + attribute :test_code, String + attribute :date_completed, String + attribute :sample_site, String + attribute :encoded_data, String + attribute :location, String + attribute :ordered_by, String + attribute :observations, UnifiedHealthData::Observation, array: true + end + + class LabOrTest + include Vets::Model + + attribute :id, String + attribute :type, String + attribute :attributes, UnifiedHealthData::Attributes, array: false + end +end diff --git a/lib/unified_health_data/service.rb b/lib/unified_health_data/service.rb new file mode 100644 index 00000000000..3a417d3e1c5 --- /dev/null +++ b/lib/unified_health_data/service.rb @@ -0,0 +1,148 @@ +# frozen_string_literal: true + +require 'common/client/base' +require_relative 'configuration' +require_relative 'models/lab_or_test' + +module UnifiedHealthData + class Service < Common::Client::Base + configuration UnifiedHealthData::Configuration + + def initialize(user) + super() + @user = user + end + + def get_labs(start_date:, end_date:) + token = fetch_access_token + patient_id = @user.icn + path = "#{config.base_path}labs?patient-id=#{patient_id}&start-date=#{start_date}&end-date=#{end_date}" + response = perform(:get, path, nil, { 'Authorization' => token }) + body = parse_response_body(response.body) + + combined_records = fetch_combined_records(body) + parsed_records = parse_labs(combined_records) + filter_records(parsed_records) + end + + private + + def fetch_access_token + response = connection.post(config.token_path) do |req| + req.headers['Content-Type'] = 'application/json' + req.body = { + appId: config.app_id, + appToken: config.app_token, + subject: config.subject, + userType: config.user_type + }.to_json + end + response.headers['authorization'] + end + + def filter_records(records) + records.select do |record| + record.attributes.test_code == 'SP' if Flipper.enabled?(:mhv_accelerated_delivery_uhd_sp_enabled, @user) + end + end + + def parse_response_body(body) + # FIXME: workaround for testing + body.is_a?(String) ? JSON.parse(body) : body + end + + def fetch_combined_records(body) + vista_records = body.dig('vista', 'entry') || [] + oracle_health_records = body.dig('oracle-health', 'entry') || [] + vista_records + oracle_health_records + end + + def parse_labs(records) + records = records.select { |record| record['resource']['resourceType'] == 'DiagnosticReport' }.map do |record| + parse_single_record(record) + end + records.compact + end + + def parse_single_record(record) + location = fetch_location(record) + code = fetch_code(record) + encoded_data = record['resource']['presentedForm'] ? record['resource']['presentedForm'].first['data'] : '' + sample_site = fetch_sample_site(record) + observations = fetch_observations(record) + ordered_by = fetch_ordered_by(record) + + return nil unless code && (encoded_data || observations) + + attributes = UnifiedHealthData::Attributes.new( + display: record['resource']['code']['text'], + test_code: code, + date_completed: record['resource']['effectiveDateTime'], + sample_site:, encoded_data:, location:, ordered_by:, observations: + ) + + UnifiedHealthData::LabOrTest.new( + id: record['resource']['id'], + type: record['resource']['resourceType'], + attributes: + ) + end + + def fetch_location(record) + if record['resource']['contained'].nil? + nil + else + location_object = record['resource']['contained'].find { |resource| resource['resourceType'] == 'Organization' } + location_object.nil? ? nil : location_object['name'] + end + end + + def fetch_code(record) + return if record['resource']['category'].empty? + + coding = record['resource']['category'].find do |category| + category['coding'].count && category['coding'][0]['code'] != 'LAB' + end + coding ? coding['coding'][0]['code'] : nil + end + + def fetch_sample_site(record) + specimen = record['resource']['contained'].find { |resource| resource['resourceType'] == 'Specimen' } + specimen ? specimen['type']&.dig('text') : '' + end + + def fetch_observations(record) + record['resource']['contained'].select { |resource| resource['resourceType'] == 'Observation' }.map do |obs| + UnifiedHealthData::Observation.new( + test_code: obs['code']['text'], + value_quantity: if obs['valueQuantity'] + "#{obs['valueQuantity']['value']} #{obs['valueQuantity']['unit']}".strip + else + '' + end, + reference_range: if obs['referenceRange'] + obs['referenceRange'].map do |range| + range['text'] + end.join(', ').strip + else + '' + end, + status: obs['status'], + comments: obs['note']&.map { |note| note['text'] }&.join(', ') || '' + ) + end + end + + def fetch_ordered_by(record) + if record['resource']['contained'] + practitioner_object = record['resource']['contained'].find do |resource| + resource['resourceType'] == 'Practitioner' + end + if practitioner_object + name = practitioner_object['name'].first + "#{name['given'].join(' ')} #{name['family']}" + end + end + end + end +end diff --git a/lib/va_profile/v2/contact_information/service.rb b/lib/va_profile/v2/contact_information/service.rb index 6cd7d2d914d..008faa260b8 100644 --- a/lib/va_profile/v2/contact_information/service.rb +++ b/lib/va_profile/v2/contact_information/service.rb @@ -137,7 +137,7 @@ def post_email(email) def put_email(email) old_email = begin - @user.va_profile_v2_email + @user.va_profile_email rescue nil end @@ -238,7 +238,7 @@ def send_contact_change_notification(transaction_status, personalisation) transaction_id = transaction.id return if TransactionNotification.find(transaction_id).present? - email = @user.va_profile_v2_email + email = @user.va_profile_email return if email.blank? VANotifyEmailJob.perform_async( diff --git a/modules/appeals_api/.bruno_appeals_api/decision_reviews v2/Docs.bru b/modules/appeals_api/.bruno_appeals_api/decision_reviews v2/Docs.bru index 0af7769fe5e..f594e93bd7c 100644 --- a/modules/appeals_api/.bruno_appeals_api/decision_reviews v2/Docs.bru +++ b/modules/appeals_api/.bruno_appeals_api/decision_reviews v2/Docs.bru @@ -1,11 +1,11 @@ meta { name: Docs type: http - seq: 2 + seq: 1 } get { - url: {{base_uri}}/services/appeals/docs/v2/decision_reviews + url: {{base_uri}}/services/appeals/v2/decision_reviews/docs body: none auth: none } diff --git a/modules/appeals_api/.bruno_appeals_api/decision_reviews v2/Healthcheck.bru b/modules/appeals_api/.bruno_appeals_api/decision_reviews v2/Healthcheck.bru new file mode 100644 index 00000000000..7ee1ee72420 --- /dev/null +++ b/modules/appeals_api/.bruno_appeals_api/decision_reviews v2/Healthcheck.bru @@ -0,0 +1,15 @@ +meta { + name: Healthcheck + type: http + seq: 2 +} + +get { + url: {{base_uri}}/services/appeals/v2/decision_reviews/healthcheck + body: none + auth: none +} + +assert { + res.status: eq 200 +} diff --git a/modules/appeals_api/.bruno_appeals_api/decision_reviews v2/Upstream Healthcheck.bru b/modules/appeals_api/.bruno_appeals_api/decision_reviews v2/Upstream Healthcheck.bru new file mode 100644 index 00000000000..a9c2046d54b --- /dev/null +++ b/modules/appeals_api/.bruno_appeals_api/decision_reviews v2/Upstream Healthcheck.bru @@ -0,0 +1,15 @@ +meta { + name: Upstream Healthcheck + type: http + seq: 3 +} + +get { + url: {{base_uri}}/services/appeals/v2/decision_reviews/upstream_healthcheck + body: none + auth: none +} + +assert { + res.status: eq 200 +} diff --git a/modules/appeals_api/app/controllers/appeals_api/metadata_controller.rb b/modules/appeals_api/app/controllers/appeals_api/metadata_controller.rb index d826ece2c81..6379fc91985 100644 --- a/modules/appeals_api/app/controllers/appeals_api/metadata_controller.rb +++ b/modules/appeals_api/app/controllers/appeals_api/metadata_controller.rb @@ -193,8 +193,8 @@ def decision_reviews_v2 version: '2.0.0', internal_only: true, status: VERSION_STATUS[:current], - path: '/services/appeals/docs/v2/decision_reviews', - healthcheck: '/services/appeals/v2/healthcheck' + path: '/services/appeals/v2/decision_reviews/docs', + healthcheck: '/services/appeals/v2/decision_reviews/healthcheck' } end end diff --git a/modules/appeals_api/catalog-info.yaml b/modules/appeals_api/catalog-info.yaml index 9239c9e30b6..c89c8c7a1df 100644 --- a/modules/appeals_api/catalog-info.yaml +++ b/modules/appeals_api/catalog-info.yaml @@ -18,4 +18,4 @@ spec: owner: lighthouse-banana-peels system: vets-api definition: - $text: https://api.va.gov/services/appeals/docs/v2/decision_reviews + $text: https://api.va.gov/services/appeals/v2/decision_reviews/docs diff --git a/modules/appeals_api/config/routes.rb b/modules/appeals_api/config/routes.rb index 8f6178d281e..c314eb00918 100644 --- a/modules/appeals_api/config/routes.rb +++ b/modules/appeals_api/config/routes.rb @@ -5,9 +5,11 @@ get '/decision_reviews/metadata', to: 'metadata#decision_reviews' get '/v0/healthcheck', to: 'metadata#healthcheck' # Appeals Status v0 get '/v1/healthcheck', to: 'metadata#healthcheck_s3' # Decision Reviews v1 + # TODO: Remove in favor of /v2/decision_reviews/healthcheck once routing changes made in API Gateway get '/v2/healthcheck', to: 'metadata#healthcheck_s3' # Decision Reviews v2 get '/v0/upstream_healthcheck', to: 'metadata#appeals_status_upstream_healthcheck' # Appeals Status v0 get '/v1/upstream_healthcheck', to: 'metadata#decision_reviews_upstream_healthcheck' # Decision Reviews v1 + # TODO: Remove in favor of /v2/decision_reviews/upstream_healthcheck once routing changes made in API Gateway get '/v2/upstream_healthcheck', to: 'metadata#decision_reviews_upstream_healthcheck' # Decision Reviews v2 get '/v0/appeals', to: 'v0/appeals#index' # Appeals Status v0 @@ -28,6 +30,10 @@ namespace :v2, defaults: { format: 'json' } do namespace :decision_reviews do + get 'docs', to: '/appeals_api/docs/v2/docs#decision_reviews' + get 'healthcheck', to: '/appeals_api/metadata#healthcheck_s3' + get 'upstream_healthcheck', to: '/appeals_api/metadata#decision_reviews_upstream_healthcheck' + get 'contestable_issues/:decision_review_type', to: 'contestable_issues#index' namespace :higher_level_reviews do @@ -79,6 +85,7 @@ get 'decision_reviews', to: 'docs#decision_reviews' end + # TODO: Remove in favor of /v2/decision_reviews/docs once routing changes made in API Gateway namespace :v2, defaults: { format: 'json' } do get 'decision_reviews', to: 'docs#decision_reviews' end diff --git a/modules/appeals_api/spec/requests/appeals_api/api_docs_request_spec.rb b/modules/appeals_api/spec/requests/appeals_api/api_docs_request_spec.rb index 78b3a09b784..16d1dba733f 100644 --- a/modules/appeals_api/spec/requests/appeals_api/api_docs_request_spec.rb +++ b/modules/appeals_api/spec/requests/appeals_api/api_docs_request_spec.rb @@ -49,7 +49,7 @@ path: '/services/appeals/docs/v1/decision_reviews', path_template: '/services/appeals/{version}/decision_reviews' it_behaves_like 'an openapi endpoint', - path: '/services/appeals/docs/v2/decision_reviews', + path: '/services/appeals/v2/decision_reviews/docs', path_template: '/services/appeals/{version}/decision_reviews' end diff --git a/modules/appeals_api/spec/requests/appeals_api/metadata_request_spec.rb b/modules/appeals_api/spec/requests/appeals_api/metadata_request_spec.rb index 2af59a0c2c8..1911c1f6423 100644 --- a/modules/appeals_api/spec/requests/appeals_api/metadata_request_spec.rb +++ b/modules/appeals_api/spec/requests/appeals_api/metadata_request_spec.rb @@ -188,12 +188,10 @@ end describe '#failed_healthcheck' do - context 'v1' do - it_behaves_like 'a failed healthcheck', '/services/appeals/v1/healthcheck' - it_behaves_like 'a failed healthcheck', '/services/appeals/v2/healthcheck' - it_behaves_like 'a failed healthcheck', '/services/appeals/notice-of-disagreements/v0/healthcheck' - it_behaves_like 'a failed healthcheck', '/services/appeals/supplemental-claims/v0/healthcheck' - end + it_behaves_like 'a failed healthcheck', '/services/appeals/v1/healthcheck' + it_behaves_like 'a failed healthcheck', '/services/appeals/v2/decision_reviews/healthcheck' + it_behaves_like 'a failed healthcheck', '/services/appeals/notice-of-disagreements/v0/healthcheck' + it_behaves_like 'a failed healthcheck', '/services/appeals/supplemental-claims/v0/healthcheck' end describe '#upstream_healthcheck' do @@ -208,12 +206,12 @@ it_behaves_like 'an upstream healthcheck (caseflow)', '/services/appeals/v0/upstream_healthcheck' end - context 'v1' do + context 'decision reviews v2' do it 'checks the status of both services individually' do VCR.use_cassette('caseflow/health-check') do allow(CentralMail::Service).to receive(:service_is_up?).and_return(false) - get '/services/appeals/v1/upstream_healthcheck' + get '/services/appeals/v2/decision_reviews/upstream_healthcheck' parsed_response = JSON.parse(response.body) caseflow = parsed_response['details']['upstreamServices'].first @@ -229,7 +227,7 @@ VCR.use_cassette('caseflow/health-check') do allow(CentralMail::Service).to receive(:service_is_up?).and_return(true) - get '/services/appeals/v1/upstream_healthcheck' + get '/services/appeals/v2/decision_reviews/upstream_healthcheck' expect(response).to have_http_status(:ok) parsed_response = JSON.parse(response.body) @@ -255,7 +253,7 @@ VCR.use_cassette('caseflow/health-check-down') do allow(CentralMail::Service).to receive(:service_is_up?).and_return(true) - get '/services/appeals/v1/upstream_healthcheck' + get '/services/appeals/v2/decision_reviews/upstream_healthcheck' expect(response).to have_http_status(:service_unavailable) parsed_response = JSON.parse(response.body) @@ -281,7 +279,7 @@ VCR.use_cassette('caseflow/health-check') do allow(CentralMail::Service).to receive(:service_is_up?).and_return(false) - get '/services/appeals/v1/upstream_healthcheck' + get '/services/appeals/v2/decision_reviews/upstream_healthcheck' expect(response).to have_http_status(:service_unavailable) parsed_response = JSON.parse(response.body) @@ -307,7 +305,7 @@ VCR.use_cassette('caseflow/health-check') do allow(CentralMail::Service).to receive(:service_is_up?).and_return(true) - get '/services/appeals/v1/upstream_healthcheck' + get '/services/appeals/v2/decision_reviews/upstream_healthcheck' expect(response).to have_http_status(:ok) parsed_response = JSON.parse(response.body) diff --git a/modules/ask_va_api/app/controllers/ask_va_api/v0/address_validation_controller.rb b/modules/ask_va_api/app/controllers/ask_va_api/v0/address_validation_controller.rb index 459a7890978..4a14ae15e3c 100644 --- a/modules/ask_va_api/app/controllers/ask_va_api/v0/address_validation_controller.rb +++ b/modules/ask_va_api/app/controllers/ask_va_api/v0/address_validation_controller.rb @@ -13,7 +13,7 @@ class AddressValidationController < ApplicationController service_tag 'profile' def create - address = if Flipper.enabled?(:va_v3_contact_information_service) + address = if Flipper.enabled?(:remove_pciu) VAProfile::Models::V3::ValidationAddress.new(address_params) else VAProfile::Models::ValidationAddress.new(address_params) @@ -47,7 +47,7 @@ def address_params end def service - @service ||= if Flipper.enabled?(:va_v3_contact_information_service) + @service ||= if Flipper.enabled?(:remove_pciu) VAProfile::V3::AddressValidation::Service.new else VAProfile::AddressValidation::Service.new diff --git a/modules/ask_va_api/spec/requests/ask_va_api/v0/address_validation_spec.rb b/modules/ask_va_api/spec/requests/ask_va_api/v0/address_validation_spec.rb index cc3f873ab4f..61217ff563a 100644 --- a/modules/ask_va_api/spec/requests/ask_va_api/v0/address_validation_spec.rb +++ b/modules/ask_va_api/spec/requests/ask_va_api/v0/address_validation_spec.rb @@ -120,7 +120,7 @@ let(:incorrect_address_pou) { build(:va_profile_v3_address, :incorrect_address_pou) } before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(true) end shared_examples 'invalid address' do diff --git a/modules/burials/app/controllers/burials/v0/claims_controller.rb b/modules/burials/app/controllers/burials/v0/claims_controller.rb index 9ea74361ffe..4a7a64e47d7 100644 --- a/modules/burials/app/controllers/burials/v0/claims_controller.rb +++ b/modules/burials/app/controllers/burials/v0/claims_controller.rb @@ -12,12 +12,6 @@ module V0 class ClaimsController < ApplicationController skip_before_action(:authenticate) before_action :load_user, only: :create - before_action :check_flipper_flag - - # Raises an exception if the burial module enabled flipper flag isn't enabled. - def check_flipper_flag - raise Common::Exceptions::Forbidden unless Flipper.enabled?(:burial_module_enabled, current_user) - end service_tag 'burial-application' diff --git a/modules/burials/spec/controllers/v0/claims_controller_spec.rb b/modules/burials/spec/controllers/v0/claims_controller_spec.rb index efeb95fefb7..7f421092ec8 100644 --- a/modules/burials/spec/controllers/v0/claims_controller_spec.rb +++ b/modules/burials/spec/controllers/v0/claims_controller_spec.rb @@ -8,27 +8,12 @@ let(:monitor) { double('Burials::Monitor') } before do - allow(Flipper).to receive(:enabled?).with(anything).and_call_original - allow(Flipper).to receive(:enabled?).with(:burial_module_enabled, anything).and_return true - allow(Burials::Monitor).to receive(:new).and_return(monitor) allow(monitor).to receive_messages(track_show404: nil, track_show_error: nil, track_create_attempt: nil, track_create_error: nil, track_create_success: nil, track_create_validation_error: nil, track_process_attachment_error: nil) end - context 'module is not enabled' do - it 'returns Forbidden' do - allow(Flipper).to receive(:enabled?).with(:burial_module_enabled, anything).and_return false - - expect(Burials::SavedClaim).not_to receive(:new) - - get '/burials/v0/claims/:id', params: { id: 'test-id' } - - expect(response).to have_http_status(:forbidden) - end - end - context 'with a user' do let(:form) { build(:burials_saved_claim) } let(:param_name) { :burial_claim } diff --git a/modules/burials/spec/lib/burials/form_profiles/va_21p530ez_spec.rb b/modules/burials/spec/lib/burials/form_profiles/va_21p530ez_spec.rb index 7745f683a65..260a9b376dc 100644 --- a/modules/burials/spec/lib/burials/form_profiles/va_21p530ez_spec.rb +++ b/modules/burials/spec/lib/burials/form_profiles/va_21p530ez_spec.rb @@ -10,6 +10,7 @@ let(:address) { instance_double(Address, country: 'USA') } before do + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) allow(FormProfile).to receive(:prefill_enabled_forms).and_return([form_id]) end diff --git a/modules/claims_api/app/services/claims_api/power_of_attorney_request_service/index.rb b/modules/claims_api/app/services/claims_api/power_of_attorney_request_service/index.rb index 1594420592c..7e66290746c 100644 --- a/modules/claims_api/app/services/claims_api/power_of_attorney_request_service/index.rb +++ b/modules/claims_api/app/services/claims_api/power_of_attorney_request_service/index.rb @@ -29,11 +29,14 @@ def get_poa_list private def poa_list - @poa_list ||= manage_representative_service.read_poa_request(poa_codes: @poa_codes, page_size: @page_size, - page_index: @page_index, filter: @filter, + @poa_list ||= manage_representative_service.read_poa_request(poa_codes: @poa_codes, + page_size: @page_size, + page_index: @page_index, + filter: @filter, use_mocks: true) - @poa_list['poaRequestRespondReturnVOList'] + list = @poa_list['poaRequestRespondReturnVOList'] + list.is_a?(Array) ? list : [list].compact end def manage_representative_service diff --git a/modules/claims_api/spec/services/power_of_attorney_request_service/index_spec.rb b/modules/claims_api/spec/services/power_of_attorney_request_service/index_spec.rb new file mode 100644 index 00000000000..1f0f2b5f69c --- /dev/null +++ b/modules/claims_api/spec/services/power_of_attorney_request_service/index_spec.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +require 'rails_helper' +require 'bgs_service/manage_representative_service' + +describe ClaimsApi::PowerOfAttorneyRequestService::Index do + subject { described_class.new(poa_codes: ['002'], page_size: 10, page_index: 1, filter: {}) } + + describe '#get_poa_list' do + let(:obj_response_data) do + { + 'poaRequestRespondReturnVOList' => { + 'poaCode' => '002', + 'procID' => '10906' + } + } + end + + let(:arr_response_data) do + { + 'poaRequestRespondReturnVOList' => [{ + 'poaCode' => '002', + 'procID' => '10906' + }, { + 'poaCode' => '002', + 'procID' => '10907' + }] + } + end + + context 'when page size is set to 1' do + before do + @page_size = 1 + service_double = instance_double(ClaimsApi::ManageRepresentativeService) + allow(ClaimsApi::ManageRepresentativeService).to receive(:new).with(any_args) + .and_return(service_double) + allow(service_double).to receive(:read_poa_request).with(any_args).and_return(obj_response_data) + end + + it 'does not return an error when page_size is 1' do + expect do + subject.get_poa_list + end.not_to raise_error + end + end + + context 'when page size is over 1 and less then the max allowed' do + before do + @page_size = 5 + service_double = instance_double(ClaimsApi::ManageRepresentativeService) + allow(ClaimsApi::ManageRepresentativeService).to receive(:new).with(any_args) + .and_return(service_double) + allow(service_double).to receive(:read_poa_request).with(any_args).and_return(arr_response_data) + end + + it 'still works as expected when page_size is > 1' do + expect do + subject.get_poa_list + end.not_to raise_error + end + end + end +end diff --git a/modules/ivc_champva/app/jobs/ivc_champva/missing_form_status_job.rb b/modules/ivc_champva/app/jobs/ivc_champva/missing_form_status_job.rb index f97161af224..77a6ec8a63a 100644 --- a/modules/ivc_champva/app/jobs/ivc_champva/missing_form_status_job.rb +++ b/modules/ivc_champva/app/jobs/ivc_champva/missing_form_status_job.rb @@ -12,15 +12,17 @@ class MissingFormStatusJob def perform # rubocop:disable Metrics/MethodLength return unless Settings.ivc_forms.sidekiq.missing_form_status_job.enabled - forms = IvcChampvaForm.where(pega_status: nil).where('created_at < ?', 1.minute.ago) + batches = get_nil_batches - return unless forms.any? + return unless batches.any? # Send the count of forms to DataDog - StatsD.gauge('ivc_champva.forms_missing_status.count', forms.count) + StatsD.gauge('ivc_champva.forms_missing_status.count', batches.count) current_time = Time.now.utc - forms.each do |form| + + batches.each_value do |batch| + form = batch[0] # get a representative form from this submission batch # Check if we've been missing Pega status for > custom threshold of days: elapsed_days = (current_time - form.created_at).to_i / 1.day threshold = Settings.vanotify.services.ivc_champva.failure_email_threshold_days.to_i || 7 @@ -106,6 +108,32 @@ def send_zsf_notification_to_pega(form, template_id) end end + ## + # Returns form submissions with nil pega statuses created more than 1 minute ago + # organized in batches that correspond to individual form submissions. + # + # @return [Hash] hash of batches where the keys are a batch's `form_uuid` + # and the value is a list of `IvcChampvaForm`s with that form_uuid + # e.g.: + # { + # 'ad6c9181-530c-4a8f-9fbd-5e8e8a400d4a': [, ] + # 'fac6a892-530c-8a40-8afc-9fbd8ad8a40a': [] + # } + # + def get_nil_batches + all_nil_statuses = IvcChampvaForm.where(pega_status: nil).where('created_at < ?', 1.minute.ago) + + batches = {} + + # Group all nil results into batches by form UUID + all_nil_statuses.map do |el| + batch = IvcChampvaForm.where(form_uuid: el.form_uuid) + batches[el.form_uuid] = batch + end + + batches + end + def fetch_forms_by_uuid(form_uuid) @fetch_forms_by_uuid ||= IvcChampvaForm.where(form_uuid:) end diff --git a/modules/ivc_champva/spec/jobs/missing_form_status_job_spec.rb b/modules/ivc_champva/spec/jobs/missing_form_status_job_spec.rb index 91ff04b6440..b173aeadf6e 100644 --- a/modules/ivc_champva/spec/jobs/missing_form_status_job_spec.rb +++ b/modules/ivc_champva/spec/jobs/missing_form_status_job_spec.rb @@ -16,6 +16,7 @@ def days_since_now(created_at) before do allow(Settings.ivc_forms.sidekiq.missing_form_status_job).to receive(:enabled).and_return(true) + allow(Flipper).to receive(:enabled?).with(:champva_vanotify_custom_callback, @current_user).and_return(true) allow(StatsD).to receive(:gauge) allow(StatsD).to receive(:increment) @@ -24,12 +25,14 @@ def days_since_now(created_at) track_failed_send_zsf_notification_to_pega: nil)) # Save the original form creation times so we can restore them later @original_creation_times = forms.map(&:created_at) + @original_uuids = forms.map(&:form_uuid) end after do - # Restore original form creation times for time sensitive tests + # Restore original dummy form created_at/form_uuid props in case we've adjusted them forms.each_with_index do |form, index| form.update(created_at: @original_creation_times[index]) + form.update(form_uuid: @original_uuids[index]) end end @@ -105,6 +108,30 @@ def days_since_now(created_at) expect(StatsD).to have_received(:gauge).with('ivc_champva.forms_missing_status.count', forms.count - 1) end + it 'processes nil forms in batches that belong to the same submission' do + # Set shared `form_uuid` so these two now belong to the same batch: + forms[0].update(form_uuid: '78444a0b-3ac8-454d-a28d-8d63cddd0d3b') + forms[1].update(form_uuid: '78444a0b-3ac8-454d-a28d-8d63cddd0d3b') + + # Perform the job that checks form statuses + job.perform + + # Check that we processed batches rather than individual forms: + expect(StatsD).to have_received(:gauge).with('ivc_champva.forms_missing_status.count', forms.count - 1) + end + + it 'groups nil statuses into batches by uuid' do + # Set shared `form_uuid` so these two now belong to the same batch: + forms[0].update(form_uuid: '78444a0b-3ac8-454d-a28d-8d63cddd0d3b') + forms[1].update(form_uuid: '78444a0b-3ac8-454d-a28d-8d63cddd0d3b') + + # Perform the job that checks form statuses + batches = job.get_nil_batches + + expect(batches.count == forms.count - 1).to be true + expect(batches['78444a0b-3ac8-454d-a28d-8d63cddd0d3b'].count == 2).to be true + end + it 'sends the count of forms to DataDog' do IvcChampva::MissingFormStatusJob.new.perform diff --git a/modules/ivc_champva/spec/services/s3_spec.rb b/modules/ivc_champva/spec/services/s3_spec.rb index 00482af4111..5b65a5d8c62 100644 --- a/modules/ivc_champva/spec/services/s3_spec.rb +++ b/modules/ivc_champva/spec/services/s3_spec.rb @@ -29,6 +29,9 @@ before do allow_any_instance_of(Aws::S3::Client).to receive(:put_object).and_return(response_double) + allow(Flipper).to receive(:enabled?) + .with(:champva_log_all_s3_uploads, @current_user) + .and_return(true) end it 'returns success response' do @@ -57,7 +60,6 @@ allow(Flipper).to receive(:enabled?) .with(:champva_log_all_s3_uploads, @current_user) .and_return(true) - Flipper.enable(:champva_log_all_s3_uploads) end it 'returns failure response with status code and body' do @@ -81,7 +83,6 @@ allow(Flipper).to receive(:enabled?) .with(:champva_log_all_s3_uploads, @current_user) .and_return(true) - Flipper.enable(:champva_log_all_s3_uploads) end it 'returns failure response with exception message' do @@ -109,7 +110,6 @@ allow(Flipper).to receive(:enabled?) .with(:champva_log_all_s3_uploads, @current_user) .and_return(true) - Flipper.enable(:champva_log_all_s3_uploads) end it 'returns failure response with status code' do diff --git a/modules/mobile/app/controllers/mobile/v0/addresses_controller.rb b/modules/mobile/app/controllers/mobile/v0/addresses_controller.rb index 60281993eef..7d37d5a87be 100644 --- a/modules/mobile/app/controllers/mobile/v0/addresses_controller.rb +++ b/modules/mobile/app/controllers/mobile/v0/addresses_controller.rb @@ -26,7 +26,7 @@ def destroy end def validate - validated_address_params = if Flipper.enabled?(:mobile_v2_contact_info) + validated_address_params = if Flipper.enabled?(:remove_pciu) VAProfile::Models::V3::ValidationAddress.new(address_params) else VAProfile::Models::ValidationAddress.new(address_params) @@ -77,7 +77,7 @@ def address_params end def validation_service - if Flipper.enabled?(:mobile_v2_contact_info) + if Flipper.enabled?(:remove_pciu) VAProfile::V3::AddressValidation::Service.new else VAProfile::AddressValidation::Service.new diff --git a/modules/mobile/app/controllers/mobile/v1/labs_and_tests_controller.rb b/modules/mobile/app/controllers/mobile/v1/labs_and_tests_controller.rb new file mode 100644 index 00000000000..3cda06b4787 --- /dev/null +++ b/modules/mobile/app/controllers/mobile/v1/labs_and_tests_controller.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'unified_health_data/service' +require 'mobile/v1/lab_or_test_serializer' + +module Mobile + module V1 + class LabsAndTestsController < ApplicationController + before_action :controller_enabled? + + def index + start_date = params[:start_date] + end_date = params[:end_date] + labs = service.get_labs(start_date:, end_date:) + render json: labs.map { |record| LabOrTestSerializer.serialize(record) } + end + + private + + def controller_enabled? + routing_error unless Flipper.enabled?(:mhv_accelerated_delivery_uhd_enabled, @current_user) + end + + def routing_error + raise Common::Exceptions::RoutingError, params[:path] + end + + def service + UnifiedHealthData::Service.new(@current_user) + end + end + end +end diff --git a/modules/mobile/app/models/mobile/v0/user_accessible_services.rb b/modules/mobile/app/models/mobile/v0/user_accessible_services.rb index abb742f2877..45a5dbe1765 100644 --- a/modules/mobile/app/models/mobile/v0/user_accessible_services.rb +++ b/modules/mobile/app/models/mobile/v0/user_accessible_services.rb @@ -38,7 +38,7 @@ def service_auth_map prescriptions: access?(mhv_prescriptions: :access?), scheduleAppointments: access?(schedule_appointment: :access?), secureMessaging: access?(mhv_messaging: :mobile_access?), - userProfileUpdate: access?(vet360: :access?) + userProfileUpdate: access?(va_profile: :access_to_v2?) } end # rubocop:enable Metrics/MethodLength diff --git a/modules/mobile/app/serializers/mobile/v1/lab_or_test_serializer.rb b/modules/mobile/app/serializers/mobile/v1/lab_or_test_serializer.rb new file mode 100644 index 00000000000..cd8efc1a21a --- /dev/null +++ b/modules/mobile/app/serializers/mobile/v1/lab_or_test_serializer.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module Mobile + module V1 + class LabOrTestSerializer + include JSONAPI::Serializer + + def self.serialize(record) + { + id: record.id, + type: record.type, + attributes: serialize_attributes(record.attributes) + } + end + + def self.serialize_attributes(attributes) + { + display: attributes.display, + test_code: attributes.test_code, + date_completed: attributes.date_completed, + sample_site: attributes.sample_site, + encoded_data: attributes.encoded_data, + location: attributes.location, + ordered_by: attributes.ordered_by, + observations: serialize_observations(attributes.observations) + } + end + + def self.serialize_observations(observations) + observations.map do |obs| + { + test_code: obs.test_code, + value_quantity: obs.value_quantity, + reference_range: obs.reference_range, + status: obs.status, + comments: obs.comments + } + end + end + end + end +end diff --git a/modules/mobile/app/services/mobile/v0/profile/sync_update_service.rb b/modules/mobile/app/services/mobile/v0/profile/sync_update_service.rb index 6f00a52d30a..b2dd1b1aaaa 100644 --- a/modules/mobile/app/services/mobile/v0/profile/sync_update_service.rb +++ b/modules/mobile/app/services/mobile/v0/profile/sync_update_service.rb @@ -58,7 +58,7 @@ def save!(http_method, resource_type, params) end def build_record(type, params) - if type == :address && Flipper.enabled?(:mobile_v2_contact_info, @user) + if type == :address && Flipper.enabled?(:remove_pciu, @user) 'VAProfile::Models::V3::Address' .constantize .new(params) @@ -129,7 +129,7 @@ def check_transaction_status!(transaction_id) end def contact_information_service - if Flipper.enabled?(:mobile_v2_contact_info, @user) + if Flipper.enabled?(:remove_pciu, @user) VAProfile::V2::ContactInformation::Service.new @user else VAProfile::ContactInformation::Service.new @user diff --git a/modules/mobile/app/sidekiq/mobile/v0/vet360_linking_job.rb b/modules/mobile/app/sidekiq/mobile/v0/vet360_linking_job.rb index 332ab091d24..9f490965326 100644 --- a/modules/mobile/app/sidekiq/mobile/v0/vet360_linking_job.rb +++ b/modules/mobile/app/sidekiq/mobile/v0/vet360_linking_job.rb @@ -38,7 +38,7 @@ def perform(uuid) mobile_user.vet360_linked = false end - result = if Flipper.enabled?(:mobile_v2_contact_info) + result = if Flipper.enabled?(:remove_pciu) VAProfile::V2::Person::Service.new(user).init_vet360_id else VAProfile::Person::Service.new(user).init_vet360_id diff --git a/modules/mobile/config/routes.rb b/modules/mobile/config/routes.rb index addd08f9e51..f2eeae6a9d9 100644 --- a/modules/mobile/config/routes.rb +++ b/modules/mobile/config/routes.rb @@ -109,6 +109,7 @@ namespace :v1 do get '/health/immunizations', to: 'immunizations#index' + get '/health/labs-and-tests', to: 'labs_and_tests#index' get '/messaging/health/messages/:id/thread', to: 'messages#thread' get '/user', to: 'users#show' end diff --git a/modules/mobile/spec/requests/mobile/v0/community_care_providers_spec.rb b/modules/mobile/spec/requests/mobile/v0/community_care_providers_spec.rb index bccff0afdf6..8f5330dd332 100644 --- a/modules/mobile/spec/requests/mobile/v0/community_care_providers_spec.rb +++ b/modules/mobile/spec/requests/mobile/v0/community_care_providers_spec.rb @@ -11,7 +11,6 @@ let(:json_body_headers) { { 'Content-Type' => 'application/json', 'Accept' => 'application/json' } } before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(false) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end diff --git a/modules/mobile/spec/requests/mobile/v0/user/addresses_spec.rb b/modules/mobile/spec/requests/mobile/v0/user/addresses_spec.rb index 68250d04837..d7cd5edf7e2 100644 --- a/modules/mobile/spec/requests/mobile/v0/user/addresses_spec.rb +++ b/modules/mobile/spec/requests/mobile/v0/user/addresses_spec.rb @@ -8,9 +8,6 @@ let!(:user) { sis_user(icn: '123498767V234859') } before do - allow(Flipper).to receive(:enabled?).with(:mobile_v2_contact_info, instance_of(User)).and_return(true) - allow(Flipper).to receive(:enabled?).with(:mobile_v2_contact_info).and_return(true) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) Timecop.freeze(Time.zone.parse('2024-08-27T18:51:06.012Z')) end @@ -335,6 +332,7 @@ let(:invalid_address) { build(:va_profile_v3_validation_address) } before do + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(true) post '/mobile/v0/user/addresses/validate', params: invalid_address.to_json, headers: sis_headers(json: true) end @@ -394,6 +392,7 @@ let(:multiple_match_address) { build(:va_profile_v3_validation_address, :multiple_matches) } before do + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(true) VCR.use_cassette( 'va_profile/v3/address_validation/candidate_multiple_matches', VCR::MATCH_EVERYTHING diff --git a/modules/mobile/spec/requests/mobile/v0/user/contact_info_spec.rb b/modules/mobile/spec/requests/mobile/v0/user/contact_info_spec.rb index 7dc6b810f82..7f3e0d96e0b 100644 --- a/modules/mobile/spec/requests/mobile/v0/user/contact_info_spec.rb +++ b/modules/mobile/spec/requests/mobile/v0/user/contact_info_spec.rb @@ -3,7 +3,6 @@ require_relative '../../../../support/helpers/rails_helper' RSpec.describe 'Mobile::V0::User::ContactInfo', type: :request do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(false) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end diff --git a/modules/mobile/spec/requests/mobile/v0/user/emails_spec.rb b/modules/mobile/spec/requests/mobile/v0/user/emails_spec.rb index 512a2cd5050..6b4f95983f5 100644 --- a/modules/mobile/spec/requests/mobile/v0/user/emails_spec.rb +++ b/modules/mobile/spec/requests/mobile/v0/user/emails_spec.rb @@ -8,8 +8,6 @@ let!(:user) { sis_user } before do - allow(Flipper).to receive(:enabled?).with(:mobile_v2_contact_info, instance_of(User)).and_return(true) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) Timecop.freeze(Time.zone.parse('2024-08-27T18:51:06.000Z')) end diff --git a/modules/mobile/spec/requests/mobile/v0/user/phones_spec.rb b/modules/mobile/spec/requests/mobile/v0/user/phones_spec.rb index dba5062dd15..75127923e19 100644 --- a/modules/mobile/spec/requests/mobile/v0/user/phones_spec.rb +++ b/modules/mobile/spec/requests/mobile/v0/user/phones_spec.rb @@ -12,8 +12,6 @@ end before do - allow(Flipper).to receive(:enabled?).with(:mobile_v2_contact_info, instance_of(User)).and_return(true) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) Timecop.freeze(Time.zone.parse('2024-08-27T18:51:06.012Z')) end diff --git a/modules/mobile/spec/requests/mobile/v0/user_spec.rb b/modules/mobile/spec/requests/mobile/v0/user_spec.rb index 15d0bd7b50e..0f298f77852 100644 --- a/modules/mobile/spec/requests/mobile/v0/user_spec.rb +++ b/modules/mobile/spec/requests/mobile/v0/user_spec.rb @@ -11,8 +11,6 @@ end before do - allow(Flipper).to receive(:enabled?).with(:mobile_v2_contact_info, instance_of(User)).and_return(true) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) allow(Flipper).to receive(:enabled?).with(:mobile_lighthouse_letters, instance_of(User)).and_return(false) allow(Flipper).to receive(:enabled?).with(:mobile_lighthouse_claims, instance_of(User)).and_return(false) diff --git a/modules/mobile/spec/requests/mobile/v1/health/labs_and_tests_controller_spec.rb b/modules/mobile/spec/requests/mobile/v1/health/labs_and_tests_controller_spec.rb new file mode 100644 index 00000000000..db55aa8958e --- /dev/null +++ b/modules/mobile/spec/requests/mobile/v1/health/labs_and_tests_controller_spec.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +require 'rails_helper' + +require_relative '../../../../support/helpers/rails_helper' +require_relative '../../../../support/helpers/committee_helper' + +RSpec.describe 'Mobile::V1::LabsAndTestsController', :skip_json_api_validation, type: :request do + include JsonSchemaMatchers + include CommitteeHelper + + let!(:user) { sis_user(icn: '1000000000V000000') } + let(:default_params) { { 'patient-id': '1000000000V000000', start_date: '2024-01-01', end_date: '2024-12-31' } } + let(:path) { '/mobile/v1/health/labs-and-tests' } + let(:labs_cassette) { 'mobile/unified_health_data/get_labs' } + let(:uhd_flipper) { :mhv_accelerated_delivery_uhd_enabled } + let(:sp_flipper) { :mhv_accelerated_delivery_uhd_sp_enabled } + let(:expected_response) do + JSON.parse(Rails.root.join( + 'modules', 'mobile', 'spec', 'support', 'fixtures', 'labs_and_tests_response.json' + ).read) + end + + describe 'GET /mobile/v1/health/labs-and-tests' do + context 'happy path' do + before do + allow(Flipper).to receive(:enabled?).with(uhd_flipper, instance_of(User)).and_return(true) + allow(Flipper).to receive(:enabled?).with(sp_flipper, instance_of(User)).and_return(true) + VCR.use_cassette(labs_cassette) do + get path, headers: sis_headers, params: default_params + end + end + + it 'returns a successful response' do + expect(response).to be_successful + end + + it 'returns the correct lab records' do + json_response = JSON.parse(response.body) + expect(json_response.count).to eq(1) + expect(json_response[0]).to eq(expected_response) + end + end + + context 'when UHD is disabled' do + before do + allow(Flipper).to receive(:enabled?).with(uhd_flipper, instance_of(User)).and_return(false) + VCR.use_cassette(labs_cassette) do + get path, headers: sis_headers, params: default_params + end + end + + it 'returns a 404 when the flipper is disabled' do + expect(response).to have_http_status(:not_found) + end + end + end +end diff --git a/modules/mobile/spec/requests/mobile/v1/user_spec.rb b/modules/mobile/spec/requests/mobile/v1/user_spec.rb index ade30f9237b..bb0d0b02521 100644 --- a/modules/mobile/spec/requests/mobile/v1/user_spec.rb +++ b/modules/mobile/spec/requests/mobile/v1/user_spec.rb @@ -7,8 +7,6 @@ include JsonSchemaMatchers before do - allow(Flipper).to receive(:enabled?).with(:mobile_v2_contact_info, instance_of(User)).and_return(true) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) allow(Flipper).to receive(:enabled?).with(:mobile_lighthouse_letters, instance_of(User)).and_return(false) allow(Flipper).to receive(:enabled?).with(:mobile_lighthouse_claims, instance_of(User)).and_return(false) diff --git a/modules/mobile/spec/services/sync_update_service_spec.rb b/modules/mobile/spec/services/sync_update_service_spec.rb index 5c07ea3d0f3..e2b0a1fc6fc 100644 --- a/modules/mobile/spec/services/sync_update_service_spec.rb +++ b/modules/mobile/spec/services/sync_update_service_spec.rb @@ -7,8 +7,6 @@ let(:service) { Mobile::V0::Profile::SyncUpdateService.new(user) } before do - allow(Flipper).to receive(:enabled?).with(:mobile_v2_contact_info, instance_of(User)).and_return(true) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) Timecop.freeze(Time.zone.parse('2024-09-16T16:09:37.000Z')) end diff --git a/modules/mobile/spec/sidekiq/vet360_linking_spec.rb b/modules/mobile/spec/sidekiq/vet360_linking_spec.rb index 15c95eee934..6352ebe1c42 100644 --- a/modules/mobile/spec/sidekiq/vet360_linking_spec.rb +++ b/modules/mobile/spec/sidekiq/vet360_linking_spec.rb @@ -6,10 +6,7 @@ let(:user) { create(:user, :loa3) } before do - allow(Flipper).to receive(:enabled?).with(:mobile_v2_contact_info, instance_of(User)).and_return(true) - allow(Flipper).to receive(:enabled?).with(:mobile_v2_contact_info).and_return(true) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) - allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(true) end context 'when linking request is successfully made' do diff --git a/modules/mobile/spec/support/fixtures/labs_and_tests_response.json b/modules/mobile/spec/support/fixtures/labs_and_tests_response.json new file mode 100644 index 00000000000..4138bd2ed6b --- /dev/null +++ b/modules/mobile/spec/support/fixtures/labs_and_tests_response.json @@ -0,0 +1,14 @@ +{ + "id": "1d91f54a-809f-4825-8175-81b689807784", + "type": "DiagnosticReport", + "attributes": { + "display": "SURGICAL PATHOLOGY", + "testCode": "SP", + "dateCompleted": "2025-02-21T02:34:00Z", + "sampleSite": "skin", + "encodedData": "UkdGMFpTQlRjR1ZqSUhSaGEyVnVPaUJHWldJZ01qQXNJREl3TWpVZ01qRTZNelFnSUZCaGRHaHZiRzluYVhOME9sTlVSVkJJUlU0Z1FrRlNVbE5FWVhSbElGTndaV01nY21WakoyUTZJRVpsWWlBeU1Dd2dNakF5TlNBeU1Ub3pOU0FnVW1WemFXUmxiblE2SUUxQlVrTkpJRkFnVFVOSFZVbFNSVVJoZEdVZ0lHTnZiWEJzWlhSbFpEb2dSbVZpSURJd0xDQXlNREkxSUNBZ0lDQWdJQ0JCWTJObGMzTnBiMjRnSXpvZ1UxQWdNalVnTTFOMVltMXBkSFJsWkNCaWVUb2dZbTl5YkdGdVpDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCUWNtRmpkR2wwYVc5dVpYSTZWa2xEVkU5U1NVRWdRU0JDVDFKTVFVNUVMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExWTndaV05wYldWdU9pQnphMmx1UW5KcFpXWWdRMnhwYm1sallXd2dTR2x6ZEc5eWVUcEJiR1Y0WVc1a1pYSWdjSEpsYzJWdWRHVmtJSFJ2SUhCb2VYTnBZMmxoYmlkeklHOW1abWxqWlNCM0lHTnZibU5sY201eklHRnliM1Z1WkNCaElHMXZiR1ZpYjNWMElHRWdaR0Z5YTJWdWFXNW5JRzF2YkdVZ2IyNGdhR2x6SUdKaFkyc3VVSEpsYjNCbGNtRjBhWFpsSUVScFlXZHViM05wY3pwd2IzUmxiblJwWVd3Z2JXRnNhV2R1WVc1MElHNWxiM0JzWVhOdElHOW1JSFJvWlNCemEybHVUM0JsY21GMGFYWmxJRVpwYm1ScGJtZHpPa05zWldGdUlHMWhjbWRwYm5NZ2IyWWdZV1ptWldOMFpXUWdkR2x6YzNWbElHVjRkSEpoWTNSbFpDQjJhV0VnY0hWdVkyZ2dZbWx2Y0hONVVHOXpkRzl3WlhKaGRHbDJaU0JFYVdGbmJtOXphWE02UVdOMGFXNXBZeUJyWlhKaGRHOXphWE1nS0hCeVpXTmhibU5sY205MWN5QnNaWE5wYjI0cGJuVnNiRzV2UjNKdmMzTWdaR1Z6WTNKcGNIUnBiMjQ2VTJOaGJIa2daM0p2ZDNSb0lHNWxZWElnYzJOaGNIVnNZWElnY21WbmFXOXVJSEJ2ZEdWdWRHbGhiQ0J3Y21WamRYSnpiM0lnZEc4Z2MzRjFZVzF2ZFhNZ1kyRnlZMmx1YjIxaFRXbGpjbTl6WTI5d2FXTWdaWGhoYlM5a2FXRm5ibTl6YVhNNklDaEVZWFJsSUZOd1pXTWdkR0ZyWlc0NklFWmxZaUF5TUN3Z01qQXlOU0F5TVRvek5DbFVRa0Z1ZFd4c1lXTjBhVzVwWXlCclpYSmhkRzl6YVhNOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzFRWlhKbWIzSnRhVzVuSUV4aFltOXlZWFJ2Y25rNlUzVnlaMmxqWVd3Z1VHRjBhRzlzYjJkNUlGSmxjRzl5ZENCUVpYSm1iM0p0WldRZ1FuazZJRU5JV1ZOSVVpQlVSVk5VSUV4QlFqSXpOakFnUlNCUVJWSlRTRWxPUnlCQ1RGWkVJRU5JUlZsRlRrNUZMQ0JHVENBNE1qQXdNUzAxTXpVMmJuVnNiQT09", + "location": "CHYSHR TEST LAB", + "orderedBy": null, + "observations": [] + } +} diff --git a/modules/travel_pay/app/services/travel_pay/claim_association_service.rb b/modules/travel_pay/app/services/travel_pay/claim_association_service.rb index 4828f30a80d..09134a68067 100644 --- a/modules/travel_pay/app/services/travel_pay/claim_association_service.rb +++ b/modules/travel_pay/app/services/travel_pay/claim_association_service.rb @@ -41,7 +41,7 @@ def associate_appointments_to_claims(params = {}) raw_claims = faraday_response.body['data'].deep_dup data = raw_claims&.map do |sc| - sc['claimStatus'] = sc['claimStatus'].underscore.titleize + sc['claimStatus'] = sc['claimStatus'].underscore.humanize sc end @@ -67,7 +67,7 @@ def associate_single_appointment_to_claim(params = {}) claim_data = faraday_response.body['data']&.dig(0) - claim_data['claimStatus'] = claim_data['claimStatus'].underscore.titleize if claim_data + claim_data['claimStatus'] = claim_data['claimStatus'].underscore.humanize if claim_data appt['travelPayClaim'] = {} appt['travelPayClaim']['metadata'] = build_metadata(faraday_response.body) diff --git a/modules/travel_pay/app/services/travel_pay/claims_service.rb b/modules/travel_pay/app/services/travel_pay/claims_service.rb index a2e38eddf75..74678efaba1 100644 --- a/modules/travel_pay/app/services/travel_pay/claims_service.rb +++ b/modules/travel_pay/app/services/travel_pay/claims_service.rb @@ -15,7 +15,7 @@ def get_claims(params = {}) { data: claims.map do |sc| - sc['claimStatus'] = sc['claimStatus'].underscore.titleize + sc['claimStatus'] = sc['claimStatus'].underscore.humanize sc end } @@ -37,7 +37,7 @@ def get_claims_by_date_range(params = {}) 'message' => faraday_response.body['message'] }, data: raw_claims&.map do |sc| - sc['claimStatus'] = sc['claimStatus'].underscore.titleize + sc['claimStatus'] = sc['claimStatus'].underscore.humanize sc end } @@ -64,7 +64,7 @@ def get_claim_by_id(claim_id) claim = claims.find { |c| c['id'] == claim_id } if claim - claim['claimStatus'] = claim['claimStatus'].underscore.titleize + claim['claimStatus'] = claim['claimStatus'].underscore.humanize claim end end diff --git a/modules/travel_pay/spec/services/claims_association_service_spec.rb b/modules/travel_pay/spec/services/claims_association_service_spec.rb index 313830ba298..34ef44a3df4 100644 --- a/modules/travel_pay/spec/services/claims_association_service_spec.rb +++ b/modules/travel_pay/spec/services/claims_association_service_spec.rb @@ -43,7 +43,7 @@ 'id' => '73611905-71bf-46ed-b1ec-e790593b8565', 'claimNumber' => 'TC0004', 'claimName' => '9d81c1a1-cd05-47c6-be97-d14dec579893', - 'claimStatus' => 'Claim Submitted', + 'claimStatus' => 'ClaimSubmitted', 'appointmentDateTime' => nil, 'facilityName' => 'Tomah VA Medical Center', 'createdOn' => '2023-12-29T22:00:57.915Z', diff --git a/modules/travel_pay/spec/services/claims_service_spec.rb b/modules/travel_pay/spec/services/claims_service_spec.rb index 64e1e972ba1..a07eb7a4297 100644 --- a/modules/travel_pay/spec/services/claims_service_spec.rb +++ b/modules/travel_pay/spec/services/claims_service_spec.rb @@ -40,7 +40,7 @@ 'id' => '73611905-71bf-46ed-b1ec-e790593b8565', 'claimNumber' => 'TC0004', 'claimName' => '9d81c1a1-cd05-47c6-be97-d14dec579893', - 'claimStatus' => 'Claim Submitted', + 'claimStatus' => 'ClaimSubmitted', 'appointmentDateTime' => nil, 'facilityName' => 'Tomah VA Medical Center', 'createdOn' => '2023-12-29T22:00:57.915Z', @@ -67,7 +67,7 @@ end it 'returns sorted and parsed claims' do - expected_statuses = ['In Progress', 'In Progress', 'Incomplete', 'Claim Submitted'] + expected_statuses = ['In progress', 'In progress', 'Incomplete', 'Claim submitted'] claims = @service.get_claims actual_statuses = claims[:data].pluck('claimStatus') diff --git a/modules/veteran/app/sidekiq/organizations/update.rb b/modules/veteran/app/sidekiq/organizations/update.rb index 93fc5e944f2..8cddd111bf9 100644 --- a/modules/veteran/app/sidekiq/organizations/update.rb +++ b/modules/veteran/app/sidekiq/organizations/update.rb @@ -74,7 +74,7 @@ def record_can_be_updated?(org_data) # @param address [Hash] A hash containing the details of the organization's address. # @return [VAProfile::Models::ValidationAddress] A validation address object ready for address validation service. def build_validation_address(address) - validation_model = if Flipper.enabled?(:va_v3_contact_information_service) + validation_model = if Flipper.enabled?(:remove_pciu) VAProfile::Models::V3::ValidationAddress else VAProfile::Models::ValidationAddress @@ -97,7 +97,7 @@ def build_validation_address(address) # @param candidate_address [VAProfile::Models::ValidationAddress] The address to be validated. # @return [Hash] The response from the address validation service. def validate_address(candidate_address) - validation_service = if Flipper.enabled?(:va_v3_contact_information_service) + validation_service = if Flipper.enabled?(:remove_pciu) VAProfile::V3::AddressValidation::Service.new else VAProfile::AddressValidation::Service.new @@ -131,7 +131,7 @@ def update_org_record(org_data, api_response) # @param org_data [Hash] Original org_data containing the address and other details. # @param api_response [Hash] The response from the address validation service. def build_address_attributes(org_data, api_response) - if Flipper.enabled?(:va_v3_contact_information_service) + if Flipper.enabled?(:remove_pciu) build_v3_address(api_response['candidate_addresses'].first) else address = api_response['candidate_addresses'].first['address'] diff --git a/modules/veteran/app/sidekiq/representatives/update.rb b/modules/veteran/app/sidekiq/representatives/update.rb index 959a27c14fc..4558f4d67e3 100644 --- a/modules/veteran/app/sidekiq/representatives/update.rb +++ b/modules/veteran/app/sidekiq/representatives/update.rb @@ -77,7 +77,7 @@ def record_can_be_updated?(rep_data) # @param address [Hash] A hash containing the details of the representative's address. # @return [VAProfile::Models::ValidationAddress] A validation address object ready for address validation service. def build_validation_address(address) - validation_model = if Flipper.enabled?(:va_v3_contact_information_service) + validation_model = if Flipper.enabled?(:remove_pciu) VAProfile::Models::V3::ValidationAddress else VAProfile::Models::ValidationAddress @@ -100,7 +100,7 @@ def build_validation_address(address) # @param candidate_address [VAProfile::Models::ValidationAddress] The address to be validated. # @return [Hash] The response from the address validation service. def validate_address(candidate_address) - validation_service = if Flipper.enabled?(:va_v3_contact_information_service) + validation_service = if Flipper.enabled?(:remove_pciu) VAProfile::V3::AddressValidation::Service.new else VAProfile::AddressValidation::Service.new @@ -157,7 +157,7 @@ def update_flags(representative_id, flag_type) # @param rep_data [Hash] Original rep_data containing the address and other details. # @param api_response [Hash] The response from the address validation service. def build_address_attributes(rep_data, api_response) - if Flipper.enabled?(:va_v3_contact_information_service) + if Flipper.enabled?(:remove_pciu) build_v3_address(api_response['candidate_addresses'].first) else address = api_response['candidate_addresses'].first['address'] diff --git a/modules/veteran/lib/tasks/update_vso_addresses.rake b/modules/veteran/lib/tasks/update_vso_addresses.rake index db84e76cff0..24669159828 100644 --- a/modules/veteran/lib/tasks/update_vso_addresses.rake +++ b/modules/veteran/lib/tasks/update_vso_addresses.rake @@ -904,7 +904,7 @@ ADDRESS_BATCH5 = [ # @param org [Hash] A hash containing the details of the organization's address. # @return [VAProfile::Models::ValidationAddress] A validation address object ready for address validation service. def build_validation_address(org) - validation_model = if Flipper.enabled?(:va_v3_contact_information_service, @current_user) + validation_model = if Flipper.enabled?(:remove_pciu) VAProfile::Models::V3::ValidationAddress else VAProfile::Models::ValidationAddress @@ -926,7 +926,7 @@ end # @param candidate_address [VAProfile::Models::ValidationAddress] The address to be validated. # @return [Hash] The response from the address validation service. def validate_address(candidate_address) - validation_service = if Flipper.enabled?(:va_v3_contact_information_service, @current_user) + validation_service = if Flipper.enabled?(:remove_pciu) VAProfile::V3::AddressValidation::Service.new else VAProfile::AddressValidation::Service.new diff --git a/modules/veteran/spec/sidekiq/organizations/update_spec.rb b/modules/veteran/spec/sidekiq/organizations/update_spec.rb index 5e9039285f0..0f8b29c7588 100644 --- a/modules/veteran/spec/sidekiq/organizations/update_spec.rb +++ b/modules/veteran/spec/sidekiq/organizations/update_spec.rb @@ -11,7 +11,7 @@ let(:address_exists) { true } before do - Flipper.disable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(false) allow(VAProfile::AddressValidation::Service).to receive(:new).and_return(double('VAProfile::AddressValidation::Service', candidate: nil)) # rubocop:disable Layout/LineLength end @@ -26,14 +26,10 @@ let(:address_exists) { true } before do - Flipper.enable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(true) allow(VAProfile::V3::AddressValidation::Service).to receive(:new).and_return(double('VAProfile::V3::AddressValidation::Service', candidate: nil)) # rubocop:disable Layout/LineLength end - after do - Flipper.disable(:va_v3_contact_information_service) - end - it 'does not call validate_address or VAProfile::V3::AddressValidation::Service.new' do subject.perform(json_data) @@ -131,7 +127,7 @@ def create_organization end before do - Flipper.disable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(false) allow_any_instance_of(VAProfile::AddressValidation::Service).to receive(:candidate).and_return(api_response_v2) end @@ -167,10 +163,6 @@ def create_organization let(:address_changed) { true } let!(:organization) { create_organization } - before do - Flipper.disable(:va_v3_contact_information_service) - end - it 'updates the address' do subject.perform(json_data) organization.reload @@ -185,10 +177,6 @@ def create_organization let(:address_changed) { true } let!(:organization) { create_organization } - before do - Flipper.disable(:va_v3_contact_information_service) - end - it 'updates the address' do subject.perform(json_data) organization.reload @@ -370,7 +358,6 @@ def create_organization context 'when the first retry has non-zero coordinates' do before do - Flipper.disable(:va_v3_contact_information_service) allow(VAProfile::AddressValidation::Service).to receive(:new).and_return(validation_stub) allow(validation_stub).to receive(:candidate).and_return(api_response_with_zero_v2, api_response1_v2) @@ -392,7 +379,6 @@ def create_organization context 'when the second retry has non-zero coordinates' do before do - Flipper.disable(:va_v3_contact_information_service) allow(VAProfile::AddressValidation::Service).to receive(:new).and_return(validation_stub) allow(validation_stub).to receive(:candidate).and_return(api_response_with_zero_v2, api_response_with_zero_v2, @@ -415,7 +401,6 @@ def create_organization context 'when the third retry has non-zero coordinates' do before do - Flipper.disable(:va_v3_contact_information_service) allow(VAProfile::AddressValidation::Service).to receive(:new).and_return(validation_stub) allow(validation_stub).to receive(:candidate).and_return(api_response_with_zero_v2, api_response_with_zero_v2, @@ -439,7 +424,6 @@ def create_organization context 'when the retry coordinates are all zero' do before do - Flipper.disable(:va_v3_contact_information_service) allow(VAProfile::AddressValidation::Service).to receive(:new).and_return(validation_stub) allow(validation_stub).to receive(:candidate).and_return(api_response_with_zero_v2, api_response_with_zero_v2, @@ -546,15 +530,11 @@ def create_organization end before do - Flipper.enable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(true) address_validation_service = VAProfile::V3::AddressValidation::Service allow_any_instance_of(address_validation_service).to receive(:candidate).and_return(api_response_v3) end - after do - Flipper.disable(:va_v3_contact_information_service) - end - context 'when JSON parsing fails' do let(:invalid_json_data) { 'invalid json' } diff --git a/modules/veteran/spec/sidekiq/representatives/update_spec.rb b/modules/veteran/spec/sidekiq/representatives/update_spec.rb index 363de5097af..c477aae416b 100644 --- a/modules/veteran/spec/sidekiq/representatives/update_spec.rb +++ b/modules/veteran/spec/sidekiq/representatives/update_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.shared_examples 'a representative email or phone update process' do |flag_type, attribute, valid_value, invalid_value| # rubocop:disable Layout/LineLength +RSpec.shared_examples 'a representative email or phone update process' do |flag_type, attribute, valid_value, _invalid_value| # rubocop:disable Layout/LineLength let(:id) { '123abc' } let(:address_changed) { flag_type == 'address' } let(:email_changed) { flag_type == 'email' } @@ -13,72 +13,7 @@ let(:address_exists) { true } before do - Flipper.disable(:va_v3_contact_information_service) - create_flagged_records(flag_type) - allow(VAProfile::AddressValidation::Service).to receive(:new).and_return(double('VAProfile::AddressValidation::Service', candidate: nil)) # rubocop:disable Layout/LineLength - end - - it "updates the #{flag_type} and the associated flagged records" do - flagged_records = - RepresentationManagement::FlaggedVeteranRepresentativeContactData - .where(representative_id: id, flag_type:) - - flagged_records.each do |record| - expect(record.flagged_value_updated_at).to be_nil - end - - subject.perform(json_data) - representative.reload - - expect(representative.send(attribute)).to eq(valid_value) - - flagged_records.each do |record| - record.reload - expect(record.flagged_value_updated_at).not_to be_nil - end - end - - it 'does not call validate_address or VAProfile::AddressValidation::Service.new' do - subject.perform(json_data) - - expect(VAProfile::AddressValidation::Service).not_to have_received(:new) - end - end - - context 'when address_exists is false' do - let(:address_exists) { false } - - before do - Flipper.disable(:va_v3_contact_information_service) - create_flagged_records(flag_type) - end - - it "does not update the #{flag_type} or the associated flagged records" do - flagged_records = - RepresentationManagement::FlaggedVeteranRepresentativeContactData - .where(representative_id: id, flag_type:) - - flagged_records.each do |record| - expect(record.flagged_value_updated_at).to be_nil - end - - subject.perform(json_data) - representative.reload - - expect(representative.send(attribute)).to eq(invalid_value) - - flagged_records.each do |record| - record.reload - expect(record.flagged_value_updated_at).to be_nil - end - end - end - - context 'when address_exists is true for V3/AddressValidation' do - let(:address_exists) { true } - - before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(true) create_flagged_records(flag_type) allow(VAProfile::V3::AddressValidation::Service).to receive(:new).and_return(double('VAProfile::V3::AddressValidation::Service', candidate: nil)) # rubocop:disable Layout/LineLength end @@ -219,7 +154,6 @@ def create_flagged_records(flag_type) end before do - Flipper.disable(:va_v3_contact_information_service) allow_any_instance_of(VAProfile::AddressValidation::Service).to receive(:candidate).and_return(api_response_v2) end @@ -260,7 +194,6 @@ def create_flagged_records(flag_type) let!(:representative) { create_representative } before do - Flipper.disable(:va_v3_contact_information_service) create_flagged_records('address') end @@ -294,7 +227,6 @@ def create_flagged_records(flag_type) let!(:representative) { create_representative } before do - Flipper.disable(:va_v3_contact_information_service) create_flagged_records('address') end @@ -328,7 +260,6 @@ def create_flagged_records(flag_type) let!(:representative) { create_representative } before do - Flipper.disable(:va_v3_contact_information_service) create_flagged_records('address') end @@ -540,7 +471,6 @@ def create_flagged_records(flag_type) context 'when the first retry has non-zero coordinates' do before do - Flipper.disable(:va_v3_contact_information_service) allow(VAProfile::AddressValidation::Service).to receive(:new).and_return(validation_stub) allow(validation_stub).to receive(:candidate).and_return(api_response_with_zero_v2, api_response1_v2) end @@ -561,7 +491,6 @@ def create_flagged_records(flag_type) context 'when the second retry has non-zero coordinates' do before do - Flipper.disable(:va_v3_contact_information_service) allow(VAProfile::AddressValidation::Service).to receive(:new).and_return(validation_stub) allow(validation_stub).to receive(:candidate).and_return(api_response_with_zero_v2, api_response_with_zero_v2, api_response2_v2) @@ -583,7 +512,6 @@ def create_flagged_records(flag_type) context 'when the third retry has non-zero coordinates' do before do - Flipper.disable(:va_v3_contact_information_service) allow(VAProfile::AddressValidation::Service).to receive(:new).and_return(validation_stub) allow(validation_stub).to receive(:candidate).and_return(api_response_with_zero_v2, api_response_with_zero_v2, api_response_with_zero_v2, api_response3_v2) @@ -605,7 +533,6 @@ def create_flagged_records(flag_type) context 'when the retry coordinates are all zero' do before do - Flipper.disable(:va_v3_contact_information_service) allow(VAProfile::AddressValidation::Service).to receive(:new).and_return(validation_stub) allow(validation_stub).to receive(:candidate).and_return(api_response_with_zero_v2, api_response_with_zero_v2, api_response_with_zero_v2, api_response_with_zero_v2) @@ -730,7 +657,7 @@ def create_flagged_records(flag_type) before do validation_service = VAProfile::V3::AddressValidation::Service - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(true) allow_any_instance_of(validation_service).to receive(:candidate).and_return(api_response_v3) end diff --git a/spec/controllers/v0/burial_claims_controller_spec.rb b/spec/controllers/v0/burial_claims_controller_spec.rb deleted file mode 100644 index 9a7135e2dcc..00000000000 --- a/spec/controllers/v0/burial_claims_controller_spec.rb +++ /dev/null @@ -1,107 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' -require 'support/controller_spec_helper' -require 'burials/monitor' -require 'burials/benefits_intake/submit_claim_job' - -RSpec.describe V0::BurialClaimsController, type: :controller do - let(:monitor) { double('Burials::Monitor') } - - before do - allow(Burials::Monitor).to receive(:new).and_return(monitor) - allow(monitor).to receive_messages(track_show404: nil, track_show_error: nil, track_create_attempt: nil, - track_create_error: nil, track_create_success: nil, - track_create_validation_error: nil, track_process_attachment_error: nil) - end - - describe 'with a user' do - let(:form) { build(:burial_claim) } - let(:param_name) { :burial_claim } - let(:form_id) { '21P-530EZ' } - let(:user) { create(:user) } - - it 'logs validation errors' do - allow(SavedClaim::Burial).to receive(:new).and_return(form) - allow(form).to receive_messages(save: false, errors: 'mock error') - - expect(monitor).to receive(:track_create_attempt).once - expect(monitor).to receive(:track_create_validation_error).once - expect(monitor).to receive(:track_create_error).once - expect(form).not_to receive(:process_attachments!) - - response = post(:create, params: { param_name => { form: form.form } }) - expect(response.status).to eq(500) - end - end - - describe '#show' do - let(:claim) { build(:burial_claim) } - - it 'returns a success when the claim is found' do - allow(SavedClaim::Burial).to receive(:find_by!).and_return(claim) - response = get(:show, params: { id: claim.guid }) - - expect(response.status).to eq(200) - end - - it 'returns an error if the claim is not found' do - expect(monitor).to receive(:track_show404).once - - response = get(:show, params: { id: 'non-existant-saved-claim' }) - - expect(response.status).to eq(404) - end - - it 'logs show errors' do - error = StandardError.new('Mock Error') - allow(SavedClaim::Burial).to receive(:find_by!).and_raise(error) - - expect(monitor).to receive(:track_show_error).once - - response = get(:show, params: { id: 'non-existant-saved-claim' }) - - expect(response.status).to eq(500) - end - end - - describe '#process_and_upload_to_lighthouse' do - let(:claim) { build(:burial_claim) } - let(:in_progress_form) { build(:in_progress_form) } - - it 'returns a success' do - expect(claim).to receive(:process_attachments!) - - subject.send(:process_and_upload_to_lighthouse, in_progress_form, claim) - end - - it 'raises an error' do - allow(claim).to receive(:process_attachments!).and_raise(StandardError, 'mock error') - expect(monitor).to receive(:track_process_attachment_error).once - expect(Burials::BenefitsIntake::SubmitClaimJob).not_to receive(:perform_async) - - expect do - subject.send(:process_and_upload_to_lighthouse, in_progress_form, claim) - end.to raise_error(StandardError, 'mock error') - end - end - - describe '#log_validation_error_to_metadata' do - let(:claim) { build(:burial_claim) } - let(:in_progress_form) { build(:in_progress_form) } - - it 'returns if a `blank` in_progress_form' do - ['', [], {}, nil].each do |blank| - expect(in_progress_form).not_to receive(:update) - result = subject.send(:log_validation_error_to_metadata, blank, claim) - expect(result).to be_nil - end - end - - it 'updates the in_progress_form' do - expect(in_progress_form).to receive(:metadata).and_return(in_progress_form.metadata) - expect(in_progress_form).to receive(:update) - subject.send(:log_validation_error_to_metadata, in_progress_form, claim) - end - end -end diff --git a/spec/controllers/v0/profile/address_validation_controller_spec.rb b/spec/controllers/v0/profile/address_validation_controller_spec.rb index 74da71e0539..45c6e19dfe4 100644 --- a/spec/controllers/v0/profile/address_validation_controller_spec.rb +++ b/spec/controllers/v0/profile/address_validation_controller_spec.rb @@ -9,7 +9,7 @@ let(:invalid_address) { build(:va_profile_validation_address).to_h } before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service).and_return(false) + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(false) end shared_examples 'invalid address' do @@ -132,7 +132,7 @@ let(:incorrect_address_pou) { build(:va_profile_v3_address, :incorrect_address_pou) } before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(true) end shared_examples 'invalid address' do diff --git a/spec/controllers/v0/users_controller_spec.rb b/spec/controllers/v0/users_controller_spec.rb index 11fc29a4a6b..88302f06a75 100644 --- a/spec/controllers/v0/users_controller_spec.rb +++ b/spec/controllers/v0/users_controller_spec.rb @@ -56,8 +56,6 @@ before do sign_in_as(user) - Flipper.disable(:va_v3_contact_information_service) - Flipper.disable(:remove_pciu) Flipper.disable(:profile_user_claims) create(:user_verification, idme_uuid: user.idme_uuid) end diff --git a/spec/controllers/v0/virtual_agent/virtual_agent_appeal_spec.rb b/spec/controllers/v0/virtual_agent/virtual_agent_appeal_spec.rb deleted file mode 100644 index 4fa5f62d560..00000000000 --- a/spec/controllers/v0/virtual_agent/virtual_agent_appeal_spec.rb +++ /dev/null @@ -1,452 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe 'VirtualAgentAppeals', type: :request do - let(:user) { create(:user, :loa3, ssn: '111223333') } - - describe 'GET /v0/virtual_agent/appeal' do - describe 'environment is not staging' do - it 'returns information when most recent open appeal is compensation' do - sign_in_as(user) - # run job - - VCR.use_cassette('caseflow/virtual_agent_appeals/recent_open_compensation_appeal') do - get '/v0/virtual_agent/appeal' - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(JSON.parse(response.body)['data'].size).to equal(1) - expect(res_body[0]).to include({ - 'appeal_type' => 'Compensation', - 'filing_date' => '06/11/2008', - 'appeal_status' => 'Please review your Supplemental Statement of the Case', - 'updated_date' => '01/16/2018', - 'description' => ' ', - 'appeal_or_review' => 'appeal' - }) - end - allow(Settings).to receive(:vsp_environment).and_call_original - end - - it 'returns unknown status when most recent open appeal is of an unknown status' do - sign_in_as(user) - # run job - - VCR.use_cassette('caseflow/virtual_agent_appeals/recent_open_unknown_appeal_status') do - get '/v0/virtual_agent/appeal' - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(JSON.parse(response.body)['data'].size).to equal(1) - expect(res_body[0]).to include({ - 'appeal_type' => 'Compensation', - 'filing_date' => '06/11/2008', - 'appeal_status' => 'Unknown Status', - 'updated_date' => '01/16/2018', - 'description' => ' ', - 'appeal_or_review' => 'appeal' - }) - end - allow(Settings).to receive(:vsp_environment).and_call_original - end - - it 'returns empty array when no appeals are found' do - sign_in_as(user) - - VCR.use_cassette('caseflow/appeals_empty') do - get '/v0/virtual_agent/appeal' - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(res_body.size).to equal(0) - end - end - - it 'returns most recent appeal that is compensation and active' do - sign_in_as(user) - VCR.use_cassette('caseflow/virtual_agent_appeals/appeals_old_comp') do - get '/v0/virtual_agent/appeal' - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(res_body.size).to equal(1) - expect(res_body[0]).to include({ - 'appeal_type' => 'Compensation', - 'filing_date' => '01/06/2003', - 'appeal_status' => 'Your appeal was closed', - 'description' => ' (Service connection, sleep apnea) ', - 'updated_date' => '09/30/2003', - 'appeal_or_review' => 'appeal' - }) - end - end - - it 'returns an empty array when no active compensation appeals are found' do - sign_in_as(user) - - VCR.use_cassette('caseflow/virtual_agent_appeals/appeals_inactive_comp') do - get '/v0/virtual_agent/appeal' - - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(res_body.size).to equal(0) - end - end - - it 'returns an empty array when no active appeals are found' do - sign_in_as(user) - - VCR.use_cassette('caseflow/virtual_agent_appeals/appeals_inactive') do - get '/v0/virtual_agent/appeal' - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(res_body.size).to equal(0) - end - end - - it 'returns correct appeal status message for field grant appeal status type' do - sign_in_as(user) - - VCR.use_cassette('caseflow/virtual_agent_appeals/appeals_field_grant_status_type') do - get '/v0/virtual_agent/appeal' - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(res_body.size).to equal(1) - expect(res_body[0]).to include( - { - 'appeal_type' => 'Compensation', - 'filing_date' => '06/11/2008', - 'appeal_status' => 'The Veterans Benefits Administration granted your appeal', - 'updated_date' => '01/16/2018', - 'description' => ' ', - 'appeal_or_review' => 'appeal' - } - ) - end - end - - describe 'get appeal or review based on appeal type' do - it 'returns appeal when appeal type is legacyAppeal' do - sign_in_as(user) - # run job - VCR.use_cassette('caseflow/virtual_agent_appeals/recent_open_compensation_appeal') do - get '/v0/virtual_agent/appeal' - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(JSON.parse(response.body)['data'].size).to equal(1) - expect(res_body[0]).to include({ - 'appeal_type' => 'Compensation', - 'filing_date' => '06/11/2008', - 'appeal_status' => 'Please review your Supplemental Statement of the Case', - 'updated_date' => '01/16/2018', - 'description' => ' ', - 'appeal_or_review' => 'appeal' - }) - end - end - - it 'returns appeal when appeal type is appeal' do - sign_in_as(user) - # run job - VCR.use_cassette('caseflow/virtual_agent_appeals/appeal_type_is_appeal') do - get '/v0/virtual_agent/appeal' - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(JSON.parse(response.body)['data'].size).to equal(1) - expect(res_body[0]).to include({ - 'appeal_type' => 'Compensation', - 'filing_date' => '06/11/2008', - 'appeal_status' => 'Please review your Supplemental Statement of the Case', - 'updated_date' => '01/16/2018', - 'description' => ' ', - 'appeal_or_review' => 'appeal' - }) - end - end - - it 'returns review when appeal type is higherLevelReview' do - sign_in_as(user) - # run job - VCR.use_cassette('caseflow/virtual_agent_appeals/appeal_type_is_higher_level_review') do - get '/v0/virtual_agent/appeal' - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(JSON.parse(response.body)['data'].size).to equal(1) - expect(res_body[0]).to include({ - 'appeal_type' => 'Compensation', - 'filing_date' => '06/11/2008', - 'appeal_status' => 'Please review your Supplemental Statement of the Case', - 'updated_date' => '01/16/2018', - 'description' => ' ', - 'appeal_or_review' => 'review' - }) - end - end - - it 'returns review when appeal type is supplementalClaim' do - sign_in_as(user) - # run job - VCR.use_cassette('caseflow/virtual_agent_appeals/appeal_type_is_supplemental_claim') do - get '/v0/virtual_agent/appeal' - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(JSON.parse(response.body)['data'].size).to equal(1) - expect(res_body[0]).to include({ - 'appeal_type' => 'Compensation', - 'filing_date' => '06/11/2008', - 'appeal_status' => 'Please review your Supplemental Statement of the Case', - 'updated_date' => '01/16/2018', - 'description' => ' ', - 'appeal_or_review' => 'review' - }) - end - end - - describe 'returns multiple appeals as an array' do - it 'only returns active comp appeals' do - sign_in_as(user) - # run job - VCR.use_cassette('caseflow/virtual_agent_appeals/three_appeals_two_open_comp') do - get '/v0/virtual_agent/appeal' - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(res_body.length).to equal(2) - expect(res_body).to eq([{ - 'appeal_type' => 'Compensation', - 'filing_date' => '09/30/2021', - 'appeal_status' => 'Your appeal is waiting to be sent to a judge', - 'updated_date' => '09/30/2021', - 'description' => ' ', - 'appeal_or_review' => 'appeal' - }, { - 'appeal_type' => 'Compensation', - 'filing_date' => '01/06/2003', - 'appeal_status' => 'The Board made a decision on your appeal', - 'updated_date' => '09/15/2021', - 'description' => ' ', - 'appeal_or_review' => 'appeal' - }]) - end - end - - it 'only returns five active comp appeals when more than five are found' do - sign_in_as(user) - # run job - VCR.use_cassette('caseflow/virtual_agent_appeals/six_open_comp_appeals_five_returned') do - get '/v0/virtual_agent/appeal' - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(res_body.length).to equal(5) - expect(res_body).to eq([{ - 'appeal_type' => 'Compensation', - 'filing_date' => '02/06/2003', - 'appeal_status' => 'Your appeal was closed', - 'updated_date' => '10/01/2021', - 'description' => ' ', - 'appeal_or_review' => 'appeal' - }, { - 'appeal_type' => 'Compensation', - 'filing_date' => '09/30/2021', - 'appeal_status' => 'Your appeal is waiting to be sent to a judge', - 'updated_date' => '09/30/2021', - 'description' => ' ', - 'appeal_or_review' => 'appeal' - }, { - 'appeal_type' => 'Compensation', - 'filing_date' => '09/29/2021', - 'appeal_status' => 'Your appeal is waiting to be sent to a judge', - 'updated_date' => '09/29/2021', - 'description' => ' ', - 'appeal_or_review' => 'appeal' - }, { - 'appeal_type' => 'Compensation', - 'filing_date' => '01/06/2003', - 'appeal_status' => 'The Board made a decision on your appeal', - 'updated_date' => '09/16/2021', - 'description' => ' ', - 'appeal_or_review' => 'appeal' - }, { - 'appeal_type' => 'Compensation', - 'filing_date' => '03/06/2021', - 'appeal_status' => 'The Board made a decision on your appeal', - 'updated_date' => '09/15/2021', - 'description' => ' ', - 'appeal_or_review' => 'appeal' - }]) - end - end - end - end - end - - describe 'call Lighthouse mock when environment is staging' do - before do - allow(Settings).to receive(:vsp_environment).and_return('staging') - end - - describe 'when logged in with user+228' do - let(:user) { create(:user, :loa3, ssn: '111223333', email: 'vets.gov.user+228@gmail.com') } - - it 'returns single appeal' do - sign_in_as(user) - - # new cassette to use for lighthouse mock request - VCR.use_cassette('caseflow/virtual_agent_appeals/lighthouse_mock_appeal', match_requests_on: [:headers]) do - get '/v0/virtual_agent/appeal' - end - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(res_body.length).to equal(1) - expect(res_body).to eq([{ - 'appeal_type' => 'Compensation', - 'filing_date' => '08/10/2017', - 'appeal_status' => 'Please review your Statement of the Case', - 'updated_date' => '05/15/2018', - 'description' => ' (Service connection, sleep apnea) ', - 'appeal_or_review' => 'appeal' - }]) - end - - it 'returns single appeal with correct appeal status for sc_recieved' do - sign_in_as(user) - - # new cassette to use for lighthouse mock request - VCR.use_cassette( - 'caseflow/virtual_agent_appeals/lighthouse_mock_appeal_sc_recieved', - match_requests_on: [:headers] - ) do - get '/v0/virtual_agent/appeal' - end - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(res_body.length).to equal(1) - expect(res_body).to eq([{ - 'appeal_type' => 'Compensation', - 'filing_date' => '08/10/2017', - 'appeal_status' => 'A reviewer is examining your new evidence', - 'updated_date' => '05/15/2018', - 'description' => ' (Service connection, sleep apnea) ', - 'appeal_or_review' => 'appeal' - }]) - end - end - - describe 'when logged in with user+54' do - let(:user) { create(:user, :loa3, ssn: '111223333', email: 'vets.gov.user+54@gmail.com') } - - it 'returns no appeals' do - sign_in_as(user) - - # new cassette to use for lighthouse mock request - VCR.use_cassette('caseflow/virtual_agent_appeals/lighthouse_mock_no_appeals', - match_requests_on: [:headers]) do - get '/v0/virtual_agent/appeal' - end - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(res_body.length).to equal(0) - expect(res_body).to eq([]) - end - end - - describe 'when logged in with user+36' do - let(:user) { create(:user, :loa3, ssn: '796043735', email: 'vets.gov.user+36@gmail.com') } - - it 'returns multiple appeal' do - sign_in_as(user) - - VCR.use_cassette('caseflow/virtual_agent_appeals/lighthouse_mock_multiple_appeals', - match_requests_on: [:headers]) do - get '/v0/virtual_agent/appeal' - end - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(res_body.length).to equal(3) - expect(res_body).to eq([{ - 'appeal_type' => 'Compensation', - 'filing_date' => '08/10/2020', - 'appeal_status' => 'Please review your Statement of the Case', - 'updated_date' => '05/15/2021', - 'description' => ' (Service connection, lumbosacral strain) ', - 'appeal_or_review' => 'appeal' - }, - { - 'appeal_type' => 'Compensation', - 'filing_date' => '02/19/2019', - 'appeal_status' => 'The Veterans Benefits Administration made a decision', - 'updated_date' => '08/05/2019', - 'description' => ' (Severance of service connection, hypothyroidism, and 1 other) ', - 'appeal_or_review' => 'review' - }, - { - 'appeal_type' => 'Compensation', - 'filing_date' => '08/10/2017', - 'appeal_status' => 'Please review your Statement of the Case', - 'updated_date' => '05/15/2018', - 'description' => ' (Service connection, sleep apnea) ', - 'appeal_or_review' => 'appeal' - }]) - end - end - - describe 'when logged in with another user' do - let(:user) { create(:user, :loa3, ssn: '111222333', email: 'vets.gov.user+420@gmail.com') } - - it 'returns no appeals' do - sign_in_as(user) - - # new cassette to use for lighthouse mock request - VCR.use_cassette('caseflow/virtual_agent_appeals/lighthouse_mock_no_appeals_another_user', - match_requests_on: [:headers]) do - get '/v0/virtual_agent/appeal' - end - res_body = JSON.parse(response.body)['data'] - expect(response).to have_http_status(:ok) - expect(res_body).to be_a(Array) - expect(res_body.length).to equal(0) - expect(res_body).to eq([]) - end - end - - describe 'when logged in with user that does not exist' do - let(:user) { create(:user, :loa3, ssn: '111222333', email: 'vets.gov.user+110@gmail.com') } - - it 'returns not found but defaults to 500' do - sign_in_as(user) - - # new cassette to use for lighthouse mock request - VCR.use_cassette('caseflow/virtual_agent_appeals/lighthouse_mock_not_found') do - get '/v0/virtual_agent/appeal' - end - expect(response).to have_http_status(:internal_server_error) - end - end - end - - describe 'when CaseFlow throws an error' do - it 'logs to sentry when CaseFlow has server error 500' do - sign_in_as(user) - - VCR.use_cassette('caseflow/server_error') do - get '/v0/virtual_agent/appeal' - - expect(response).to have_http_status(:internal_server_error) - end - end - end - end -end diff --git a/spec/controllers/v0/virtual_agent_claim_letters_controller_spec.rb b/spec/controllers/v0/virtual_agent_claim_letters_controller_spec.rb deleted file mode 100644 index e7fd500f59c..00000000000 --- a/spec/controllers/v0/virtual_agent_claim_letters_controller_spec.rb +++ /dev/null @@ -1,60 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe V0::VirtualAgentClaimLettersController, type: :controller do - let(:user) { build(:user, :loa3) } - let(:document_id) { '{27832B64-2D88-4DEE-9F6F-DF80E4CAAA87}' } - let(:filename) { 'ClaimLetter-2022-9-22.pdf' } - let(:list_letters_res) { get_fixture('claim_letter/claim_letter_list') } - - before do - sign_in_as(user) - end - - describe '#index' do - it 'lists document id and letter details for claim letters' do - get(:index) - letters = JSON.parse(response.body) - expected_important_keys = %w[document_id doc_type received_at] - - expect(letters.length).to be > 0 - # We can reference the keys of the first letters since - # they _should_ all have the same keys. - expect(letters.first.keys).to include(*expected_important_keys) - end - - it 'lists only documents of the doctypes specified by the feature flags' do - allow(Flipper).to receive(:enabled?).with(:cst_include_ddl_sqd_letters, nil).and_return(false) - allow(Flipper).to receive(:enabled?).with(:cst_include_ddl_5103_letters, nil).and_return(true) - allow(Flipper).to receive(:enabled?).with(:cst_include_ddl_boa_letters, nil).and_return(false) - get(:index) - letters = JSON.parse(response.body) - allowed_letters = letters.select { |d| %w[184 704 706 858].include?(d['doc_type']) } - expect(allowed_letters.length).to eql(letters.length) - end - end - - describe '#show' do - it 'responds with a pdf with a dated filename' do - get(:show, params: { document_id: }) - - expect(response.header['Content-Type']).to eq('application/pdf') - expect(response.header['Content-Disposition']).to include("filename=\"#{filename}\"") - end - - it 'returns a 404 with a not found message if document id does not exist' do - get(:show, params: { document_id: '{0}' }) - err = JSON.parse(response.body)['errors'].first - - expect(err['status']).to eql('404') - expect(err['title'].downcase).to include('not found') - end - - it 'has a dated filename' do - get(:show, params: { document_id: }) - - expect(response.header['Content-Disposition']).to include("filename=\"#{filename}\"") - end - end -end diff --git a/spec/fixtures/form1010_ezr/veteran_data.json b/spec/fixtures/form1010_ezr/veteran_data.json new file mode 100644 index 00000000000..50f475f2a15 --- /dev/null +++ b/spec/fixtures/form1010_ezr/veteran_data.json @@ -0,0 +1,74 @@ +{ + "providers": [ + { + "insuranceGroupCode": "G1234", + "insuranceName": "MyInsurance", + "insurancePolicyHolderName": "FirstName ZZTEST", + "insurancePolicyNumber": "P1234" + } + ], + "medicareClaimNumber": "873462432", + "isEnrolledMedicarePartA": true, + "maritalStatus": "Never Married", + "medicarePartAEffectiveDate": "1999-10-16", + "isMedicaidEligible": false, + "dependents": [ + { + "fullName": { + "first": "Eric", + "middle": "Victor", + "last": "Bishop", + "suffix": "Jr." + }, + "socialSecurityNumber": "666333111", + "becameDependent": "2010-01-25", + "dependentRelation": "Son", + "disabledBefore18": false, + "attendedSchoolLastYear": true, + "cohabitedLastYear": true, + "dateOfBirth": "2010-01-25" + }, + { + "fullName": { + "first": "Jessica", + "middle": "Layla", + "last": "Bishop" + }, + "socialSecurityNumber": "666394444", + "becameDependent": "2013-03-15", + "dependentRelation": "Daughter", + "disabledBefore18": false, + "attendedSchoolLastYear": true, + "cohabitedLastYear": true, + "dateOfBirth": "2013-03-15" + } + ], + "spouseFullName": { + "first": "Sarah", + "middle": "Jasmine", + "last": "Bishop" + }, + "dateOfMarriage": "1991-10-12", + "cohabitedLastYear": true, + "spouseDateOfBirth": "1970-04-21", + "spouseSocialSecurityNumber": "666112121", + "nonPrefill": { + "previousFinancialInfo": { + "veteranFinancialInfo": { + "incomeYear": "2024", + "otherIncome": "2811", + "grossIncome": "67584", + "netIncome": "14293", + "deductibleFuneralExpenses": "1283", + "deductibleMedicalExpenses": "8576", + "deductibleEducationExpenses": "4344" + }, + "spouseFinancialInfo": { + "incomeYear": "2024", + "otherIncome": "1229", + "grossIncome": "57930", + "netIncome": "7458" + } + } + } +} diff --git a/spec/lib/common/models/concerns/cache_aside_spec.rb b/spec/lib/common/models/concerns/cache_aside_spec.rb index 4d7bcfb85c9..c9739b8a66d 100644 --- a/spec/lib/common/models/concerns/cache_aside_spec.rb +++ b/spec/lib/common/models/concerns/cache_aside_spec.rb @@ -6,70 +6,30 @@ describe Common::CacheAside do let(:user) { build(:user, :loa3) } - unless Flipper.enabled?(:va_v3_contact_information_service) - describe 'ContactInformationV1' do - let(:person) { build(:person) } + let(:person) { build(:person_v2) } - before do - Flipper.disable(:va_v3_contact_information_service) - allow(VAProfile::Models::Person).to receive(:build_from).and_return(person) - end - - describe '#do_cached_with' do - let(:person_response) do - if Flipper.enabled?(:va_v3_contact_information_service) - VAProfile::V2::ContactInformation::PersonResponse.from( - OpenStruct.new(status: 200, body: { 'bio' => person.to_hash }) - ) - else - VAProfile::ContactInformation::PersonResponse.from( - OpenStruct.new(status: 200, body: { 'bio' => person.to_hash }) - ) - end - end - - it 'sets the attributes needed to perform redis actions', :aggregate_failures do - instance1 = VAProfileRedis::ContactInformation.for_user(user) - instance1.do_cached_with(key: 'test') { person_response } - expect(instance1.attributes[:uuid]).not_to be_nil - expect(instance1.attributes[:response]).not_to be_nil - - instance2 = VAProfileRedis::ContactInformation.for_user(user) - instance2.do_cached_with(key: 'test') { raise 'value was not cached!' } - expect(instance2.attributes[:uuid]).not_to be_nil - expect(instance2.attributes[:response]).not_to be_nil - end - end - end + before do + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(true) + allow(VAProfile::Models::V3::Person).to receive(:build_from).and_return(person) end - if Flipper.enabled?(:va_v3_contact_information_service) - describe 'ContactInformationV2' do - let(:person) { build(:person_v2) } - - before do - allow(VAProfile::Models::V3::Person).to receive(:build_from).and_return(person) - end - - describe '#do_cached_with', :skip_vet360 do - let(:person_response) do - VAProfile::V2::ContactInformation::PersonResponse.from( - OpenStruct.new(status: 200, body: { 'bio' => person.to_hash }) - ) - end + describe '#do_cached_with' do + let(:person_response) do + VAProfile::V2::ContactInformation::PersonResponse.from( + OpenStruct.new(status: 200, body: { 'bio' => person.to_hash }) + ) + end - it 'sets the attributes needed to perform redis actions', :aggregate_failures do - instance1 = VAProfileRedis::V2::ContactInformation.for_user(user) - instance1.do_cached_with(key: 'test') { person_response } - expect(instance1.attributes[:uuid]).not_to be_nil - expect(instance1.attributes[:response]).not_to be_nil + it 'sets the attributes needed to perform redis actions', :aggregate_failures do + instance1 = VAProfileRedis::V2::ContactInformation.for_user(user) + instance1.do_cached_with(key: 'test') { person_response } + expect(instance1.attributes[:uuid]).not_to be_nil + expect(instance1.attributes[:response]).not_to be_nil - instance2 = VAProfileRedis::V2::ContactInformation.for_user(user) - instance2.do_cached_with(key: 'test') { raise 'value was not cached!' } - expect(instance2.attributes[:uuid]).not_to be_nil - expect(instance2.attributes[:response]).not_to be_nil - end - end + instance2 = VAProfileRedis::V2::ContactInformation.for_user(user) + instance2.do_cached_with(key: 'test') { raise 'value was not cached!' } + expect(instance2.attributes[:uuid]).not_to be_nil + expect(instance2.attributes[:response]).not_to be_nil end end end diff --git a/spec/lib/debt_management_center/statement_identifier_service_spec.rb b/spec/lib/debt_management_center/statement_identifier_service_spec.rb index 31a3221b2e9..06c1c3320ba 100644 --- a/spec/lib/debt_management_center/statement_identifier_service_spec.rb +++ b/spec/lib/debt_management_center/statement_identifier_service_spec.rb @@ -6,8 +6,6 @@ RSpec.describe DebtManagementCenter::StatementIdentifierService, :skip_vet360, type: :service do describe '#get_mpi_data' do - Flipper.disable(:va_v3_contact_information_service) - context 'given edipi statement' do edipi = '492031291' let(:verification) { build(:dslogon_user_verification) } @@ -195,15 +193,7 @@ describe '#get_mpi_data v2' do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) - end - - let(:cassette_path) do - if Flipper.enabled?(:va_v3_contact_information_service) - 'va_profile/v2/contact_information' - else - 'va_profile/contact_information' - end + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) end context 'given edipi statement' do diff --git a/spec/lib/hca/enrollment_eligibility/service_spec.rb b/spec/lib/hca/enrollment_eligibility/service_spec.rb index 0bb1b09c56b..cc6f0d1709f 100644 --- a/spec/lib/hca/enrollment_eligibility/service_spec.rb +++ b/spec/lib/hca/enrollment_eligibility/service_spec.rb @@ -4,64 +4,51 @@ require 'hca/enrollment_eligibility/service' describe HCA::EnrollmentEligibility::Service do - context 'with a user who has dependents', run_at: 'Tue, 31 Oct 2023 12:04:33 GMT' do - it 'gets data for prefilling 1010ezr' do - VCR.use_cassette( - 'hca/ee/dependents', - VCR::MATCH_EVERYTHING.merge(erb: true) - ) do - expect(described_class.new.get_ezr_data('1012829228V424035').to_h).to eq( - { - medicareClaimNumber: nil, - isEnrolledMedicarePartA: false, - medicarePartAEffectiveDate: nil, - isMedicaidEligible: false, - dependents: [{ fullName: { first: 'CHILD', last: 'BISHOP' }, - socialSecurityNumber: '234114455', - becameDependent: '2020-10-01', - dependentRelation: 'Daughter', - disabledBefore18: false, - attendedSchoolLastYear: false, - cohabitedLastYear: true, - dateOfBirth: '2020-10-01' }], - spouseFullName: { first: 'VSDV', last: 'SDVSDV' }, - maritalStatus: 'Married', - dateOfMarriage: '2000-10-15', - cohabitedLastYear: true, - spouseDateOfBirth: '1950-02-17', - spouseSocialSecurityNumber: '435345344' - } - ) + describe '#get_ezr_data' do + let(:veteran_data) do + data = JSON.parse(File.read('spec/fixtures/form1010_ezr/veteran_data.json')) + financial_info = data['nonPrefill']['previousFinancialInfo'] + + data.delete('nonPrefill') + data.merge('previousFinancialInfo' => financial_info) + end + + context "when the 'ezr_form_prefill_with_providers_and_dependents' flipper is enabled" do + before do + allow(Flipper).to receive(:enabled?).with(:ezr_form_prefill_with_providers_and_dependents).and_return(true) + end + + it 'gets Veteran data relevant to the 1010ezr', run_at: 'Thu, 27 Feb 2025 01:10:06 GMT' do + VCR.use_cassette( + 'form1010_ezr/lookup_user_with_ezr_prefill_data', + match_requests_on: %i[method uri body], erb: true + ) do + expect( + described_class.new.get_ezr_data( + '1012829228V424035' + ).to_h.deep_stringify_keys + ).to eq(veteran_data) + end end end - end - describe '#get_ezr_data', run_at: 'Tue, 24 Oct 2023 17:27:12 GMT' do - it 'gets data for prefilling 1010ezr' do - VCR.use_cassette( - 'hca/ee/lookup_user_2023', - VCR::MATCH_EVERYTHING.merge(erb: true) - ) do - expect( - described_class.new.get_ezr_data( - '1013032368V065534' - ).to_h.deep_stringify_keys - ).to eq( - { 'providers' => - [{ 'insuranceGroupCode' => '123456', - 'insuranceName' => 'Aetna', - 'insurancePolicyHolderName' => 'Four IVMTEST', - 'insurancePolicyNumber' => '123456' }, - { 'insuranceGroupCode' => 'G1234', - 'insuranceName' => 'MyInsurance', - 'insurancePolicyHolderName' => 'FirstName ZZTEST', - 'insurancePolicyNumber' => 'P1234' }], - 'medicareClaimNumber' => '873462432', - 'isEnrolledMedicarePartA' => true, - 'medicarePartAEffectiveDate' => '1999-10-16', - 'maritalStatus' => 'Married', - 'isMedicaidEligible' => true } - ) + context "when the 'ezr_form_prefill_with_providers_and_dependents' flipper is disabled" do + before do + allow(Flipper).to receive(:enabled?).with(:ezr_form_prefill_with_providers_and_dependents).and_return(false) + end + + it 'gets Veteran data relevant to the 1010ezr, except for insurance providers and dependents', + run_at: 'Thu, 27 Feb 2025 01:10:06 GMT' do + VCR.use_cassette( + 'form1010_ezr/lookup_user_with_ezr_prefill_data', + match_requests_on: %i[method uri body], erb: true + ) do + expect( + described_class.new.get_ezr_data( + '1012829228V424035' + ).to_h.deep_stringify_keys + ).to eq(veteran_data.except!('providers', 'dependents')) + end end end end diff --git a/spec/lib/va_profile/v2/contact_information/service_spec.rb b/spec/lib/va_profile/v2/contact_information/service_spec.rb index 258f4ed68fd..2ecbe4210fd 100644 --- a/spec/lib/va_profile/v2/contact_information/service_spec.rb +++ b/spec/lib/va_profile/v2/contact_information/service_spec.rb @@ -9,7 +9,7 @@ let(:user) { build(:user, :loa3) } before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) end describe '#get_person' do @@ -91,7 +91,7 @@ VCR.use_cassette('va_profile/v2/contact_information/put_email_success', VCR::MATCH_EVERYTHING) do VCR.use_cassette('va_profile/v2/contact_information/person', VCR::MATCH_EVERYTHING) do allow(VAProfile::Configuration::SETTINGS.contact_information).to receive(:cache_enabled).and_return(true) - old_email = user.vaprofile_contact_info.email.email_address + old_email = user.va_profile_email expect_any_instance_of(VAProfile::Models::Transaction).to receive(:received?).and_return(true) response = subject.put_email(email) @@ -398,7 +398,7 @@ context 'transaction notification doesnt exist' do context 'users email is blank' do it 'doesnt send an email' do - expect(user).to receive(:va_profile_v2_email).and_return(nil) + expect(user).to receive(:va_profile_email).and_return(nil) expect(VANotifyEmailJob).not_to receive(:perform_async) subject.send(:send_contact_change_notification, transaction_status, :email) @@ -411,7 +411,7 @@ allow(VAProfile::Configuration::SETTINGS.contact_information).to receive(:cache_enabled).and_return(true) expect(VANotifyEmailJob).to receive(:perform_async).with( - user.va_profile_v2_email, + user.va_profile_email, described_class::CONTACT_INFO_CHANGE_TEMPLATE, { 'contact_info' => 'Email address' } ) diff --git a/spec/lib/va_profile/v2/contact_information/transaction_response_spec.rb b/spec/lib/va_profile/v2/contact_information/transaction_response_spec.rb index 5903d254507..ba060b178a2 100644 --- a/spec/lib/va_profile/v2/contact_information/transaction_response_spec.rb +++ b/spec/lib/va_profile/v2/contact_information/transaction_response_spec.rb @@ -5,7 +5,7 @@ describe VAProfile::V2::ContactInformation::TransactionResponse do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) end describe '.from' do diff --git a/spec/lib/va_profile/v2/person/service_spec.rb b/spec/lib/va_profile/v2/person/service_spec.rb index 7ef18f0c3bf..9b2c5a89a81 100644 --- a/spec/lib/va_profile/v2/person/service_spec.rb +++ b/spec/lib/va_profile/v2/person/service_spec.rb @@ -14,7 +14,7 @@ let(:user) { build(:user, :loa3) } before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) end context 'with a user present, that has a icn_with_aaid' do diff --git a/spec/lib/va_profile/v3/address_validation/service_spec.rb b/spec/lib/va_profile/v3/address_validation/service_spec.rb index 6d1f3c96aae..1fd1a391562 100644 --- a/spec/lib/va_profile/v3/address_validation/service_spec.rb +++ b/spec/lib/va_profile/v3/address_validation/service_spec.rb @@ -28,7 +28,7 @@ end before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) end describe '#address_suggestions' do diff --git a/spec/models/async_transaction/va_profile/base_spec.rb b/spec/models/async_transaction/va_profile/base_spec.rb index 195acc9803f..76117bb5370 100644 --- a/spec/models/async_transaction/va_profile/base_spec.rb +++ b/spec/models/async_transaction/va_profile/base_spec.rb @@ -6,7 +6,6 @@ describe 'contact information v1', :skip_va_profile_user do before do allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(false) end describe '.find_transaction!' do @@ -288,7 +287,7 @@ def last_transactions_by_class describe 'contact information v2' do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) end describe '.refresh_transaction_status() v2', :skip_vet360 do diff --git a/spec/models/async_transaction/vet360/base_spec.rb b/spec/models/async_transaction/vet360/base_spec.rb index 6c30c86659f..06742732d15 100644 --- a/spec/models/async_transaction/vet360/base_spec.rb +++ b/spec/models/async_transaction/vet360/base_spec.rb @@ -6,7 +6,6 @@ describe 'contact information v1', :skip_va_profile_user do before do allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(false) end describe '.refresh_transaction_status()' do @@ -136,8 +135,7 @@ let(:service) { VAProfile::ContactInformation::Service.new(user) } before do - Flipper.disable(:va_v3_contact_information_service) - Flipper.disable(:remove_pciu) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) # vet360_id appears in the API request URI so we need it to match the cassette allow_any_instance_of(MPIData).to receive(:response_from_redis_or_service).and_return( create(:find_profile_response, profile: build(:mpi_profile, vet360_id: '1')) @@ -173,7 +171,6 @@ describe 'contact information v2' do before do allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) end describe '.refresh_transaction_status() v2', :skip_vet360 do diff --git a/spec/models/form_profile/mdot_spec.rb b/spec/models/form_profile/mdot_spec.rb index daad46fc264..2e7b01ad764 100644 --- a/spec/models/form_profile/mdot_spec.rb +++ b/spec/models/form_profile/mdot_spec.rb @@ -16,6 +16,10 @@ let(:user) { build(:user, :loa3, user_details) } describe '#prefill_form' do + before do + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) + end + it 'prefills the MDOT form' do VCR.insert_cassette( 'mdot/get_supplies_200', diff --git a/spec/models/form_profile_spec.rb b/spec/models/form_profile_spec.rb index 726ed1772c0..a55c7de67b3 100644 --- a/spec/models/form_profile_spec.rb +++ b/spec/models/form_profile_spec.rb @@ -15,8 +15,7 @@ described_class.instance_variable_set(:@mappings, nil) allow(Flipper).to receive(:enabled?).and_call_original allow(Flipper).to receive(:enabled?).with(:remove_pciu, anything).and_return(false) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, anything) - .and_return(false) + allow(Flipper).to receive(:enabled?).with(:disability_526_max_cfi_service_switch, anything).and_return(false) end let(:street_check) { build(:street_check) } @@ -1314,129 +1313,79 @@ def expect_prefilled(form_id) FormProfiles::VA1010ezr.new(user:, form_id: 'f') end - context 'when the ee service is down' do - let(:v10_10_ezr_expected) do - { - 'veteranFullName' => { - 'first' => user.first_name&.capitalize, - 'middle' => user.middle_name&.capitalize, - 'last' => user.last_name&.capitalize, - 'suffix' => user.suffix - }, - 'veteranSocialSecurityNumber' => user.ssn, - 'gender' => user.gender, - 'veteranDateOfBirth' => user.birth_date, - 'homePhone' => us_phone, - 'veteranAddress' => { - 'street' => street_check[:street], - 'street2' => street_check[:street2], - 'city' => user.address[:city], - 'state' => user.address[:state], - 'country' => user.address[:country], - 'postal_code' => user.address[:postal_code][0..4] - }, - 'email' => user.pciu_email - } - end - - it 'prefills the rest of the data and logs exception to sentry' do - expect_any_instance_of(FormProfiles::VA1010ezr).to receive(:log_exception_to_sentry).with( - instance_of(VCR::Errors::UnhandledHTTPRequestError) - ) - expect_prefilled('10-10EZR') - end + let(:ezr_prefilled_data_without_ee_data) do + { + 'veteranFullName' => { + 'first' => user.first_name&.capitalize, + 'middle' => user.middle_name&.capitalize, + 'last' => user.last_name&.capitalize, + 'suffix' => user.suffix + }, + 'veteranSocialSecurityNumber' => user.ssn, + 'gender' => user.gender, + 'veteranDateOfBirth' => user.birth_date, + 'homePhone' => us_phone, + 'veteranAddress' => { + 'street' => street_check[:street], + 'street2' => street_check[:street2], + 'city' => user.address[:city], + 'state' => user.address[:state], + 'country' => user.address[:country], + 'postal_code' => user.address[:postal_code][0..4] + }, + 'email' => user.pciu_email + } end - context 'with a user with dependents', run_at: 'Tue, 31 Oct 2023 12:04:33 GMT' do - let(:v10_10_ezr_expected) do - { - 'veteranFullName' => { - 'first' => user.first_name&.capitalize, - 'middle' => user.middle_name&.capitalize, - 'last' => user.last_name&.capitalize, - 'suffix' => user.suffix - }, - 'veteranSocialSecurityNumber' => user.ssn, - 'gender' => user.gender, - 'veteranDateOfBirth' => user.birth_date, - 'homePhone' => us_phone, - 'veteranAddress' => { - 'street' => street_check[:street], - 'street2' => street_check[:street2], - 'city' => user.address[:city], - 'state' => user.address[:state], - 'country' => user.address[:country], - 'postal_code' => user.address[:postal_code][0..4] - }, - 'email' => user.pciu_email, - 'spouseSocialSecurityNumber' => '435345344', - 'spouseDateOfBirth' => '1950-02-17', - 'dateOfMarriage' => '2000-10-15', - 'cohabitedLastYear' => true, - 'maritalStatus' => 'Married', - 'isMedicaidEligible' => false, - 'isEnrolledMedicarePartA' => false, - 'spouseFullName' => { - 'first' => 'VSDV', - 'last' => 'SDVSDV' - } - } - end - + context 'with a user with financial data, insurance data, and dependents' do before do allow(user).to receive(:icn).and_return('1012829228V424035') + allow(Flipper).to receive(:enabled?).and_call_original + allow(Flipper).to receive(:enabled?).with(:remove_pciu, anything).and_return(false) end - it 'returns a prefilled 10-10EZR form' do - VCR.use_cassette( - 'hca/ee/dependents', - VCR::MATCH_EVERYTHING.merge(erb: true) - ) do - expect_prefilled('10-10EZR') + context "when the 'ezr_form_prefill_with_providers_and_dependents' send failure email flipper is enabled" do + before do + allow(Flipper).to receive(:enabled?).with(:ezr_form_prefill_with_providers_and_dependents).and_return(true) end - end - end - context 'with a user with insurance data', run_at: 'Tue, 24 Oct 2023 17:27:12 GMT' do - let(:v10_10_ezr_expected) do - { - 'veteranFullName' => { - 'first' => user.first_name&.capitalize, - 'middle' => user.middle_name&.capitalize, - 'last' => user.last_name&.capitalize, - 'suffix' => user.suffix - }, - 'veteranSocialSecurityNumber' => user.ssn, - 'gender' => user.gender, - 'veteranDateOfBirth' => user.birth_date, - 'homePhone' => us_phone, - 'veteranAddress' => { - 'street' => street_check[:street], - 'street2' => street_check[:street2], - 'city' => user.address[:city], - 'state' => user.address[:state], - 'country' => user.address[:country], - 'postal_code' => user.address[:postal_code][0..4] - }, - 'email' => user.pciu_email, - 'maritalStatus' => 'Married', - 'isMedicaidEligible' => true, - 'isEnrolledMedicarePartA' => true, - 'medicarePartAEffectiveDate' => '1999-10-16', - 'medicareClaimNumber' => '873462432' - } - end + let(:v10_10_ezr_expected) do + JSON.parse( + File.read('spec/fixtures/form1010_ezr/veteran_data.json') + ).merge(ezr_prefilled_data_without_ee_data) + end - before do - allow(user).to receive(:icn).and_return('1013032368V065534') + it 'returns a prefilled 10-10EZR form', run_at: 'Thu, 27 Feb 2025 01:10:06 GMT' do + VCR.use_cassette( + 'form1010_ezr/lookup_user_with_ezr_prefill_data', + match_requests_on: %i[method uri body], erb: true + ) do + expect_prefilled('10-10EZR') + end + end end - it 'returns a prefilled 10-10EZR form' do - VCR.use_cassette( - 'hca/ee/lookup_user_2023', - VCR::MATCH_EVERYTHING.merge(erb: true) - ) do - expect_prefilled('10-10EZR') + context "when the 'ezr_form_prefill_with_providers_and_dependents' send failure email flipper is disabled" do + before do + allow(Flipper).to receive(:enabled?).with( + :ezr_form_prefill_with_providers_and_dependents + ).and_return(false) + end + + let(:v10_10_ezr_expected) do + JSON.parse( + File.read('spec/fixtures/form1010_ezr/veteran_data.json') + ).merge(ezr_prefilled_data_without_ee_data).except!('providers', 'dependents') + end + + it 'returns a prefilled 10-10EZR form that does not include providers and dependents', + run_at: 'Thu, 27 Feb 2025 01:10:06 GMT' do + VCR.use_cassette( + 'form1010_ezr/lookup_user_with_ezr_prefill_data', + match_requests_on: %i[method uri body], erb: true + ) do + expect_prefilled('10-10EZR') + end end end end @@ -1866,8 +1815,6 @@ def expect_prefilled(form_id) end it 'returns prefilled 21-526EZ' do - allow(Flipper).to receive(:enabled?).with(:disability_compensation_remove_pciu, - anything).and_return(false) VCR.use_cassette('evss/pciu_address/address_domestic') do VCR.use_cassette('lighthouse/veteran_verification/disability_rating/200_response') do VCR.use_cassette('lighthouse/direct_deposit/show/200_valid_new_icn') do @@ -1894,9 +1841,10 @@ def expect_prefilled(form_id) VAProfile::Configuration::SETTINGS.prefill = true # TODO: - is this missing in the failures above? expected_veteran_info = v21_526_ez_expected['veteran'] expected_veteran_info['emailAddress'] = - VAProfileRedis::ContactInformation.for_user(user).email.email_address + VAProfileRedis::V2::ContactInformation.for_user(user).email.email_address expected_veteran_info['primaryPhone'] = '3035551234' allow_any_instance_of(Auth::ClientCredentials::Service).to receive(:get_token).and_return('fake_token') + allow(Flipper).to receive(:enabled?).with(:remove_pciu, anything).and_return(true) end after do @@ -1953,8 +1901,6 @@ def expect_prefilled(form_id) end before do - allow_any_instance_of(FormProfiles::VA21p530ez) - .to receive(:initialize_contact_information).and_return(FormContactInformation.new) allow_any_instance_of(Burials::FormProfiles::VA21p530ez) .to receive(:initialize_contact_information).and_return(FormContactInformation.new) end diff --git a/spec/models/form_profile_v2_spec.rb b/spec/models/form_profile_v2_spec.rb index 1bd77e8850d..662a45c9db8 100644 --- a/spec/models/form_profile_v2_spec.rb +++ b/spec/models/form_profile_v2_spec.rb @@ -11,8 +11,7 @@ before do allow(Flipper).to receive(:enabled?).and_call_original allow(Flipper).to receive(:enabled?).with(:remove_pciu, anything).and_return(true) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, anything).and_return(true) - allow(Flipper).to receive(:enabled?).with(:disability_compensation_remove_pciu, anything).and_return(true) + allow(Flipper).to receive(:enabled?).with(:disability_526_max_cfi_service_switch, anything).and_return(false) described_class.instance_variable_set(:@mappings, nil) end @@ -1095,24 +1094,25 @@ def expect_prefilled(form_id) let(:form_profile) do FormProfiles::VA1010ezr.new(user:, form_id: 'f') end + let(:ezr_prefilled_data_without_ee_data) do + { + 'veteranFullName' => { + 'first' => user.first_name&.capitalize, + 'middle' => user.middle_name&.capitalize, + 'last' => user.last_name&.capitalize, + 'suffix' => user.suffix + }, + 'veteranSocialSecurityNumber' => user.ssn, + 'gender' => user.gender, + 'veteranDateOfBirth' => user.birth_date, + 'homePhone' => us_phone, + 'veteranAddress' => address, + 'email' => user.va_profile_email + } + end context 'when the ee service is down' do - let(:v10_10_ezr_expected) do - { - 'veteranFullName' => { - 'first' => user.first_name&.capitalize, - 'middle' => user.middle_name&.capitalize, - 'last' => user.last_name&.capitalize, - 'suffix' => user.suffix - }, - 'veteranSocialSecurityNumber' => user.ssn, - 'gender' => user.gender, - 'veteranDateOfBirth' => user.birth_date, - 'homePhone' => us_phone, - 'veteranAddress' => address, - 'email' => user.va_profile_email - } - end + let(:v10_10_ezr_expected) { ezr_prefilled_data_without_ee_data.merge('nonPrefill' => {}) } it 'prefills the rest of the data and logs exception to sentry' do expect_any_instance_of(FormProfiles::VA1010ezr).to receive(:log_exception_to_sentry).with( @@ -1122,82 +1122,56 @@ def expect_prefilled(form_id) end end - context 'with a user with dependents', run_at: 'Tue, 31 Oct 2023 12:04:33 GMT' do - let(:v10_10_ezr_expected) do - { - 'veteranFullName' => { - 'first' => user.first_name&.capitalize, - 'middle' => user.middle_name&.capitalize, - 'last' => user.last_name&.capitalize, - 'suffix' => user.suffix - }, - 'veteranSocialSecurityNumber' => user.ssn, - 'gender' => user.gender, - 'veteranDateOfBirth' => user.birth_date, - 'homePhone' => us_phone, - 'veteranAddress' => address, - 'email' => user.va_profile_email, - 'spouseSocialSecurityNumber' => '435345344', - 'spouseDateOfBirth' => '1950-02-17', - 'dateOfMarriage' => '2000-10-15', - 'cohabitedLastYear' => true, - 'maritalStatus' => 'Married', - 'isMedicaidEligible' => false, - 'isEnrolledMedicarePartA' => false, - 'spouseFullName' => { - 'first' => 'VSDV', - 'last' => 'SDVSDV' - } - } - end - + context 'with a user with financial data, insurance data, and dependents', + run_at: 'Thu, 27 Feb 2025 01:10:06 GMT' do before do allow(user).to receive(:icn).and_return('1012829228V424035') + allow(Flipper).to receive(:enabled?).and_call_original + allow(Flipper).to receive(:enabled?).with(:remove_pciu, anything).and_return(true) end - it 'returns a prefilled 10-10EZR form' do - VCR.use_cassette( - 'hca/ee/dependents', - VCR::MATCH_EVERYTHING.merge(erb: true) - ) do - expect_prefilled('10-10EZR') + context "when the 'ezr_form_prefill_with_providers_and_dependents' flipper is enabled" do + before do + allow(Flipper).to receive(:enabled?).with(:ezr_form_prefill_with_providers_and_dependents).and_return(true) + end + + let(:v10_10_ezr_expected) do + JSON.parse( + File.read('spec/fixtures/form1010_ezr/veteran_data.json') + ).merge(ezr_prefilled_data_without_ee_data) end - end - end - context 'with a user with insurance data', run_at: 'Tue, 24 Oct 2023 17:27:12 GMT' do - let(:v10_10_ezr_expected) do - { - 'veteranFullName' => { - 'first' => user.first_name&.capitalize, - 'middle' => user.middle_name&.capitalize, - 'last' => user.last_name&.capitalize, - 'suffix' => user.suffix - }, - 'veteranSocialSecurityNumber' => user.ssn, - 'gender' => user.gender, - 'veteranDateOfBirth' => user.birth_date, - 'homePhone' => us_phone, - 'veteranAddress' => address, - 'email' => user.va_profile_email, - 'maritalStatus' => 'Married', - 'isMedicaidEligible' => true, - 'isEnrolledMedicarePartA' => true, - 'medicarePartAEffectiveDate' => '1999-10-16', - 'medicareClaimNumber' => '873462432' - } + it 'returns a prefilled 10-10EZR form', run_at: 'Thu, 27 Feb 2025 01:10:06 GMT' do + VCR.use_cassette( + 'form1010_ezr/lookup_user_with_ezr_prefill_data', + match_requests_on: %i[method uri body], erb: true + ) do + expect_prefilled('10-10EZR') + end + end end - before do - allow(user).to receive(:icn).and_return('1013032368V065534') - end + context "when the 'ezr_form_prefill_with_providers_and_dependents' flipper is disabled" do + before do + allow(Flipper).to receive(:enabled?).with( + :ezr_form_prefill_with_providers_and_dependents + ).and_return(false) + end + + let(:v10_10_ezr_expected) do + JSON.parse( + File.read('spec/fixtures/form1010_ezr/veteran_data.json') + ).merge(ezr_prefilled_data_without_ee_data).except!('providers', 'dependents') + end - it 'returns a prefilled 10-10EZR form' do - VCR.use_cassette( - 'hca/ee/lookup_user_2023', - VCR::MATCH_EVERYTHING.merge(erb: true) - ) do - expect_prefilled('10-10EZR') + it 'returns a prefilled 10-10EZR form that does not include providers and dependents', + run_at: 'Thu, 27 Feb 2025 01:10:06 GMT' do + VCR.use_cassette( + 'form1010_ezr/lookup_user_with_ezr_prefill_data', + match_requests_on: %i[method uri body], erb: true + ) do + expect_prefilled('10-10EZR') + end end end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 50014c63ac6..9b51b26ecae 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -84,8 +84,6 @@ context 'when Flipper remove_pciu is disabled' do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, - instance_of(User)).and_return(false) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end @@ -100,8 +98,6 @@ context 'when Flipper remove_pciu is enabled' do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, - instance_of(User)).and_return(true) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) end diff --git a/spec/models/va_profile_redis/cache_spec.rb b/spec/models/va_profile_redis/cache_spec.rb index d8fee5d998f..9d901774d3c 100644 --- a/spec/models/va_profile_redis/cache_spec.rb +++ b/spec/models/va_profile_redis/cache_spec.rb @@ -7,7 +7,7 @@ describe 'ContactInformationServiceV1' do before do - Flipper.disable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) allow(user).to receive(:vet360_id).and_return('1') allow(VAProfile::Configuration::SETTINGS.contact_information).to receive(:cache_enabled).and_return(true) end diff --git a/spec/models/va_profile_redis/contact_information_spec.rb b/spec/models/va_profile_redis/contact_information_spec.rb index 526e80f5ae9..22b2f509b2f 100644 --- a/spec/models/va_profile_redis/contact_information_spec.rb +++ b/spec/models/va_profile_redis/contact_information_spec.rb @@ -4,7 +4,6 @@ describe VAProfileRedis::ContactInformation do let(:user) { build(:user, :loa3) } - Flipper.disable(:va_v3_contact_information_service) let(:person_response) do raw_response = OpenStruct.new(status: 200, body: { 'bio' => person.to_hash }) @@ -28,6 +27,7 @@ end before do + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) allow(VAProfile::Models::Person).to receive(:build_from).and_return(person) end diff --git a/spec/models/va_profile_redis/v2/cache_spec.rb b/spec/models/va_profile_redis/v2/cache_spec.rb index ace77a6fdd8..88af4125220 100644 --- a/spec/models/va_profile_redis/v2/cache_spec.rb +++ b/spec/models/va_profile_redis/v2/cache_spec.rb @@ -7,7 +7,7 @@ describe 'ContactInformationServiceV2' do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) allow(VAProfile::Configuration::SETTINGS.contact_information).to receive(:cache_enabled).and_return(true) end diff --git a/spec/models/va_profile_redis/v2/contact_information_spec.rb b/spec/models/va_profile_redis/v2/contact_information_spec.rb index 47a19256e0b..4e52345f72e 100644 --- a/spec/models/va_profile_redis/v2/contact_information_spec.rb +++ b/spec/models/va_profile_redis/v2/contact_information_spec.rb @@ -22,7 +22,7 @@ end before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) allow(VAProfile::Models::V3::Person).to receive(:build_from).and_return(person) end diff --git a/spec/rakelib/vet360_spec.rb b/spec/rakelib/vet360_spec.rb index fdeb26233a8..51cecc9faa0 100644 --- a/spec/rakelib/vet360_spec.rb +++ b/spec/rakelib/vet360_spec.rb @@ -12,7 +12,7 @@ before do # Prevents cross-pollination between tests ENV['VET360_RAKE_DATA'] = nil - Flipper.disable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(false) end service = VAProfile::ContactInformation::Service diff --git a/spec/requests/swagger_spec.rb b/spec/requests/swagger_spec.rb index 542295769d6..8d10469d88a 100644 --- a/spec/requests/swagger_spec.rb +++ b/spec/requests/swagger_spec.rb @@ -431,7 +431,7 @@ ) do expect(subject).to validate( :post, - '/v0/burial_claims', + '/burials/v0/claims', 200, '_data' => { 'burial_claim' => { @@ -442,7 +442,7 @@ expect(subject).to validate( :post, - '/v0/burial_claims', + '/burials/v0/claims', 422, '_data' => { 'burial_claim' => { @@ -2712,8 +2712,6 @@ describe 'profile/status', :skip_va_profile_user do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, - instance_of(User)).and_return(false) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) # vet360_id appears in the API request URI so we need it to match the cassette @@ -2803,16 +2801,10 @@ describe 'contact infromation v2', :skip_vet360 do before do - Flipper.enable(:va_v3_contact_information_service) - Flipper.enable(:remove_pciu) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) allow(VAProfile::Configuration::SETTINGS.contact_information).to receive(:cache_enabled).and_return(true) end - after do - Flipper.disable(:va_v3_contact_information_service) - Flipper.disable(:remove_pciu) - end - describe 'profiles v2', :initiate_vaprofile, :skip_vet360 do let(:mhv_user) { build(:user, :loa3) } @@ -2821,6 +2813,7 @@ end it 'supports getting service history data' do + allow(Flipper).to receive(:enabled?).with(:profile_show_military_academy_attendance, nil).and_return(false) expect(subject).to validate(:get, '/v0/profile/service_history', 401) VCR.use_cassette('va_profile/military_personnel/post_read_service_history_200') do expect(subject).to validate(:get, '/v0/profile/service_history', 200, headers) @@ -2994,6 +2987,7 @@ end it 'supports the address validation api' do + allow(Flipper).to receive(:enabled?).with(:remove_pciu).and_return(true) address = build(:va_profile_v3_validation_address, :multiple_matches) VCR.use_cassette( 'va_profile/address_validation/validate_match', @@ -3465,6 +3459,7 @@ before do allow(Flipper).to receive(:enabled?).with(:va_dependents_v2).and_return(false) allow(Flipper).to receive(:enabled?).with(:va_dependents_submit674, instance_of(User)).and_return(false) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end let!(:user) { build(:user, ssn: '796043735') } @@ -3510,6 +3505,7 @@ before do allow(Flipper).to receive(:enabled?).with(:va_dependents_v2).and_return(true) allow(Flipper).to receive(:enabled?).with(:va_dependents_submit674, instance_of(User)).and_return(false) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end let!(:user) { build(:user, ssn: '796043735') } @@ -3994,6 +3990,7 @@ subject.untested_mappings.delete('/v0/coe/download_coe') subject.untested_mappings.delete('/v0/coe/document_download/{id}') subject.untested_mappings.delete('/v0/caregivers_assistance_claims/download_pdf') + subject.untested_mappings.delete('/v0/health_care_applications/download_pdf') # SiS methods that involve forms & redirects subject.untested_mappings.delete('/v0/sign_in/authorize') diff --git a/spec/requests/v0/disability_compensation_in_progress_forms_controller_spec.rb b/spec/requests/v0/disability_compensation_in_progress_forms_controller_spec.rb index da0569f942a..7fbab0497c5 100644 --- a/spec/requests/v0/disability_compensation_in_progress_forms_controller_spec.rb +++ b/spec/requests/v0/disability_compensation_in_progress_forms_controller_spec.rb @@ -16,7 +16,6 @@ before do allow(Flipper).to receive(:enabled?).with(:in_progress_form_custom_expiration) allow(Flipper).to receive(:enabled?).with(:disability_compensation_sync_modern_0781_flow, instance_of(User)) - allow(Flipper).to receive(:enabled?).with(:disability_compensation_remove_pciu, instance_of(User)) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)) allow(Flipper).to receive(:enabled?).with(:intent_to_file_lighthouse_enabled, instance_of(User)) end diff --git a/spec/requests/v0/health_care_applications_spec.rb b/spec/requests/v0/health_care_applications_spec.rb index 99941d15aac..9bc6e31cd46 100644 --- a/spec/requests/v0/health_care_applications_spec.rb +++ b/spec/requests/v0/health_care_applications_spec.rb @@ -11,6 +11,14 @@ ) end + let(:headers) do + { + 'ACCEPT' => 'application/json', + 'CONTENT_TYPE' => 'application/json', + 'HTTP_X_KEY_INFLECTION' => 'camel' + } + end + describe 'GET rating_info' do let(:current_user) { build(:ch33_dd_user) } @@ -420,7 +428,7 @@ post( v0_health_care_applications_path, params: params.to_json, - headers: { 'CONTENT_TYPE' => 'application/json', 'HTTP_X_KEY_INFLECTION' => 'camel' } + headers: ) end @@ -720,4 +728,93 @@ def self.expect_async_submit end end end + + describe 'POST /v0/health_care_applications/download_pdf' do + subject do + post('/v0/health_care_applications/download_pdf', params: body, headers:) + end + + let(:endpoint) { '/v0/health_care_applications/download_pdf' } + let(:response_pdf) { Rails.root.join 'tmp', 'pdfs', '10-10EZ_from_response.pdf' } + let(:expected_pdf) { Rails.root.join 'spec', 'fixtures', 'pdf_fill', '10-10EZ', 'unsigned', 'simple.pdf' } + + let(:form_data) { get_fixture('pdf_fill/10-10EZ/simple').to_json } + let(:health_care_application) { build(:health_care_application, form: form_data) } + let(:body) { { form: form_data, asyncCompatible: true }.to_json } + + after do + FileUtils.rm_f(response_pdf) + end + + it 'returns a completed PDF' do + expect(HealthCareApplication).to receive(:new) + .with(hash_including('form' => form_data)) + .and_return(health_care_application) + + expect(SecureRandom).to receive(:uuid).and_return('saved-claim-guid') + expect(SecureRandom).to receive(:uuid).and_return('file-name-uuid') + + subject + + expect(response).to have_http_status(:ok) + + veteran_full_name = health_care_application.parsed_form['veteranFullName'] + expected_filename = "10-10EZ_#{veteran_full_name['first']}_#{veteran_full_name['last']}.pdf" + expect(response.headers['Content-Disposition']).to include("filename=\"#{expected_filename}\"") + + # download response content (the pdf) to disk + File.open(response_pdf, 'wb+') { |f| f.write(response.body) } + + # compare it with the pdf fixture + expect( + pdfs_fields_match?(response_pdf, expected_pdf) + ).to be(true) + + # ensure that the tmp file was deleted + expect( + File.exist?('tmp/pdfs/10-10EZ_file-name-uuid.pdf') + ).to be(false) + end + + it 'ensures the tmp file is deleted when send_data fails' do + expect(HealthCareApplication).to receive(:new) + .with(hash_including('form' => form_data)) + .and_return(health_care_application) + + allow_any_instance_of(ApplicationController).to receive(:send_data).and_raise(StandardError, 'send_data failed') + + expect(SecureRandom).to receive(:uuid).and_return('saved-claim-guid') + expect(SecureRandom).to receive(:uuid).and_return('file-name-uuid') + + subject + + expect(response).to have_http_status(:internal_server_error) + expect( + File.exist?('tmp/pdfs/10-10EZ_file-name-uuid.pdf') + ).to be(false) + end + + it 'ensures the tmp file is deleted when fill_form fails' do + expect(HealthCareApplication).to receive(:new) + .with(hash_including('form' => form_data)) + .and_return(health_care_application) + + allow(PdfFill::Filler).to receive(:fill_form).and_raise(StandardError, 'error filling form') + + expect(SecureRandom).to receive(:uuid).and_return('saved-claim-guid') + expect(SecureRandom).to receive(:uuid).and_return('file-name-uuid') + + expect_any_instance_of(ApplicationController).not_to receive(:send_data) + + expect(File).not_to receive(:delete) + + subject + + expect(response).to have_http_status(:internal_server_error) + + expect( + File.exist?('tmp/pdfs/10-10EZ_file-name-uuid.pdf') + ).to be(false) + end + end end diff --git a/spec/requests/v0/in_progress_forms_controller_spec.rb b/spec/requests/v0/in_progress_forms_controller_spec.rb index e7cf33557c3..9d5455487a6 100644 --- a/spec/requests/v0/in_progress_forms_controller_spec.rb +++ b/spec/requests/v0/in_progress_forms_controller_spec.rb @@ -13,8 +13,8 @@ before do sign_in_as(user) - Flipper.disable(:va_v3_contact_information_service) - Flipper.disable(:remove_pciu) + allow(Flipper).to receive(:enabled?).with(:in_progress_form_custom_expiration).and_return(false) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) enabled_forms = FormProfile.prefill_enabled_forms << 'FAKEFORM' allow(FormProfile).to receive(:prefill_enabled_forms).and_return(enabled_forms) allow(FormProfile).to receive(:load_form_mapping).with('FAKEFORM').and_return( @@ -133,10 +133,6 @@ end describe '#show' do - before do - Flipper.disable('remove_pciu_2') - end - let(:user) { build(:user, :loa3, address: build(:mpi_profile_address)) } let!(:in_progress_form) { create(:in_progress_form, :with_nested_metadata, user_uuid: user.uuid) } @@ -271,6 +267,12 @@ describe '#update' do let(:user) { loa3_user } + before do + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) + allow(Flipper).to receive(:enabled?).with(:intent_to_file_lighthouse_enabled, + instance_of(User)).and_return(true) + end + context 'with a new form' do let(:new_form) { create(:in_progress_form, user_uuid: user.uuid) } @@ -337,7 +339,7 @@ it "can't have non-hash formData" do put v0_in_progress_form_url(new_form.form_id), - params: { form_data: 'Hello!' }.to_json, + params: { form_data: '' }.to_json, headers: { 'CONTENT_TYPE' => 'application/json' } expect(response).to have_http_status(:error) end diff --git a/spec/requests/v0/profile/addresses_spec.rb b/spec/requests/v0/profile/addresses_spec.rb index 48e7e6c8750..ae5df650308 100644 --- a/spec/requests/v0/profile/addresses_spec.rb +++ b/spec/requests/v0/profile/addresses_spec.rb @@ -21,7 +21,7 @@ describe 'POST /v0/profile/addresses/create_or_update' do before do - Flipper.disable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end let(:address) { build(:va_profile_address, vet360_id: user.vet360_id) } @@ -38,7 +38,7 @@ describe 'POST /v0/profile/addresses' do before do - Flipper.disable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end let(:address) { build(:va_profile_address, vet360_id: user.vet360_id) } @@ -164,7 +164,7 @@ describe 'PUT /v0/profile/addresses' do before do - Flipper.disable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end let(:address) { build(:va_profile_address, vet360_id: user.vet360_id) } @@ -270,7 +270,7 @@ describe 'DELETE /v0/profile/addresses' do before do - Flipper.disable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end context 'when the method is DELETE' do @@ -331,10 +331,10 @@ # describe 'POST /v0/profile/addresses/create_or_update' do # before do - # Flipper.enable(:va_v3_contact_information_service) + # Flipper.enable(:remove_pciu) # end # after do - # Flipper.disable(:va_v3_contact_information_service) + # allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) # end # let(:address) { build(:va_profile_v3_address, vet360_id: user.vet360_id) } @@ -350,7 +350,7 @@ describe 'contact information v2' do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) end diff --git a/spec/requests/v0/profile/email_addresses_spec.rb b/spec/requests/v0/profile/email_addresses_spec.rb index 4466c8dc5e2..6a38286b25c 100644 --- a/spec/requests/v0/profile/email_addresses_spec.rb +++ b/spec/requests/v0/profile/email_addresses_spec.rb @@ -11,7 +11,6 @@ describe 'ContactInformationV1', :skip_va_profile_user do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(false) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) Timecop.freeze(Time.zone.local(2018, 6, 6, 15, 35, 55)) allow(VAProfile::Configuration::SETTINGS.contact_information).to receive(:cache_enabled).and_return(true) @@ -274,7 +273,6 @@ let(:contact_info) { VAProfileRedis::V2::ContactInformation.for_user(user) } before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) allow(VAProfile::Configuration::SETTINGS.contact_information).to receive(:cache_enabled).and_return(true) user.vet360_contact_info diff --git a/spec/requests/v0/profile/permissions_spec.rb b/spec/requests/v0/profile/permissions_spec.rb index 3815854327f..5dc408146fd 100644 --- a/spec/requests/v0/profile/permissions_spec.rb +++ b/spec/requests/v0/profile/permissions_spec.rb @@ -17,7 +17,7 @@ let(:frozen_time) { Time.zone.local(2019, 11, 5, 16, 49, 18) } before do - Flipper.disable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) Timecop.freeze(frozen_time) sign_in_as(user) allow(Settings).to receive(:virtual_hosts).and_return('www.example.com') diff --git a/spec/requests/v0/profile/persons_spec.rb b/spec/requests/v0/profile/persons_spec.rb index 5bc26b9bf66..56c3e235ba5 100644 --- a/spec/requests/v0/profile/persons_spec.rb +++ b/spec/requests/v0/profile/persons_spec.rb @@ -13,7 +13,7 @@ before do Timecop.freeze('2018-04-09T17:52:03Z') sign_in_as(user) - Flipper.disable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) allow_any_instance_of(User).to receive(:vet360_id).and_return(nil) end @@ -90,7 +90,7 @@ before do Timecop.freeze('2018-04-09T17:52:03Z') sign_in_as(user) - Flipper.disable(:va_v3_contact_information_service) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end context 'with an ok response' do @@ -152,7 +152,7 @@ before do Timecop.freeze('2024-09-16T16:09:37Z') sign_in_as(user) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) end describe 'POST /v0/profile/initialize_vet360_id v2' do diff --git a/spec/requests/v0/profile/telephones_spec.rb b/spec/requests/v0/profile/telephones_spec.rb index 066c56ff8f9..35ca96db89f 100644 --- a/spec/requests/v0/profile/telephones_spec.rb +++ b/spec/requests/v0/profile/telephones_spec.rb @@ -22,7 +22,7 @@ describe 'POST /v0/profile/telephones/create_or_update' do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end @@ -40,7 +40,7 @@ describe 'POST /v0/profile/telephones' do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end @@ -76,7 +76,7 @@ context 'with a 400 response' do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end @@ -138,7 +138,7 @@ describe 'PUT /v0/profile/telephones' do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) telephone.id = 42 end @@ -273,7 +273,6 @@ before do sign_in_as(user) - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) end diff --git a/spec/requests/v0/profile/transactions_spec.rb b/spec/requests/v0/profile/transactions_spec.rb index 3cbbe1ecfda..69d4046a598 100644 --- a/spec/requests/v0/profile/transactions_spec.rb +++ b/spec/requests/v0/profile/transactions_spec.rb @@ -9,7 +9,6 @@ describe 'contact information v1', :skip_va_profile_user do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(false) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) allow(VAProfile::Configuration::SETTINGS.contact_information).to receive(:cache_enabled).and_return(true) user.vet360_contact_info @@ -169,10 +168,9 @@ describe 'contact information v2', :skip_vet360 do before do - allow(Flipper).to receive(:enabled?).with(:va_v3_contact_information_service, instance_of(User)).and_return(true) allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(true) allow(VAProfile::Configuration::SETTINGS.contact_information).to receive(:cache_enabled).and_return(true) - user.vaprofile_contact_info + user.vet360_contact_info sign_in_as(user) end diff --git a/spec/services/bgs/dependent_service_spec.rb b/spec/services/bgs/dependent_service_spec.rb index 7a3ef130a2d..5c72fbc885a 100644 --- a/spec/services/bgs/dependent_service_spec.rb +++ b/spec/services/bgs/dependent_service_spec.rb @@ -31,6 +31,7 @@ allow(claim).to receive(:id).and_return('1234') allow_any_instance_of(KmsEncrypted::Box).to receive(:encrypt).and_return(encrypted_vet_info) allow(Flipper).to receive(:enabled?).with(:va_dependents_submit674, an_instance_of(User)).and_return(true) + allow(Flipper).to receive(:enabled?).with(:remove_pciu, instance_of(User)).and_return(false) end describe '#submit_686c_form' do diff --git a/spec/sidekiq/education_form/create_daily_spool_files_spec.rb b/spec/sidekiq/education_form/create_daily_spool_files_spec.rb index e9e028ddc38..3de182b6d53 100644 --- a/spec/sidekiq/education_form/create_daily_spool_files_spec.rb +++ b/spec/sidekiq/education_form/create_daily_spool_files_spec.rb @@ -148,7 +148,7 @@ context 'with records in production', run_at: '2016-09-16 03:00:00 EDT' do before do - Settings.hostname = 'api.va.gov' # Mock how this is set in production + allow(Settings).to receive(:hostname).and_return('api.va.gov') application_1606.saved_claim.form = {}.to_json create(:va1990_western_region) create(:va1995_full_form) @@ -156,10 +156,6 @@ ActionMailer::Base.deliveries.clear end - after do - Settings.hostname = nil - end - it 'does not process the valid messages' do expect(Flipper).to receive(:enabled?).with(any_args).and_return(false).at_least(:once) expect { subject.perform }.to change { EducationBenefitsClaim.unprocessed.count }.from(4).to(0) @@ -311,7 +307,7 @@ it 'writes files out over sftp' do # we're only pushing spool files on production, b/c of issues with staging data getting into TIMS at RPO's allow(Rails.env).to receive(:production?).and_return(true) - Settings.hostname = 'api.va.gov' + allow(Settings).to receive(:hostname).and_return('api.va.gov') expect(EducationBenefitsClaim.unprocessed).not_to be_empty expect(Flipper).to receive(:enabled?).with(any_args).and_return(false).at_least(:once) diff --git a/spec/sidekiq/form1095/delete_old1095_bs_job_spec.rb b/spec/sidekiq/form1095/delete_old1095_bs_job_spec.rb new file mode 100644 index 00000000000..63be7be9291 --- /dev/null +++ b/spec/sidekiq/form1095/delete_old1095_bs_job_spec.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Form1095::DeleteOld1095BsJob, type: :job do + describe 'perform' do + let!(:current_tax_year_form) { create(:form1095_b, tax_year: Form1095B.current_tax_year) } + let!(:current_year_form) { create(:form1095_b, tax_year: Form1095B.current_tax_year + 1) } + + it 'deletes all 1095b forms prior to the current tax year' do + create(:form1095_b, tax_year: Form1095B.current_tax_year - 5) + create(:form1095_b, tax_year: Form1095B.current_tax_year - 3) + create(:form1095_b, tax_year: Form1095B.current_tax_year - 1) + + expect(Rails.logger).to receive(:info).with('Begin deleting 3 old Form1095B files') + expect(Rails.logger).to receive(:info).with(/Finished deleting old Form1095B files in \d+\.\d+ seconds/) + + subject.perform + + expect(Form1095B.pluck(:id)).to contain_exactly(current_tax_year_form.id, current_year_form.id) + end + + it 'uses an optional limit parameter' do + oldest_form = create(:form1095_b, tax_year: Form1095B.current_tax_year - 5) + older_form = create(:form1095_b, tax_year: Form1095B.current_tax_year - 3) + old_form = create(:form1095_b, tax_year: Form1095B.current_tax_year - 1) + + expect(Rails.logger).to receive(:info).with('Begin deleting 2 old Form1095B files') + expect(Rails.logger).to receive(:info).with(/Finished deleting old Form1095B files in \d+\.\d+ seconds/) + + subject.perform(2) + + expect(Form1095B.where(id: [oldest_form.id, older_form.id, old_form.id]).count).to eq(1) + expect(Form1095B.where(id: [current_tax_year_form.id, current_year_form.id]).count).to eq(2) + end + + it 'logs a message and deletes nothing if there are no forms to delete' do + expect(Rails.logger).to receive(:info).with('No old Form1095B records to delete') + + subject.perform + + expect(Form1095B.pluck(:id)).to contain_exactly(current_tax_year_form.id, current_year_form.id) + end + end +end diff --git a/spec/sidekiq/lighthouse/evidence_submissions/delete_evidence_submission_records_job_spec.rb b/spec/sidekiq/lighthouse/evidence_submissions/delete_evidence_submission_records_job_spec.rb index 4cb76710d60..45f1e2a345b 100644 --- a/spec/sidekiq/lighthouse/evidence_submissions/delete_evidence_submission_records_job_spec.rb +++ b/spec/sidekiq/lighthouse/evidence_submissions/delete_evidence_submission_records_job_spec.rb @@ -18,7 +18,7 @@ context 'when EvidenceSubmission records have a delete_date set' do it 'deletes only the records with a past or current delete_time' do expect(StatsD).to receive(:increment) - .with('worker.cst.delete_evidence_submission_records.count').exactly(1).time + .with('worker.cst.delete_evidence_submission_records.count', 2).exactly(1).time expect(Rails.logger) .to receive(:info) .with("#{subject} deleted 2 of 3 EvidenceSubmission records") diff --git a/spec/support/va_profile/stub_vet360.rb b/spec/support/va_profile/stub_vet360.rb index b1012ea54f8..3eb7ffd8890 100644 --- a/spec/support/va_profile/stub_vet360.rb +++ b/spec/support/va_profile/stub_vet360.rb @@ -8,7 +8,7 @@ # rubocop:disable Metrics/MethodLength def stub_vet360(person = nil) - Flipper.disable(:va_v3_contact_information_service) + Flipper.disable(:remove_pciu) service = VAProfile::ContactInformation::Service person_response = VAProfile::ContactInformation::PersonResponse diff --git a/spec/support/vcr_cassettes/form1010_ezr/lookup_user_with_ezr_prefill_data.yml b/spec/support/vcr_cassettes/form1010_ezr/lookup_user_with_ezr_prefill_data.yml new file mode 100644 index 00000000000..914f1b41249 --- /dev/null +++ b/spec/support/vcr_cassettes/form1010_ezr/lookup_user_with_ezr_prefill_data.yml @@ -0,0 +1,161 @@ +--- +http_interactions: + - request: + method: post + uri: <%= Settings.hca.ee.endpoint %> + body: + encoding: UTF-8 + string: | + + + + + + HCASvcUsr + + + + + + + 1012829228V424035 + HCAData + + + + headers: + Accept: + - text/xml;charset=UTF-8 + Content-Type: + - text/xml;charset=UTF-8 + User-Agent: + - Vets.gov Agent + Date: + - Thu, 27 Feb 2025 01:10:06 GMT + Content-Length: + - '975' + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 27 Feb 2025 01:10:07 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '18793' + Connection: + - keep-alive + Server: + - Apache + X-Frame-Options: + - SAMEORIGIN + Content-Security-Policy: + - 'default-src https: data: ''unsafe-inline'' ''unsafe-eval''' + Accept: + - text/xml + X-Oracle-Dms-Rid: + - '0' + X-Oracle-Dms-Ecid: + - 04e85de4-97b2-4a84-a045-dda78b496ebe-009e8c94 + Soapaction: + - '""' + X-Oneagent-Js-Injection: + - 'true' + Ssl-Env: + - 'On' + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + Cache-Control: + - max-age=0, no-store + Server-Timing: + - dtSInfo;desc="0", dtRpid;desc="1972249502" + Strict-Transport-Security: + - max-age=16000000; includeSubDomains; preload; + body: + encoding: UTF-8 + string: 5.12.0.05003G1234MyInsuranceFirstName + ZZTESTP12342025-02-11T11:36:45.000-06:00VeteranPart + APart AMedicareBISHOP, + ERIC873462432true199910162025-02-13T11:00:18.000-06:00VeteranVERIFIED20231121dd214falseRejectedGroup + 2HECVerified2023-11-21T13:24:21.000-06:002025-02-21T11:59:04.000-06:00false2022-04-25T00:00:00.000-05:00trueSC + LESS THAN 50%P2023-11-21T13:24:20.000-06:00Clinical + EvaluationS2023-11-21T13:24:20.000-06:00Disability + Compensationfalse2023-11-21T13:24:20.000-06:00Houseboundfalse2023-11-21T13:24:20.000-06:00VA + Pensionfalse2023-11-21T13:24:20.000-06:00Aid + And Attendancefalse2023-11-21T13:24:20.000-06:00Unknown, + Not Screened40truefalsefalse6711-Lung + condition402023-11-21T13:24:20.000-06:0067112024-07-01T13:27:46.000-05:002025-02-21T11:59:04.000-06:002019-09-17T19:21:22.000-05:002025-02-21T11:59:04.000-06:00EnrolledOther + Next of KinMARYJESSICABISHOPDAUGHTER
748 + TEST STAPT 394UNIT 2ALBUQUERQUEBERNALILLONM87109USA
(274)294-33842023-12-08T09:52:04.000-06:00
Other + emergency contactDEBORAHWILLIAMSUNRELATED + FRIEND
2645 TEST WAYUNIT 192CLEARWATERPINELLASFL33760USA
(927)737-74862023-12-08T11:04:05.000-06:00
DesigneeMARGOSHARCOTBISHOPEXTENDED + FAMILY MEMBER
9758 TEST AVEALBUQUERQUEBERNALILLONM87109USA
(439)573-82742024-03-25T15:52:36.000-05:00
Emergency + ContactETHANJEREMYBISHOPBROTHER
9758 + TEST AVEALBUQUERQUEBERNALILLONM87109USA
(439)573-82742023-12-08T11:01:23.000-06:00
Power + of AttorneyFREDRIKSONJEREMYAYAMCKENZYFRIENDJACOBITE
678 + SOMERSTOWERALBUQUERQUEBERNALILLONM87109USA
(302)445-69082024-03-25T15:55:08.000-05:00
Power + of AttorneyMARKLGRANTFRIENDTESTING + TEST
1 HERE STAUSTINTX733010001USA
2024-03-25T15:55:20.000-05:00
Primary + Next of KinJANEBISHOPMOTHER
823 + SE 2ND STBLDG 2UNIT 163GUADALAJARA44100MEX
(202)394-66882024-03-06T10:51:15.000-06:00
610 + - MARION VA MEDICAL CENTERPERSIAN GULF WAR459GB + - HILO CLINICOTHER OR NONE742 + - HEALTH ELIGIBILITY CENTEROTHER OR NONE463GB + - SOLDOTNA VA CLINICPERSIAN GULF WAR583QD + - INDIANAPOLIS YMCA VA CLINICOTHER OR NONE589 + - KANSAS CITY VAMCOTHER OR NONE668QE + - SPOKANE VA CLINICOTHER OR NONE589A6 + - EASTERN KS HCS LEAVENWORTH DIVPERSIAN GULF WAR668 + - MANN-GRANDSTAFF VAMCOTHER OR NONE570GA + - MERCED VA CLINICPERSIAN GULF WAR459 + - SPARK M. MATSUNAGA VAMCOTHER OR NONE570 + - FRESNO VA MEDICAL CENTEROTHER OR NONE459GE + - GUAM CLINICOTHER OR NONE668HK + - SPOKANE MORCOTHER OR NONE531GG + - CALDWELL VA CLINICPERSIAN GULF WAR988 + - DAYT20OTHER OR NONE583 + - RICHARD L. ROUDEBUSH VAMCOTHER OR NONE
4049 + S DALE MABRY HWYTAMPAHILLSBOROUGHFL33611USAPermanent2025-02-21T11:59:04.000-06:00Health + Eligibility Center742 - HEALTH ELIGIBILITY + CENTER082025-02-21T11:59:04.000-06:00
4049 + S DALE MABRY HWYTAMPAHILLSBOROUGHFL33611USAResidential2025-02-13T11:00:18.000-06:00Health + Eligibility Center742 - HEALTH ELIGIBILITY + CENTER
Home(303)444-11222025-02-13T11:00:18.000-06:00Business(571)420-96052025-02-21T11:59:04.000-06:00Mobile(123)555-12342025-02-21T11:59:04.000-06:00Personal
foo@example.com
742 + - HEALTH ELIGIBILITY CENTERHEC
Declined + to AnswerNever MarriedNot + Hispanic or LatinoUnknown668QE + - SPOKANE VA CLINICfalse2025-02-21T11:59:07.000-06:00668QE + - SPOKANE VA CLINIC2025-02-21T11:59:07.000-06:00
4049 + S DALE MABRY HWYTAMPAHILLSBOROUGHFL33611USA2024truetrue2025-02-21T00:00:00.000-06:003truefalseHECCo-Pay + Exemption Test2025-02-26T18:40:30.000-06:005638776400158063138483.819579.20Non-Exempt2025-02-21T00:00:00.000-06:002025-02-26T18:40:30.000-06:00Co-Pay + Exemption TestNon-Exempt800002802015000false2024Funeral + and Burial Expenses12832025-02-26T18:40:30.000-06:00Total + Non-Reimbursed Medical Expenses85762025-02-26T18:40:30.000-06:00Veteran's + Educational Expenses43442025-02-26T18:40:30.000-06:00Adjusted + Medical Expense7209.22025-02-26T18:40:30.000-06:00All + Other Income28112025-02-26T18:40:30.000-06:00Total + Employment Income675842025-02-26T18:40:30.000-06:00Net + Income from Farm, Ranch, Property, Business142932025-02-26T18:40:30.000-06:00true22024All + Other Income12292025-02-26T18:40:30.000-06:00Total + Employment Income579302025-02-26T18:40:30.000-06:00Net + Income from Farm, Ranch, Property, Business74582025-02-26T18:40:30.000-06:00truetrue19700421BishopFemaleSarahJasmineSPOUSE666112121ActiveNew + Record19911012Employed + Full-Time2024Child's + Educational Expenses3762025-02-26T18:40:30.000-06:00All + Other Income22025-02-26T18:40:30.000-06:00Total + Employment Income67432025-02-26T18:40:30.000-06:00Net + Income from Farm, Ranch, Property, Business132025-02-26T18:40:30.000-06:00true20100125BishopMaleEricVictorSON666333111ActiveNew + Record20100125Jr.falsetruetruetrue2024true20130315BishopFemaleJessicaLaylaDAUGHTER666394444ActiveNew + Record20130315falsefalsetrue2025-02-26T18:40:30.000-06:002024570 + - FRESNO VA MEDICAL CENTER002025-02-11T12:03:05.000-06:002024668 + - MANN-GRANDSTAFF VAMC002025-02-11T11:44:06.000-06:002024583 + - RICHARD L. ROUDEBUSH VAMC002025-02-11T12:15:04.000-06:00
2025-02-26T19:10:07
+ recorded_at: Thu, 27 Feb 2025 01:10:07 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/support/vcr_cassettes/mobile/unified_health_data/get_labs.yml b/spec/support/vcr_cassettes/mobile/unified_health_data/get_labs.yml new file mode 100644 index 00000000000..aa30d7240da --- /dev/null +++ b/spec/support/vcr_cassettes/mobile/unified_health_data/get_labs.yml @@ -0,0 +1,921 @@ +--- +http_interactions: +- request: + method: post + uri: https://security.example.myhealth.va.gov/mhvapi/security/v1/login + body: + encoding: UTF-8 + string: '{"appId":1000,"appToken":"example token","subject":"VA.gov SCDF + Proxy Client","userType":"SYSTEM"}' + headers: + User-Agent: + - "" + Content-Type: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: '' + headers: + Date: + - Mon, 24 Feb 2025 22:20:51 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Vary: + - Access-Control-Request-Headers + - Access-Control-Request-Method + - Origin + Authorization: Bearer + X-Content-Type-Options: + - nosniff + X-Xss-Protection: + - '0' + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Pragma: + - no-cache + Expires: + - '0' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Frame-Options: + - DENY + body: + encoding: UTF-8 + string: '{"id":601,"name":"VA.gov SCDF Proxy Client","permissions":["system/Practitioner.read","system/Condition.read","Patient","system/ServiceRequest.read","system/Immunization.read","system/Person.read","system/Location.read","system/Procedure.read","System","system/DiagnosticReport.read","system/AllergyIntolerance.read","system/Patient.read","system/Organization.read","system/RelatedPerson.read","system/DocumentReference.read","system/Observation.read","system/Binary.read","system/Encounter.read"]}' + recorded_at: Mon, 24 Feb 2025 22:20:49 GMT +- request: + method: get + uri: https://example.myhealth.va.gov/mhvapi/v1/medicalrecords/labs?end-date=2024-12-31&patient-id=1000000000V000000&start-date=2024-01-01 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - "" + Authorization: Bearer + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: '' + headers: + Date: + - Mon, 24 Feb 2025 22:21:04 GMT + Content-Type: + - text/plain;charset=UTF-8 + Content-Length: + - '225301' + Connection: + - keep-alive + X-Content-Type-Options: + - nosniff + X-Xss-Protection: + - '0' + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Pragma: + - no-cache + Expires: + - '0' + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + X-Frame-Options: + - DENY + body: + encoding: UTF-8 + string: '{"vista":{"resourceType":"Bundle","entry":[{"resource":{"resourceType":"DiagnosticReport","id":"e9513940-bf84-4120-ac9c-718f537b00e0","contained":[{"resourceType":"Practitioner","id":"63740edb-d6f4-4335-a44b-593bba1dd9e8","name":[{"family":"MCGUIRE","given":["MARCI","P"]}]},{"resourceType":"Organization","id":"b65c5b7e-900a-487a-8c51-435bba052a7f","meta":{"profile":["https://department-of-veterans-affairs.github.io/mhv-fhir-phr-mapping/StructureDefinition/VA.MHV.PHR.organization"]},"identifier":[{"use":"usual","system":"urn:oid:2.16.840.1.113883.4.349","value":"989"}],"active":true,"name":"CHYSHR + TEST LAB"},{"resourceType":"Organization","id":"752087ef-b21c-42a1-9f87-50467bac6436","active":true,"name":"OIFO + BAYPINES TEST LAB "},{"resourceType":"ServiceRequest","id":"87d1f9f5-b17f-4986-a70c-d66500dd5ebe","status":"unknown","intent":"order","category":[{"coding":[{"system":"http://snomed.info/sct","code":"108252007","display":"Laboratory + procedure"}]}],"subject":{"reference":"Patient/null"},"requester":{"reference":"Practitioner/63740edb-d6f4-4335-a44b-593bba1dd9e8"},"performer":[{"reference":"Organization/752087ef-b21c-42a1-9f87-50467bac6436"}]},{"resourceType":"Specimen","id":"cd858d73-290d-4e85-96f4-b85db4bab67e","status":"available","type":{"text":"SERUM"},"request":[{"reference":"ServiceRequest/87d1f9f5-b17f-4986-a70c-d66500dd5ebe"}],"collection":{"collectedDateTime":"2025-01-23T22:06:02Z"}},{"resourceType":"Observation","id":"0be46017-e2e4-41ba-85e7-6a284547cf5e","basedOn":[{"reference":"87d1f9f5-b17f-4986-a70c-d66500dd5ebe"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"2345-7"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4665460"}],"text":"GLUCOSE"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:14Z","performer":[{"reference":"Organization/752087ef-b21c-42a1-9f87-50467bac6436"}],"valueQuantity":{"value":99,"unit":"mg/dL","system":"http://unitsofmeasure.org"},"specimen":{"reference":"cd858d73-290d-4e85-96f4-b85db4bab67e"},"referenceRange":[{"text":"70 + - 110"}]},{"resourceType":"Observation","id":"7ab79b72-16d3-4035-a718-53d2f2d93a67","basedOn":[{"reference":"87d1f9f5-b17f-4986-a70c-d66500dd5ebe"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"3094-0"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4673484"}],"text":"UREA + NITROGEN"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:14Z","performer":[{"reference":"Organization/752087ef-b21c-42a1-9f87-50467bac6436"}],"valueQuantity":{"value":200,"unit":"mg/dL","system":"http://unitsofmeasure.org"},"specimen":{"reference":"cd858d73-290d-4e85-96f4-b85db4bab67e"},"referenceRange":[{"text":"7 + - 18"}]},{"resourceType":"Observation","id":"b60b3ecf-250a-4e90-9a19-d2c758af48c8","basedOn":[{"reference":"87d1f9f5-b17f-4986-a70c-d66500dd5ebe"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"2160-0"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4663483"}],"text":"CREATININE"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:14Z","performer":[{"reference":"Organization/752087ef-b21c-42a1-9f87-50467bac6436"}],"valueQuantity":{"value":5,"unit":"mg/dL","system":"http://unitsofmeasure.org"},"specimen":{"reference":"cd858d73-290d-4e85-96f4-b85db4bab67e"},"referenceRange":[{"text":"0.6 + - 1.3"}]},{"resourceType":"Observation","id":"209a3836-bd94-40d2-923b-f3ce0b6fab16","basedOn":[{"reference":"87d1f9f5-b17f-4986-a70c-d66500dd5ebe"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"2951-2"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4671912"}],"text":"SODIUM"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:14Z","performer":[{"reference":"Organization/752087ef-b21c-42a1-9f87-50467bac6436"}],"valueQuantity":{"value":8,"unit":"meq/L","system":"http://unitsofmeasure.org"},"specimen":{"reference":"cd858d73-290d-4e85-96f4-b85db4bab67e"},"referenceRange":[{"text":"136 + - 145"}]},{"resourceType":"Observation","id":"cc277d95-cf9f-49e9-b043-882c6c9f96fb","basedOn":[{"reference":"87d1f9f5-b17f-4986-a70c-d66500dd5ebe"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"2823-3"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4670505"}],"text":"POTASSIUM"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:14Z","performer":[{"reference":"Organization/752087ef-b21c-42a1-9f87-50467bac6436"}],"valueQuantity":{"value":24,"unit":"meq/L","system":"http://unitsofmeasure.org"},"specimen":{"reference":"cd858d73-290d-4e85-96f4-b85db4bab67e"},"referenceRange":[{"text":"3.5 + - 5.1"}]},{"resourceType":"Observation","id":"a93d7cc6-8e8f-49dc-a310-b8e500675432","basedOn":[{"reference":"87d1f9f5-b17f-4986-a70c-d66500dd5ebe"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"2075-0"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4662584"}],"text":"CHLORIDE"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:14Z","performer":[{"reference":"Organization/752087ef-b21c-42a1-9f87-50467bac6436"}],"valueQuantity":{"value":2,"unit":"meq/L","system":"http://unitsofmeasure.org"},"specimen":{"reference":"cd858d73-290d-4e85-96f4-b85db4bab67e"},"referenceRange":[{"text":"98 + - 107"}]},{"resourceType":"Observation","id":"b7347c02-4abe-4784-af18-21f8c7b8fc6a","basedOn":[{"reference":"87d1f9f5-b17f-4986-a70c-d66500dd5ebe"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"2028-9"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4662085"}],"text":"CO2"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:14Z","performer":[{"reference":"Organization/752087ef-b21c-42a1-9f87-50467bac6436"}],"valueQuantity":{"value":2,"unit":"meq/L","system":"http://unitsofmeasure.org"},"specimen":{"reference":"cd858d73-290d-4e85-96f4-b85db4bab67e"},"referenceRange":[{"text":"22 + - 29"}]}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"LAB","display":"LAB"}]},{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"CH","display":"CH"}]}],"code":{"text":"CH"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-23T22:06:02Z","issued":"2025-01-26T20:37:14.000+00:00","performer":[{"reference":"Organization/b65c5b7e-900a-487a-8c51-435bba052a7f"}],"specimen":[{"reference":"Specimen/cd858d73-290d-4e85-96f4-b85db4bab67e"}],"result":[{"reference":"Observation/0be46017-e2e4-41ba-85e7-6a284547cf5e"},{"reference":"Observation/7ab79b72-16d3-4035-a718-53d2f2d93a67"},{"reference":"Observation/b60b3ecf-250a-4e90-9a19-d2c758af48c8"},{"reference":"Observation/209a3836-bd94-40d2-923b-f3ce0b6fab16"},{"reference":"Observation/cc277d95-cf9f-49e9-b043-882c6c9f96fb"},{"reference":"Observation/a93d7cc6-8e8f-49dc-a310-b8e500675432"},{"reference":"Observation/b7347c02-4abe-4784-af18-21f8c7b8fc6a"}]}},{"resource":{"resourceType":"DiagnosticReport","id":"4c16e6da-439e-4be8-851d-33c41504c37a","contained":[{"resourceType":"Practitioner","id":"5bca9f44-8faf-4029-ad9c-1a93c7faac7a","name":[{"family":"MCGUIRE","given":["MARCI","P"]}]},{"resourceType":"Organization","id":"3cead0df-109b-4c11-b857-f7550081a064","meta":{"profile":["https://department-of-veterans-affairs.github.io/mhv-fhir-phr-mapping/StructureDefinition/VA.MHV.PHR.organization"]},"identifier":[{"use":"usual","system":"urn:oid:2.16.840.1.113883.4.349","value":"989"}],"active":true,"name":"CHYSHR + TEST LAB"},{"resourceType":"Organization","id":"7c49eac8-f262-4536-a8aa-62a0caa1fe6a","active":true,"name":"OIFO + BAYPINES TEST LAB "},{"resourceType":"ServiceRequest","id":"74133704-5a24-410c-8398-e4c8bbddd8f4","status":"unknown","intent":"order","category":[{"coding":[{"system":"http://snomed.info/sct","code":"108252007","display":"Laboratory + procedure"}]}],"subject":{"reference":"Patient/null"},"requester":{"reference":"Practitioner/5bca9f44-8faf-4029-ad9c-1a93c7faac7a"},"performer":[{"reference":"Organization/7c49eac8-f262-4536-a8aa-62a0caa1fe6a"}]},{"resourceType":"Specimen","id":"4c5a79da-ab6e-464f-a23c-c91ec999c38f","status":"available","type":{"text":"SERUM"},"request":[{"reference":"ServiceRequest/74133704-5a24-410c-8398-e4c8bbddd8f4"}],"collection":{"collectedDateTime":"2025-01-23T22:01:52Z"}},{"resourceType":"Observation","id":"0d59be0f-391f-4336-8053-9f8d85e7374f","basedOn":[{"reference":"74133704-5a24-410c-8398-e4c8bbddd8f4"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"2345-7"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4665460"}],"text":"GLUCOSE"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:00Z","performer":[{"reference":"Organization/7c49eac8-f262-4536-a8aa-62a0caa1fe6a"}],"valueQuantity":{"value":99,"unit":"mg/dL","system":"http://unitsofmeasure.org"},"specimen":{"reference":"4c5a79da-ab6e-464f-a23c-c91ec999c38f"},"referenceRange":[{"text":"70 + - 110"}]},{"resourceType":"Observation","id":"adb4950c-b53a-4347-8d70-2f73665755b9","basedOn":[{"reference":"74133704-5a24-410c-8398-e4c8bbddd8f4"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"3094-0"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4673484"}],"text":"UREA + NITROGEN"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:00Z","performer":[{"reference":"Organization/7c49eac8-f262-4536-a8aa-62a0caa1fe6a"}],"valueQuantity":{"value":30,"unit":"mg/dL","system":"http://unitsofmeasure.org"},"specimen":{"reference":"4c5a79da-ab6e-464f-a23c-c91ec999c38f"},"referenceRange":[{"text":"7 + - 18"}]},{"resourceType":"Observation","id":"cd9388c8-b4dd-4ff7-8da5-a8084660fdea","basedOn":[{"reference":"74133704-5a24-410c-8398-e4c8bbddd8f4"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"2160-0"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4663483"}],"text":"CREATININE"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:00Z","performer":[{"reference":"Organization/7c49eac8-f262-4536-a8aa-62a0caa1fe6a"}],"valueQuantity":{"value":20,"unit":"mg/dL","system":"http://unitsofmeasure.org"},"specimen":{"reference":"4c5a79da-ab6e-464f-a23c-c91ec999c38f"},"referenceRange":[{"text":"0.6 + - 1.3"}]},{"resourceType":"Observation","id":"bad4874c-98d9-485f-ab36-c8e5244cb7ef","basedOn":[{"reference":"74133704-5a24-410c-8398-e4c8bbddd8f4"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"2951-2"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4671912"}],"text":"SODIUM"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:00Z","performer":[{"reference":"Organization/7c49eac8-f262-4536-a8aa-62a0caa1fe6a"}],"valueQuantity":{"value":24,"unit":"meq/L","system":"http://unitsofmeasure.org"},"specimen":{"reference":"4c5a79da-ab6e-464f-a23c-c91ec999c38f"},"referenceRange":[{"text":"136 + - 145"}]},{"resourceType":"Observation","id":"7d9e4871-22cf-40ea-919c-5f01c103a2f6","basedOn":[{"reference":"74133704-5a24-410c-8398-e4c8bbddd8f4"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"2823-3"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4670505"}],"text":"POTASSIUM"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:00Z","performer":[{"reference":"Organization/7c49eac8-f262-4536-a8aa-62a0caa1fe6a"}],"valueQuantity":{"value":200,"unit":"meq/L","system":"http://unitsofmeasure.org"},"specimen":{"reference":"4c5a79da-ab6e-464f-a23c-c91ec999c38f"},"referenceRange":[{"text":"3.5 + - 5.1"}]},{"resourceType":"Observation","id":"9bd357ab-5e7d-44e1-8c07-1b45ab428f08","basedOn":[{"reference":"74133704-5a24-410c-8398-e4c8bbddd8f4"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"2075-0"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4662584"}],"text":"CHLORIDE"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:00Z","performer":[{"reference":"Organization/7c49eac8-f262-4536-a8aa-62a0caa1fe6a"}],"valueQuantity":{"value":10,"unit":"meq/L","system":"http://unitsofmeasure.org"},"specimen":{"reference":"4c5a79da-ab6e-464f-a23c-c91ec999c38f"},"referenceRange":[{"text":"98 + - 107"}]},{"resourceType":"Observation","id":"a10efe78-fcca-4f81-b915-a04005e475af","basedOn":[{"reference":"74133704-5a24-410c-8398-e4c8bbddd8f4"}],"status":"final","code":{"coding":[{"system":"http://loinc.org","version":"2.68","code":"2028-9"},{"system":"http://va.gov/terminology/vistaDefinedTerms/95.3","code":"4662085"}],"text":"CO2"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-26T20:37:00Z","performer":[{"reference":"Organization/7c49eac8-f262-4536-a8aa-62a0caa1fe6a"}],"valueQuantity":{"value":1,"unit":"meq/L","system":"http://unitsofmeasure.org"},"specimen":{"reference":"4c5a79da-ab6e-464f-a23c-c91ec999c38f"},"referenceRange":[{"text":"22 + - 29"}]}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"LAB","display":"LAB"}]},{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"CH","display":"CH"}]}],"code":{"text":"CH"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-01-23T22:01:52Z","issued":"2025-01-26T20:37:00.000+00:00","performer":[{"reference":"Organization/3cead0df-109b-4c11-b857-f7550081a064"}],"specimen":[{"reference":"Specimen/4c5a79da-ab6e-464f-a23c-c91ec999c38f"}],"result":[{"reference":"Observation/0d59be0f-391f-4336-8053-9f8d85e7374f"},{"reference":"Observation/adb4950c-b53a-4347-8d70-2f73665755b9"},{"reference":"Observation/cd9388c8-b4dd-4ff7-8da5-a8084660fdea"},{"reference":"Observation/bad4874c-98d9-485f-ab36-c8e5244cb7ef"},{"reference":"Observation/7d9e4871-22cf-40ea-919c-5f01c103a2f6"},{"reference":"Observation/9bd357ab-5e7d-44e1-8c07-1b45ab428f08"},{"reference":"Observation/a10efe78-fcca-4f81-b915-a04005e475af"}]}},{"resource":{"resourceType":"DiagnosticReport","id":"1d91f54a-809f-4825-8175-81b689807784","contained":[{"resourceType":"Organization","id":"648307b3-1a55-404e-8bcb-7f06afc15b5f","meta":{"profile":["https://department-of-veterans-affairs.github.io/mhv-fhir-phr-mapping/StructureDefinition/VA.MHV.PHR.organization"]},"identifier":[{"use":"usual","system":"urn:oid:2.16.840.1.113883.4.349","value":"989"}],"active":true,"name":"CHYSHR + TEST LAB"},{"resourceType":"Specimen","id":"d5ed63c9-c543-477c-b9e5-c11c4a157bf1","accessionIdentifier":{"use":"usual","system":"urn:oid:2.16.840.1.113883.4.349.4.989","value":"SP + 25 3"},"status":"available","type":{"text":"skin"},"collection":{"collectedDateTime":"2025-02-21T02:34:00Z"}}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"LAB","display":"LAB"}]},{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"SP","display":"SP"}]}],"code":{"coding":[{"system":"http://loinc.org","code":"27898-6","display":"Pathology + studies (set)"}],"text":"SURGICAL PATHOLOGY"},"subject":{"reference":"Patient/null"},"effectiveDateTime":"2025-02-21T02:34:00Z","issued":"2025-02-21T02:48:04.000+00:00","performer":[{"reference":"Organization/648307b3-1a55-404e-8bcb-7f06afc15b5f"}],"specimen":[{"reference":"Specimen/d5ed63c9-c543-477c-b9e5-c11c4a157bf1"}],"presentedForm":[{"contentType":"text/plain","data":"UkdGMFpTQlRjR1ZqSUhSaGEyVnVPaUJHWldJZ01qQXNJREl3TWpVZ01qRTZNelFnSUZCaGRHaHZiRzluYVhOME9sTlVSVkJJUlU0Z1FrRlNVbE5FWVhSbElGTndaV01nY21WakoyUTZJRVpsWWlBeU1Dd2dNakF5TlNBeU1Ub3pOU0FnVW1WemFXUmxiblE2SUUxQlVrTkpJRkFnVFVOSFZVbFNSVVJoZEdVZ0lHTnZiWEJzWlhSbFpEb2dSbVZpSURJd0xDQXlNREkxSUNBZ0lDQWdJQ0JCWTJObGMzTnBiMjRnSXpvZ1UxQWdNalVnTTFOMVltMXBkSFJsWkNCaWVUb2dZbTl5YkdGdVpDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCUWNtRmpkR2wwYVc5dVpYSTZWa2xEVkU5U1NVRWdRU0JDVDFKTVFVNUVMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExWTndaV05wYldWdU9pQnphMmx1UW5KcFpXWWdRMnhwYm1sallXd2dTR2x6ZEc5eWVUcEJiR1Y0WVc1a1pYSWdjSEpsYzJWdWRHVmtJSFJ2SUhCb2VYTnBZMmxoYmlkeklHOW1abWxqWlNCM0lHTnZibU5sY201eklHRnliM1Z1WkNCaElHMXZiR1ZpYjNWMElHRWdaR0Z5YTJWdWFXNW5JRzF2YkdVZ2IyNGdhR2x6SUdKaFkyc3VVSEpsYjNCbGNtRjBhWFpsSUVScFlXZHViM05wY3pwd2IzUmxiblJwWVd3Z2JXRnNhV2R1WVc1MElHNWxiM0JzWVhOdElHOW1JSFJvWlNCemEybHVUM0JsY21GMGFYWmxJRVpwYm1ScGJtZHpPa05zWldGdUlHMWhjbWRwYm5NZ2IyWWdZV1ptWldOMFpXUWdkR2x6YzNWbElHVjRkSEpoWTNSbFpDQjJhV0VnY0hWdVkyZ2dZbWx2Y0hONVVHOXpkRzl3WlhKaGRHbDJaU0JFYVdGbmJtOXphWE02UVdOMGFXNXBZeUJyWlhKaGRHOXphWE1nS0hCeVpXTmhibU5sY205MWN5QnNaWE5wYjI0cGJuVnNiRzV2UjNKdmMzTWdaR1Z6WTNKcGNIUnBiMjQ2VTJOaGJIa2daM0p2ZDNSb0lHNWxZWElnYzJOaGNIVnNZWElnY21WbmFXOXVJSEJ2ZEdWdWRHbGhiQ0J3Y21WamRYSnpiM0lnZEc4Z2MzRjFZVzF2ZFhNZ1kyRnlZMmx1YjIxaFRXbGpjbTl6WTI5d2FXTWdaWGhoYlM5a2FXRm5ibTl6YVhNNklDaEVZWFJsSUZOd1pXTWdkR0ZyWlc0NklFWmxZaUF5TUN3Z01qQXlOU0F5TVRvek5DbFVRa0Z1ZFd4c1lXTjBhVzVwWXlCclpYSmhkRzl6YVhNOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzA5TFMwOUxTMDlMUzFRWlhKbWIzSnRhVzVuSUV4aFltOXlZWFJ2Y25rNlUzVnlaMmxqWVd3Z1VHRjBhRzlzYjJkNUlGSmxjRzl5ZENCUVpYSm1iM0p0WldRZ1FuazZJRU5JV1ZOSVVpQlVSVk5VSUV4QlFqSXpOakFnUlNCUVJWSlRTRWxPUnlCQ1RGWkVJRU5JUlZsRlRrNUZMQ0JHVENBNE1qQXdNUzAxTXpVMmJuVnNiQT09"}]}}]},"oracle-health":{"resourceType":"Bundle","entry":[{"resource":{"resourceType":"Patient","id":"66415180","meta":{"versionId":"10","lastUpdated":"2025-01-27T14:33:04.000Z"},"text":{"status":"generated","div":"

Patient

Name: + SILVA, ALEXANDER RICARDO

Status: Active

DOB: Mar 1, + 1990

Administrative Gender: Male

"},"identifier":[{"id":"CI-7542266848-0","use":"usual","type":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/4","code":"10","display":"MRN","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"MR","display":"Medical + record number","userSelected":false}],"text":"MRN"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"83617932000001","_value":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/rendered-value","valueString":"83617932000001"}]},"period":{"start":"2024-12-11T14:34:10.000Z"}},{"id":"CI-7542266842-2","use":"usual","type":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/4","code":"22","display":"DOD + ID","userSelected":true}],"text":"DOD ID"},"system":"urn:oid:2.16.840.1.113883.3.42.10001.100001.12","value":"2116901415","_value":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/rendered-value","valueString":"2116901415"}]},"period":{"start":"2024-12-11T14:34:10.000Z"}},{"id":"CI-7542948825-3","use":"usual","type":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/4","code":"670843","display":"Messaging","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"U","display":"Unspecified + identifier","userSelected":false}],"text":"Messaging"},"system":"urn:oid:2.16.840.1.113883.3.8901.2","value":"1000000000V000000","_value":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/rendered-value","valueString":"1000000000V000000"}]}},{"id":"CI-7542948823-4","use":"usual","type":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/4","code":"165915171","display":"Federated + Person Principal","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"AN","display":"Account + number","userSelected":false}],"text":"Federated Person Principal"},"system":"urn:oid:2.16.840.1.113883.3.13.6","value":"URN:CERNER:IDENTITY-FEDERATION:REALM:F0FDED0D-D00B-4B28-9190-853247FD9F9D:PRINCIPAL:2116901415","_value":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/rendered-value","valueString":"URN:CERNER:IDENTITY-FEDERATION:REALM:F0FDED0D-D00B-4B28-9190-853247FD9F9D:PRINCIPAL:2116901415"}]}},{"id":"CI-7542948827-5","use":"usual","type":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/4","code":"165915179","display":"MIllennium + Person Identifier","userSelected":true}],"text":"MIllennium Person Identifier"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"3327253","_value":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/rendered-value","valueString":"3327253"}]},"period":{"start":"2025-01-09T16:51:21.000Z"}},{"id":"CI-7542266844-6","use":"usual","type":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/4","code":"246779987","display":"Veteran + ID","userSelected":true}],"text":"Veteran ID"},"system":"urn:oid:2.16.840.1.113883.4.349","value":"1000000000V000000","_value":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/rendered-value","valueString":"1000000000V000000"}]},"period":{"start":"2024-12-11T14:34:10.000Z"}}],"active":true,"name":[{"id":"CI-66415180-0","use":"official","text":"SILVA, + ALEXANDER RICARDO","family":"SILVA","given":["ALEXANDER","RICARDO"],"period":{"start":"2024-12-11T14:34:10.000Z"}}],"gender":"male","birthDate":"1990-03-01"}},{"resource":{"resourceType":"DiagnosticReport","id":"160c4f2c-5ba0-47af-afb3-d356ba29d180","meta":{"profile":["https://department-of-veterans-affairs.github.io/mhv-fhir-phr-mapping/StructureDefinition/VA.MHV.PHR.chReport"]},"contained":[{"resourceType":"ServiceRequest","id":"15208412425","meta":{},"text":{"status":"generated","div":"

Service Request

Patient: + SILVA, ALEXANDER RICARDO

Code: Urinalysis with Microscopic and + Culture if Indicated

Occurrence Start: Jan 27, 2025 8:45 A.M. + CST

Occurrence End: Jan 27, 2025 9:47 A.M. CST

Priority: + STAT

Reason:

  • Lethargy

Status: Completed

Intent: + Order

Requester: Borland, Victoria A

Order Detail: + 01/27/25 9:41:00 EST, Urine, Stat, Nurse collect

"},"status":"completed","intent":"order","category":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/6000","code":"2513","display":"Laboratory","userSelected":true},{"system":"http://snomed.info/sct","code":"108252007","display":"Laboratory + procedure (procedure)","userSelected":false}],"text":"Laboratory"}],"priority":"stat","code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/200","code":"35032985","userSelected":true}],"text":"Urinalysis + with Microscopic and Culture if Indicated"},"orderDetail":[{"text":"01/27/25 + 9:41:00 EST, Urine, Stat, Nurse collect"}],"subject":{"reference":"Patient/66415180","display":"SILVA, + ALEXANDER RICARDO"},"encounter":{"reference":"Encounter/248195800"},"occurrencePeriod":{"start":"2025-01-27T14:45:00Z","end":"2025-01-27T15:47:27Z"},"authoredOn":"2025-01-27T14:41:33Z","requester":{"reference":"Practitioner/63662034","display":"Borland, + Victoria A"},"reasonCode":[{"coding":[{"system":"http://hl7.org/fhir/sid/icd-10-cm","code":"R53.83","display":"Other + fatigue","userSelected":true}],"text":"Lethargy"}]},{"resourceType":"Observation","id":"L-15247088108","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Glucose

Result: Trace

Interpretation: Abnormal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: NEGATIVE

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088108-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607189","display":"UA + Glucose","userSelected":true},{"system":"http://loinc.org","code":"25428-4","userSelected":false}],"text":"UA + Glucose"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"Trace"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"201","display":"ABN","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"A","display":"Abnormal","userSelected":false}],"text":"Abnormal"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":"NEGATIVE"}]},{"resourceType":"Observation","id":"L-15247088106","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Clarity

Result: Cloudy

Interpretation: Abnormal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: Clear

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088106-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"131376289","display":"UA + Clarity","userSelected":true},{"system":"http://loinc.org","code":"32167-9","userSelected":false}],"text":"UA + Clarity"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"Cloudy"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"201","display":"ABN","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"A","display":"Abnormal","userSelected":false}],"text":"Abnormal"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":"Clear"}]},{"resourceType":"Observation","id":"L-15247088110","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Ketones

Result: NEGATIVE

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: NEGATIVE

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088110-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102596899","display":"UA + Ketones","userSelected":true},{"system":"http://loinc.org","code":"2514-8","userSelected":false}],"text":"UA + Ketones"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"NEGATIVE"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":"NEGATIVE"}]},{"resourceType":"Observation","id":"L-15247088100","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Hippuric Acid Crystal

Result: Rare

Interpretation: + Normal

Effective Date: Jan 27, 2025 8:45 A.M. CST

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088100-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11778746071","display":"UA + Hippuric Acid Crystal","userSelected":true}],"text":"UA Hippuric Acid Crystal"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"Rare"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"note":[{"authorReference":{"reference":"Practitioner/63662034"},"time":"2025-01-27T15:47:23Z","text":"Comment + on subresult"}]},{"resourceType":"Observation","id":"L-15247088116","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Spec Gravity

Result: 1.010

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 1.000-1.030

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088116-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607153","display":"UA + Spec Gravity","userSelected":true},{"system":"http://loinc.org","code":"5811-5","userSelected":false}],"text":"UA + Spec Gravity"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":1.010},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":1.000},"high":{"value":1.030},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247088102","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Culture Ind?

Result: Yes

Interpretation: Abnormal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088102-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102598681","display":"UA + Culture Ind?","userSelected":true}],"text":"UA Culture Ind?"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"Yes"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"201","display":"ABN","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"A","display":"Abnormal","userSelected":false}],"text":"Abnormal"}]},{"resourceType":"Observation","id":"L-15247088104","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Color

Result: Dark Yellow

Interpretation: Abnormal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: Yellow

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088104-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102593593","display":"UA + Color","userSelected":true},{"system":"http://loinc.org","code":"5778-6","userSelected":false}],"text":"UA + Color"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"Dark + Yellow"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"201","display":"ABN","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"A","display":"Abnormal","userSelected":false}],"text":"Abnormal"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":"Yellow"}]},{"resourceType":"Observation","id":"L-15247088118","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA pH

Result: 5.0

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 5.0-8.0

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088118-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607007","display":"UA + pH","userSelected":true},{"system":"http://loinc.org","code":"5803-2","userSelected":false}],"text":"UA + pH"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":5.0},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":5.0},"high":{"value":8.0},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247088122","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Urobilinogen

Result: 1.1 mg/dL RBC

Interpretation: + High

Effective Date: Jan 27, 2025 8:45 A.M. CST

Reference + Range: 0.2-1.0 mg/dL RBC

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088122-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102596011","display":"UA + Urobilinogen","userSelected":true},{"system":"http://loinc.org","code":"20405-7","userSelected":false}],"text":"UA + Urobilinogen"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":1.1,"unit":"mg/dL + RBC","system":"http://unitsofmeasure.org","code":"mg/dL{RBCs}"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"207","display":"HI","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"H","display":"High","userSelected":false}],"text":"High"}],"referenceRange":[{"low":{"value":0.2,"unit":"mg/dL + RBC","system":"http://unitsofmeasure.org","code":"mg/dL{RBCs}"},"high":{"value":1.0,"unit":"mg/dL + RBC","system":"http://unitsofmeasure.org","code":"mg/dL{RBCs}"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247088120","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Protein

Result: Trace

Interpretation: Abnormal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: NEGATIVE

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088120-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607241","display":"UA + Protein","userSelected":true},{"system":"http://loinc.org","code":"20454-5","userSelected":false}],"text":"UA + Protein"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"Trace"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"201","display":"ABN","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"A","display":"Abnormal","userSelected":false}],"text":"Abnormal"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":"NEGATIVE"}]},{"resourceType":"Observation","id":"L-15247088124","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Nitrite

Result: NEGATIVE

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: NEGATIVE

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088124-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607255","display":"UA + Nitrite","userSelected":true},{"system":"http://loinc.org","code":"5802-4","userSelected":false}],"text":"UA + Nitrite"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"NEGATIVE"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":"NEGATIVE"}]},{"resourceType":"Observation","id":"L-15247088130","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA WBC

Result: 2 /HPF

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 0-3 /HPF

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088130-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607285","display":"UA + WBC","userSelected":true},{"system":"http://loinc.org","code":"20455-2","userSelected":false}],"text":"UA + WBC"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":2,"unit":"/HPF","system":"http://unitsofmeasure.org","code":"/[HPF]"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":0,"unit":"/HPF","system":"http://unitsofmeasure.org","code":"/[HPF]"},"high":{"value":3,"unit":"/HPF","system":"http://unitsofmeasure.org","code":"/[HPF]"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247088132","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Bacteria

Result: 3+

Interpretation: Abnormal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: None Seen

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088132-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607317","display":"UA + Bacteria","userSelected":true},{"system":"http://loinc.org","code":"25145-4","userSelected":false}],"text":"UA + Bacteria"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"3+"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"201","display":"ABN","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"A","display":"Abnormal","userSelected":false}],"text":"Abnormal"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":"None Seen"}]},{"resourceType":"Observation","id":"L-15247088126","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Leuk Esterase

Result: NEGATIVE

Interpretation: + Normal

Effective Date: Jan 27, 2025 8:45 A.M. CST

Reference + Range: NEGATIVE

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088126-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607269","display":"UA + Leuk Esterase","userSelected":true},{"system":"http://loinc.org","code":"5799-2","userSelected":false}],"text":"UA + Leuk Esterase"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"NEGATIVE"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":"NEGATIVE"}]},{"resourceType":"Observation","id":"L-15247088128","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA RBC

Result: 1 /HPF

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 0-2 /HPF

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088128-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607297","display":"UA + RBC","userSelected":true},{"system":"http://loinc.org","code":"13945-1","userSelected":false}],"text":"UA + RBC"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":1,"unit":"/HPF","system":"http://unitsofmeasure.org","code":"/[HPF]"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":0,"unit":"/HPF","system":"http://unitsofmeasure.org","code":"/[HPF]"},"high":{"value":2,"unit":"/HPF","system":"http://unitsofmeasure.org","code":"/[HPF]"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247088114","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Bili

Result: NEGATIVE

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: NEGATIVE

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088114-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102596041","display":"UA + Bili","userSelected":true},{"system":"http://loinc.org","code":"5770-3","userSelected":false}],"text":"UA + Bili"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"NEGATIVE"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":"NEGATIVE"}]},{"resourceType":"Observation","id":"L-15247088112","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + UA Blood

Result: NEGATIVE

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: NEGATIVE

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247088112-2025012715472800"}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607209","display":"UA + Blood","userSelected":true},{"system":"http://loinc.org","code":"5794-3","userSelected":false}],"text":"UA + Blood"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:47:25.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"NEGATIVE"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":"NEGATIVE"}]},{"resourceType":"Practitioner","id":"63662034","meta":{},"text":{"status":"generated","div":"

Practitioner

Name: + Borland, Victoria A

Identifiers: OTHER: 999, DOCDEA: VA - 1234567890, + OTHER: 999, NPI: 1234567890, PRSNLPRIMID: 1634880646, MESSAGING: 63662034, + OTHER: 1079053164, OTHER: SN=999

Status: Active

"},"extension":[{"url":"https://fhir-ehr.cerner.com/r4/StructureDefinition/is-physician","valueBoolean":true}],"identifier":[{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"DEA","display":"Drug + Enforcement Administration registration number"}],"text":"DOCDEA"},"system":"urn:oid:2.16.840.1.113883.4.814","value":"VA + - 1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"NPI","display":"National + provider identifier"}],"text":"National Provider Identifier"},"system":"http://hl7.org/fhir/sid/us-npi","value":"1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"Personnel + Primary Identifier"},"system":"urn:oid:2.16.840.1.113883.3.42.10001.100001.12","value":"1634880646","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"U","display":"Unspecified + identifier"}],"text":"Messaging"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"63662034","period":{"start":"2025-01-23T19:30:16.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"1079053164","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"SN=999","period":{"start":"2024-06-27T15:47:31.000Z"}}],"active":true,"name":[{"use":"usual","text":"Borland, + Victoria A","family":"Borland","given":["Victoria","A"],"period":{"start":"2025-01-23T19:02:14.000Z"}}]}],"basedOn":[{"reference":"ServiceRequest/15208412425"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"LAB"}]},{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"CH"}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607189","display":"UA + Glucose","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"131376289","display":"UA + Clarity","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102596899","display":"UA + Ketones","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11778746071","display":"UA + Hippuric Acid Crystal","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607153","display":"UA + Spec Gravity","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102598681","display":"UA + Culture Ind?","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102593593","display":"UA + Color","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607007","display":"UA + pH","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102596011","display":"UA + Urobilinogen","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607241","display":"UA + Protein","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607255","display":"UA + Nitrite","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607285","display":"UA + WBC","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607317","display":"UA + Bacteria","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607269","display":"UA + Leuk Esterase","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607297","display":"UA + RBC","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102596041","display":"UA + Bili","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102607209","display":"UA + Blood","userSelected":true}]}],"code":{"text":"CH"},"effectiveDateTime":"2025-01-27T14:45:00+00:00","performer":[{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"}],"result":[{"reference":"Observation/L-15247088108"},{"reference":"Observation/L-15247088106"},{"reference":"Observation/L-15247088110"},{"reference":"Observation/L-15247088100"},{"reference":"Observation/L-15247088116"},{"reference":"Observation/L-15247088102"},{"reference":"Observation/L-15247088104"},{"reference":"Observation/L-15247088118"},{"reference":"Observation/L-15247088122"},{"reference":"Observation/L-15247088120"},{"reference":"Observation/L-15247088124"},{"reference":"Observation/L-15247088130"},{"reference":"Observation/L-15247088132"},{"reference":"Observation/L-15247088126"},{"reference":"Observation/L-15247088128"},{"reference":"Observation/L-15247088114"},{"reference":"Observation/L-15247088112"}]}},{"resource":{"resourceType":"DiagnosticReport","id":"f25ef531-4aaf-4d25-bdfc-318a6a5d423b","meta":{"profile":["https://department-of-veterans-affairs.github.io/mhv-fhir-phr-mapping/StructureDefinition/VA.MHV.PHR.chReport"]},"contained":[{"resourceType":"ServiceRequest","id":"15207944073","meta":{},"text":{"status":"generated","div":"

Service Request

Patient: + SILVA, ALEXANDER RICARDO

Code: PT and INR POC

Occurrence + Start: Jan 20, 2025 1:28 P.M. CST

Occurrence End: Jan 20, + 2025 1:30 P.M. CST

Priority: Routine

Status: Completed

Intent: + Order

Requester: KUPRIAN, MIKHAIL JOSEPH, MD

Order Detail: + RT, 01/20/25 14:28:00 EST, Blood, Collected Y/N, RT - Routine, VICTORI.BORLAND.0001, + 01/20/25 13:30:05 CST

"},"status":"completed","intent":"order","category":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/6000","code":"2513","display":"Laboratory","userSelected":true},{"system":"http://snomed.info/sct","code":"108252007","display":"Laboratory + procedure (procedure)","userSelected":false}],"text":"Laboratory"}],"priority":"routine","code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/200","code":"743908241","userSelected":true}],"text":"PT + and INR POC"},"orderDetail":[{"text":"RT, 01/20/25 14:28:00 EST, Blood, Collected + Y/N, RT - Routine, VICTORI.BORLAND.0001, 01/20/25 13:30:05 CST"}],"subject":{"reference":"Patient/66415180","display":"SILVA, + ALEXANDER RICARDO"},"encounter":{"reference":"Encounter/248195800"},"occurrencePeriod":{"start":"2025-01-20T19:28:00Z","end":"2025-01-20T19:30:06Z"},"authoredOn":"2025-01-20T19:30:05Z","requester":{"reference":"Practitioner/4482457","display":"KUPRIAN, + MIKHAIL JOSEPH, MD"}},{"resourceType":"Observation","id":"L-15246756175","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + POC PT

Result: 12 seconds

Interpretation: Normal

Effective + Date: Jan 20, 2025 1:28 P.M. CST

Reference Range: 12-14 + seconds

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15246756175-2025012019300700"}],"basedOn":[{"reference":"ServiceRequest/15207944073"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"904598005","display":"POC + PT","userSelected":true},{"system":"http://loinc.org","code":"5964-2","userSelected":false}],"text":"POC + PT"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-20T19:28:00.000Z","issued":"2025-01-20T19:28:00.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}}],"reference":"Practitioner/63662034"},{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/4482457"}],"valueQuantity":{"value":12,"unit":"seconds","system":"http://unitsofmeasure.org","code":"s"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":12,"unit":"seconds","system":"http://unitsofmeasure.org","code":"s"},"high":{"value":14,"unit":"seconds","system":"http://unitsofmeasure.org","code":"s"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15246756173","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + POC INR

Result: 1.0

Interpretation: N/A

Effective + Date: Jan 20, 2025 1:28 P.M. CST

Reference Range: 0.7-4.5

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15246756173-2025012019300700"}],"basedOn":[{"reference":"ServiceRequest/15207944073"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"146642381","display":"POC + INR","userSelected":true},{"system":"http://loinc.org","code":"34714-6","userSelected":false}],"text":"POC + INR"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-20T19:28:00.000Z","issued":"2025-01-20T19:28:00.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}}],"reference":"Practitioner/63662034"},{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/4482457"}],"valueQuantity":{"value":1.0},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"212","display":"NA","userSelected":true}],"text":"N/A"}],"note":[{"authorReference":{"reference":"Practitioner/63662034"},"time":"2025-01-20T19:28:00Z","text":"{\\rtf1\\ansi\\ansicpg1252\\uc1\\deff1\\adeff1\\deflang0\\deflangfe0\\adeflang0{\\fonttbl\r\n{\\f0\\fswiss\\fcharset0\\fprq2{\\*\\panose + 020B0604020202020204}Arial;}\r\n{\\f1\\froman\\fcharset128\\fprq2{\\*\\panose + 02020400000000000000}Yu Mincho{\\*\\falt \\''9f\\''e0\\''96\\''be\\''92\\''a9};}\r\n{\\f2\\fswiss\\fcharset0\\fprq2{\\*\\panose + 020F0502020204030204}Calibri;}\r\n{\\f3\\froman\\fcharset2\\fprq2{\\*\\panose + 05050102010706020507}Symbol;}}\r\n{\\colortbl;\\red0\\green0\\blue0;}\r\n{\\stylesheet{\\s0\\ltrpar\\itap0\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\sa160\\sl259\\slmult1\\cbpat0\\rtlch\\af1\\afs22\\ltrch\\f1\\fs22 + Normal;}{\\*\\cs10\\additive Default Paragraph Font;}{\\s16\\ltrpar\\itap0\\nowidctlpar\\ql\\li0\\ri0\\lin0\\rin0\\cbpat0\\rtlch\\af0\\afs24\\ltrch\\f0\\fs24 + [Normal];}}\r\n{\\info\r\n{\\*\\txInfo{\\txVer 25.0.721.500}}}\r\n\\paperw12240\\paperh15840\\margl1440\\margt1440\\margr1440\\margb1440\\deftab1134\\widowctrl\\lytexcttp\\formshade\\pgbrdrhead\\pgbrdrfoot\\sectd\r\n\\headery720\\footery720\\pgwsxn11590\\pghsxn4000\\marglsxn1440\\margtsxn1440\\margrsxn1440\\margbsxn1440\\pgbrdropt0\\pard\\ltrpar\\itap0\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\sa160\\sl259\\slmult1\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080\\plain\\rtlch\\af2\\afs22\\alang1033\\ltrch\\f2\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033 + Venous Thrombosis 2.0-3.0. \\par Mechanical Valves 2.5-3.5. \\par Results + >4.5 must be confirmed by laboratory testing.\\par\\pard\\ltrpar\\s16\\itap0\\nowidctlpar\\ql\\li0\\ri0\\lin0\\rin0\\par + }"}],"referenceRange":[{"low":{"value":0.7},"high":{"value":4.5},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Practitioner","id":"63662034","meta":{},"text":{"status":"generated","div":"

Practitioner

Name: + Borland, Victoria A

Identifiers: OTHER: 999, DOCDEA: VA - 1234567890, + OTHER: 999, NPI: 1234567890, PRSNLPRIMID: 1634880646, MESSAGING: 63662034, + OTHER: 1079053164, OTHER: SN=999

Status: Active

"},"extension":[{"url":"https://fhir-ehr.cerner.com/r4/StructureDefinition/is-physician","valueBoolean":true}],"identifier":[{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"DEA","display":"Drug + Enforcement Administration registration number"}],"text":"DOCDEA"},"system":"urn:oid:2.16.840.1.113883.4.814","value":"VA + - 1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"NPI","display":"National + provider identifier"}],"text":"National Provider Identifier"},"system":"http://hl7.org/fhir/sid/us-npi","value":"1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"Personnel + Primary Identifier"},"system":"urn:oid:2.16.840.1.113883.3.42.10001.100001.12","value":"1634880646","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"U","display":"Unspecified + identifier"}],"text":"Messaging"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"63662034","period":{"start":"2025-01-23T19:30:16.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"1079053164","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"SN=999","period":{"start":"2024-06-27T15:47:31.000Z"}}],"active":true,"name":[{"use":"usual","text":"Borland, + Victoria A","family":"Borland","given":["Victoria","A"],"period":{"start":"2025-01-23T19:02:14.000Z"}}]}],"basedOn":[{"reference":"ServiceRequest/15207944073"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"LAB"}]},{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"CH"}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"904598005","display":"POC + PT","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"146642381","display":"POC + INR","userSelected":true}]}],"code":{"text":"CH"},"effectiveDateTime":"2025-01-20T19:28:00+00:00","performer":[{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"}],"result":[{"reference":"Observation/L-15246756175"},{"reference":"Observation/L-15246756173"}]}},{"resource":{"resourceType":"DiagnosticReport","id":"b8ac39d2-d0f1-49f0-9fdd-94e5df8753ff","meta":{"profile":["https://department-of-veterans-affairs.github.io/mhv-fhir-phr-mapping/StructureDefinition/VA.MHV.PHR.chReport"]},"contained":[{"resourceType":"ServiceRequest","id":"15208491105","meta":{},"text":{"status":"generated","div":"

Service Request

Patient: + SILVA, ALEXANDER RICARDO

Code: Hemoglobin A1c

Occurrence + Start: Jan 27, 2025 8:45 A.M. CST

Occurrence End: Jan 27, + 2025 9:42 A.M. CST

Priority: STAT

Reason:

  • Lethargy

Status: + Completed

Intent: Order

Requester: Borland, Victoria + A

Order Detail: 01/27/25 9:41:00 EST, Whole Blood, Stat, Nurse + collect

"},"status":"completed","intent":"order","category":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/6000","code":"2513","display":"Laboratory","userSelected":true},{"system":"http://snomed.info/sct","code":"108252007","display":"Laboratory + procedure (procedure)","userSelected":false}],"text":"Laboratory"}],"priority":"stat","code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/200","code":"21978844","userSelected":true},{"system":"http://loinc.org","code":"4548-4","userSelected":false}],"text":"Hemoglobin + A1c"},"orderDetail":[{"text":"01/27/25 9:41:00 EST, Whole Blood, Stat, Nurse + collect"}],"subject":{"reference":"Patient/66415180","display":"SILVA, ALEXANDER + RICARDO"},"encounter":{"reference":"Encounter/248195800"},"occurrencePeriod":{"start":"2025-01-27T14:45:00Z","end":"2025-01-27T15:42:10Z"},"authoredOn":"2025-01-27T14:41:15Z","requester":{"reference":"Practitioner/63662034","display":"Borland, + Victoria A"},"reasonCode":[{"coding":[{"system":"http://hl7.org/fhir/sid/icd-10-cm","code":"R53.83","display":"Other + fatigue","userSelected":true}],"text":"Lethargy"}]},{"resourceType":"Observation","id":"L-15246837612","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Hemoglobin A1c

Result: 5.0 %

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: <=5.6

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15246837612-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15208491105"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102593743","display":"Hemoglobin + A1c","userSelected":true},{"system":"http://loinc.org","code":"4548-4","userSelected":false}],"text":"Hemoglobin + A1c"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":5.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"note":[{"authorReference":{"reference":"Practitioner/63662034"},"time":"2025-01-27T15:42:05Z","text":"{\\rtf1\\ansi\\ansicpg1252\\uc1\\deff0\\adeff0\\deflang0\\deflangfe0\\adeflang0{\\fonttbl\r\n{\\f0\\fswiss\\fcharset0\\fprq2{\\*\\panose + 020B0604020202020204}Arial;}\r\n{\\f1\\fswiss\\fcharset0\\fprq2{\\*\\panose + 020F0502020204030204}Calibri;}\r\n{\\f2\\froman\\fcharset2\\fprq2{\\*\\panose + 05050102010706020507}Symbol;}}\r\n{\\colortbl;\\red0\\green0\\blue0;}\r\n{\\stylesheet{\\s0\\ltrpar\\itap0\\nowidctlpar\\ql\\li0\\ri0\\lin0\\rin0\\cbpat0\\rtlch\\af0\\afs24\\ltrch\\f0\\fs24 + [Normal];}{\\*\\cs10\\additive Default Paragraph Font;}}\r\n{\\info\r\n{\\*\\txInfo{\\txVer + 25.0.721.500}}}\r\n\\paperw12240\\paperh15840\\margl1440\\margt1440\\margr1440\\margb1440\\deftab1134\\widowctrl\\lytexcttp\\formshade\\sectd\r\n\\headery720\\footery720\\pgwsxn11590\\pghsxn4000\\marglsxn1440\\margtsxn1440\\margrsxn1440\\margbsxn1440\\pgbrdropt0\\pard\\ltrpar\\itap0\\nowidctlpar\\ql\\li0\\ri0\\lin0\\rin0\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080\\plain\\rtlch\\af1\\afs20\\alang0\\ltrch\\f1\\fs20\\lang0\\langnp0\\langfe0\\langfenp0 + SUGGESTED DIAGNOSIS\\~\\~ HGBA1C %\\plain\\rtlch\\af1\\afs22\\alang0\\ltrch\\f1\\fs22\\lang0\\langnp0\\langfe0\\langfenp0\\par\\plain\\rtlch\\af1\\afs20\\alang0\\ltrch\\f1\\fs20\\lang0\\langnp0\\langfe0\\langfenp0\\~\\plain\\rtlch\\af1\\afs22\\alang0\\ltrch\\f1\\fs22\\lang0\\langnp0\\langfe0\\langfenp0\\par\\plain\\rtlch\\af1\\afs20\\alang0\\ltrch\\f1\\fs20\\lang0\\langnp0\\langfe0\\langfenp0 + NORMAL\\~\\~\\~\\~\\~\\~\\~\\~\\~\\~\\~\\~\\~\\~\\~ <5.7%\\~\\~\\~\\~\\~\\plain\\rtlch\\af1\\afs22\\alang0\\ltrch\\f1\\fs22\\lang0\\langnp0\\langfe0\\langfenp0\\par\\plain\\rtlch\\af1\\afs20\\alang0\\ltrch\\f1\\fs20\\lang0\\langnp0\\langfe0\\langfenp0 + PREDIABETES\\~\\~\\~\\~\\~\\~\\~\\~\\~\\~ 5.7-6.4%\\plain\\rtlch\\af1\\afs22\\alang0\\ltrch\\f1\\fs22\\lang0\\langnp0\\langfe0\\langfenp0\\par\\plain\\rtlch\\af1\\afs20\\alang0\\ltrch\\f1\\fs20\\lang0\\langnp0\\langfe0\\langfenp0 + DIABETES\\~\\~\\~\\~\\~\\~\\~\\~\\~\\~\\~\\~\\~ >=6.5%\\plain\\rtlch\\af1\\afs22\\alang0\\ltrch\\f1\\fs22\\lang0\\langnp0\\langfe0\\langfenp0\\par\\plain\\rtlch\\af1\\afs20\\alang0\\ltrch\\f1\\fs20\\lang0\\langnp0\\langfe0\\langfenp0\\~\\plain\\rtlch\\af1\\afs22\\alang0\\ltrch\\f1\\fs22\\lang0\\langnp0\\langfe0\\langfenp0\\par\\plain\\rtlch\\af1\\afs20\\alang0\\ltrch\\f1\\fs20\\lang0\\langnp0\\langfe0\\langfenp0 + Target A1C values should be individualized. Better understanding of A1C\\plain\\rtlch\\af1\\afs22\\alang0\\ltrch\\f1\\fs22\\lang0\\langnp0\\langfe0\\langfenp0\\par\\plain\\rtlch\\af1\\afs20\\alang0\\ltrch\\f1\\fs20\\lang0\\langnp0\\langfe0\\langfenp0 + test result accuracy is essential if clinicians are to interpret results\\plain\\rtlch\\af1\\afs22\\alang0\\ltrch\\f1\\fs22\\lang0\\langnp0\\langfe0\\langfenp0\\par\\plain\\rtlch\\af1\\afs20\\alang0\\ltrch\\f1\\fs20\\lang0\\langnp0\\langfe0\\langfenp0 + for Veterans, and discuss treatment options through the process of Shared\\plain\\rtlch\\af1\\afs22\\alang0\\ltrch\\f1\\fs22\\lang0\\langnp0\\langfe0\\langfenp0\\par\\plain\\rtlch\\af1\\afs20\\alang0\\ltrch\\f1\\fs20\\lang0\\langnp0\\langfe0\\langfenp0 + Decision Making.\\~ Contact your provider for performance characteristics\\plain\\rtlch\\af1\\afs22\\alang0\\ltrch\\f1\\fs22\\lang0\\langnp0\\langfe0\\langfenp0\\par\\plain\\rtlch\\af1\\afs20\\alang0\\ltrch\\f1\\fs20\\lang0\\langnp0\\langfe0\\langfenp0 + of this assay.\\par\\pard\\ltrpar\\itap0\\nowidctlpar\\ql\\li0\\ri0\\lin0\\rin0\\par + }"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":"<=5.6"}]},{"resourceType":"Practitioner","id":"63662034","meta":{},"text":{"status":"generated","div":"

Practitioner

Name: + Borland, Victoria A

Identifiers: OTHER: 999, DOCDEA: VA - 1234567890, + OTHER: 999, NPI: 1234567890, PRSNLPRIMID: 1634880646, MESSAGING: 63662034, + OTHER: 1079053164, OTHER: SN=999

Status: Active

"},"extension":[{"url":"https://fhir-ehr.cerner.com/r4/StructureDefinition/is-physician","valueBoolean":true}],"identifier":[{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"DEA","display":"Drug + Enforcement Administration registration number"}],"text":"DOCDEA"},"system":"urn:oid:2.16.840.1.113883.4.814","value":"VA + - 1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"NPI","display":"National + provider identifier"}],"text":"National Provider Identifier"},"system":"http://hl7.org/fhir/sid/us-npi","value":"1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"Personnel + Primary Identifier"},"system":"urn:oid:2.16.840.1.113883.3.42.10001.100001.12","value":"1634880646","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"U","display":"Unspecified + identifier"}],"text":"Messaging"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"63662034","period":{"start":"2025-01-23T19:30:16.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"1079053164","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"SN=999","period":{"start":"2024-06-27T15:47:31.000Z"}}],"active":true,"name":[{"use":"usual","text":"Borland, + Victoria A","family":"Borland","given":["Victoria","A"],"period":{"start":"2025-01-23T19:02:14.000Z"}}]}],"basedOn":[{"reference":"ServiceRequest/15208491105"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"LAB"}]},{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"CH"}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102593743","display":"Hemoglobin + A1c","userSelected":true}]}],"code":{"text":"CH"},"effectiveDateTime":"2025-01-27T14:45:00+00:00","performer":[{"reference":"Practitioner/63662034"}],"result":[{"reference":"Observation/L-15246837612"}]}},{"resource":{"resourceType":"DiagnosticReport","id":"c16e68f6-1f88-4f8e-9c5f-cb7f44ea900b","meta":{"profile":["https://department-of-veterans-affairs.github.io/mhv-fhir-phr-mapping/StructureDefinition/VA.MHV.PHR.chReport"]},"contained":[{"resourceType":"ServiceRequest","id":"15208324075","meta":{},"text":{"status":"generated","div":"

Service Request

Patient: + SILVA, ALEXANDER RICARDO

Code: *Differential Automated

Occurrence + Start: Jan 27, 2025 8:40 A.M. CST

Occurrence End: Jan 27, + 2025 9:42 A.M. CST

Priority: STAT

Reason:

  • Lethargy

Status: + Completed

Intent: Order

Requester: Borland, Victoria + A

Order Detail: 01/27/25 9:40:00 EST, Whole Blood, Stat, Nurse + collect, 265367720.000000

"},"status":"completed","intent":"order","category":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/6000","code":"2513","display":"Laboratory","userSelected":true},{"system":"http://snomed.info/sct","code":"108252007","display":"Laboratory + procedure (procedure)","userSelected":false}],"text":"Laboratory"}],"priority":"stat","code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/200","code":"101239539","userSelected":true}],"text":"*Differential + Automated"},"orderDetail":[{"text":"01/27/25 9:40:00 EST, Whole Blood, Stat, + Nurse collect, 265367720.000000"}],"subject":{"reference":"Patient/66415180","display":"SILVA, + ALEXANDER RICARDO"},"encounter":{"reference":"Encounter/248195800"},"occurrencePeriod":{"start":"2025-01-27T14:40:00Z","end":"2025-01-27T15:42:10Z"},"authoredOn":"2025-01-27T15:35:59Z","requester":{"reference":"Practitioner/63662034","display":"Borland, + Victoria A"},"reasonCode":[{"coding":[{"system":"http://hl7.org/fhir/sid/icd-10-cm","code":"R53.83","display":"Other + fatigue","userSelected":true}],"text":"Lethargy"}],"note":[{"text":"Order + added by Discern Expert system."}]},{"resourceType":"Observation","id":"L-15247119718","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Neutrophil % Auto

Result: 66.0 %

Interpretation: + Normal

Effective Date: Jan 27, 2025 8:45 A.M. CST

Reference + Range: 49.0-78.0 %

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119718-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15208324075"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102599869","display":"Neutrophil + % Auto","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11165761","display":"NEUTROPHILS/100 + LEUKOCYTES:NFR:PT:BLD:QN:AUTOMATED COUNT","userSelected":true},{"system":"http://loinc.org","code":"770-8","userSelected":false}],"text":"Neutrophil + % Auto"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":66.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":49.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"high":{"value":78.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119730","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Mono Absolute

Result: 0.20 K/mcL

Interpretation: + Normal

Effective Date: Jan 27, 2025 8:45 A.M. CST

Reference + Range: 0.00-1.50 K/mcL

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119730-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15208324075"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102596353","display":"Mono + Absolute","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11134257","display":"MONOCYTES:NCNC:PT:BLD:QN:","userSelected":true},{"system":"http://loinc.org","code":"742-7","userSelected":false}],"text":"Mono + Absolute"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":0.20,"unit":"K/mcL","system":"http://unitsofmeasure.org","code":"10*3/uL"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":0.00,"unit":"K/mcL","system":"http://unitsofmeasure.org","code":"10*3/uL"},"high":{"value":1.50,"unit":"K/mcL","system":"http://unitsofmeasure.org","code":"10*3/uL"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119722","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Monocyte % Auto

Result: 4.2 %

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 3.0-9.5 + %

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119722-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15208324075"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102599689","display":"Monocyte + % Auto","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11163468","display":"MONOCYTES/100 + LEUKOCYTES:NFR:PT:BLD:QN:AUTOMATED COUNT","userSelected":true},{"system":"http://loinc.org","code":"5905-5","userSelected":false}],"text":"Monocyte + % Auto"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":4.2,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":3.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"high":{"value":9.5,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119728","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Lymph Absolute

Result: 2.10 K/mcL

Interpretation: + Normal

Effective Date: Jan 27, 2025 8:45 A.M. CST

Reference + Range: 1.20-3.40 K/mcL

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119728-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15208324075"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102593677","display":"Lymph + Absolute","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11165367","display":"LYMPHOCYTES:NCNC:PT:BLD:QN:AUTOMATED + COUNT","userSelected":true},{"system":"http://loinc.org","code":"731-0","userSelected":false}],"text":"Lymph + Absolute"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":2.10,"unit":"K/mcL","system":"http://unitsofmeasure.org","code":"10*3/uL"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":1.20,"unit":"K/mcL","system":"http://unitsofmeasure.org","code":"10*3/uL"},"high":{"value":3.40,"unit":"K/mcL","system":"http://unitsofmeasure.org","code":"10*3/uL"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119720","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Lymphocyte % Auto

Result: 32.0 %

Interpretation: + Normal

Effective Date: Jan 27, 2025 8:45 A.M. CST

Reference + Range: 20.0-45.0 %

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119720-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15208324075"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102597277","display":"Lymphocyte + % Auto","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11165217","display":"LYMPHOCYTES/100 + LEUKOCYTES:NFR:PT:BLD:QN:AUTOMATED COUNT","userSelected":true},{"system":"http://loinc.org","code":"736-9","userSelected":false}],"text":"Lymphocyte + % Auto"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":32.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":20.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"high":{"value":45.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119724","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Eosinophil % Auto

Result: 2.0 %

Interpretation: + Normal

Effective Date: Jan 27, 2025 8:45 A.M. CST

Reference + Range: 0.0-4.0 %

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119724-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15208324075"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102598057","display":"Eosinophil + % Auto","userSelected":true},{"system":"http://loinc.org","code":"713-8","userSelected":false}],"text":"Eosinophil + % Auto"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":2.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":0.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"high":{"value":4.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119726","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Basophil % Auto

Result: 0.2 %

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 0.0-3.0 + %

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119726-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15208324075"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102594565","display":"Basophil + % Auto","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11164361","display":"BASOPHILS/100 + LEUKOCYTES:NFR:PT:BLD:QN:AUTOMATED COUNT","userSelected":true},{"system":"http://loinc.org","code":"706-2","userSelected":false}],"text":"Basophil + % Auto"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":0.2,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":0.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"high":{"value":3.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Practitioner","id":"63662034","meta":{},"text":{"status":"generated","div":"

Practitioner

Name: + Borland, Victoria A

Identifiers: OTHER: 999, DOCDEA: VA - 1234567890, + OTHER: 999, NPI: 1234567890, PRSNLPRIMID: 1634880646, MESSAGING: 63662034, + OTHER: 1079053164, OTHER: SN=999

Status: Active

"},"extension":[{"url":"https://fhir-ehr.cerner.com/r4/StructureDefinition/is-physician","valueBoolean":true}],"identifier":[{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"DEA","display":"Drug + Enforcement Administration registration number"}],"text":"DOCDEA"},"system":"urn:oid:2.16.840.1.113883.4.814","value":"VA + - 1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"NPI","display":"National + provider identifier"}],"text":"National Provider Identifier"},"system":"http://hl7.org/fhir/sid/us-npi","value":"1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"Personnel + Primary Identifier"},"system":"urn:oid:2.16.840.1.113883.3.42.10001.100001.12","value":"1634880646","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"U","display":"Unspecified + identifier"}],"text":"Messaging"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"63662034","period":{"start":"2025-01-23T19:30:16.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"1079053164","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"SN=999","period":{"start":"2024-06-27T15:47:31.000Z"}}],"active":true,"name":[{"use":"usual","text":"Borland, + Victoria A","family":"Borland","given":["Victoria","A"],"period":{"start":"2025-01-23T19:02:14.000Z"}}]}],"basedOn":[{"reference":"ServiceRequest/15208324075"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"LAB"}]},{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"CH"}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102599869","display":"Neutrophil + % Auto","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102596353","display":"Mono + Absolute","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102599689","display":"Monocyte + % Auto","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102593677","display":"Lymph + Absolute","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102597277","display":"Lymphocyte + % Auto","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102598057","display":"Eosinophil + % Auto","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102594565","display":"Basophil + % Auto","userSelected":true}]}],"code":{"text":"CH"},"effectiveDateTime":"2025-01-27T14:45:00+00:00","performer":[{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"}],"result":[{"reference":"Observation/L-15247119718"},{"reference":"Observation/L-15247119730"},{"reference":"Observation/L-15247119722"},{"reference":"Observation/L-15247119728"},{"reference":"Observation/L-15247119720"},{"reference":"Observation/L-15247119724"},{"reference":"Observation/L-15247119726"}]}},{"resource":{"resourceType":"DiagnosticReport","id":"a5fbe12c-a328-4b41-84be-116d3a06e57d","meta":{"profile":["https://department-of-veterans-affairs.github.io/mhv-fhir-phr-mapping/StructureDefinition/VA.MHV.PHR.chReport"]},"contained":[{"resourceType":"ServiceRequest","id":"15207872423","meta":{},"text":{"status":"generated","div":"

Service Request

Patient: + SILVA, ALEXANDER RICARDO

Code: CBC w/ Diff

Occurrence + Start: Jan 27, 2025 8:45 A.M. CST

Occurrence End: Jan 27, + 2025 9:42 A.M. CST

Priority: STAT

Reason:

  • Lethargy

Status: + Completed

Intent: Order

Requester: Borland, Victoria + A

Order Detail: 01/27/25 9:40:00 EST, Whole Blood, Stat, Nurse + collect

"},"status":"completed","intent":"order","category":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/6000","code":"2513","display":"Laboratory","userSelected":true},{"system":"http://snomed.info/sct","code":"108252007","display":"Laboratory + procedure (procedure)","userSelected":false}],"text":"Laboratory"}],"priority":"stat","code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/200","code":"2921414","userSelected":true}],"text":"CBC + w/ Diff"},"orderDetail":[{"text":"01/27/25 9:40:00 EST, Whole Blood, Stat, + Nurse collect"}],"subject":{"reference":"Patient/66415180","display":"SILVA, + ALEXANDER RICARDO"},"encounter":{"reference":"Encounter/248195800"},"occurrencePeriod":{"start":"2025-01-27T14:45:00Z","end":"2025-01-27T15:42:10Z"},"authoredOn":"2025-01-27T14:40:48Z","requester":{"reference":"Practitioner/63662034","display":"Borland, + Victoria A"},"reasonCode":[{"coding":[{"system":"http://hl7.org/fhir/sid/icd-10-cm","code":"R53.83","display":"Other + fatigue","userSelected":true}],"text":"Lethargy"}]},{"resourceType":"Observation","id":"L-15247119708","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + MCH

Result: 30.0 pg

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 28.0-35.0 + pg

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119708-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15207872423"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102597151","display":"MCH","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11165264","display":"ERYTHROCYTE + MEAN CORPUSCULAR HEMOGLOBIN:ENTMASS:PT:RBC:QN:AUTOMATED COUNT","userSelected":true},{"system":"http://loinc.org","code":"785-6","userSelected":false}],"text":"MCH"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":30.0,"unit":"pg","system":"http://unitsofmeasure.org","code":"pg"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":28.0,"unit":"pg","system":"http://unitsofmeasure.org","code":"pg"},"high":{"value":35.0,"unit":"pg","system":"http://unitsofmeasure.org","code":"pg"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119710","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + MCHC

Result: 33.0 g/dL

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 33.0-36.0 + g/dL

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119710-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15207872423"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102599611","display":"MCHC","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11165261","display":"ERYTHROCYTE + MEAN CORPUSCULAR HEMOGLOBIN CONCENTRATION:MCNC:PT:RBC:QN:AUTOMATED COUNT","userSelected":true},{"system":"http://loinc.org","code":"786-4","userSelected":false}],"text":"MCHC"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":33.0,"unit":"g/dL","system":"http://unitsofmeasure.org","code":"g/dL"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":33.0,"unit":"g/dL","system":"http://unitsofmeasure.org","code":"g/dL"},"high":{"value":36.0,"unit":"g/dL","system":"http://unitsofmeasure.org","code":"g/dL"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119704","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Hematocrit

Result: 48.0 %

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 39.3-52.5 + %

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119704-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15207872423"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102606671","display":"Hematocrit","userSelected":true},{"system":"http://loinc.org","code":"4544-3","userSelected":false}],"text":"Hematocrit"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":48.0,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":39.3,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"high":{"value":52.5,"unit":"%","system":"http://unitsofmeasure.org","code":"%"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119706","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + MCV

Result: 92.0 fL

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 80.0-97.0 + fL

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119706-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15207872423"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102596851","display":"MCV","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"51888480","display":"ERYTHROCYTE + MEAN CORPUSCULAR VOLUME:ENTVOL:PT:RBC:QN:AUTOMATED COUNT","userSelected":true},{"system":"http://loinc.org","code":"787-2","userSelected":false}],"text":"MCV"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":92.0,"unit":"fL","system":"http://unitsofmeasure.org","code":"fL"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":80.0,"unit":"fL","system":"http://unitsofmeasure.org","code":"fL"},"high":{"value":97.0,"unit":"fL","system":"http://unitsofmeasure.org","code":"fL"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119714","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + MPV

Result: 8.4 fL

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 7.4-12.0 + fL

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119714-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15207872423"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102594769","display":"MPV","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11139821","display":"PLATELET + MEAN VOLUME:ENTVOL:PT:BLD:QN:AUTOMATED COUNT","userSelected":true},{"system":"http://loinc.org","code":"32623-1","userSelected":false}],"text":"MPV"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":8.4,"unit":"fL","system":"http://unitsofmeasure.org","code":"fL"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":7.4,"unit":"fL","system":"http://unitsofmeasure.org","code":"fL"},"high":{"value":12.0,"unit":"fL","system":"http://unitsofmeasure.org","code":"fL"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119698","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + WBC

Result: 4.4 K/mcL

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 3.9-11.0 + K/mcL

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119698-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15207872423"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102597493","display":"WBC","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11163405","display":"LEUKOCYTES:NCNC:PT:BLD:QN:AUTOMATED + COUNT","userSelected":true},{"system":"http://loinc.org","code":"6690-2","userSelected":false}],"text":"WBC"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":4.4,"unit":"K/mcL","system":"http://unitsofmeasure.org","code":"10*3/uL"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":3.9,"unit":"K/mcL","system":"http://unitsofmeasure.org","code":"10*3/uL"},"high":{"value":11.0,"unit":"K/mcL","system":"http://unitsofmeasure.org","code":"10*3/uL"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119700","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + RBC

Result: 5.2 10^6/uL

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 4.1-5.8 + 10^6/uL

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119700-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15207872423"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102593461","display":"RBC","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11165136","display":"ERYTHROCYTES:NCNC:PT:BLD:QN:AUTOMATED + COUNT","userSelected":true},{"system":"http://loinc.org","code":"789-8","userSelected":false}],"text":"RBC"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":5.2,"unit":"10^6/uL","system":"http://unitsofmeasure.org","code":"10*6/uL"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":4.1,"unit":"10^6/uL","system":"http://unitsofmeasure.org","code":"10*6/uL"},"high":{"value":5.8,"unit":"10^6/uL","system":"http://unitsofmeasure.org","code":"10*6/uL"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15247119696","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Differential?

Result: Auto

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119696-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15207872423"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102599179","display":"Differential?","userSelected":true},{"system":"http://loinc.org","code":"49024-3","userSelected":false}],"text":"Differential?"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueCodeableConcept":{"text":"Auto"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}]},{"resourceType":"Observation","id":"L-15247119702","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Hemoglobin

Result: 15.0 g/dL

Interpretation: Normal

Effective + Date: Jan 27, 2025 8:45 A.M. CST

Reference Range: 13.1-17.5 + g/dL

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15247119702-2025012715421100"}],"basedOn":[{"reference":"ServiceRequest/15207872423"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102599089","display":"Hemoglobin","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11165700","display":"HEMOGLOBIN:MCNC:PT:BLD:QN:","userSelected":true},{"system":"http://loinc.org","code":"718-7","userSelected":false}],"text":"Hemoglobin"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-27T14:45:00.000Z","issued":"2025-01-27T15:42:07.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":15.0,"unit":"g/dL","system":"http://unitsofmeasure.org","code":"g/dL"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":13.1,"unit":"g/dL","system":"http://unitsofmeasure.org","code":"g/dL"},"high":{"value":17.5,"unit":"g/dL","system":"http://unitsofmeasure.org","code":"g/dL"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Practitioner","id":"63662034","meta":{},"text":{"status":"generated","div":"

Practitioner

Name: + Borland, Victoria A

Identifiers: OTHER: 999, DOCDEA: VA - 1234567890, + OTHER: 999, NPI: 1234567890, PRSNLPRIMID: 1634880646, MESSAGING: 63662034, + OTHER: 1079053164, OTHER: SN=999

Status: Active

"},"extension":[{"url":"https://fhir-ehr.cerner.com/r4/StructureDefinition/is-physician","valueBoolean":true}],"identifier":[{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"DEA","display":"Drug + Enforcement Administration registration number"}],"text":"DOCDEA"},"system":"urn:oid:2.16.840.1.113883.4.814","value":"VA + - 1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"NPI","display":"National + provider identifier"}],"text":"National Provider Identifier"},"system":"http://hl7.org/fhir/sid/us-npi","value":"1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"Personnel + Primary Identifier"},"system":"urn:oid:2.16.840.1.113883.3.42.10001.100001.12","value":"1634880646","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"U","display":"Unspecified + identifier"}],"text":"Messaging"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"63662034","period":{"start":"2025-01-23T19:30:16.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"1079053164","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"SN=999","period":{"start":"2024-06-27T15:47:31.000Z"}}],"active":true,"name":[{"use":"usual","text":"Borland, + Victoria A","family":"Borland","given":["Victoria","A"],"period":{"start":"2025-01-23T19:02:14.000Z"}}]}],"basedOn":[{"reference":"ServiceRequest/15207872423"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"LAB"}]},{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"CH"}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102597151","display":"MCH","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102599611","display":"MCHC","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102606671","display":"Hematocrit","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102596851","display":"MCV","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102594769","display":"MPV","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102597493","display":"WBC","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102593461","display":"RBC","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102599179","display":"Differential?","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102599089","display":"Hemoglobin","userSelected":true}]}],"code":{"text":"CH"},"effectiveDateTime":"2025-01-27T14:45:00+00:00","performer":[{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"}],"result":[{"reference":"Observation/L-15247119708"},{"reference":"Observation/L-15247119710"},{"reference":"Observation/L-15247119704"},{"reference":"Observation/L-15247119706"},{"reference":"Observation/L-15247119714"},{"reference":"Observation/L-15247119698"},{"reference":"Observation/L-15247119700"},{"reference":"Observation/L-15247119696"},{"reference":"Observation/L-15247119702"}]}},{"resource":{"resourceType":"DiagnosticReport","id":"33688220-ec5d-4ad8-a1e5-32264ebc7601","meta":{"profile":["https://department-of-veterans-affairs.github.io/mhv-fhir-phr-mapping/StructureDefinition/VA.MHV.PHR.chReport"]},"contained":[{"resourceType":"ServiceRequest","id":"15208451147","meta":{},"text":{"status":"generated","div":"

Service Request

Patient: + SILVA, ALEXANDER RICARDO

Code: *Glomerular Filtration Rate, Estimated

Occurrence + Start: Jan 28, 2025 3:11 P.M. CST

Occurrence End: Jan 28, + 2025 3:22 P.M. CST

Priority: STAT

Reason:

  • Crushed + by alligator, initial encounter

Status: Completed

Intent: + Order

Requester: Borland, Victoria A

Order Detail: + 01/28/25 15:11:00 CST, Blood, Stat, Nurse collect, 265367823.000000

"},"status":"completed","intent":"order","category":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/6000","code":"2513","display":"Laboratory","userSelected":true},{"system":"http://snomed.info/sct","code":"108252007","display":"Laboratory + procedure (procedure)","userSelected":false}],"text":"Laboratory"}],"priority":"stat","code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/200","code":"101239469","userSelected":true}],"text":"*Glomerular + Filtration Rate, Estimated"},"orderDetail":[{"text":"01/28/25 15:11:00 CST, + Blood, Stat, Nurse collect, 265367823.000000"}],"subject":{"reference":"Patient/66415180","display":"SILVA, + ALEXANDER RICARDO"},"encounter":{"reference":"Encounter/248295631"},"occurrencePeriod":{"start":"2025-01-28T21:11:00Z","end":"2025-01-28T21:22:47Z"},"authoredOn":"2025-01-28T21:22:44Z","requester":{"reference":"Practitioner/63662034","display":"Borland, + Victoria A"},"reasonCode":[{"coding":[{"system":"http://hl7.org/fhir/sid/icd-10-cm","code":"W58.03XA","display":"Crushed + by alligator, initial encounter","userSelected":true}],"text":"Crushed by + alligator, initial encounter"}]},{"resourceType":"Observation","id":"L-15246933259","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + eGFR CKD EPI

Result: 3 mL/min/1.73m^2

Interpretation: + Low

Effective Date: Jan 28, 2025 3:16 P.M. CST

Reference + Range: >=60

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15246933259-2025012821224700"}],"basedOn":[{"reference":"ServiceRequest/15208451147"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"2590665505","display":"eGFR + CKD EPI","userSelected":true},{"system":"http://loinc.org","code":"62238-1","userSelected":false}],"text":"eGFR + CKD EPI"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248295631"},"effectiveDateTime":"2025-01-28T21:16:00.000Z","issued":"2025-01-28T21:22:46.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}}],"reference":"Practitioner/1"},{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":3,"unit":"mL/min/1.73m^2"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"211","display":"LOW","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"L","display":"Low","userSelected":false}],"text":"Low"}],"note":[{"authorReference":{"reference":"Practitioner/1"},"time":"2025-01-28T21:22:46Z","text":"{\\rtf1\\ansi\\ansicpg1252\\uc1\\deff1\\adeff1\\deflang0\\deflangfe0\\adeflang0{\\fonttbl\r\n{\\f0\\fswiss\\fcharset0\\fprq2{\\*\\panose + 020B0604020202020204}Arial;}\r\n{\\f1\\fswiss\\fcharset0\\fprq2{\\*\\panose + 020F0502020204030204}Calibri;}\r\n{\\f2\\froman\\fcharset2\\fprq2{\\*\\panose + 05050102010706020507}Symbol;}}\r\n{\\colortbl;\\red0\\green0\\blue0;\\red255\\green255\\blue255;\\red51\\green51\\blue51;\\red99\\green102\\blue106;}\r\n{\\stylesheet{\\s0\\ltrpar\\itap0\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\sa160\\sl259\\slmult1\\cbpat0\\rtlch\\af1\\afs22\\ltrch\\f1\\fs22 + Normal;}{\\*\\cs10\\additive Default Paragraph Font;}{\\s16\\ltrpar\\itap0\\nowidctlpar\\ql\\li0\\ri0\\lin0\\rin0\\cbpat0\\rtlch\\af0\\afs24\\ltrch\\f0\\fs24 + [Normal];}}\r\n{\\info\r\n{\\*\\txInfo{\\txVer 25.0.721.500}}}\r\n\\paperw12240\\paperh15840\\margl1440\\margt1440\\margr1440\\margb1440\\deftab1134\\widowctrl\\lytexcttp\\formshade\\pgbrdrhead\\pgbrdrfoot\\sectd\r\n\\headery720\\footery720\\pgwsxn11590\\pghsxn4000\\marglsxn1440\\margtsxn1440\\margrsxn1440\\margbsxn1440\\pgbrdropt0\\pard\\ltrpar\\itap0\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\sa160\\sl259\\slmult1\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033 + Estimated Glomerular Filtration Rate (eGFR) calculated using the 2021 Chronic + Kidney Disease-Epidemiology (CKD-EPI) Collaboration creatinine equation; units + of measure are mL/min/1.73 m2.\\par Results are only valid for adults (\\u8805 + ?18 years) whose serum creatinine is in steady state.\\~ eGFR calculations + are not valid for patients with acute kidney injury and for patients on dialysis. + \\~Creatinine-based estimates of kidney function may also be inaccurate in + patients with reduced creatinine generation due to decreased muscle mass (e.g., + malnutrition, severe hypoalbuminemia, sarcopenia, chronic neuromuscular disease, + amputations, severe heart failure or liver disease) and in patients with increased + creatinine generation due to increased muscle mass (e.g., muscle builders, + anabolic steroids) or increased dietary intake.\\par\\pard\\ltrpar\\itap0\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080 + As drug clearance is proportional to total GFR and not GFR indexed to body + surface area (BSA), in individuals with a BSA substantially different than + 1.73 m2, drug dosing should be based the reported eGFRvalue de-indexed from + BSA by multiplying by the individual\\loch\\af1\\dbch\\af1\\hich\\f1\\''92\\hich\\af1\\dbch\\af1\\loch\\f1 + s BSA and dividing by 1.73.\\par\\pard\\ltrpar\\itap0\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\sa160\\sl259\\slmult1\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080\\par + CKD is diagnosed based on abnormalities of kidney structure or function, present + for >3 months, with implications for health and disease. CKD is classified + and staged based on cause, eGFR and albuminuria (quantified as urine albumin + to creatinine ratio). An eGFR >60 mL/min/1.73 m2 in the absence of increased + urine albumin excretion or structural abnormalities does not represent CKD.\\par\\trowd\\irow0\\irowband0\\trgaph15\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalc\\clbrdrt\\brdrs\\brdrw20\\brdrcf3\\clbrdrb\\brdrs\\brdrw20\\brdrcf3\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalc\\clbrdrt\\brdrs\\brdrw20\\brdrcf3\\clbrdrb\\brdrs\\brdrw20\\brdrcf3\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalc\\clbrdrt\\brdrs\\brdrw20\\brdrcf3\\clbrdrb\\brdrs\\brdrw20\\brdrcf3\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\pard\\ltrpar\\intbl\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\sa160\\sl252\\slmult1\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080\\plain\\rtlch\\af1\\afs22\\alang1033\\ab\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\b + eGFR\\plain\\rtlch\\af1\\afs22\\alang1033\\ab\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\b\\cf1\\line + (mL/min/1.73 m2)\\plain\\rtlch\\af1\\afs22\\alang1033\\ab\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\b\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\ab\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\b\\cf1 + CKD stage\\plain\\rtlch\\af1\\afs22\\alang1033\\ab\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\b\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\ab\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\b\\cf1 + Interpretation\\plain\\rtlch\\af1\\afs22\\alang1033\\ab\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\b\\cell\\trowd\\irow0\\irowband0\\trgaph15\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalc\\clbrdrt\\brdrs\\brdrw20\\brdrcf3\\clbrdrb\\brdrs\\brdrw20\\brdrcf3\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalc\\clbrdrt\\brdrs\\brdrw20\\brdrcf3\\clbrdrb\\brdrs\\brdrw20\\brdrcf3\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalc\\clbrdrt\\brdrs\\brdrw20\\brdrcf3\\clbrdrb\\brdrs\\brdrw20\\brdrcf3\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\row\\trowd\\irow1\\irowband1\\trgaph15\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\pard\\ltrpar\\intbl\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\sa160\\sl252\\slmult1\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1\\u8805 + ?90\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + G1\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + Normal\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\trowd\\irow1\\irowband1\\trgaph15\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\row\\trowd\\irow2\\irowband2\\trgaph15\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\pard\\ltrpar\\intbl\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\sa160\\sl252\\slmult1\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + 60-89\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + G2\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + Mild decrease\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\trowd\\irow2\\irowband2\\trgaph15\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\row\\trowd\\irow3\\irowband3\\trgaph15\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\pard\\ltrpar\\intbl\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\sa160\\sl252\\slmult1\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + 45-59\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + G3A\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + Mild to moderate decrease\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\trowd\\irow3\\irowband3\\trgaph15\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\row\\trowd\\irow4\\irowband4\\trgaph15\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\pard\\ltrpar\\intbl\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\sa160\\sl252\\slmult1\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + 30-44\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + G3B\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + Moderate to severe decrease\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\trowd\\irow4\\irowband4\\trgaph15\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\row\\trowd\\irow5\\irowband5\\trgaph15\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\pard\\ltrpar\\intbl\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\sa160\\sl252\\slmult1\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + 15-29\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + G4\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + Severe decrease\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\trowd\\irow5\\irowband5\\trgaph15\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf4\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\row\\trowd\\irow6\\irowband6\\lastrow\\trgaph15\\trrh453\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf3\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf3\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf3\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\pard\\ltrpar\\intbl\\widctlpar\\ql\\li0\\ri0\\lin0\\rin0\\sa160\\sl252\\slmult1\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + <15\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + G5\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\plain\\rtlch\\af1\\afs22\\alang1033\\acf1\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cf1 + Kidney failure\\plain\\rtlch\\af1\\afs22\\alang1033\\ltrch\\f1\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\cell\\trowd\\irow6\\irowband6\\lastrow\\trgaph15\\trrh453\\trleft0\\trpaddl15\\trpaddt60\\trpaddr300\\trpaddb15\\trpaddfl3\\trpaddft3\\trpaddfr3\\trpaddfb3\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf3\\clcbpat2\\clftsWidth3\\clwWidth2631\\cellx2631\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf3\\clcbpat2\\clftsWidth3\\clwWidth1084\\cellx3715\\clvertalt\\clbrdrb\\brdrs\\brdrw20\\brdrcf3\\clcbpat2\\clftsWidth3\\clwWidth3785\\cellx7500\\row\\pard\\ltrpar\\s16\\itap0\\nowidctlpar\\ql\\li0\\ri0\\lin0\\rin0\\par + }"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":">=60"}]},{"resourceType":"Practitioner","id":"1","meta":{},"text":{"status":"generated","div":"

Practitioner

Name: + SYSTEM, SYSTEM Cerner, Cerner Managed Acct

Identifiers: MESSAGING: + 1

Status: Active

"},"extension":[{"url":"https://fhir-ehr.cerner.com/r4/StructureDefinition/is-physician","valueBoolean":false}],"identifier":[{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"U","display":"Unspecified + identifier"}],"text":"Messaging"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"1","period":{"start":"2017-02-15T20:30:58.000Z"}}],"active":true,"name":[{"use":"usual","text":"SYSTEM, + SYSTEM Cerner, Cerner Managed Acct","family":"SYSTEM","given":["SYSTEM","Cerner"],"prefix":["Cerner + Managed Acct"],"period":{"start":"2018-11-28T20:44:44.000Z"}}],"address":[{"use":"work","text":"1234 + Street\nAnywhere, CA \nUS","line":["1234 Street"],"city":"Anywhere","state":"CA","country":"US"}]},{"resourceType":"Practitioner","id":"63662034","meta":{},"text":{"status":"generated","div":"

Practitioner

Name: + Borland, Victoria A

Identifiers: OTHER: 999, DOCDEA: VA - 1234567890, + OTHER: 999, NPI: 1234567890, PRSNLPRIMID: 1634880646, MESSAGING: 63662034, + OTHER: 1079053164, OTHER: SN=999

Status: Active

"},"extension":[{"url":"https://fhir-ehr.cerner.com/r4/StructureDefinition/is-physician","valueBoolean":true}],"identifier":[{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"DEA","display":"Drug + Enforcement Administration registration number"}],"text":"DOCDEA"},"system":"urn:oid:2.16.840.1.113883.4.814","value":"VA + - 1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"NPI","display":"National + provider identifier"}],"text":"National Provider Identifier"},"system":"http://hl7.org/fhir/sid/us-npi","value":"1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"Personnel + Primary Identifier"},"system":"urn:oid:2.16.840.1.113883.3.42.10001.100001.12","value":"1634880646","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"U","display":"Unspecified + identifier"}],"text":"Messaging"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"63662034","period":{"start":"2025-01-23T19:30:16.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"1079053164","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"SN=999","period":{"start":"2024-06-27T15:47:31.000Z"}}],"active":true,"name":[{"use":"usual","text":"Borland, + Victoria A","family":"Borland","given":["Victoria","A"],"period":{"start":"2025-01-23T19:02:14.000Z"}}]}],"basedOn":[{"reference":"ServiceRequest/15208451147"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"LAB"}]},{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"CH"}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"2590665505","display":"eGFR + CKD EPI","userSelected":true}]}],"code":{"text":"CH"},"effectiveDateTime":"2025-01-28T21:16:00+00:00","performer":[{"reference":"Practitioner/1"}],"result":[{"reference":"Observation/L-15246933259"}]}},{"resource":{"resourceType":"DiagnosticReport","id":"2180f24a-f7b4-4ecd-9ff1-58be89f3377a","meta":{"profile":["https://department-of-veterans-affairs.github.io/mhv-fhir-phr-mapping/StructureDefinition/VA.MHV.PHR.chReport"]},"contained":[{"resourceType":"ServiceRequest","id":"15208364287","meta":{},"text":{"status":"generated","div":"

Service Request

Patient: + SILVA, ALEXANDER RICARDO

Code: BMP

Occurrence: Jan + 28, 2025 3:16 P.M. CST

Priority: STAT

Reason:

  • Crushed + by alligator, initial encounter

Status: Active

Intent: + Order

Requester: Borland, Victoria A

Order Detail: + 01/28/25 15:11:00 CST, Blood, Stat, Nurse collect

"},"status":"active","intent":"order","category":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/6000","code":"2513","display":"Laboratory","userSelected":true},{"system":"http://snomed.info/sct","code":"108252007","display":"Laboratory + procedure (procedure)","userSelected":false}],"text":"Laboratory"}],"priority":"stat","code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/200","code":"2921288","userSelected":true}],"text":"BMP"},"orderDetail":[{"text":"01/28/25 + 15:11:00 CST, Blood, Stat, Nurse collect"}],"subject":{"reference":"Patient/66415180","display":"SILVA, + ALEXANDER RICARDO"},"encounter":{"reference":"Encounter/248295631"},"occurrenceDateTime":"2025-01-28T21:16:00Z","authoredOn":"2025-01-28T21:11:26Z","requester":{"reference":"Practitioner/63662034","display":"Borland, + Victoria A"},"reasonCode":[{"coding":[{"system":"http://hl7.org/fhir/sid/icd-10-cm","code":"W58.03XA","display":"Crushed + by alligator, initial encounter","userSelected":true}],"text":"Crushed by + alligator, initial encounter"}],"note":[{"text":"TEST COMMENT - RESULTS CONTAIN + CRITICAL HIGH AND CRITICAL LOW VALU"}]},{"resourceType":"Observation","id":"L-15246933243","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Chloride

Result: <50 mmol/L

Interpretation: Critical

Effective + Date: Jan 28, 2025 3:16 P.M. CST

Reference Range: 98-109 + mmol/L

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15246933243-2025012821224300"}],"basedOn":[{"reference":"ServiceRequest/15208364287"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11125992","display":"CHLORIDE:SCNC:PT:SER/PLAS:QN:","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"21705582","display":"Chloride","userSelected":true},{"system":"http://loinc.org","code":"2075-0","userSelected":false}],"text":"Chloride"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248295631"},"effectiveDateTime":"2025-01-28T21:16:00.000Z","issued":"2025-01-28T21:22:09.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":50,"comparator":"<","unit":"mmol/L","system":"http://unitsofmeasure.org","code":"mmol/L"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"203","display":"CRIT","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"AA","display":"Critical + abnormal","userSelected":false}],"text":"Critical"}],"note":[{"authorReference":{"reference":"Practitioner/63662034"},"time":"2025-01-28T21:22:08Z","text":"Required + comment for crit high / low values - believe this is a unique requirement + for OH"}],"referenceRange":[{"low":{"value":98,"unit":"mmol/L","system":"http://unitsofmeasure.org","code":"mmol/L"},"high":{"value":109,"unit":"mmol/L","system":"http://unitsofmeasure.org","code":"mmol/L"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15246933249","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Glucose Lvl

Result: 99 mg/dL

Interpretation: Normal

Effective + Date: Jan 28, 2025 3:16 P.M. CST

Reference Range: 70-99 + mg/dL

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15246933249-2025012821224300"}],"basedOn":[{"reference":"ServiceRequest/15208364287"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102606625","display":"Glucose + Lvl","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"60489690","display":"GLUCOSE:MCNC:PT:SER/PLAS/BLD:QN:","userSelected":true},{"system":"http://loinc.org","code":"2345-7","userSelected":false}],"text":"Glucose + Lvl"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248295631"},"effectiveDateTime":"2025-01-28T21:16:00.000Z","issued":"2025-01-28T21:22:09.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":99,"unit":"mg/dL","system":"http://unitsofmeasure.org","code":"mg/dL"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"214","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"N","display":"Normal","userSelected":false}],"text":"Normal"}],"referenceRange":[{"low":{"value":70,"unit":"mg/dL","system":"http://unitsofmeasure.org","code":"mg/dL"},"high":{"value":99,"unit":"mg/dL","system":"http://unitsofmeasure.org","code":"mg/dL"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15246933251","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + CO2

Result: <10.0 mmol/L

Interpretation: Critical

Effective + Date: Jan 28, 2025 3:16 P.M. CST

Reference Range: 21.0-32.0 + mmol/L

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15246933251-2025012821224300"}],"basedOn":[{"reference":"ServiceRequest/15208364287"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102594007","display":"CO2","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11125605","display":"CARBON + DIOXIDE:SCNC:PT:SER/PLAS:QN:","userSelected":true},{"system":"http://loinc.org","code":"2028-9","userSelected":false}],"text":"CO2"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248295631"},"effectiveDateTime":"2025-01-28T21:16:00.000Z","issued":"2025-01-28T21:22:09.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":10.0,"comparator":"<","unit":"mmol/L","system":"http://unitsofmeasure.org","code":"mmol/L"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"203","display":"CRIT","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"AA","display":"Critical + abnormal","userSelected":false}],"text":"Critical"}],"note":[{"authorReference":{"reference":"Practitioner/63662034"},"time":"2025-01-28T21:22:08Z","text":"Required + comment for crit high / low values - believe this is a unique requirement + for OH"}],"referenceRange":[{"low":{"value":21.0,"unit":"mmol/L","system":"http://unitsofmeasure.org","code":"mmol/L"},"high":{"value":32.0,"unit":"mmol/L","system":"http://unitsofmeasure.org","code":"mmol/L"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15246933255","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Creatinine Level

Result: 20.00 mg/dL

Interpretation: + Critical

Effective Date: Jan 28, 2025 3:16 P.M. CST

Reference + Range: 0.73-1.18 mg/dL

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15246933255-2025012821224300"}],"basedOn":[{"reference":"ServiceRequest/15208364287"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102606593","display":"Creatinine + Level","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11120927","display":"CREATININE:SCNC:PT:SER/PLAS:QN:","userSelected":true},{"system":"http://loinc.org","code":"2160-0","userSelected":false}],"text":"Creatinine + Level"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248295631"},"effectiveDateTime":"2025-01-28T21:16:00.000Z","issued":"2025-01-28T21:22:09.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":20.00,"unit":"mg/dL","system":"http://unitsofmeasure.org","code":"mg/dL"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"203","display":"CRIT","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"AA","display":"Critical + abnormal","userSelected":false}],"text":"Critical"}],"note":[{"authorReference":{"reference":"Practitioner/63662034"},"time":"2025-01-28T21:22:08Z","text":"Required + comment for crit high / low values - believe this is a unique requirement + for OH"}],"referenceRange":[{"low":{"value":0.73,"unit":"mg/dL","system":"http://unitsofmeasure.org","code":"mg/dL"},"high":{"value":1.18,"unit":"mg/dL","system":"http://unitsofmeasure.org","code":"mg/dL"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15246933245","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Potassium Lvl

Result: >10.0 mmol/L

Interpretation: + Critical

Effective Date: Jan 28, 2025 3:16 P.M. CST

Reference + Range: 3.0-6.0 mmol/L

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15246933245-2025012821224300"}],"basedOn":[{"reference":"ServiceRequest/15208364287"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102598663","display":"Potassium + Lvl","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11134126","display":"POTASSIUM:SCNC:PT:SER/PLAS:QN:","userSelected":true},{"system":"http://loinc.org","code":"2823-3","userSelected":false}],"text":"Potassium + Lvl"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248295631"},"effectiveDateTime":"2025-01-28T21:16:00.000Z","issued":"2025-01-28T21:22:09.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":10.0,"comparator":">","unit":"mmol/L","system":"http://unitsofmeasure.org","code":"mmol/L"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"203","display":"CRIT","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"AA","display":"Critical + abnormal","userSelected":false}],"text":"Critical"}],"note":[{"authorReference":{"reference":"Practitioner/63662034"},"time":"2025-01-28T21:22:08Z","text":"Required + comment for crit high / low values - believe this is a unique requirement + for OH"},{"authorReference":{"reference":"Practitioner/63662034"},"time":"2025-01-28T21:22:08Z","text":"{\\rtf1\\ansi\\ansicpg1252\\uc1\\deff0\\adeff0\\deflang0\\deflangfe0\\adeflang0{\\fonttbl\r\n{\\f0\\fswiss\\fcharset0\\fprq2{\\*\\panose + 020B0604020202020204}Arial;}\r\n{\\f1\\fswiss\\fcharset0\\fprq2{\\*\\panose + 020F0502020204030204}Calibri;}\r\n{\\f2\\froman\\fcharset2\\fprq2{\\*\\panose + 05050102010706020507}Symbol;}}\r\n{\\colortbl;\\red0\\green0\\blue0;}\r\n{\\stylesheet{\\s0\\ltrpar\\itap0\\nowidctlpar\\ql\\li0\\ri0\\lin0\\rin0\\cbpat0\\rtlch\\af0\\afs24\\ltrch\\f0\\fs24 + [Normal];}{\\*\\cs10\\additive Default Paragraph Font;}}\r\n{\\info\r\n{\\*\\txInfo{\\txVer + 25.0.721.500}}}\r\n\\paperw12240\\paperh15840\\margl1440\\margt1440\\margr1440\\margb1440\\deftab1134\\widowctrl\\lytexcttp\\formshade\\sectd\r\n\\headery720\\footery720\\pgwsxn11590\\pghsxn4000\\marglsxn1440\\margtsxn1440\\margrsxn1440\\margbsxn1440\\pgbrdropt0\\pard\\ltrpar\\itap0\\nowidctlpar\\ql\\li0\\ri0\\lin0\\rin0\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\tx9360\\tx10080\\plain\\rtlch\\af1\\afs22\\alang0\\acf1\\ltrch\\f1\\fs22\\lang0\\langnp0\\langfe0\\langfenp0\\cf1 + Adult reference range:\\par Plasma: 3.5\\loch\\af1\\dbch\\af1\\hich\\f1\\''96\\hich\\af1\\dbch\\af1\\loch\\f1 + 4.7 mmol/L\\par Serum: 3.5\\loch\\af1\\dbch\\af1\\hich\\f1\\''96\\hich\\af1\\dbch\\af1\\loch\\f1 + 5.1 mmol/L\\par\\par\\pard\\ltrpar\\itap0\\nowidctlpar\\ql\\li0\\ri0\\lin0\\rin0 + Platelets release K+ upon clotting and therefore K+ values in serum may be + slightly higher than plasma depending on platelet count. \\par\\par }"}],"referenceRange":[{"low":{"value":3.0,"unit":"mmol/L","system":"http://unitsofmeasure.org","code":"mmol/L"},"high":{"value":6.0,"unit":"mmol/L","system":"http://unitsofmeasure.org","code":"mmol/L"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15246933247","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + Sodium

Result: <50 mmol/L

Interpretation: Critical

Effective + Date: Jan 28, 2025 3:16 P.M. CST

Reference Range: 136-145 + mmol/L

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15246933247-2025012821224300"}],"basedOn":[{"reference":"ServiceRequest/15208364287"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102593623","display":"Sodium","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11135696","display":"SODIUM:SCNC:PT:SER/PLAS:QN:","userSelected":true},{"system":"http://loinc.org","code":"2951-2","userSelected":false}],"text":"Sodium"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248295631"},"effectiveDateTime":"2025-01-28T21:16:00.000Z","issued":"2025-01-28T21:22:09.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":50,"comparator":"<","unit":"mmol/L","system":"http://unitsofmeasure.org","code":"mmol/L"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"203","display":"CRIT","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"AA","display":"Critical + abnormal","userSelected":false}],"text":"Critical"}],"note":[{"authorReference":{"reference":"Practitioner/63662034"},"time":"2025-01-28T21:22:08Z","text":"Required + comment for crit high / low values - believe this is a unique requirement + for OH"}],"referenceRange":[{"low":{"value":136,"unit":"mmol/L","system":"http://unitsofmeasure.org","code":"mmol/L"},"high":{"value":145,"unit":"mmol/L","system":"http://unitsofmeasure.org","code":"mmol/L"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Observation","id":"L-15246933253","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + BUN

Result: 30 mg/dL

Interpretation: High

Effective + Date: Jan 28, 2025 3:16 P.M. CST

Reference Range: 7-21 mg/dL

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15246933253-2025012821224300"}],"basedOn":[{"reference":"ServiceRequest/15208364287"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102596677","display":"BUN","userSelected":true},{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11120151","display":"UREA + NITROGEN:SCNC:PT:SER/PLAS:QN:","userSelected":true},{"system":"http://loinc.org","code":"3094-0","userSelected":false}],"text":"BUN"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248295631"},"effectiveDateTime":"2025-01-28T21:16:00.000Z","issued":"2025-01-28T21:22:09.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/63662034"}],"valueQuantity":{"value":30,"unit":"mg/dL","system":"http://unitsofmeasure.org","code":"mg/dL"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"207","display":"HI","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"H","display":"High","userSelected":false}],"text":"High"}],"referenceRange":[{"low":{"value":7,"unit":"mg/dL","system":"http://unitsofmeasure.org","code":"mg/dL"},"high":{"value":21,"unit":"mg/dL","system":"http://unitsofmeasure.org","code":"mg/dL"},"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"}}]},{"resourceType":"Practitioner","id":"63662034","meta":{},"text":{"status":"generated","div":"

Practitioner

Name: + Borland, Victoria A

Identifiers: OTHER: 999, DOCDEA: VA - 1234567890, + OTHER: 999, NPI: 1234567890, PRSNLPRIMID: 1634880646, MESSAGING: 63662034, + OTHER: 1079053164, OTHER: SN=999

Status: Active

"},"extension":[{"url":"https://fhir-ehr.cerner.com/r4/StructureDefinition/is-physician","valueBoolean":true}],"identifier":[{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"DEA","display":"Drug + Enforcement Administration registration number"}],"text":"DOCDEA"},"system":"urn:oid:2.16.840.1.113883.4.814","value":"VA + - 1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"NPI","display":"National + provider identifier"}],"text":"National Provider Identifier"},"system":"http://hl7.org/fhir/sid/us-npi","value":"1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"Personnel + Primary Identifier"},"system":"urn:oid:2.16.840.1.113883.3.42.10001.100001.12","value":"1634880646","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"U","display":"Unspecified + identifier"}],"text":"Messaging"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"63662034","period":{"start":"2025-01-23T19:30:16.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"1079053164","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"SN=999","period":{"start":"2024-06-27T15:47:31.000Z"}}],"active":true,"name":[{"use":"usual","text":"Borland, + Victoria A","family":"Borland","given":["Victoria","A"],"period":{"start":"2025-01-23T19:02:14.000Z"}}]}],"basedOn":[{"reference":"ServiceRequest/15208364287"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"LAB"}]},{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"CH"}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"11125992","display":"CHLORIDE:SCNC:PT:SER/PLAS:QN:","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102606625","display":"Glucose + Lvl","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102594007","display":"CO2","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102606593","display":"Creatinine + Level","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102598663","display":"Potassium + Lvl","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102593623","display":"Sodium","userSelected":true}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"102596677","display":"BUN","userSelected":true}]}],"code":{"text":"CH"},"effectiveDateTime":"2025-01-28T21:16:00+00:00","performer":[{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"},{"reference":"Practitioner/63662034"}],"result":[{"reference":"Observation/L-15246933243"},{"reference":"Observation/L-15246933249"},{"reference":"Observation/L-15246933251"},{"reference":"Observation/L-15246933255"},{"reference":"Observation/L-15246933245"},{"reference":"Observation/L-15246933247"},{"reference":"Observation/L-15246933253"}]}},{"resource":{"resourceType":"DiagnosticReport","id":"c51f5d4d-99a9-4780-bb8a-d053b68c3dfb","meta":{"profile":["https://department-of-veterans-affairs.github.io/mhv-fhir-phr-mapping/StructureDefinition/VA.MHV.PHR.chReport"]},"contained":[{"resourceType":"ServiceRequest","id":"15207944071","meta":{},"text":{"status":"generated","div":"

Service Request

Patient: + SILVA, ALEXANDER RICARDO

Code: SARS-CoV-2 ANTIGEN POC

Occurrence + Start: Jan 20, 2025 1:26 P.M. CST

Occurrence End: Jan 20, + 2025 1:29 P.M. CST

Priority: Routine

Status: Completed

Intent: + Order

Requester: KUPRIAN, MIKHAIL JOSEPH, MD

Order Detail: + RT, 01/20/25 14:26:00 EST, Nasopharyngeal Swab, Collected Y/N, RT - Routine, + VICTORI.BORLAND.0001, 01/20/25 13:28:58 CST

"},"status":"completed","intent":"order","category":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/6000","code":"2513","display":"Laboratory","userSelected":true},{"system":"http://snomed.info/sct","code":"108252007","display":"Laboratory + procedure (procedure)","userSelected":false}],"text":"Laboratory"}],"priority":"routine","code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/200","code":"648459931","userSelected":true}],"text":"SARS-CoV-2 + ANTIGEN POC"},"orderDetail":[{"text":"RT, 01/20/25 14:26:00 EST, Nasopharyngeal + Swab, Collected Y/N, RT - Routine, VICTORI.BORLAND.0001, 01/20/25 13:28:58 + CST"}],"subject":{"reference":"Patient/66415180","display":"SILVA, ALEXANDER + RICARDO"},"encounter":{"reference":"Encounter/248195800"},"occurrencePeriod":{"start":"2025-01-20T19:26:00Z","end":"2025-01-20T19:29:01Z"},"authoredOn":"2025-01-20T19:28:58Z","requester":{"reference":"Practitioner/4482457","display":"KUPRIAN, + MIKHAIL JOSEPH, MD"}},{"resourceType":"Observation","id":"L-15246756169","meta":{},"text":{"status":"generated","div":"

Observation

Patient + Id: 66415180

Status: Final

Categories: Laboratory

Code: + SARS-CoV-2 ANTIGEN

Result: Positive

Interpretation: + Abnormal

Effective Date: Jan 20, 2025 1:26 P.M. CST

Reference + Range: Negative

"},"identifier":[{"system":"https://fhir.cerner.com/ceuuid","value":"e552a601-e6dd-47a6-b78e-7d3e6e2d8648-15246756169-2025012019290100"}],"basedOn":[{"reference":"ServiceRequest/15207944071"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory","userSelected":false}],"text":"Laboratory"}],"code":{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"421259709","display":"SARS-CoV-2 + ANTIGEN","userSelected":true},{"system":"http://loinc.org","code":"94558-4","userSelected":false}],"text":"SARS-CoV-2 + ANTIGEN"},"subject":{"reference":"Patient/66415180"},"encounter":{"reference":"Encounter/248195800"},"effectiveDateTime":"2025-01-20T19:26:00.000Z","issued":"2025-01-20T19:26:00.000Z","performer":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"LA","display":"legal + authenticator"}],"text":"legal authenticator"}},{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-ParticipationType","code":"PPRF","display":"primary + performer"}],"text":"primary performer"}}],"reference":"Practitioner/63662034"},{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/event-performerFunction","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0912","code":"OP","display":"Ordering + Provider"}],"text":"Ordering Provider"}}],"reference":"Practitioner/4482457"}],"valueCodeableConcept":{"text":"Positive"},"interpretation":[{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/52","code":"201","display":"ABN","userSelected":true},{"system":"http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation","code":"A","display":"Abnormal","userSelected":false}],"text":"Abnormal"}],"referenceRange":[{"type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/referencerange-meaning","code":"normal","display":"Normal + Range"}],"text":"Normal Range"},"text":"Negative"}]},{"resourceType":"Practitioner","id":"63662034","meta":{},"text":{"status":"generated","div":"

Practitioner

Name: + Borland, Victoria A

Identifiers: OTHER: 999, DOCDEA: VA - 1234567890, + OTHER: 999, NPI: 1234567890, PRSNLPRIMID: 1634880646, MESSAGING: 63662034, + OTHER: 1079053164, OTHER: SN=999

Status: Active

"},"extension":[{"url":"https://fhir-ehr.cerner.com/r4/StructureDefinition/is-physician","valueBoolean":true}],"identifier":[{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"DEA","display":"Drug + Enforcement Administration registration number"}],"text":"DOCDEA"},"system":"urn:oid:2.16.840.1.113883.4.814","value":"VA + - 1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"999","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"NPI","display":"National + provider identifier"}],"text":"National Provider Identifier"},"system":"http://hl7.org/fhir/sid/us-npi","value":"1234567890","period":{"start":"2025-01-23T19:04:10.000Z"}},{"use":"usual","type":{"text":"Personnel + Primary Identifier"},"system":"urn:oid:2.16.840.1.113883.3.42.10001.100001.12","value":"1634880646","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"U","display":"Unspecified + identifier"}],"text":"Messaging"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"63662034","period":{"start":"2025-01-23T19:30:16.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"1079053164","period":{"start":"2024-06-27T15:47:31.000Z"}},{"use":"usual","type":{"text":"OTHER"},"_system":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]},"value":"SN=999","period":{"start":"2024-06-27T15:47:31.000Z"}}],"active":true,"name":[{"use":"usual","text":"Borland, + Victoria A","family":"Borland","given":["Victoria","A"],"period":{"start":"2025-01-23T19:02:14.000Z"}}]}],"basedOn":[{"reference":"ServiceRequest/15207944071"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"LAB"}]},{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0074","code":"CH"}]},{"coding":[{"system":"https://fhir.cerner.com/d45741b3-8335-463d-ab16-8c5f0bcf78ed/codeSet/72","code":"421259709","display":"SARS-CoV-2 + ANTIGEN","userSelected":true}]}],"code":{"text":"CH"},"effectiveDateTime":"2025-01-20T19:26:00+00:00","performer":[{"reference":"Practitioner/63662034"}],"result":[{"reference":"Observation/L-15246756169"}]}}]}}' + recorded_at: Mon, 24 Feb 2025 22:21:01 GMT +recorded_with: VCR 6.3.1