Files
openfoodnetwork/app/services/customer_syncer.rb
2023-09-14 16:25:49 +09:00

49 lines
1.4 KiB
Ruby

# frozen_string_literal: true
# Create, find and update customer records.
#
# P.S.: I almost couldn't resist to call this CustomerService.
class CustomerSyncer
def self.find_and_update_customer(order)
find_customer(order).tap { |customer| synchronise_email(order, customer) }
end
def self.find_customer(order)
order.user&.customers&.of(order.distributor)&.first ||
Customer.of(order.distributor).find_by(email: customer_email(order))
end
def self.synchronise_email(order, customer)
email = order.user&.email
return unless email && customer && email != customer.email
duplicate = Customer.find_by(email:, enterprise: order.distributor)
if duplicate.present?
Spree::Order.where(customer_id: duplicate.id).update_all(customer_id: customer.id)
Subscription.where(customer_id: duplicate.id).update_all(customer_id: customer.id)
duplicate.destroy
end
customer.update(email:)
end
def self.create_customer(order)
Customer.create(
enterprise: order.distributor,
email: customer_email(order),
user: order.user,
first_name: order.bill_address&.first_name.to_s,
last_name: order.bill_address&.last_name.to_s,
bill_address: order.bill_address&.clone,
ship_address: order.ship_address&.clone
)
end
def self.customer_email(order)
(order.user&.email || order.email)&.downcase
end
end