Advertisement
Guest User

Untitled

a guest
May 20th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.41 KB | None | 0 0
  1. class Quantarium::Quantarium
  2. include QuantariumConstants
  3. MAIN_URL = 'https://qvmservices.xome.com/QDataService/'
  4. USER = Rails.application.secrets.quantarium_user_id
  5. KEY = Rails.application.secrets.quantarium_key
  6.  
  7. def initialize(geo, address, user, unit = nil)
  8. @geo = geo
  9. @address = address
  10. @unit = unit
  11. @user = user
  12. end
  13.  
  14. # {'QueryPropertiesByAddress' => {user, key, address, citystate_zip}}
  15. # {'GetPropertyRecords' => {user, key, property_id, records[all, alllistings]}}
  16. # {'GetListingRecords' => {user, key, org_id, listing_id, records[basic, extended, “basic, extended”]}}
  17. def perform
  18. result = {}
  19.  
  20. property = get_property
  21.  
  22. @user.log_call 'Quantarium'
  23. return property[:error] if property[:error].present?
  24. return 'No data for given address.' if property['id'].nil?
  25.  
  26. property_records = get_property_records(property['id'])
  27. property.delete('id')
  28. result['property'] = property
  29. result.merge!(property_records)
  30. result = delete_extra_params(result)
  31. result = translate_quantarium_data(result)
  32. ensure_all_keys_present(result)
  33. rescue Exception => e
  34. raise e if Rails.env == 'development'
  35. 'Wrong address format'
  36. end
  37.  
  38. private
  39.  
  40. def get_property
  41. street = @geo[:address]
  42. citystate_zip = @geo[:zip]
  43.  
  44. if @address.present?
  45. address = parse_user_address
  46.  
  47. if address.present?
  48. street = address.to_s(:line1)
  49. citystate_zip = [address.postal_code, address.postal_code_ext].compact.join('-')
  50. end
  51. end
  52.  
  53. street += " unit #{@unit}" if @unit.present?
  54. query = "QueryPropertiesByAddress?u=#{USER}&k=#{KEY}&address=#{street}&citystate_zip=#{citystate_zip}&hc=1"
  55.  
  56. response = request(query).fetch(0, {})
  57. end
  58.  
  59. def get_property_records(id)
  60. response = {}
  61. property_records = request("GetPropertyRecords?u=#{USER}&k=#{KEY}&id=#{id}&records=all")
  62. response['assessment'] = property_records['assessment']
  63.  
  64. all_listings = request("GetPropertyRecords?u=#{USER}&k=#{KEY}&id=#{id}&records=alllistings")
  65. if all_listings['listings'].present?
  66. listing = all_listings['listings'][0]
  67. response['listing_record'] = listing
  68. if listing.is_a?(Hash) && listing['org_id'].present? && listing['listing_id'].present?
  69. listing_record = get_listing_records(listing['org_id'], listing['listing_id'])
  70. response['mls_listing_record_details'] = listing_record['details'] if listing_record['details']
  71. response['images'] =
  72. if listing_record['images'].present? && !listing_record['images']['urls'].empty?
  73. listing_record['images']['urls']
  74. else
  75. dig_images(all_listings['listings'])
  76. end
  77. end
  78. end
  79.  
  80. response
  81. end
  82.  
  83. def dig_images(all_listings)
  84. all_listings[1..-1].each do |listing|
  85. listing_record = get_listing_records(listing['org_id'], listing['listing_id'])
  86. if listing_record['images'].present? && !listing_record['images']['urls'].empty?
  87. return listing_record['images']['urls']
  88. end
  89. end
  90. []
  91. end
  92.  
  93. def get_listing_records(org_id, listing_id)
  94. response = request("GetListingRecords?u=#{USER}&k=#{KEY}&org=#{org_id}&id=#{listing_id}")
  95. response
  96. end
  97.  
  98. def request(url)
  99. link = URI.encode(MAIN_URL + url).gsub('+', '%2B')
  100. RestClient::SharedConfig.log_geodata(@geo, @address)
  101. Rails.logger.info("Quantarium request: #{link}")
  102.  
  103. options = RestClient::SharedConfig.configure(link)
  104. JSON.parse(RestClient::Request.execute(options))
  105. rescue Exception => e
  106. raise e if Rails.env == 'development'
  107. {}
  108. end
  109.  
  110. def translate_quantarium_data(result)
  111. {
  112. 'ex_garage_features' => GARAGE_TYPE_OR_PARKING,
  113. 'ex_patio_yn' => YN,
  114. 'Garage_Type' => GARAGE_TYPE_OR_PARKING,
  115. 'if_basement_yn' => YN,
  116. 'if_cooling_yn' => YN,
  117. 'if_fireplace_yn' => YN,
  118. 'if_levels' => IF_LEVELS_FEATURES,
  119. 'if_security_system_yn' => YN,
  120. 'Owner_Occupied' => YN,
  121. 'rm_family_yn' => YN,
  122. 'rm_room11_features' => RM_ROOMS,
  123. 'rm_room11_type' => RM_ROOMS,
  124. 'rm_room13_features' => RM_ROOMS,
  125. 'rm_room13_type' => RM_ROOMS,
  126. 'School_Tax_District_1_Indicator' => SCHOOL_TAX_DISTRICT_INDICATOR,
  127. 'School_Tax_District_2_Indicator' => SCHOOL_TAX_DISTRICT_INDICATOR,
  128. 'School_Tax_District_3_Indicator' => SCHOOL_TAX_DISTRICT_INDICATOR,
  129. }.each do |key, value|
  130. translation_helper(result, key, value)
  131. end
  132.  
  133. %w[
  134. ex_exterior_wall_features
  135. ex_general_features
  136. ex_patio_features
  137. ex_parking_features
  138. ex_construction_features
  139. ex_foundation_features
  140. ex_roof_features
  141. ex_sewer_features
  142. ex_style_features
  143. if_appliance_features
  144. if_basement_features
  145. if_cooling_features
  146. if_floor_features
  147. if_general_features
  148. if_heating_features
  149. if_levels_features
  150. if_security_features
  151. if_water_features
  152. in_property_type
  153. in_subtype
  154. LSale_Price_Code
  155. Main_Building_Area_Indicator
  156. Site_Influence
  157. use_code
  158. ].each do |key|
  159. translation_helper(result, key)
  160. end
  161.  
  162. result
  163. end
  164.  
  165. def delete_extra_params(result)
  166. result.each_key do |key|
  167. next if key == 'images'
  168.  
  169. result[key].each_key do |embedded_key|
  170. result[key].delete(embedded_key) unless ALLOWED_PARAMS.keys.include?(embedded_key)
  171. end
  172. end
  173.  
  174. result
  175. end
  176.  
  177. def ensure_all_keys_present(result)
  178. ALLOWED_PARAMS.each do |k, v|
  179. next if k == 'id'
  180. if result[v]
  181. result[v][k] = nil unless result[v][k]
  182. end
  183. end
  184.  
  185. ALLOWED_PARAMS.values.uniq.each do |value|
  186. result[value] = {} unless result[value]
  187. end
  188.  
  189. result['images'] = [] unless result['images']
  190.  
  191. result
  192. end
  193.  
  194. def translation_helper(result, field, constant = nil)
  195. return if %w[if_levels Site_Influence].include? field
  196.  
  197. constant ||= ('Quantarium::QuantariumConstants::' + field.upcase).constantize
  198. position_in_result = Quantarium::QuantariumConstants::ALLOWED_PARAMS[field]
  199.  
  200. if result[position_in_result] && result[position_in_result][field]
  201. res = []
  202.  
  203. result[position_in_result][field].split(',').each do |to_translate|
  204. res << constant[to_translate] unless constant[to_translate].nil?
  205. end
  206.  
  207. result[position_in_result][field] = res.join(', ') unless res.blank?
  208. end
  209. end
  210.  
  211. def parse_user_address
  212. user_address = StreetAddress::US.parse(@address)
  213. geo_address = StreetAddress::US.parse(
  214. (@geo.slice(:address, :city, :state, :zip).values + ['USA']).join(', ')
  215. )
  216.  
  217. if user_address.nil? ||
  218. user_address.number != geo_address.number ||
  219. user_address.street != geo_address.street ||
  220. user_address.street_type != geo_address.street_type ||
  221. user_address.city != geo_address.city ||
  222. user_address.state != geo_address.state ||
  223. user_address.postal_code != geo_address.postal_code ||
  224. user_address.postal_code_ext != geo_address.postal_code_ext
  225.  
  226. geo_address
  227. else
  228. user_address
  229. end
  230. end
  231.  
  232. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement