namespace :phone_validation do desc "Update NPA/NXX numbers" task :update do require 'net/http' require 'fileutils' begin # Canadian numbers Net::HTTP.start('cnac.ca') do |http| response = http.get('/data/NPANXX.zip') open('NPANXX.zip', 'wb') do |file| file.write(response.body) end end `unzip NPANXX.zip` FileUtils.mv 'NPANXX.csv', File.dirname(__FILE__) + '/../data/NPANXX.csv', :force => true FileUtils.rm 'NPANXX.zip' # American numbers Net::HTTP.start('www.nanpa.com') do |http| response = http.get('/nanp1/allutlzd.zip ') open('allutlzd.zip', 'wb') do |file| file.write(response.body) end end `unzip allutlzd.zip` FileUtils.mv 'allutlzd.txt', File.dirname(__FILE__) + '/../data/allutlzd.txt', :force => true FileUtils.rm 'allutlzd.zip' # merge the two files into one csv database File.open(File.dirname(__FILE__) + '/../data/NPANXX.csv', 'a') do |database| File.open(File.dirname(__FILE__) + '/../data/allutlzd.txt', 'r').each_line do |record| state, npa_nxx, ocn, company, rate_center, effective_date, use, assign_date, initial_growth = record.split(/\t/) npa, nxx = npa_nxx.split(/-/) next unless npa.to_i > 0 availability = (use == "AS") ? "Assigned" : "Available" company.gsub!(/"/, "") unless company.nil? company.strip! unless company.nil? rate_center.strip! unless rate_center.nil? database.puts "\"#{npa}\",\"#{nxx}\",\"#{ocn}\",\"#{company}\",\"#{availability}\",\"#{rate_center}\",\"#{assign_date}\"" end end rescue Exception => e puts "Unable to update NPA/NXX database: #{e.message}" end end end