spree_cm_commissioner 2.5.1.pre.pre5 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_and_build_gem.yml +2 -2
  3. data/Gemfile.lock +1 -1
  4. data/app/controllers/spree/api/v2/storefront/popular_route_places_controller.rb +2 -2
  5. data/app/controllers/spree/api/v2/storefront/transit/draft_orders_controller.rb +4 -4
  6. data/app/controllers/spree/transit/trips_controller.rb +3 -3
  7. data/app/finders/spree_cm_commissioner/places/find_with_route.rb +12 -12
  8. data/app/finders/spree_cm_commissioner/routes/find_popular.rb +35 -19
  9. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +4 -11
  10. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +1 -10
  11. data/app/{services/spree_cm_commissioner/transit_order/create.rb → interactors/spree_cm_commissioner/transit/draft_order_creator.rb} +16 -13
  12. data/app/interactors/spree_cm_commissioner/trip_clone_creator.rb +3 -4
  13. data/app/interactors/spree_cm_commissioner/trip_stops_creator.rb +2 -2
  14. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +2 -2
  15. data/app/jobs/spree_cm_commissioner/transit/route_fulfilled_order_count_incrementer_job.rb +10 -0
  16. data/app/jobs/spree_cm_commissioner/transit/route_order_count_incrementer_job.rb +10 -0
  17. data/app/jobs/spree_cm_commissioner/transit/route_previous_trip_count_decrementer_job.rb +13 -0
  18. data/app/jobs/spree_cm_commissioner/transit/route_trip_count_decrementer_job.rb +10 -0
  19. data/app/jobs/spree_cm_commissioner/transit/route_trip_count_incrementer_job.rb +10 -0
  20. data/app/models/concerns/spree_cm_commissioner/route_order_countable.rb +2 -2
  21. data/app/models/concerns/spree_cm_commissioner/route_trip_count_callbacks.rb +48 -0
  22. data/app/models/spree_cm_commissioner/place.rb +8 -5
  23. data/app/models/spree_cm_commissioner/product_decorator.rb +0 -1
  24. data/app/models/spree_cm_commissioner/route.rb +5 -45
  25. data/app/models/spree_cm_commissioner/trip.rb +33 -8
  26. data/app/models/spree_cm_commissioner/trip_connection.rb +36 -0
  27. data/app/models/spree_cm_commissioner/trip_stop.rb +2 -16
  28. data/app/models/spree_cm_commissioner/vendor_decorator.rb +1 -3
  29. data/app/models/spree_cm_commissioner/vendor_route.rb +9 -0
  30. data/app/queries/spree_cm_commissioner/trip_query.rb +2 -2
  31. data/app/serializers/spree_cm_commissioner/v2/storefront/route_serializer.rb +1 -2
  32. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_stop_serializer.rb +1 -1
  33. data/app/services/spree_cm_commissioner/{route_metrics/update_route_metrics.rb → routes/base_update_order_metrics.rb} +16 -11
  34. data/app/services/spree_cm_commissioner/routes/decrement_previous_trip_count.rb +30 -0
  35. data/app/services/spree_cm_commissioner/routes/decrement_trip_count.rb +33 -0
  36. data/app/services/spree_cm_commissioner/{route_metrics/increase_fulfilled_order_count.rb → routes/increment_fulfilled_order_count.rb} +3 -3
  37. data/app/services/spree_cm_commissioner/{route_metrics/increase_order_count.rb → routes/increment_order_count.rb} +3 -3
  38. data/app/services/spree_cm_commissioner/routes/increment_trip_count.rb +33 -0
  39. data/app/views/spree/transit/trip_stops/index.html.erb +2 -4
  40. data/app/views/spree_cm_commissioner/guest_mailer/send_ticket_to_guest.html.erb +1 -0
  41. data/config/initializers/spree_permitted_attributes.rb +0 -11
  42. data/config/routes.rb +0 -6
  43. data/lib/spree_cm_commissioner/test_helper/factories/route_factory.rb +6 -7
  44. data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +6 -0
  45. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +1 -4
  46. data/lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb +1 -3
  47. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +0 -2
  48. data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +0 -22
  49. data/lib/spree_cm_commissioner/version.rb +1 -1
  50. data/lib/spree_cm_commissioner.rb +0 -4
  51. metadata +19 -39
  52. data/app/controllers/spree/api/v2/tenant/popular_route_places_controller.rb +0 -60
  53. data/app/controllers/spree/api/v2/tenant/routes_controller.rb +0 -50
  54. data/app/controllers/spree/api/v2/tenant/transit/draft_orders_controller.rb +0 -46
  55. data/app/finders/spree_cm_commissioner/route_metrics/find_popular.rb +0 -44
  56. data/app/finders/spree_cm_commissioner/routes/find.rb +0 -94
  57. data/app/jobs/spree_cm_commissioner/route_metrics/decrease_trip_count_job.rb +0 -10
  58. data/app/jobs/spree_cm_commissioner/route_metrics/increase_fulfilled_order_count_job.rb +0 -10
  59. data/app/jobs/spree_cm_commissioner/route_metrics/increase_order_count_job.rb +0 -10
  60. data/app/jobs/spree_cm_commissioner/route_metrics/increase_trip_count_job.rb +0 -10
  61. data/app/models/spree_cm_commissioner/route_metric.rb +0 -21
  62. data/app/models/spree_cm_commissioner/route_photo.rb +0 -12
  63. data/app/serializers/spree/v2/tenant/transit_cart_serializer.rb +0 -11
  64. data/app/serializers/spree_cm_commissioner/v2/storefront/route_metric_serializer.rb +0 -13
  65. data/app/serializers/spree_cm_commissioner/v2/storefront/transit_line_item_serializer.rb +0 -17
  66. data/app/services/spree_cm_commissioner/route_metrics/decrease_trip_count.rb +0 -31
  67. data/app/services/spree_cm_commissioner/route_metrics/increase_trip_count.rb +0 -31
  68. data/app/services/spree_cm_commissioner/routes/create.rb +0 -51
  69. data/app/services/spree_cm_commissioner/routes/update.rb +0 -25
  70. data/app/services/spree_cm_commissioner/trips/create_single_leg.rb +0 -128
  71. data/app/services/spree_cm_commissioner/trips/service_calendars/create_or_update.rb +0 -54
  72. data/app/services/spree_cm_commissioner/trips/update_single_leg.rb +0 -88
  73. data/app/services/spree_cm_commissioner/trips/variants/create.rb +0 -103
  74. data/db/migrate/20251224033103_migrate_cm_routes_to_cm_route_metrics.rb +0 -17
  75. data/db/migrate/20251224033910_migrate_cm_vendor_routes_to_cm_routes.rb +0 -30
  76. data/db/migrate/20260105072450_migrate_cm_trip_stops_to_support_trip_connection.rb +0 -12
  77. data/db/migrate/20260108101406_add_allow_booking_to_cm_trips.rb +0 -5
  78. data/lib/spree_cm_commissioner/test_helper/factories/route_metric_factory.rb +0 -12
  79. data/lib/spree_cm_commissioner/test_helper/factories/route_photo_factory.rb +0 -5
  80. data/lib/spree_cm_commissioner/transit/route_stop.rb +0 -61
  81. data/lib/spree_cm_commissioner/transit/route_stop_collection.rb +0 -203
  82. data/lib/spree_cm_commissioner/transit/trip_form.rb +0 -105
  83. data/lib/spree_cm_commissioner/transit/trip_stop_form.rb +0 -67
