Class: SpreeCmCommissioner::CalculateDistance

Inherits:
Object
  • Object
show all
Includes:
Spree::ServiceModule::Base
Defined in:
app/services/spree_cm_commissioner/calculate_distance.rb

Instance Method Summary collapse

Instance Method Details

#call(pickups_attributes: [], dropoffs_attributes: [], pickup_oob_confirmed: false, dropoff_oob_confirmed: false, trip_id: nil) ⇒ Object



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
# File 'app/services/spree_cm_commissioner/calculate_distance.rb', line 52

def call(
  pickups_attributes: [],
  dropoffs_attributes: [],
  pickup_oob_confirmed: false,
  dropoff_oob_confirmed: false,
  trip_id: nil
)
  return failure(nil, 'trip_id is required') if trip_id.blank?

  @trip_id = trip_id
  @pickup_oob_confirmed = pickup_oob_confirmed
  @dropoff_oob_confirmed = dropoff_oob_confirmed

  @pickups_points = Array(pickups_attributes).compact
  @dropoffs_points = Array(dropoffs_attributes).compact

  @final_destination = @dropoffs_points.last

  return failure(nil, 'Trip origin location is not configured') if origin_point.blank?
  return failure(nil, 'Trip destination location is not configured') if destination_point.blank?
  return failure(nil, 'At least one dropoff is required') if @dropoffs_points.empty?

  # Step 1: Calculate base route (no waypoints) - this is the reference for detour calculations
  base_km = calculate_base_route_km
  return failure(nil, 'Unable to calculate base route') if base_km.nil?

  # Step 2: Calculate full route with all waypoints (optimized order)
  details_ctx = fetch_full_route_details
  return failure(nil, details_ctx.error || 'Unable to calculate route') unless details_ctx.success?

  # Step 3: Calculate detour distances and derive extra chargeable km
  detour_distances = calculate_detour_distances
  build_result(details_ctx, base_km, detour_distances)
rescue StandardError => e
  failure(nil, e.message)
end