mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
49 lines
1.4 KiB
Ruby
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
|