mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2024-11-29 10:24:20 +01:00
60 lines
1.7 KiB
Ruby
60 lines
1.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# module definition
|
|
module Cart; end
|
|
|
|
# Provides methods to update the customer of the given cart
|
|
class Cart::SetCustomerService
|
|
# @param operator [User]
|
|
def initialize(operator)
|
|
@operator = operator
|
|
end
|
|
|
|
# @param order[Order]
|
|
# @param customer [User]
|
|
def call(order, customer)
|
|
return order unless @operator.privileged?
|
|
|
|
return order unless order.operator_profile_id.blank? || order.operator_profile_id == @operator.invoicing_profile.id
|
|
|
|
return order unless order.state == 'cart'
|
|
|
|
ActiveRecord::Base.transaction do
|
|
order.statistic_profile_id = customer.statistic_profile.id
|
|
order.operator_profile_id = @operator.invoicing_profile.id
|
|
order.order_items.each do |item|
|
|
update_item_user(item, customer)
|
|
end
|
|
unset_offer(order, customer)
|
|
Cart::UpdateTotalService.new.call(order)
|
|
order.save
|
|
end
|
|
order.reload
|
|
end
|
|
|
|
private
|
|
|
|
# If the operator is also the customer, he cannot offer items to himself, so we unset all the offers
|
|
# @param order[Order]
|
|
# @param customer [User]
|
|
def unset_offer(order, customer)
|
|
return unless @operator == customer
|
|
|
|
order.order_items.each do |item|
|
|
item.is_offered = false
|
|
item.save
|
|
end
|
|
end
|
|
|
|
# @param item[OrderItem]
|
|
# @param customer [User]
|
|
def update_item_user(item, customer)
|
|
return unless item.orderable_type.match(/^CartItem::/)
|
|
|
|
item.orderable.update_with_context({
|
|
customer_profile_id: customer.invoicing_profile.id,
|
|
operator_profile_id: @operator.invoicing_profile.id
|
|
}, item.order.order_items)
|
|
end
|
|
end
|