@@ -2,6 +2,7 @@ module SpreeCmCommissioner
2
2
  class Trip < Base
3
3
  include SpreeCmCommissioner::StoreMetadata
4
4
  include SpreeCmCommissioner::RouteType
5
+ include SpreeCmCommissioner::RouteTripCountCallbacks
5
6
 
6
7
  attr_accessor :hours, :minutes, :seconds
7
8
 
@@ -14,9 +15,7 @@ module SpreeCmCommissioner
14
15
 
15
16
  # before create, duplicate seat layout from vehicle_type if present
16
17
  before_validation :duplicate_seat_layout_from_vehicle, if: -> { seat_layout.nil? && vehicle_type&.seat_layout.present? }
17
-
18
- after_create :increment_route_metric_trip_count
19
- before_destroy :decrement_route_metric_trip_count
18
+ before_validation :assign_route_and_vendor_route, if: :changed_route_attributes?
20
19
 
21
20
  belongs_to :vendor, class_name: 'Spree::Vendor', inverse_of: :trips, optional: false
22
21
  belongs_to :product, class_name: 'Spree::Product', inverse_of: :trip, optional: false
@@ -27,7 +26,7 @@ module SpreeCmCommissioner
27
26
 
28
27
  belongs_to :origin_place, class_name: 'SpreeCmCommissioner::Place', optional: false
