mirror of
https://github.com/System-End/theseus.git
synced 2026-04-19 16:38:18 +00:00
66 lines
2 KiB
Ruby
66 lines
2 KiB
Ruby
module GeocodingService
|
|
class USPSFacilities
|
|
class << self
|
|
SPECIAL_CASES = {
|
|
"001376" => {
|
|
lat: "40.6532171",
|
|
lon: "-73.7712486",
|
|
},
|
|
}
|
|
|
|
def coords_for_locale_key(locale_key, event = nil)
|
|
SPECIAL_CASES[locale_key] ||
|
|
Rails.cache.fetch("geocode_usps_facility_#{locale_key}", expires_in: 1.day) do
|
|
address = address_for_locale_key(locale_key)
|
|
if address
|
|
GeocodingService.first_hit(address) ||
|
|
GeocodingService.first_hit(address.slice(:city, :state, :postalcode, :country))
|
|
elsif event
|
|
# Fallback to event scan facility data when USPS facility lookup fails
|
|
facility = event.scan_facility
|
|
fallback_address = {
|
|
city: facility[:city],
|
|
state: facility[:state],
|
|
postalcode: facility[:zip],
|
|
country: "US",
|
|
}
|
|
Rails.logger.warn "USPS facility not found for locale_key #{locale_key}, falling back to scan facility data: #{fallback_address}"
|
|
GeocodingService.first_hit(fallback_address)
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
end
|
|
|
|
def address_for_locale_key(locale_key)
|
|
facility = find_facility(locale_key)
|
|
return nil unless facility
|
|
|
|
{
|
|
street: facility["FACILITY ADDRESS"],
|
|
city: facility["FACILITY CITY"],
|
|
state: facility["FACILITY STATE"],
|
|
postalcode: facility["ZIP"][0...5],
|
|
country: "US",
|
|
}
|
|
end
|
|
|
|
def find_facility(locale_key)
|
|
facilities[locale_key]
|
|
end
|
|
|
|
private
|
|
|
|
def facilities
|
|
@facilities ||= load_facilities
|
|
end
|
|
|
|
def load_facilities
|
|
Rails.logger.info "Loading USPS facilities"
|
|
facilities_file = File.join(File.dirname(__FILE__), "FACILITY.xlsx")
|
|
xsv = Xsv.open(facilities_file, parse_headers: true).first
|
|
return xsv.to_a.index_by { |row| row["LOCALE KEY"] }
|
|
end
|
|
end
|
|
end
|
|
end
|