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.
- checksums.yaml +4 -4
- data/.github/workflows/test_and_build_gem.yml +2 -2
- data/Gemfile.lock +1 -1
- data/app/controllers/spree/api/v2/storefront/popular_route_places_controller.rb +2 -2
- data/app/controllers/spree/api/v2/storefront/transit/draft_orders_controller.rb +4 -4
- data/app/controllers/spree/transit/trips_controller.rb +3 -3
- data/app/finders/spree_cm_commissioner/places/find_with_route.rb +12 -12
- data/app/finders/spree_cm_commissioner/routes/find_popular.rb +35 -19
- data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +4 -11
- data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +1 -10
- data/app/{services/spree_cm_commissioner/transit_order/create.rb → interactors/spree_cm_commissioner/transit/draft_order_creator.rb} +16 -13
- data/app/interactors/spree_cm_commissioner/trip_clone_creator.rb +3 -4
- data/app/interactors/spree_cm_commissioner/trip_stops_creator.rb +2 -2
- data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +2 -2
- data/app/jobs/spree_cm_commissioner/transit/route_fulfilled_order_count_incrementer_job.rb +10 -0
- data/app/jobs/spree_cm_commissioner/transit/route_order_count_incrementer_job.rb +10 -0
- data/app/jobs/spree_cm_commissioner/transit/route_previous_trip_count_decrementer_job.rb +13 -0
- data/app/jobs/spree_cm_commissioner/transit/route_trip_count_decrementer_job.rb +10 -0
- data/app/jobs/spree_cm_commissioner/transit/route_trip_count_incrementer_job.rb +10 -0
- data/app/models/concerns/spree_cm_commissioner/route_order_countable.rb +2 -2
- data/app/models/concerns/spree_cm_commissioner/route_trip_count_callbacks.rb +48 -0
- data/app/models/spree_cm_commissioner/place.rb +8 -5
- data/app/models/spree_cm_commissioner/product_decorator.rb +0 -1
- data/app/models/spree_cm_commissioner/route.rb +5 -45
- data/app/models/spree_cm_commissioner/trip.rb +33 -8
- data/app/models/spree_cm_commissioner/trip_connection.rb +36 -0
- data/app/models/spree_cm_commissioner/trip_stop.rb +2 -16
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +1 -3
- data/app/models/spree_cm_commissioner/vendor_route.rb +9 -0
- data/app/queries/spree_cm_commissioner/trip_query.rb +2 -2
- data/app/serializers/spree_cm_commissioner/v2/storefront/route_serializer.rb +1 -2
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_stop_serializer.rb +1 -1
- data/app/services/spree_cm_commissioner/{route_metrics/update_route_metrics.rb → routes/base_update_order_metrics.rb} +16 -11
- data/app/services/spree_cm_commissioner/routes/decrement_previous_trip_count.rb +30 -0
- data/app/services/spree_cm_commissioner/routes/decrement_trip_count.rb +33 -0
- data/app/services/spree_cm_commissioner/{route_metrics/increase_fulfilled_order_count.rb → routes/increment_fulfilled_order_count.rb} +3 -3
- data/app/services/spree_cm_commissioner/{route_metrics/increase_order_count.rb → routes/increment_order_count.rb} +3 -3
- data/app/services/spree_cm_commissioner/routes/increment_trip_count.rb +33 -0
- data/app/views/spree/transit/trip_stops/index.html.erb +2 -4
- data/app/views/spree_cm_commissioner/guest_mailer/send_ticket_to_guest.html.erb +1 -0
- data/config/initializers/spree_permitted_attributes.rb +0 -11
- data/config/routes.rb +0 -6
- data/lib/spree_cm_commissioner/test_helper/factories/route_factory.rb +6 -7
- data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +6 -0
- data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +1 -4
- data/lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb +1 -3
- data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +0 -2
- data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +0 -22
- data/lib/spree_cm_commissioner/version.rb +1 -1
- data/lib/spree_cm_commissioner.rb +0 -4
- metadata +19 -39
- data/app/controllers/spree/api/v2/tenant/popular_route_places_controller.rb +0 -60
- data/app/controllers/spree/api/v2/tenant/routes_controller.rb +0 -50
- data/app/controllers/spree/api/v2/tenant/transit/draft_orders_controller.rb +0 -46
- data/app/finders/spree_cm_commissioner/route_metrics/find_popular.rb +0 -44
- data/app/finders/spree_cm_commissioner/routes/find.rb +0 -94
- data/app/jobs/spree_cm_commissioner/route_metrics/decrease_trip_count_job.rb +0 -10
- data/app/jobs/spree_cm_commissioner/route_metrics/increase_fulfilled_order_count_job.rb +0 -10
- data/app/jobs/spree_cm_commissioner/route_metrics/increase_order_count_job.rb +0 -10
- data/app/jobs/spree_cm_commissioner/route_metrics/increase_trip_count_job.rb +0 -10
- data/app/models/spree_cm_commissioner/route_metric.rb +0 -21
- data/app/models/spree_cm_commissioner/route_photo.rb +0 -12
- data/app/serializers/spree/v2/tenant/transit_cart_serializer.rb +0 -11
- data/app/serializers/spree_cm_commissioner/v2/storefront/route_metric_serializer.rb +0 -13
- data/app/serializers/spree_cm_commissioner/v2/storefront/transit_line_item_serializer.rb +0 -17
- data/app/services/spree_cm_commissioner/route_metrics/decrease_trip_count.rb +0 -31
- data/app/services/spree_cm_commissioner/route_metrics/increase_trip_count.rb +0 -31
- data/app/services/spree_cm_commissioner/routes/create.rb +0 -51
- data/app/services/spree_cm_commissioner/routes/update.rb +0 -25
- data/app/services/spree_cm_commissioner/trips/create_single_leg.rb +0 -128
- data/app/services/spree_cm_commissioner/trips/service_calendars/create_or_update.rb +0 -54
- data/app/services/spree_cm_commissioner/trips/update_single_leg.rb +0 -88
- data/app/services/spree_cm_commissioner/trips/variants/create.rb +0 -103
- data/db/migrate/20251224033103_migrate_cm_routes_to_cm_route_metrics.rb +0 -17
- data/db/migrate/20251224033910_migrate_cm_vendor_routes_to_cm_routes.rb +0 -30
- data/db/migrate/20260105072450_migrate_cm_trip_stops_to_support_trip_connection.rb +0 -12
- data/db/migrate/20260108101406_add_allow_booking_to_cm_trips.rb +0 -5
- data/lib/spree_cm_commissioner/test_helper/factories/route_metric_factory.rb +0 -12
- data/lib/spree_cm_commissioner/test_helper/factories/route_photo_factory.rb +0 -5
- data/lib/spree_cm_commissioner/transit/route_stop.rb +0 -61
- data/lib/spree_cm_commissioner/transit/route_stop_collection.rb +0 -203
- data/lib/spree_cm_commissioner/transit/trip_form.rb +0 -105
- 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,
|
|
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
|
-
|
|
105
|
-
|
|
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
|
-
|
|
109
|
-
|
|
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
|
|
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 :
|
|
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.
|
|
81
|
-
INNER JOIN cm_trip_stops AS drop_off ON drop_off.trip_id = cm_trips.id AND drop_off.
|
|
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
|
|
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, :
|
|
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
|
|
3
|
-
class
|
|
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
|
-
|
|
35
|
-
|
|
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
|
|
42
|
-
SpreeCmCommissioner::
|
|
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
|
|
3
|
-
class
|
|
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::
|
|
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
|
|
3
|
-
class
|
|
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::
|
|
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(:
|
|
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.
|
|
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
|
-
|
|
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
|
|
@@ -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
|
-
|
|
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
|
|
@@ -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
|
|