29
28
  belongs_to :destination_place, class_name: 'SpreeCmCommissioner::Place', optional: false
30
- belongs_to :route, class_name: 'SpreeCmCommissioner::Route', inverse_of: :trips, optional: true
29
+ belongs_to :route, inverse_of: :trips
31
30
 
32
31
  has_many :trip_blazer_queries, as: :queryable, class_name: 'SpreeCmCommissioner::BlazerQueryable'
33
32
  has_many :blazer_queries, through: :trip_blazer_queries, source: :blazer_query, class_name: 'Blazer::Query'
@@ -49,6 +48,10 @@ module SpreeCmCommissioner
49
48
  self.whitelisted_ransackable_associations = %w[product vehicle vehicle_type]
50
49
  self.whitelisted_ransackable_attributes = %w[origin_place_id destination_place_id]
51
50
 
51
+ def changed_route_attributes?
52
+ origin_place_id_changed? || destination_place_id_changed? || vendor_id_changed?
53
+ end
54
+
52
55
  def convert_duration_to_seconds
53
56
  return if hours.blank? && minutes.blank? && seconds.blank?
54
57
 
@@ -101,12 +104,34 @@ module SpreeCmCommissioner
101
104
  )
102
105
  end
103
106
 
104
- def increment_route_metric_trip_count
105
- SpreeCmCommissioner::RouteMetrics::IncreaseTripCountJob.perform_later(trip_id: id)
107
+ # Check if any of the route context attributes are changing
108
+ def will_route_context_change?
109
+ # Returns true if any of the route context attributes will change on save.
110
+ will_save_change_to_route_id? ||
111
+ will_save_change_to_origin_place_id? ||
112
+ will_save_change_to_destination_place_id? ||
113
+ will_save_change_to_vendor_id?
114
+ end
115
+
116
+ def changed_route_context?
117
+ saved_change_to_route_id? ||
118
+ saved_change_to_origin_place_id? ||
119
+ saved_change_to_destination_place_id? ||
120
+ saved_change_to_vendor_id?
106
121
  end
107
122
 
108
- def decrement_route_metric_trip_count
109
- SpreeCmCommissioner::RouteMetrics::DecreaseTripCountJob.perform_later(trip_id: id)
123
+ # Find or create the Route for this trip (by origin/destination) and
124
+ # assign it to the trip. Also populate a default route_name from the
125
+ # product when the route is new/blank.
126
+ def assign_route_and_vendor_route
127
+ route = SpreeCmCommissioner::Route.find_or_create_by!(
128
+ origin_place_id: origin_place_id,
129
+ destination_place_id: destination_place_id
130
+ )
131
+ route.route_name = product.name if route.route_name.blank?
132
+ route.save! if route.changed?
133
+
134
+ self.route_id = route.id
110
135
  end
111
136
  end
112
137
  end
