module DialAZip

Constants

DIAL_A_ZIP_ADDRESS_NOT_FOUND_MESSAGE
DIAL_A_ZIP_BASE_URL
DIAL_A_ZIP_RESPONSE_MESSAGES

Attributes

dial_a_zip_password[RW]
dial_a_zip_user[RW]

Public Instance Methods

verify_address(address) click to toggle source
# File lib/dial_a_zip.rb, line 20
def verify_address(address)
  xml = %!
  <VERIFYADDRESS>
    <COMMAND>ZIP1</COMMAND>
    <SERIALNO>#{dial_a_zip_user}</SERIALNO>
    <USER>#{dial_a_zip_user}</USER>
    <PASSWORD>#{dial_a_zip_password}</PASSWORD>
    <ADDRESS0></ADDRESS0>
    <ADDRESS1>#{address[:full_name]}</ADDRESS1>
    <ADDRESS2>#{address[:address]}</ADDRESS2>
    <ADDRESS3>#{address[:city]}, #{address[:state]} #{address[:zipcode]}</ADDRESS3>
  </VERIFYADDRESS>!

  begin
    response = RestClient.post "#{DIAL_A_ZIP_BASE_URL}/MethodZIPValidate", :input => xml

    response_xml = Nokogiri::XML(response.body)

    return_code_node_xml = response_xml.css('Dial-A-ZIP_Response ReturnCode').first
    return_code = return_code_node_xml ? return_code_node_xml.text : nil

    addr_exists_node_xml = response_xml.css('Dial-A-ZIP_Response AddrExists').first
    addr_exists = addr_exists_node_xml ? addr_exists_node_xml.text : nil

    if ['31', '32'].include?(return_code) && addr_exists == 'TRUE'
      return {
        :full_name => response_xml.css('Dial-A-ZIP_Response AddrLine2').first.text,
        :address => response_xml.css('Dial-A-ZIP_Response AddrLine1').first.text,
        :city => response_xml.css('Dial-A-ZIP_Response City').first.text,
        :state => response_xml.css('Dial-A-ZIP_Response State').first.text,
        :zipcode => [response_xml.css('Dial-A-ZIP_Response ZIP5').first.text, response_xml.css('Dial-A-ZIP_Response Plus4').first.text].join('-'),
      }
    else
      fail return_code == '31' ? DIAL_A_ZIP_ADDRESS_NOT_FOUND_MESSAGE : DIAL_A_ZIP_RESPONSE_MESSAGES[return_code]
    end

  rescue => e
    fail e.to_s
  end
end