openfoodfoundation/openfoodnetwork

View on GitHub
script/import-customers.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

# Read customer entries in CSV format from STDIN and create those records in
# the database. Example:
#
#   rails runner script/import-customers.rb 3359 < FND-customers-Emails.csv
#
# This script was written for a once-off import. If we want to perform this
# task more often, we can make it more flexible and eventually add a
# feature to the user interface.
require 'csv'

enterprise_id = ARGV.first

def check_enterprise_exists(id)
  enterprise = Enterprise.find(id)
  puts "Importing customers for #{enterprise.name}:"
end

def import_customer(row, enterprise_id)
  email = row["Email"].downcase
  tag = row["Tag"]

  print email
  customer = find_or_create_customer(email, enterprise_id)
  add_tag(customer, tag)
  puts ""
end

def find_or_create_customer(email, enterprise_id)
  Customer.find_or_create_by(
    email: email,
    enterprise_id: enterprise_id,
  ) { print " - newly imported" }
  print " - user exists" if Spree::User.where(email: email).exists?
end

def add_tag(customer, tag)
  return if tag.blank?

  customer.tag_list.add(tag)
  customer.save!
end

check_enterprise_exists(enterprise_id)

CSV($stdin, headers: true, row_sep: "\r\n") do |csv|
  csv.each do |row|
    import_customer(row, enterprise_id)
  end
end