@@ -0,0 +1,36 @@
1
+ module SpreeCmCommissioner
2
+ class TripConnection < Base
3
+ belongs_to :from_trip, class_name: 'SpreeCmCommissioner::Trip'
4
+ belongs_to :to_trip, class_name: 'SpreeCmCommissioner::Trip'
5
+
6
+ validate :both_trip_cannot_be_the_same
7
+ before_validation :calculate_connection_time_minutes
8
+ validates :from_trip_id, uniqueness: { scope: :to_trip_id }
9
+
10
+ private
11
+
12
+ def calculate_connection_time_minutes
13
+ return if from_trip.nil? || to_trip.nil?
14
+
15
+ arrival_seconds = from_trip.arrival_time.seconds_since_midnight
16
+ departure_seconds = to_trip.departure_time.seconds_since_midnight
17
+
18
+ layover_seconds = departure_seconds - arrival_seconds
19
+ layover_seconds += 86_400 if layover_seconds.negative?
20
+
21
+ connection_time_in_minutes = layover_seconds / 60
22
+
23
+ if connection_time_in_minutes.between?(0, 180)
24
+ self.connection_time_minutes = connection_time_in_minutes.to_i
25
+ else
26
+ errors.add(:base, 'Connection time must be less than 3 hours')
27
+ end
28
+ end
29
+
30
+ def both_trip_cannot_be_the_same
31
+ return unless from_trip.id == to_trip.id
32
+
33
+ errors.add(:base, 'Both trip cannot be the same')
34
+ end
35
+ end
36
+ end
@@ -1,39 +1,25 @@
1
1
  module SpreeCmCommissioner
2
2
  class TripStop < Base
3
3
  acts_as_list column: :sequence, scope: :trip_id
4
+ enum :stop_type, { boarding: 0, drop_off: 1 }
4
5
 
5
6
  belongs_to :trip, class_name: 'SpreeCmCommissioner::Trip', optional: false
6
7
  belongs_to :stop_place, class_name: 'SpreeCmCommissioner::Place', optional: false
7
8
  belongs_to :location_place, class_name: 'SpreeCmCommissioner::Place', optional: false
8
9
 
9
- belongs_to :board_to_trip, class_name: 'SpreeCmCommissioner::Trip', optional: true
10
-
11
10
  before_validation :set_stop_name
12
-
13
11
  validates :stop_place_id, uniqueness: { scope: :trip_id }
14
- validate :boarding_trip_requires_allow_boarding
15
-
16
- scope :boarding, -> { where(allow_boarding: true) }
17
- scope :drop_off, -> { where(allow_drop_off: true) }
18
12
 
19
13
  def set_stop_name
20
14
  self.stop_name = stop_place.name if stop_place.present?
21
15
  end
22
16
 
23
17
  def self.ransackable_attributes(_auth_object = nil)
24
- %w[stop_name allow_boarding allow_drop_off]
18
+ %w[stop_name stop_type]
25
19
  end
26
20
 
27
21
  def self.ransackable_associations(_auth_object = nil)
28
22
  ['stop_place']
29
23
  end
30
-
31
- private
32
-
33
- def boarding_trip_requires_allow_boarding
34
- return unless board_to_trip_id.present? && !allow_boarding?
35
-
36
- errors.add(:board_to_trip, 'requires allow_boarding to be true')
37
- end
38
24
  end
39
25
  end
@@ -82,9 +82,7 @@ module SpreeCmCommissioner
82
82
  base.has_many :subscriptions, through: :customers, class_name: 'SpreeCmCommissioner::Subscription'
83
83
  base.has_many :subscription_orders, through: :subscriptions, class_name: 'Spree::Order', source: :orders
84
84
  base.has_many :promotion_categories, class_name: 'Spree::PromotionCategory', foreign_key: :vendor_id, dependent: :destroy
85
- base.has_many :routes, class_name: 'SpreeCmCommissioner::Route', dependent: :destroy
86
- base.has_many :popular_routes, -> { order(fulfilled_order_count: :desc, order_count: :desc) },
87
- class_name: 'SpreeCmCommissioner::Route'
85
+ base.has_many :vendor_routes, class_name: 'SpreeCmCommissioner::VendorRoute'
88
86
 
89
87
  base.has_many :homepage_section_relatables,
90
88
  as: :relatable,
@@ -0,0 +1,9 @@
1
+ module SpreeCmCommissioner
2
+ class VendorRoute < Base
3
+ belongs_to :vendor, class_name: 'Spree::Vendor', optional: false
4
+ belongs_to :route, class_name: 'SpreeCmCommissioner::Route', optional: false
5
+
6
+ has_many :trips, -> (vr) { where(vendor_id: vr.vendor_id, route_id: vr.route_id) }, class_name: 'SpreeCmCommissioner::Trip'
7
+ validates :vendor_id, uniqueness: { scope: :route_id }
8
+ end
9
+ end
@@ -77,8 +77,8 @@ module SpreeCmCommissioner
77
77
 
