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 =
%w(cart pending pending_payment pending_release_authorization in_cr_hold)
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.
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, #options, #process, #tagged_logger
Constructor Details
#initialize(order, options = {}) ⇒ Mover
Returns a new instance of Mover.
13 14 15 16 17 |
# File 'app/services/order/mover.rb', line 13 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)
36 37 38 |
# File 'app/services/order/mover.rb', line 36 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
21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'app/services/order/mover.rb', line 21 def self.order_moveable_report(order) errors = [] unless order.state.in?(ORDER_VALID_STATES) errors << "Cannot move an order unless state is in #{ORDER_VALID_STATES.join(', ')}." end if order.room_configurations.present? errors << "Cannot move an order with room presents. Use an opportunity mover for those cases" end if order.is_store_transfer? errors << "Store Transfer orders are not supported" end 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.
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 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'app/services/order/mover.rb', line 45 def move_to(customer: nil, opportunity: nil) @errors = [] success = false if customer.nil? && opportunity.nil? @errors << "Specify an opportunity or a customer at a minimum" end customer ||= opportunity&.customer unless @order.customer.catalog_id == customer&.catalog_id @errors << "Cannot move an order in a different catalog" end if @order.customer == customer @errors << "Order already belongs to customer #{customer.reference_number}" end if opportunity && opportunity.customer != customer @errors << "Opportunity specified does not belong to target customer" end @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 => exc @errors << "Order could not be moved: #{exc.to_s}" @logger.error exc.inspect raise ActiveRecord::Rollback end end OrderMoverResult.new(success: success, order: @order, errors: @errors) end |