-
-
Save jteneycke/3957432 to your computer and use it in GitHub Desktop.
Part of my FatFreeCRM migration rake task. I've added custom fields and roles to this install of FatFreeCRM. The files used by this rake task are generated by another task that downloads them and converts then to csv files using the pipe "|" as the delimi
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Store rake tasks specific to [company] | |
namespace :[company] do | |
# Migrate [Company]'s data into the new CRM | |
namespace :migrate do | |
require 'progressbar' | |
desc "Run all [company] migration tasks" | |
task :all => [:config, :users, :comments, :accounts] | |
desc "Import [company] defaults (web user, campaigns, etc)" | |
task :config => :environment do | |
## Web User | |
user = User.create( | |
:username => 'weblead', | |
:password => '[random hash]', | |
:email => '[email protected]', | |
:first_name => 'Company', | |
:last_name => 'Web Lead' | |
) | |
user.roles = ['user'] | |
user.save | |
## Campaigns | |
Campaign.create( | |
:user_id => user.id, | |
:name => 'Website - Contact Us', | |
:access => 'Private', | |
:status => 'started', | |
:starts_on => '2011-01-01' | |
) | |
Campaign.create( | |
:user_id => user.id, | |
:name => 'Website - Requested More Information', | |
:access => 'Private', | |
:status => 'started', | |
:starts_on => '2011-01-01' | |
) | |
end | |
desc "Import comments" | |
task :comments => :environment do | |
## Comments | |
file = File.open("db/comments.txt") | |
count = `wc -l db/comments.txt` | |
puts "Importing #{count.to_i} Comments..." | |
progress = ProgressBar.new('Comments', count.to_i) | |
weblead_user = User.find_by_username('weblead') | |
file.each do |line| | |
attrs = line.split("|") | |
if (attrs[0].strip != 'id') | |
# Until association, attach all new contacts to admin user | |
created_by = User.find_by_username(attrs[6].strip) # Assign the contact to the last person who modified the lead | |
comment = Comment.new | |
comment.update_attributes( | |
:user_id => !created_by.nil? ? created_by.id : weblead_user.id, | |
:commentable_id => weblead_user.id, | |
:commentable_type => 'User', | |
:comment => urlescape(attrs[4].strip), | |
:created_at => attrs[3].strip, | |
:updated_at => !attrs[7].strip.nil? ? attrs[7].strip : attrs[3].strip, | |
:state => 'Collapsed', | |
:old_user_id => attrs[1].strip, | |
:old_status => attrs[2].strip | |
) | |
progress.inc | |
end | |
end | |
progress.finish | |
end | |
desc "Import accounts" | |
task :accounts => :environment do | |
## Accounts | |
file = File.open("db/accounts.txt") | |
count = `wc -l db/accounts.txt` | |
puts "Importing #{count.to_i} Leads/Accounts..." | |
progress = ProgressBar.new('Accounts', count.to_i) | |
weblead_user = User.find_by_username('weblead') | |
file.each do |line| | |
attrs = line.unpack('C*').pack('U*').split("|") | |
if (attrs[0].strip != 'id') | |
## Find the correct user or use admin account | |
created_by = User.find_by_username(attrs[7].strip) # Assign the contact to the person who created the lead | |
updated_by = User.find_by_username(attrs[8].strip) # Assign the contact to the last person who modified the lead | |
## Create Lead | |
lead = Lead.new | |
lead.update_attributes( | |
:old_id => attrs[0].strip, | |
:user_id => (!updated_by.nil? ? updated_by.id : (!created_by.nil? ? created_by.id : weblead_user.id)), | |
:access => 'Private', | |
:company => !attrs[9].strip.empty? ? attrs[9].strip : nil, | |
:first_name => !attrs[10].strip.empty? ? attrs[10].strip : '-', # First name cannot be blank | |
:last_name => !attrs[11].strip.empty? ? attrs[11].strip : '-', # Last name cannot be blank | |
:title => !attrs[12].strip.empty? ? attrs[12].strip : nil, | |
:business_address_attributes => { | |
:street1 => !attrs[13].strip.empty? ? attrs[13].strip : nil, | |
:street2 => !attrs[14].strip.empty? ? attrs[14].strip : nil, | |
:city => !attrs[15].strip.empty? ? attrs[15].strip : nil, | |
:state => !attrs[16].strip.empty? ? attrs[16].strip : nil, | |
:zipcode => !attrs[17].strip.empty? ? attrs[17].strip : nil, | |
:country => !attrs[18].strip.empty? ? attrs[18].strip : country_based_on_state_abbreviation(attrs[16].strip), | |
:address_type => 'Business' | |
}, | |
:status => lead_status_by_id(attrs[1].to_i), | |
:source => !attrs[47].strip.empty? ? attrs[47].strip : 'other', | |
:email => !attrs[37].strip.empty? ? attrs[37].strip : nil, | |
:alt_email => !attrs[38].strip.empty? ? attrs[38].strip : nil, | |
:phone => !attrs[31].strip.empty? ? attrs[31].strip : (!attrs[32].strip.empty? ? attrs[32].strip : nil), | |
:mobile => !attrs[35].strip.empty? ? attrs[35].strip : nil, | |
:created_at => attrs[3].strip, | |
:created_by => (!created_by.nil? ? created_by.id : weblead_user.id), | |
:updated_at => attrs[4].strip, | |
:updated_by => (!updated_by.nil? ? updated_by.id : weblead_user.id) | |
) | |
#-- Testing for errors from the insert above | |
if lead.id.to_s.empty? | |
puts '----' | |
puts attrs[0].strip | |
puts (!updated_by.nil? ? updated_by.id : weblead_user.id) | |
puts 'Private' | |
puts !attrs[9].strip.empty? ? attrs[9].strip : nil | |
puts !attrs[10].strip.empty? ? attrs[10].strip : nil | |
puts !attrs[11].strip.empty? ? attrs[11].strip : nil | |
puts !attrs[12].strip.empty? ? attrs[12].strip : nil | |
puts !attrs[13].strip.empty? ? attrs[13].strip : nil | |
puts !attrs[14].strip.empty? ? attrs[14].strip : nil | |
puts !attrs[15].strip.empty? ? attrs[15].strip : nil | |
puts !attrs[16].strip.empty? ? attrs[16].strip : nil | |
puts !attrs[17].strip.empty? ? attrs[17].strip : nil | |
puts !attrs[18].strip.empty? ? attrs[18].strip : country_based_on_state_abbreviation(attrs[16].strip) | |
puts 'Business' | |
puts lead_status_by_id(attrs[1].to_i) | |
puts !attrs[47].strip.empty? ? attrs[47].strip : 'other' | |
puts !attrs[37].strip.empty? ? attrs[37].strip : nil | |
puts !attrs[38].strip.empty? ? attrs[38].strip : nil | |
puts !attrs[31].strip.empty? ? attrs[31].strip : (!attrs[32].strip.empty? ? attrs[32].strip : nil) | |
puts !attrs[35].strip.empty? ? attrs[35].strip : nil | |
puts attrs[3].strip | |
puts (!created_by.nil? ? created_by.id : weblead_user.id) | |
puts attrs[4].strip | |
puts (!updated_by.nil? ? updated_by.id : weblead_user.id) | |
puts '----' | |
end | |
## If lead was converted, then create Account, Contact and Account_Contact | |
account = nil # Create and empty account object to use below | |
if (attrs[1].to_i == -3 || attrs[1].to_i == -4) | |
if !Account.find_by_name(attrs[9].strip).nil? | |
account_name = "#{attrs[9].strip} (#{attrs[16].strip})" # Append state abbreviation if the account name alread exists | |
else | |
account_name = attrs[9].strip | |
end | |
account = Account.find_by_name(account_name) || Account.new | |
account.update_attributes( | |
:name => account_name, | |
:user_id => (!updated_by.nil? ? updated_by.id : (!created_by.nil? ? created_by.id : weblead_user.id)), | |
:access => 'Private', | |
:website => !attrs[39].strip.empty? ? attrs[39].strip : nil, | |
:toll_free_phone => !attrs[32].strip.empty? ? attrs[32].strip : nil, | |
:phone => !attrs[31].strip.empty? ? attrs[31].strip : nil, | |
:email => !attrs[37].strip.empty? ? attrs[37].strip : nil, | |
:front_end_searchable => true, | |
:billing_address_attributes => { | |
:street1 => !attrs[13].strip.empty? ? attrs[13].strip : nil, | |
:street2 => !attrs[14].strip.empty? ? attrs[14].strip : nil, | |
:city => !attrs[15].strip.empty? ? attrs[15].strip : nil, | |
:state => !attrs[16].strip.empty? ? attrs[16].strip : nil, | |
:zipcode => !attrs[17].strip.empty? ? attrs[17].strip : nil, | |
:country => !attrs[18].strip.empty? ? attrs[18].strip : country_based_on_state_abbreviation(attrs[16].strip), | |
:address_type => 'Billing' | |
}, | |
:shipping_address_attributes => { | |
:street1 => !attrs[25].strip.empty? ? attrs[25].strip : nil, | |
:street2 => !attrs[26].strip.empty? ? attrs[26].strip : nil, | |
:city => !attrs[27].strip.empty? ? attrs[27].strip : nil, | |
:state => !attrs[28].strip.empty? ? attrs[28].strip : nil, | |
:zipcode => !attrs[29].strip.empty? ? attrs[29].strip : nil, | |
:country => !attrs[30].strip.empty? ? attrs[30].strip : country_based_on_state_abbreviation(attrs[28].strip), | |
:address_type => 'Shipping' | |
}, | |
:created_at => attrs[3].strip, | |
:created_by => (!created_by.nil? ? created_by.id : weblead_user.id), | |
:updated_at => attrs[4].strip, | |
:updated_by => (!updated_by.nil? ? updated_by.id : weblead_user.id) | |
) | |
# Save Contact | |
contact = Contact.new | |
contact.update_attributes( | |
:user_id => (!updated_by.nil? ? updated_by.id : (!created_by.nil? ? created_by.id : weblead_user.id)), | |
:lead_id => lead.id, | |
:access => 'Private', | |
:first_name => !attrs[10].strip.empty? ? attrs[10].strip : '-', | |
:last_name => !attrs[11].strip.empty? ? attrs[11].strip : '-', | |
:title => !attrs[12].strip.empty? ? attrs[12].strip : nil, | |
:source => !attrs[47].strip.empty? ? attrs[47].strip : 'other', | |
:email => !attrs[37].strip.empty? ? attrs[37].strip : nil, | |
:alt_email => !attrs[38].strip.empty? ? attrs[38].strip : nil, | |
:phone => !attrs[31].strip.empty? ? attrs[31].strip : (!attrs[32].strip.empty? ? attrs[32].strip : nil), | |
:office => !attrs[32].strip.empty? ? attrs[32].strip : nil, | |
:fax => !attrs[33].strip.empty? ? attrs[33].strip : nil, | |
:home => !attrs[34].strip.empty? ? attrs[34].strip : nil, | |
:mobile => !attrs[35].strip.empty? ? attrs[35].strip : nil, | |
:pager => !attrs[36].strip.empty? ? attrs[36].strip : nil, | |
:business_address_attributes => { | |
:street1 => !attrs[19].strip.empty? ? attrs[19].strip : nil, | |
:street2 => !attrs[20].strip.empty? ? attrs[20].strip : nil, | |
:city => !attrs[21].strip.empty? ? attrs[21].strip : nil, | |
:state => !attrs[22].strip.empty? ? attrs[22].strip : nil, | |
:zipcode => !attrs[23].strip.empty? ? attrs[23].strip : nil, | |
:country => !attrs[24].strip.empty? ? attrs[24].strip : country_based_on_state_abbreviation(attrs[22].strip), | |
:address_type => 'Business' | |
}, | |
:created_at => attrs[3].strip, | |
:created_by => (!created_by.nil? ? created_by.id : weblead_user.id), | |
:updated_at => attrs[4].strip, | |
:updated_by => (!updated_by.nil? ? updated_by.id : weblead_user.id) | |
) | |
account.contacts << contact | |
account.save | |
end | |
## Associate lead comments | |
id = type = nil | |
if (attrs[1].to_i == -3 || attrs[1].to_i == -4) | |
id = !account.nil? ? account.id : lead.id | |
type = !account.nil? ? 'Account' : 'Lead' | |
else | |
id = lead.id | |
type = 'Lead' | |
end | |
comments = Comment.find_all_by_old_user_id(attrs[0].strip) | |
comments.each do |comment| | |
comment.update_attributes( | |
:commentable_id => id, | |
:commentable_type => type | |
) | |
end | |
progress.inc | |
end | |
end | |
progress.finish | |
end | |
desc "Import users and dealers" | |
task :users => :environment do | |
#### users.txt format: | |
# Column Headers | |
# | |
# id | |
# username | |
# password | |
# usertype | |
# status | |
# adddate | |
# editdate | |
# adduser | |
# edituser | |
# company | |
# contact_first | |
# contact_last | |
# contact_title | |
# 13 contact_address1 | |
# 14 contact_address2 | |
# 15 contact_city | |
# 16 contact_state | |
# 17 contact_zip | |
# 18 contact_country | |
# 19 home_address1 | |
# 20 home_address2 | |
# 21 home_city | |
# 22 home_state | |
# 23 home_zip | |
# 24 home_country | |
# 25 ship_address1 | |
# 26 ship_address2 | |
# 27 ship_city | |
# 28 ship_state | |
# 29 ship_zip | |
# 30 ship_country | |
# Main | |
# Office | |
# Fax | |
# Home | |
# Mobile | |
# Pager | |
# email1 | |
# email2 | |
# website | |
### | |
file = File.open("db/users.txt") | |
count = `wc -l db/users.txt` | |
puts "Importing #{count.to_i} Users..." | |
progress = ProgressBar.new('Users', count.to_i) | |
weblead_user = User.find_by_username('weblead') | |
file.each do |line| | |
attrs = line.split("|") | |
if (!attrs[1].strip.eql?('username')) | |
created_by = User.find_by_username(attrs[7].strip) | |
updated_by = User.find_by_username(attrs[8].strip) | |
user = User.find_by_username(attrs[1].strip) || User.new #User.find_or_initialize_by_username(attrs[1].strip) | |
user.update_attributes( | |
:username => attrs[1].strip, | |
:password => !attrs[2].strip.to_s.empty? ? attrs[2].strip : attrs[1].strip, | |
:first_name => !attrs[10].strip.empty? ? attrs[10].strip : nil, | |
:last_name => !attrs[11].strip.empty? ? attrs[11].strip : nil, | |
:title => !attrs[12].strip.empty? ? attrs[12].strip : nil, | |
:company => !attrs[9].strip.empty? ? attrs[9].strip : nil, | |
:email => !attrs[37].strip.to_s.empty? ? attrs[37].strip : '', | |
:phone => !attrs[31].strip.to_s.empty? ? attrs[31].strip : nil, | |
:mobile => !attrs[35].strip.to_s.empty? ? attrs[35].strip : nil, | |
:office => !attrs[32].strip.to_s.empty? ? attrs[32].strip : nil, | |
:fax => !attrs[33].strip.to_s.empty? ? attrs[33].strip : nil, | |
:home => !attrs[34].strip.to_s.empty? ? attrs[34].strip : nil, | |
:pager => !attrs[36].strip.to_s.empty? ? attrs[36].strip : nil, | |
:alt_email => !attrs[38].strip.to_s.empty? ? attrs[38].strip : nil, | |
:website => !attrs[39].strip.to_s.empty? ? attrs[39].strip : nil, | |
:created_at => !attrs[5].strip.to_s.empty? ? attrs[5].strip : "now()", | |
:created_by => !created_by.nil? ? created_by.id : weblead_user.id, | |
:updated_at => !attrs[6].strip.to_s.empty? ? attrs[6].strip : nil, | |
:updated_by => !updated_by.nil? ? updated_by.id : weblead_user.id, | |
:home_address_attributes => { | |
:street1 => !attrs[19].strip.to_s.empty? ? attrs[19].strip : nil, | |
:street2 => !attrs[20].strip.to_s.empty? ? attrs[20].strip : nil, | |
:city => !attrs[21].strip.to_s.empty? ? attrs[21].strip : nil, | |
:state => !attrs[22].strip.to_s.empty? ? attrs[22].strip : nil, | |
:zipcode => !attrs[23].strip.to_s.empty? ? attrs[23].strip : nil, | |
:country => !attrs[24].strip.to_s.empty? ? correct_country(attrs[24].strip) : nil, | |
:address_type => !attrs[19].strip.to_s.empty? ? 'Home' : nil | |
} | |
) | |
user.update_attribute(:suspended_at, attrs[4]) if !attrs[4].to_s.empty? | |
## Admin | |
if attrs[3].strip.eql?("Admin") || attrs[3].strip.eql?("Master") | |
user.update_attribute(:admin, true) # Mass assignments don't work for :admin because of the attr_protected | |
user.roles = ['admin'] if attrs[3].strip.eql?("Admin") # Set the roles_mask | |
user.roles = ['dealer'] unless attrs[3].strip.eql?("Admin") # Set the roles_mask | |
user.save | |
## Dealer | |
else | |
user.update_attribute(:admin, false) | |
user.roles = ['dealer'] # Set the roles_mask | |
user.save | |
## Create the Dealer Account and associate the contact | |
company = attrs[9].strip.to_s | |
if (!company.empty?) | |
dealer = Dealer.find_by_name(company) || Dealer.new | |
dealer.update_attributes( | |
:name => company, | |
:user_id => !created_by.nil? ? created_by.id : weblead_user.id, | |
:access => 'Private', | |
:website => !attrs[39].strip.to_s.empty? ? attrs[39].strip : nil, | |
:toll_free_phone => !attrs[32].strip.to_s.empty? ? attrs[32].strip : nil, | |
:phone => !attrs[31].strip.to_s.empty? ? attrs[31].strip : nil, | |
:fax => !attrs[33].strip.to_s.empty? ? attrs[33].strip : nil, | |
:email => !attrs[37].strip.to_s.empty? ? attrs[37].strip : '', | |
:deleted_at => attrs[5] == -1 ? 'NOW()' : nil, | |
:created_at => !attrs[5].strip.to_s.empty? ? attrs[5].strip : 'NOW()', | |
:updated_at => !attrs[6].strip.to_s.empty? ? attrs[6].strip : nil, | |
:billing_address_attributes => { | |
:street1 => !attrs[13].strip.to_s.empty? ? attrs[13].strip : nil, | |
:street2 => !attrs[14].strip.to_s.empty? ? attrs[14].strip : nil, | |
:city => !attrs[15].strip.to_s.empty? ? attrs[15].strip : nil, | |
:state => !attrs[16].strip.to_s.empty? ? attrs[16].strip : nil, | |
:zipcode => !attrs[17].strip.to_s.empty? ? attrs[17].strip : nil, | |
:country => !attrs[18].strip.to_s.empty? ? correct_country(attrs[18].strip) : nil, | |
:address_type => !attrs[13].strip.to_s.empty? ? 'Billing' : nil | |
}, | |
:shipping_address_attributes => { | |
:street1 => !attrs[25].strip.to_s.empty? ? attrs[25].strip : nil, | |
:street2 => !attrs[26].strip.to_s.empty? ? attrs[26].strip : nil, | |
:city => !attrs[27].strip.to_s.empty? ? attrs[27].strip : nil, | |
:state => !attrs[28].strip.to_s.empty? ? attrs[28].strip : nil, | |
:zipcode => !attrs[29].strip.to_s.empty? ? attrs[29].strip : nil, | |
:country => !attrs[30].strip.to_s.empty? ? correct_country(attrs[30].strip) : nil, | |
:address_type => !attrs[25].strip.to_s.empty? ? 'Shipping' : nil | |
} | |
) | |
# Link dealer and contact (aka user) | |
user.update_attribute(:dealer_id, dealer.id) | |
end | |
end | |
progress.inc | |
end | |
end | |
progress.finish | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment