Class: Order::Mover
- Inherits:
-
BaseService
- Object
- BaseService
- Order::Mover
- Defined in:
- app/services/order/mover.rb
Overview
Responsible for moving orders between customers
Defined Under Namespace
Classes: OrderMoverResult
Constant Summary collapse
- ORDER_VALID_STATES =
Recognised order valid states.
%w[cart pending pending_payment pending_release_authorization in_cr_hold].freeze
Instance Attribute Summary collapse
-
#errors ⇒ Object
readonly
Returns the value of attribute errors.
-
#logger ⇒ Object
readonly
Returns the value of attribute logger.
-
#order ⇒ Object
readonly
Returns the value of attribute order.
Attributes inherited from BaseService
Class Method Summary collapse
-
.order_moveable?(order) ⇒ Boolean
Boolean tests if an order move is possible (before considering a customer).
-
.order_moveable_report(order) ⇒ Object
Validates if the order can be moved (checks the order state, type, etc) returns an array of strings.
Instance Method Summary collapse
-
#initialize(order, options = {}) ⇒ Mover
constructor
A new instance of Mover.
-
#move_to(customer: nil, opportunity: nil) ⇒ Object
An order can be moved straight up to another customer under specific circumstances 1.
Methods inherited from BaseService
#log_debug, #log_error, #log_info, #log_warning, #process, #tagged_logger
Constructor Details
#initialize(order, options = {}) ⇒ Mover
Returns a new instance of Mover.
15 16 17 18 19 |
# File 'app/services/order/mover.rb', line 15 def initialize(order, = {}) @options = @order = order @logger = [:logger] || Rails.logger end |
Instance Attribute Details
#errors ⇒ Object (readonly)
Returns the value of attribute errors.
4 5 6 |
# File 'app/services/order/mover.rb', line 4 def errors @errors end |
#logger ⇒ Object (readonly)
Returns the value of attribute logger.
4 5 6 |
# File 'app/services/order/mover.rb', line 4 def logger @logger end |
#order ⇒ Object (readonly)
Returns the value of attribute order.
4 5 6 |
# File 'app/services/order/mover.rb', line 4 def order @order end |
Class Method Details
.order_moveable?(order) ⇒ Boolean
Boolean tests if an order move is possible (before considering a customer)
32 33 34 |
# File 'app/services/order/mover.rb', line 32 def self.order_moveable?(order) order_moveable_report(order).empty? end |
.order_moveable_report(order) ⇒ Object
Validates if the order can be moved (checks the order state, type, etc)
returns an array of strings
23 24 25 26 27 28 29 |
# File 'app/services/order/mover.rb', line 23 def self.order_moveable_report(order) errors = [] errors << "Cannot move an order unless state is in #{ORDER_VALID_STATES.join(', ')}." unless order.state.in?(ORDER_VALID_STATES) errors << "Cannot move an order with room presents. Use an opportunity mover for those cases" if order.room_configurations.present? errors << "Store Transfer orders are not supported" if order.is_store_transfer? errors end |
Instance Method Details
#move_to(customer: nil, opportunity: nil) ⇒ Object
An order can be moved straight up to another customer under specific circumstances
- Order is on hold or draft
- Order is unattached to an opportunity
- Target customer has the same catalog (however could be improved with catalog remapper)
4.
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'app/services/order/mover.rb', line 41 def move_to(customer: nil, opportunity: nil) @errors = [] success = false @errors << "Specify an opportunity or a customer at a minimum" if customer.nil? && opportunity.nil? customer ||= opportunity&.customer @errors << "Cannot move an order in a different catalog" unless @order.customer.catalog_id == customer&.catalog_id @errors << "Order already belongs to customer #{customer.reference_number}" if @order.customer == customer @errors << "Opportunity specified does not belong to target customer" if opportunity && opportunity.customer != customer @errors += self.class.order_moveable_report(@order) return OrderMoverResult.new(success: false, order: @order, errors: @errors) if @errors.present? Order.transaction do original_customer_nbr = @order.customer.reference_number begin @order.primary_sales_rep_id = customer.primary_sales_rep_id @order.secondary_sales_rep_id = customer.secondary_sales_rep_id @order.local_sales_rep_id ||= customer.local_sales_rep_id @order.customer = customer @order.contact_id = nil @order.spiff_rep_id = nil @order.opportunity = opportunity # Duplicate the shipping address in the target customer if @order.shipping_address na = @order.shipping_address.dup na.party_id = nil # Make this a one time address na.save! @order.shipping_address = na end @order.deliveries.each do |d| d.destination_address = @order.shipping_address d.save! end @order.reset_discount(autosave: false, reset_item_pricing: true) @order.save! @order.quick_note "Order was moved from customer #{original_customer_nbr}" success = true rescue StandardError => e @errors << "Order could not be moved: #{e}" @logger.error e.inspect raise ActiveRecord::Rollback end end OrderMoverResult.new(success: success, order: @order, errors: @errors) end |