78
78
  scope
79
79
  .joins(<<~SQL.squish)
80
- INNER JOIN cm_trip_stops AS boarding ON boarding.trip_id = cm_trips.id AND boarding.allow_boarding = true
81
- INNER JOIN cm_trip_stops AS drop_off ON drop_off.trip_id = cm_trips.id AND drop_off.allow_drop_off = true
80
+ INNER JOIN cm_trip_stops AS boarding ON boarding.trip_id = cm_trips.id AND boarding.stop_type = 0
81
+ INNER JOIN cm_trip_stops AS drop_off ON drop_off.trip_id = cm_trips.id AND drop_off.stop_type = 1
82
82
  INNER JOIN cm_places AS origin_places ON origin_places.id = cm_trips.origin_place_id
83
83
  INNER JOIN cm_places AS dest_places ON dest_places.id = cm_trips.destination_place_id
84
84
  INNER JOIN spree_variants AS master ON master.product_id = cm_trips.product_id AND master.is_master = true
@@ -2,9 +2,8 @@ module SpreeCmCommissioner
2
2
  module V2
3
3
  module Storefront
4
4
  class RouteSerializer < BaseSerializer
5
- attributes :route_name, :route_type, :short_name
5
+ attributes :route_name
6
6
 
7
- has_many :route_photos, serializer: ::SpreeCmCommissioner::V2::Storefront::AssetSerializer
8
7
  has_one :origin_place, serializer: ::Spree::V2::Storefront::PlaceSerializer
9
8
  has_one :destination_place, serializer: ::Spree::V2::Storefront::PlaceSerializer
10
9
  end
@@ -2,7 +2,7 @@ module SpreeCmCommissioner
2
2
  module V2
3
3
  module Storefront
4
4
  class TripStopSerializer < BaseSerializer
5
- attributes :id, :allow_boarding, :allow_drop_off, :stop_name, :arrival_time, :departure_time
5
+ attributes :id, :stop_type, :stop_name, :arrival_time, :departure_time
6
6
 
7
7
  has_one :stop_place, serializer: ::SpreeCmCommissioner::V2::Storefront::TripPlaceSerializer
8
8
  end
@@ -1,6 +1,6 @@
1
1
  module SpreeCmCommissioner
2
- module RouteMetrics
3
- class UpdateRouteMetrics
2
+ module Routes
3
+ class BaseUpdateOrderMetrics
4
4
  attr_reader :order, :attribute
5
5
 
6
6
  SUPPORTED_ATTRIBUTES = %i[order_count fulfilled_order_count].freeze
@@ -31,21 +31,26 @@ module SpreeCmCommissioner
31
31
  trip = product&.trip
32
32
  return unless trip
33
33
 
34
- route_metric = find_or_create_route_metric_for_trip(trip)
35
- increment_route_by(route_metric, line_item.quantity)
36
-
37
- route = trip.route
38
- increment_route_by(route, line_item.quantity) if route
34
+ route = find_or_create_route_for_trip(trip)
35
+ ensure_trip_route(trip, route)
36
+ increment_route_by(route, line_item.quantity)
39
37
  end
40
38
 
