diff --git a/db/migrate/20220105085730_migrate_customers_data.rb b/db/migrate/20220105085730_migrate_customers_data.rb index 096465d7b7..7e7578e441 100644 --- a/db/migrate/20220105085730_migrate_customers_data.rb +++ b/db/migrate/20220105085730_migrate_customers_data.rb @@ -11,14 +11,47 @@ class MigrateCustomersData < ActiveRecord::Migration[6.1] end def migrate_customer_name_data! - Customer.where(first_name: "", last_name: "").where.not(name: [nil, ""]).find_each do |customer| - name_words = customer.name.split(' ') - next if name_words.empty? + customers_with_bill_addresses.find_each do |customer| + if bill_address_name_matches?(customer) + apply_name_from_bill_address!(customer) + next + end - customer.update( - first_name: name_words.first, - last_name: name_words[1..].join(' ') - ) + split_customer_name!(customer) + end + + customers_without_bill_addresses.find_each do |customer| + split_customer_name!(customer) end end + + def customers_with_bill_addresses + Customer.joins(:bill_address).where(first_name: "", last_name: "").where.not(name: [nil, ""]) + end + + def customers_without_bill_addresses + Customer.where(bill_address_id: nil, first_name: "", last_name: "").where.not(name: [nil, ""]) + end + + def bill_address_name_matches?(customer) + customer.name.delete(" ") == (customer.bill_address.firstname + customer.bill_address.lastname).delete(" ") + end + + def split_customer_name!(customer) + return if (name_parts = customer.name.split(' ')).empty? + + customer.update_columns( + first_name: name_parts.first, + last_name: name_parts[1..].join(' '), + updated_at: Time.zone.now + ) + end + + def apply_name_from_bill_address!(customer) + customer.update_columns( + first_name: customer.bill_address.firstname, + last_name: customer.bill_address.lastname, + updated_at: Time.zone.now + ) + end end diff --git a/spec/migrations/split_customer_names_spec.rb b/spec/migrations/split_customer_names_spec.rb new file mode 100644 index 0000000000..cef063a581 --- /dev/null +++ b/spec/migrations/split_customer_names_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_relative '../../db/migrate/20220105085730_migrate_customers_data' + +describe MigrateCustomersData do + let!(:customer1) { + create(:customer, name: "Timmy Test", first_name: "", last_name: "", bill_address: nil) + } + let!(:customer2) { + create(:customer, name: "Frank Lee Ridiculous", first_name: "", last_name: "", + bill_address: create(:address, first_name: "Frank Lee", last_name: "Ridiculous")) + } + let!(:customer3) { + create(:customer, name: "Shia Le Boeuf", first_name: "", last_name: "", + bill_address: create(:address, first_name: "Shia", last_name: "Le Boeuf")) + } + let!(:customer4) { + create(:customer, name: "No Eyed Deer", first_name: "", last_name: "", bill_address: nil) + } + let!(:customer5) { + create(:customer, name: " Space Invader ", first_name: "", last_name: "", bill_address: nil) + } + let!(:customer6) { + create(:customer, name: "How Many Names Do You Need?", first_name: "", last_name: "", bill_address: nil) + } + let!(:customer7) { + create(:customer, name: "Customer Name", first_name: "", last_name: "", + bill_address: create(:address, first_name: "Different", last_name: "AddressName")) + } + + it "migrates customer names" do + subject.up + + expect([customer1.reload.first_name, customer1.last_name]).to eq ["Timmy", "Test"] + expect([customer2.reload.first_name, customer2.last_name]).to eq ["Frank Lee", "Ridiculous"] + expect([customer3.reload.first_name, customer3.last_name]).to eq ["Shia", "Le Boeuf"] + expect([customer4.reload.first_name, customer4.last_name]).to eq ["No", "Eyed Deer"] + expect([customer5.reload.first_name, customer5.last_name]).to eq ["Space", "Invader"] + expect([customer6.reload.first_name, customer6.last_name]).to eq ["How", "Many Names Do You Need?"] + expect([customer7.reload.first_name, customer7.last_name]).to eq ["Customer", "Name"] + end +end