Avhana/allscripts_api

View on GitHub
lib/allscripts_api/orders/order.rb

Summary

Maintainability
A
1 hr
Test Coverage
# frozen_string_literal: true

module AllscriptsApi
  module Orders
    # A value object wrapped around a Nokogiri::XML::Builder DSL that builds
    # properly formatted XML for {AllscriptsApi::OrderingMethods#save_order}
    # @see https://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Builder
    class Order
      # Builder method for returning XML
      #
      # @param site_id [String] the id for the Allscripts install site
      # @param emr_user_id [String] the provider's Allscripts id
      # @param order_date [DateTime] a date for the order (Typically today)
      # @param encounter_id [String|Nil] an encounter id, used when
      # ordering to current encounter
      # @return [String] xml formatted for
      # {AllscriptsApi::OrderingMethods#save_order}
      def self.build_xml(site_id, emr_user_id, order_date, encounter_id = "")
        date = order_date.strftime("%d-%b-%Y")
        builder = Nokogiri::XML::Builder.new
        builder.saveorderxml do
          # a value of 'Y' makes the order visible on the order list
          builder.field("id" => "ordershowonorderlist", "value" => "Y")
          builder.field("id" => "orderlocation", "value" => site_id)
          builder.field("id" => "ordertobedone", "value" => date)
          # default, not important, required
          builder.field("id" => "orderpriority", "value" => "2")
          builder.field("id" => "orderschedulefreetext", "value" => "")
          builder.field("id" => "orderschedulerecurring", "value" => "")
          builder.field("id" => "orderschedulerecurringperiod", "value" => "")
          builder.field("id" => "orderschedulestarting", "value" => date)
          builder.field("id" => "orderscheduleending", "value" => date)
          builder.field("id" => "orderscheduleendingafter", "value" => "")
          builder.field("id" => "orderperformingcomment", "value" => "")
          builder.field("id" => "ordercommunicatedby", "value" => 11) # hard coded
          builder.field("id" => "orderorderedby", "value" => emr_user_id)
          builder.field("id" => "ordermanagedby", "value" => emr_user_id)
          builder.field("id" => "ordersupervisedby", "value" => "")
          builder.field("id" => "orderciteresult", "value" => "")
          builder.field("id" => "orderannotation", "value" => "")
          builder.field("id" => "orderstatus", "value" => "Active")
          builder.field("id" => "orderstatusdate", "value" => date)
          builder.field("id" => "orderdeferralinterval", "value" => 0)
          builder.field("id" => "orderdeferralunit", "value" => "Days")
          builder.field("id" => "orderstatusreason", "value" => "")
          builder.field("id" => "encounter", "value" => encounter_id.to_s)
          builder.field("id" => "orderintorext", "value" => "External/Internal for referral only")
          builder.orderlinkedproblems
          builder.clinicalquestions
        end

        builder.to_xml
      end


      # Builder for get order workflow xml
      #
      # @param order_id [String] order dictionary ID
      # @param order_trans_id [String] the provider's Allscripts id
      # @param order_category [DateTime] determines what order field data to send back.
      # @param encounter_id [String|Nil] an encounter id, used when
      # ordering to current encounter
      # @return [String] xml formatted for
      # {AllscriptsApi::OrderingMethods#save_order}
      def self.build_xml_for_order_workflow(order_id,
                                            order_category,
                                            problem_id = "",
                                            problem_trans_id = "0",
                                            order_trans_id = "0")
        builder = Nokogiri::XML::Builder.new
        builder.saveorderxml do
          builder.field("id" => "order_id", "value" => order_id)
          builder.field("id" => "order_transid", "value" => order_trans_id)
          builder.field("id" => "order_category", "value" => order_category)
          builder.field("id" => "problem_id", "value" => problem_id)
          builder.field("id" => "problem_transid", "value" => problem_trans_id)
        end

        builder.to_xml
      end
    end
  end
end