41
- def find_or_create_route_metric_for_trip(trip)
42
- SpreeCmCommissioner::RouteMetric.find_or_create_by(
39
+ def find_or_create_route_for_trip(trip)
40
+ SpreeCmCommissioner::Route.find_or_create_by(
43
41
  origin_place_id: trip.origin_place_id,
44
- destination_place_id: trip.destination_place_id,
45
- route_type: trip.route_type
42
+ destination_place_id: trip.destination_place_id
46
43
  )
47
44
  end
48
45
 
46
+ def ensure_trip_route(trip, route)
47
+ trip_route_id = trip.respond_to?(:route_id) ? trip.route_id : nil
48
+
49
+ return unless trip.respond_to?(:update_column) && trip_route_id != route.id
50
+
51
+ trip.update_column(:route_id, route.id) # rubocop:disable Rails/SkipsModelValidations
52
+ end
53
+
49
54
  def increment_route_by(route, qty)
50
55
  route.with_lock do
51
56
  current_value = route.public_send(attribute) || 0
@@ -0,0 +1,30 @@
1
+ module SpreeCmCommissioner
2
+ module Routes
3
+ class DecrementPreviousTripCount
4
+ prepend ::Spree::ServiceModule::Base
5
+
6
+ def call(previous_route_id:)
7
+ previous_route = SpreeCmCommissioner::Route.find_by(id: previous_route_id)
8
+ return failure(nil, 'Route not found') unless previous_route
9
+
10
+ if previous_route.vendors.exists?
11
+
12
+ # Build a trip-like object that responds to :route and :vendor so the delegated
13
+ # service can locate vendor routes correctly.
14
+ trip_like = Struct.new(:route, :vendor).new(previous_route, previous_route.vendors.first)
15
+ result = SpreeCmCommissioner::Routes::DecrementTripCount.call(trip: trip_like)
16
+ return result if result.failure?
17
+ else
18
+ previous_route.with_lock do
19
+ new_count = [previous_route.trip_count.to_i - 1, 0].max
20
+ previous_route.update!(trip_count: new_count)
21
+ end
22
+ end
23
+
24
+ success(previous_route: previous_route)
25
+ rescue StandardError => e
26
+ failure(nil, e.message)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ module SpreeCmCommissioner
2
+ module Routes
3
+ class DecrementTripCount
4
+ prepend ::Spree::ServiceModule::Base
5
+
6
+ def call(trip:)
7
+ return failure(nil, 'Trip not found') unless trip
8
+
9
+ vendor = trip.vendor
10
+ return failure(nil, 'Vendor not found') unless vendor
11
+
12
+ ActiveRecord::Base.transaction do
13
+ route = trip.route
14
+
15
+ route.update!(trip_count: [route.trip_count - 1, 0].max)
16
+
17
+ vendor_route = locate_vendor_route(vendor: vendor, route: route)
18
+ vendor_route&.update!(trip_count: [vendor_route.trip_count - 1, 0].max)
19
+ end
20
+
21
+ success(trip: trip)
22
+ rescue StandardError => e
23
+ failure(nil, e.message)
24
+ end
25
+
26
+ private
27
+
28
+ def locate_vendor_route(vendor:, route:)
29
+ vendor.vendor_routes.find_by(route_id: route.id)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,12 +1,12 @@
1
1
  module SpreeCmCommissioner
2
- module RouteMetrics
3
- class IncreaseFulfilledOrderCount
2
+ module Routes
3
+ class IncrementFulfilledOrderCount
4
4
  prepend ::Spree::ServiceModule::Base
5
5
 
6
6
  def call(order:)
7
7
  return failure(nil, 'Order not found') unless order
8
8
 
9
- SpreeCmCommissioner::RouteMetrics::UpdateRouteMetrics
9
+ SpreeCmCommissioner::Routes::BaseUpdateOrderMetrics
10
10
  .call(order: order, attribute: :fulfilled_order_count)
11
11
 
12
12
  success(order: order)
@@ -1,12 +1,12 @@
1
1
  module SpreeCmCommissioner
2
- module RouteMetrics
3
- class IncreaseOrderCount
2
+ module Routes
3
+ class IncrementOrderCount
4
4
  prepend ::Spree::ServiceModule::Base
5
5
 
6
6
  def call(order:)
7
7
  return failure(nil, 'Order not found') unless order
8
8
 
9
- SpreeCmCommissioner::RouteMetrics::UpdateRouteMetrics
9
+ SpreeCmCommissioner::Routes::BaseUpdateOrderMetrics
10
10
  .new(order: order, attribute: :order_count)
11
11
  .call
12
12
 
@@ -0,0 +1,33 @@
1
+ module SpreeCmCommissioner
2
+ module Routes
3
+ class IncrementTripCount
4
+ prepend ::Spree::ServiceModule::Base
5
+
6
+ def call(trip:)
7
+ return failure(nil, 'Trip not found') unless trip
8
+
9
+ vendor = trip.vendor
10
+ return failure(nil, 'Vendor not found') unless vendor
11
+
12
+ ActiveRecord::Base.transaction do
13
+ route = trip.route
14
+
15
+ route.update!(trip_count: route.trip_count + 1)
16
+
17
+ vendor_route = find_or_create_vendor_route(vendor: vendor, route: route)
18
+ vendor_route.update!(trip_count: vendor_route.trip_count + 1)
19
+ end
20
+
21
+ success(trip: trip)
22
+ rescue StandardError => e
23
+ failure(nil, e.message)
24
+ end
25
+
26
+ private
27
+
28
+ def find_or_create_vendor_route(vendor:, route:)
29
+ vendor.vendor_routes.find_or_create_by!(route_id: route.id)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -9,8 +9,7 @@
9
9
  <tr data-hook="option_header">
10
10
  <th class="no-border handel-head"></th>
11
11
  <th><%= Spree.t(:name) %></th>
12
- <th><%= Spree.t(:allow_boarding) %></th>
13
- <th><%= Spree.t(:allow_drop_off) %></th>
12
+ <th><%= Spree.t(:stop_type) %></th>
14
13
  <th><%= Spree.t(:sequence) %></th>
15
14
  <th><%= Spree.t(:created_at) %></th>
16
15
  </tr>
@@ -22,8 +21,7 @@
22
21
  <%= svg_icon name: "grip-vertical.svg", width: '18', height: '18' %>
23
22
  </td>
24
23
  <td><%= stop.stop_name %></td>
25
- <td> <%= stop.allow_boarding ? 'Yes' : 'No' %></td>
26
- <td> <%= stop.allow_drop_off ? 'Yes' : 'No' %></td>
24
+ <td> <%= stop.stop_type %></td>
27
25
  <td> <%= stop.sequence %></td>
28
26
  <td> <%= stop.created_at.to_date %></td>
29
27
  </tr>
@@ -151,6 +151,7 @@
151
151
  <% @trip.trip_stops.order(:sequence).each do |stop| %>
152
152
  <tr>
153
153
  <td>
154
+ <span class="stop-type <%= stop.stop_type %>"><%= stop.stop_type.to_s.titleize %></span>
154
155
  <div class="stop-name"><strong><%= stop.stop_name %></strong></div>
155
156
  <% if stop.respond_to?(:location_place) && stop.location_place.present? %>
156
157
  <% if stop.location_place.respond_to?(:address) && stop.location_place.address.present? %>
@@ -1,8 +1,5 @@
1
1
  module Spree
2
2
  module PermittedAttributes
3
- ATTRIBUTES << :route_attributes unless ATTRIBUTES.include?(:route_attributes)
4
- mattr_reader :route_attributes
5
-
6
3
  @@vendor_attributes << :logo
7
4
 
8
5
  # Permitted all guest attributes for now as permitting only some guest attributes is not working by design
@@ -89,13 +86,5 @@ module Spree
89
86
  originator_type
90
87
  originator_id
91
88
  ]
