class NwmlsClient::Listing

Constants

AMENITY_FILE
DEFAULT_PTYP
DEFAULT_SCHEMA_NAME
MLS

Attributes

criteria[RW]
mls[RW]
password[RW]
schema_name[RW]
user_id[RW]

Public Class Methods

new(config, criteria = {}) click to toggle source
# File lib/nwmls_client/listing.rb, line 23
def initialize(config, criteria = {})
  raise "Configuration data is required for authentication" if config.nil?
  @user_id = config.fetch("user_id")
  @password = config.fetch("password")
  @mls = config.fetch("mls")
  @schema_name = config.fetch("schema")
  @criteria = criteria
  @criteria[:property_type] ||= :residential
  @criteria[:begin_date] ||= DateTime.now-1
  @criteria[:end_date] ||= DateTime.now
end

Public Instance Methods

display(listing_data) click to toggle source
# File lib/nwmls_client/listing.rb, line 59
def display(listing_data)

  raise "No listing data to display" if listing_data.nil?

  amenity_file = File.join(File.dirname(__FILE__), AMENITY_FILE)
  if not File.exist?(amenity_file)
    puts "Required file not found: #{amenity_file}"
    return
  end

  begin
    amenity = YAML.load_file(amenity_file)
  rescue Exception
    puts "Failed to load file (#{AMENITY_FILE}): #{$!}"
    return
  end

  # TODO: Is there a way to load the listing data and replace both
  # Codes and Amenities with the friendly names using regular expressions?

  # Check if there is a list of items to display
  # or only one
  if listing_data.is_a?(Array)
    listing_data.each do |item|
      item.each do |key, value|
        items = []
        code = key.to_s.upcase
        friendly_name = NwmlsClient::Codes.expand_code(code)

        if amenity[code] && value
          amenities = value.split('|')
          amenities.each do |am|
            items << "#{amenity[code][am]}"
          end
          puts "#{friendly_name}: #{items.join(", ")}"
        else
          puts "#{friendly_name}: #{value}"
        end

      end
      puts "\n"
    end
  else
    listing_data.each do |key, value|

      if value != nil
        items = []
        code = key.to_s.upcase
        friendly_name = NwmlsClient::Codes.expand_code(code)

        if amenity[code]
          amenities = value.split('|')
          amenities.each do |am|
            items << "#{amenity[code][am]}"
          end
          puts "#{friendly_name}: #{items.join(', ')}"
        else
          puts "#{friendly_name}: #{value}"
        end

      end

    end
  end
end
retrieve_data() click to toggle source
# File lib/nwmls_client/listing.rb, line 35
def retrieve_data()

  operation = ( @criteria[:operation] || :retrieve_listing_data )
  data_response = ( @criteria[:data_response] || :retrieve_listing_data_response )
  data_result = ( @criteria[:data_result] || :retrieve_listing_data_result )
  data_types = ( @criteria[:data_types] || :listings )
  data_type = ( @criteria[:data_type] || @criteria[:property_type] )


  request = { 'v_strXmlQuery' => build_request()}

  @client = create_client()
  response = @client.call(operation, message: request)

  cdata = response.body[data_response][data_result] 
  nori_options = { :convert_tags_to => lambda { |tag| tag.snakecase.to_sym } }
  result = Nori.new(nori_options).parse(cdata)

  raise "No listing data found:\n#{result}" if result[data_types][data_type].nil?

  listing_data = result[data_types][data_type]

end

Private Instance Methods

build_request() click to toggle source
# File lib/nwmls_client/listing.rb, line 140
def build_request()

  xm = Builder::XmlMarkup.new

  #Generate query to obtain data from Evernet web service
  xm.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8", :standalone=>"no"
  xm.EverNetQuerySpecification(:xmlns => "urn:www.nwmls.com/Schemas/General/EverNetQueryXML.xsd") {
    xm.Message {
      xm.Head {
        xm.UserId user_id
        xm.Password password
        xm.SchemaName (schema_name || DEFAULT_SCHEMA_NAME)
      }
      xm.Body {
        xm.Query {
          xm.MLS (mls || MLS)
          if @criteria[:listing_number]
            xm.ListingNumber @criteria[:listing_number] if @criteria[:listing_number]
            xm.PropertyType (@criteria[:property_code] || DEFAULT_PTYP)
          else
            xm.PropertyType (@criteria[:property_code] || DEFAULT_PTYP)
            xm.Status @criteria[:status] if @criteria[:status]
            xm.County @criteria[:county] if @criteria[:county]
            xm.Area @criteria[:area] if @criteria[:area]
            xm.City @criteria[:city] if @criteria[:city]
            xm.BeginDate @criteria[:begin_date]
            xm.EndDate @criteria[:end_date]
            xm.OfficeId @criteria[:office_id] if @criteria[:office_id]
            xm.AgentId @criteria[:agent_id] if @criteria[:agent_id]
            xm.Bedrooms @criteria[:bedrooms] if @criteria[:bedrooms]
            xm.Bathrooms @criteria[:bathrooms] if @criteria[:bathrooms]
          end
        }
        xm.Filter @criteria[:filters].join(',') if @criteria[:filters]
      }
    }
  }

end
create_client() click to toggle source
# File lib/nwmls_client/listing.rb, line 128
def create_client()

  @client = Savon.client(
    wsdl: "http://evernet.nwmls.com/evernetqueryservice/evernetquery.asmx?wsdl"
    #log_level: :debug, # can be: :debug, warn, :error, :fatal, :info
    #log: true,
    #open_timeout: 10,
    #read_timeout: 60
    )

end