92
-
93
- @@route_attributes = %i[
94
- route_name
95
- short_name
96
- vendor_id
97
- route_type
98
- route_stops
99
- ]
100
89
  end
101
90
  end
data/config/routes.rb CHANGED
@@ -560,12 +560,6 @@ Spree::Core::Engine.add_routes do
560
560
  resources :trip_places, only: :index
561
561
  resources :trip_search, only: [:index]
562
562
  resources :trips, only: %i[show]
563
- resources :popular_route_places, only: [:index]
564
- resources :routes, only: [:index]
565
-
566
- namespace :transit do
567
- resources :draft_orders, only: %i[create]
568
- end
569
563
 
570
564
  namespace :intercity_taxi do
571
565
  resource :draft_orders, only: %i[create update]
@@ -1,11 +1,10 @@
1
1
  FactoryBot.define do
2
- factory :cm_route, class: SpreeCmCommissioner::Route do
3
- association :vendor, factory: :vendor
4
- association :tenant, factory: :cm_tenant
5
- association :origin_place, factory: :cm_place
6
- association :destination_place, factory: :cm_place
7
-
2
+ factory :cm_route, class: 'SpreeCmCommissioner::Route' do
8
3
  sequence(:route_name) { |n| "Route #{n}" }
9
- sequence(:short_name) { |n| "R#{n}" }
4
+ origin_place_id { create(:cm_place).id }
5
+ destination_place_id { create(:cm_place).id }
6
+ trip_count { 0 }
7
+ order_count { 0 }
8
+ fulfilled_order_count { 0 }
10
9
  end
11
10
  end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :cm_trip_connection, class: SpreeCmCommissioner::TripConnection do
3
+ from_trip_id { create(:cm_trip) }
4
+ to_trip_id { create(:cm_trip) }
5
+ end
6
+ end
@@ -11,10 +11,7 @@ FactoryBot.define do
11
11
  association :vehicle, factory: :cm_vehicle
12
12
  association :origin_place, factory: :cm_place
13
13
  association :destination_place, factory: :cm_place
14
-
15
- # Don't create route by default to avoid uniqueness conflicts
16
- # Tests that need these should create them explicitly
17
- route { nil }
14
+ association :route, factory: :cm_route
18
15
  end
19
16
 
20
17
  factory :cm_trip_with_seat_counts, parent: :cm_trip do
@@ -4,9 +4,7 @@ FactoryBot.define do
4
4
  association :stop_place, factory: :cm_place
5
5
  association :location_place, factory: :cm_place
6
6
 
7
- allow_boarding { true }
8
- allow_drop_off { true }
9
-
7
+ stop_type { :boarding }
10
8
  stop_name { stop_place.name }
11
9
 
12
10
  arrival_time { Time.current }
@@ -1,6 +1,5 @@
1
1
  FactoryBot.define do
2
2
  factory :cm_transit_vendor, parent: :vendor do
3
- from_email { FFaker::Internet.email } # required only when tenant exist.
4
3
  sequence(:name) { |n| "#{FFaker::Company.name} #{n}#{Kernel.rand(9999)}" }
5
4
  state { :active }
6
5
  primary_product_type { :transit }
@@ -8,7 +7,6 @@ FactoryBot.define do
8
7
 
9
8
  factory :cm_vendor, parent: :vendor do
10
9
  sequence(:name) { |n| "#{FFaker::Company.name} #{n}#{Kernel.rand(9999)}" }
11
- from_email { FFaker::Internet.email } # required only when tenant exist.
12
10
  state { :active }
13
11
  default_state_id { Spree::State.first&.id }
14
12
  primary_product_type { :ecommerce }
@@ -7,17 +7,6 @@ FactoryBot.define do
7
7
  position { FFaker::Number.number }
8
8
 
9
9
  place_type { :location }
10
-
11
- transient do
12
- place_name { nil }
13
- end
14
-
15
- before :create do |vendor_place, evaluator|
16
- if evaluator.place_name.present?
17
- vendor_place.place.name = evaluator.place_name
18
- vendor_place.place.save!
19
- end
20
- end
21
10
  end
22
11
 
23
12
  factory :cm_vendor_place, class: SpreeCmCommissioner::VendorPlace do
@@ -41,16 +30,5 @@ FactoryBot.define do
41
30
  place_type { :location }
42
31
  location { nil }
43
32
  end
44
-
45
- transient do
46
- place_name { nil }
47
- end
48
-
49
- before :create do |vendor_place, evaluator|
50
- if evaluator.place_name.present?
51
- vendor_place.place.name = evaluator.place_name
52
- vendor_place.place.save!
53
- end
54
- end
55
33
  end
56
34
  end
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '2.5.1.pre.pre5'.freeze
2
+ VERSION = '2.5.1'.freeze
3
3
 
4
4
  module_function
5
5
 
@@ -23,10 +23,6 @@ require 'spree_cm_commissioner/trip_query_result'
23
23
  require 'spree_cm_commissioner/cached_inventory_item'
24
24
  require 'spree_cm_commissioner/transit/leg'
25
25
  require 'spree_cm_commissioner/transit/seat_selection'
26
- require 'spree_cm_commissioner/transit/route_stop'
27
- require 'spree_cm_commissioner/transit/route_stop_collection'
28
- require 'spree_cm_commissioner/transit/trip_form'
29
- require 'spree_cm_commissioner/transit/trip_stop_form'
30
26
  require 'spree_cm_commissioner/intercity_taxi/map_place'
31
27
  require 'spree_cm_commissioner/distance'
32
28