spree_cm_commissioner 2.5.12 → 2.5.13.pre.pre2
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/Gemfile.lock +1 -1
- data/app/controllers/spree/api/v2/tenant/guests_controller.rb +9 -0
- data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +8 -1
- data/app/models/spree_cm_commissioner/pricing_actions/create_guest_adjustments.rb +27 -11
- data/app/models/spree_cm_commissioner/pricing_model_handler/order.rb +1 -0
- data/app/models/spree_cm_commissioner/pricing_rules/nationality.rb +33 -28
- data/app/models/spree_cm_commissioner/route.rb +2 -0
- data/app/models/spree_cm_commissioner/trip.rb +4 -3
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +1 -0
- data/app/overrides/spree/admin/vendors/_form/service_origin.html.erb.deface +6 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/transit_line_item_serializer.rb +2 -1
- data/app/services/spree_cm_commissioner/cart/recalculate_decorator.rb +5 -0
- data/app/services/spree_cm_commissioner/intercity_taxi_order/create.rb +6 -3
- data/app/services/spree_cm_commissioner/routes/create.rb +1 -0
- data/app/services/spree_cm_commissioner/transit_order/create.rb +4 -3
- data/app/services/spree_cm_commissioner/trips/create_single_leg.rb +19 -2
- data/config/initializers/spree_permitted_attributes.rb +1 -0
- data/db/migrate/20260204100000_add_service_origin_to_spree_vendors.rb +5 -0
- data/db/migrate/20260204100001_add_service_origin_to_cm_routes.rb +5 -0
- data/db/migrate/20260204100002_add_service_origin_to_cm_trips.rb +5 -0
- data/lib/spree_cm_commissioner/test_helper/factories/pricing_rule_factory.rb +1 -1
- data/lib/spree_cm_commissioner/version.rb +1 -1
- metadata +8 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 04eebbcbb9d83ad9530360d3a22e480a61ccb4b29f4c7a4e189e8b5ae90fa3ce
|
|
4
|
+
data.tar.gz: ed548b05a0f06e308bcdb09c7afe8d1c48c7eb5ed30cf8096f721681f75f2122
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4c2583b7b967f27e1d5d71b979936ef27e0da0f516f16368899d9b8bd38954ff7db95ab901d1f1d0497af7726d906a618f90ada65901954d6e3f7be86209fe53
|
|
7
|
+
data.tar.gz: f4c154d199890f8550df41a68105ff71b266ad8e56148b371ea7049fb4a28e2f10e42bd2ead83052ee5e8d2001d509e4782df01b3ad0b9e0c5fff21a0243b73c
|
data/Gemfile.lock
CHANGED
|
@@ -36,6 +36,7 @@ module Spree
|
|
|
36
36
|
resource.save!
|
|
37
37
|
run_dynamic_fields(resource)
|
|
38
38
|
resource.save_and_move_to_next_stage
|
|
39
|
+
recalculate_cart(resource.line_item)
|
|
39
40
|
end
|
|
40
41
|
|
|
41
42
|
render_serialized_payload(201) { serialize_resource(resource) }
|
|
@@ -49,6 +50,7 @@ module Spree
|
|
|
49
50
|
resource.assign_attributes(guest_params.except(:guest_dynamic_fields_attributes))
|
|
50
51
|
resource.save!
|
|
51
52
|
resource.save_and_move_to_next_stage
|
|
53
|
+
recalculate_cart(resource.line_item)
|
|
52
54
|
end
|
|
53
55
|
|
|
54
56
|
render_serialized_payload { serialize_resource(resource) }
|
|
@@ -111,6 +113,13 @@ module Spree
|
|
|
111
113
|
def handle_record_not_found(exception)
|
|
112
114
|
render_error_payload({ base: [exception.message] }, 404)
|
|
113
115
|
end
|
|
116
|
+
|
|
117
|
+
def recalculate_cart(line_item)
|
|
118
|
+
::Spree::Dependencies.cart_recalculate_service.constantize.call(
|
|
119
|
+
line_item: line_item,
|
|
120
|
+
order: spree_current_order
|
|
121
|
+
)
|
|
122
|
+
end
|
|
114
123
|
end
|
|
115
124
|
end
|
|
116
125
|
end
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
# 'direction': 'outbound' or 'inbound',
|
|
6
6
|
# 'trip_id': 123,
|
|
7
7
|
# 'boarding_trip_stop_id': 456,
|
|
8
|
-
# 'drop_off_trip_stop_id': 789
|
|
8
|
+
# 'drop_off_trip_stop_id': 789,
|
|
9
|
+
# 'service_origin_id': 101
|
|
9
10
|
# }
|
|
10
11
|
#
|
|
11
12
|
# Direction:
|
|
@@ -26,6 +27,7 @@ module SpreeCmCommissioner
|
|
|
26
27
|
validates :trip_id, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
|
|
27
28
|
validates :boarding_trip_stop_id, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
|
|
28
29
|
validates :drop_off_trip_stop_id, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
|
|
30
|
+
validates :service_origin_id, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
|
|
29
31
|
|
|
30
32
|
validates :passenger_count, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
|
|
31
33
|
|
|
@@ -56,6 +58,7 @@ module SpreeCmCommissioner
|
|
|
56
58
|
def connected_trip_id = private_metadata['connected_trip_id']
|
|
57
59
|
def boarding_trip_stop_id = private_metadata['boarding_trip_stop_id']&.to_i
|
|
58
60
|
def drop_off_trip_stop_id = private_metadata['drop_off_trip_stop_id']&.to_i
|
|
61
|
+
def service_origin_id = private_metadata['service_origin_id']&.to_i
|
|
59
62
|
|
|
60
63
|
def passenger_count = public_metadata['passenger_count']&.to_i
|
|
61
64
|
|
|
@@ -112,6 +115,10 @@ module SpreeCmCommissioner
|
|
|
112
115
|
set_private_metadata_value('drop_off_trip_stop_id', value)
|
|
113
116
|
end
|
|
114
117
|
|
|
118
|
+
def service_origin_id=(value)
|
|
119
|
+
set_private_metadata_value('service_origin_id', value)
|
|
120
|
+
end
|
|
121
|
+
|
|
115
122
|
def passenger_count=(value)
|
|
116
123
|
set_public_metadata_value('passenger_count', value)
|
|
117
124
|
end
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
module SpreeCmCommissioner
|
|
2
2
|
module PricingActions
|
|
3
3
|
class CreateGuestAdjustments < SpreeCmCommissioner::PricingAction
|
|
4
|
-
def perform(
|
|
5
|
-
|
|
6
|
-
return if line_item.guests.blank?
|
|
4
|
+
def perform(options = {})
|
|
5
|
+
line_items = extract_line_items(options)
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
return if
|
|
7
|
+
return if pricing_rule_group.pricing_rules.blank?
|
|
8
|
+
return if line_items.blank?
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
line_items.each do |line_item|
|
|
11
|
+
perform_for_line_item(line_item)
|
|
13
12
|
end
|
|
14
|
-
|
|
15
|
-
return if total_amount.zero?
|
|
16
|
-
|
|
17
|
-
create_adjustment(line_item, total_amount)
|
|
18
13
|
end
|
|
19
14
|
|
|
20
15
|
private
|
|
21
16
|
|
|
17
|
+
def extract_line_items(options)
|
|
18
|
+
return [options] if options.respond_to?(:guests)
|
|
19
|
+
|
|
20
|
+
Array(options[:line_items])
|
|
21
|
+
end
|
|
22
|
+
|
|
22
23
|
def find_eligible_guests(line_item)
|
|
23
24
|
line_item.guests.select do |guest|
|
|
24
25
|
guest_eligible_for_all_rules?(guest)
|
|
@@ -47,6 +48,21 @@ module SpreeCmCommissioner
|
|
|
47
48
|
mandatory: true
|
|
48
49
|
)
|
|
49
50
|
end
|
|
51
|
+
|
|
52
|
+
def perform_for_line_item(line_item)
|
|
53
|
+
return if line_item.guests.blank?
|
|
54
|
+
|
|
55
|
+
eligible_guests = find_eligible_guests(line_item)
|
|
56
|
+
return if eligible_guests.empty?
|
|
57
|
+
|
|
58
|
+
total_amount = eligible_guests.sum do |guest|
|
|
59
|
+
compute_guest_amount(line_item, guest)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
return if total_amount.zero?
|
|
63
|
+
|
|
64
|
+
create_adjustment(line_item, total_amount)
|
|
65
|
+
end
|
|
50
66
|
end
|
|
51
67
|
end
|
|
52
68
|
end
|
|
@@ -12,6 +12,7 @@ module SpreeCmCommissioner
|
|
|
12
12
|
return unless order&.persisted?
|
|
13
13
|
|
|
14
14
|
order.adjustments.pricing_action.delete_all
|
|
15
|
+
order.line_items.each { |li| li.adjustments.pricing_action.delete_all }
|
|
15
16
|
|
|
16
17
|
order.connected_line_item_ids.each do |group_ids|
|
|
17
18
|
line_items_in_group = order.line_items.where(id: group_ids)
|
|
@@ -5,49 +5,54 @@ module SpreeCmCommissioner
|
|
|
5
5
|
|
|
6
6
|
store_accessor :private_metadata, :rule_type, :nationalities
|
|
7
7
|
|
|
8
|
-
def eligible?(line_item)
|
|
8
|
+
def eligible?(line_item)
|
|
9
9
|
return false if nationalities.blank? || line_item.guests.blank?
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
guest_nationalities = line_item.guests.map { |g| guest_nationality(g) }.compact
|
|
13
|
-
|
|
14
|
-
return false if guest_nationalities.empty?
|
|
11
|
+
guests = line_item.guests
|
|
15
12
|
|
|
16
13
|
case rule_type
|
|
17
|
-
|
|
18
|
-
when '
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
guest_nationalities.any? { |n| targets.include?(n) }
|
|
22
|
-
when 'none'
|
|
23
|
-
guest_nationalities.any? { |n| targets.exclude?(n) }
|
|
24
|
-
else
|
|
25
|
-
false
|
|
14
|
+
when 'all' then guests.all? { |g| match?(g) }
|
|
15
|
+
when 'any' then guests.any? { |g| match?(g) }
|
|
16
|
+
when 'none' then guests.any? { |g| !match?(g) }
|
|
17
|
+
else false
|
|
26
18
|
end
|
|
27
19
|
end
|
|
28
20
|
|
|
29
21
|
def guest_eligible?(guest)
|
|
30
22
|
return false if nationalities.blank?
|
|
31
23
|
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
matched = match?(guest)
|
|
25
|
+
rule_type == 'none' ? !matched : matched
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
34
29
|
|
|
35
|
-
|
|
30
|
+
def match?(guest)
|
|
31
|
+
id = guest_nationality_id(guest)
|
|
32
|
+
return target_ids.include?(id) if id.present?
|
|
36
33
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
when 'none'
|
|
41
|
-
targets.exclude?(guest_nat)
|
|
42
|
-
else
|
|
43
|
-
false
|
|
44
|
-
end
|
|
34
|
+
group = guest_nationality_group(guest)
|
|
35
|
+
|
|
36
|
+
group.present? && group.to_sym == expected_group(guest)
|
|
45
37
|
end
|
|
46
38
|
|
|
47
|
-
|
|
39
|
+
def target_ids
|
|
40
|
+
@target_ids ||= Array(nationalities).map(&:to_i)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def guest_nationality_id(guest)
|
|
44
|
+
guest.saved_guest&.nationality&.id || guest.nationality&.id
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def guest_nationality_group(guest)
|
|
48
|
+
guest.saved_guest&.nationality_group || guest.nationality_group
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def expected_group(guest)
|
|
52
|
+
service_origin_id = guest.line_item&.service_origin_id
|
|
53
|
+
return :foreigner if service_origin_id.blank?
|
|
48
54
|
|
|
49
|
-
|
|
50
|
-
(guest.nationality&.name || guest.saved_guest&.nationality&.name).to_s.downcase
|
|
55
|
+
target_ids.include?(service_origin_id) ? :local : :foreigner
|
|
51
56
|
end
|
|
52
57
|
end
|
|
53
58
|
end
|
|
@@ -5,6 +5,8 @@ module SpreeCmCommissioner
|
|
|
5
5
|
belongs_to :vendor, class_name: 'Spree::Vendor', optional: false
|
|
6
6
|
belongs_to :tenant, class_name: 'SpreeCmCommissioner::Tenant', optional: true
|
|
7
7
|
|
|
8
|
+
belongs_to :service_origin, class_name: 'Spree::Taxon', optional: true
|
|
9
|
+
|
|
8
10
|
belongs_to :origin_place, class_name: 'SpreeCmCommissioner::Place', optional: false
|
|
9
11
|
belongs_to :destination_place, class_name: 'SpreeCmCommissioner::Place', optional: false
|
|
10
12
|
|
|
@@ -14,13 +14,14 @@ module SpreeCmCommissioner
|
|
|
14
14
|
|
|
15
15
|
# before create, duplicate seat layout from vehicle_type if present
|
|
16
16
|
before_validation :duplicate_seat_layout_from_vehicle, if: -> { seat_layout.nil? && vehicle_type&.seat_layout.present? }
|
|
17
|
-
|
|
18
17
|
after_create :increment_route_metric_trip_count
|
|
19
18
|
before_destroy :decrement_route_metric_trip_count
|
|
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
|
|
23
22
|
|
|
23
|
+
belongs_to :service_origin, class_name: 'Spree::Taxon', optional: true
|
|
24
|
+
|
|
24
25
|
belongs_to :vehicle_type, class_name: 'SpreeCmCommissioner::VehicleType', optional: false
|
|
25
26
|
belongs_to :vehicle, class_name: 'SpreeCmCommissioner::Vehicle', optional: true
|
|
26
27
|
has_one :seat_layout, as: :layoutable, class_name: 'SpreeCmCommissioner::SeatLayout', dependent: :destroy
|
|
@@ -91,12 +92,12 @@ module SpreeCmCommissioner
|
|
|
91
92
|
section.attributes.except('id', 'created_at', 'updated_at', 'seat_layout_id')
|
|
92
93
|
.merge(
|
|
93
94
|
blocks_attributes: section.blocks.map do |block|
|
|
94
|
-
block.attributes.except('id', 'created_at', 'updated_at', 'seat_layout_id', 'seat_section_id')
|
|
95
|
+
block.attributes.except('id', 'created_at', 'updated_at', 'seat_layout_id', 'seat_section_id', 'variant_id')
|
|
95
96
|
end
|
|
96
97
|
)
|
|
97
98
|
end,
|
|
98
99
|
top_level_blocks_attributes: original.top_level_blocks.map do |block|
|
|
99
|
-
block.attributes.except('id', 'created_at', 'updated_at', 'seat_layout_id', 'seat_section_id')
|
|
100
|
+
block.attributes.except('id', 'created_at', 'updated_at', 'seat_layout_id', 'seat_section_id', 'variant_id')
|
|
100
101
|
end
|
|
101
102
|
)
|
|
102
103
|
end
|
|
@@ -63,6 +63,7 @@ module SpreeCmCommissioner
|
|
|
63
63
|
base.has_one :stock_location, -> { where(active: true) }, class_name: 'Spree::StockLocation', dependent: :destroy
|
|
64
64
|
|
|
65
65
|
base.belongs_to :default_state, class_name: 'Spree::State', inverse_of: :vendors
|
|
66
|
+
base.belongs_to :service_origin, class_name: 'Spree::Taxon', optional: true
|
|
66
67
|
base.multi_tenant :tenant, class_name: 'SpreeCmCommissioner::Tenant'
|
|
67
68
|
|
|
68
69
|
base.delegate :lat, :lon, to: :stock_location, allow_nil: true
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<!-- insert_before "erb[loud]:contains('field_container :state')" -->
|
|
2
|
+
|
|
3
|
+
<%= f.field_container :service_origin_id do %>
|
|
4
|
+
<%= f.label :service_origin_id %>
|
|
5
|
+
<%= f.collection_select :service_origin_id, Spree::Taxon.where(kind: Spree::Taxon.kinds[:nationality]).order(:name), :id, :name, { include_blank: true }, { class: 'fullwidth select2' } %>
|
|
6
|
+
<% end %>
|
|
@@ -24,6 +24,11 @@ module SpreeCmCommissioner
|
|
|
24
24
|
else
|
|
25
25
|
order.ensure_updated_shipments
|
|
26
26
|
end
|
|
27
|
+
# SPREE: Original Spree::Cart::Recalculate code ends here
|
|
28
|
+
|
|
29
|
+
# CUSTOM: Apply pricing models at order level (groups connected trips together)
|
|
30
|
+
|
|
31
|
+
SpreeCmCommissioner::PricingModelHandler::Order.new(order).activate
|
|
27
32
|
|
|
28
33
|
# SPREE: Original Spree::Cart::Recalculate code continues here
|
|
29
34
|
::Spree::PromotionHandler::Cart.new(order, line_item).activate
|
|
@@ -15,14 +15,17 @@ module SpreeCmCommissioner
|
|
|
15
15
|
|
|
16
16
|
order = Spree::Order.new(state: 'cart', use_billing: true, user: user)
|
|
17
17
|
|
|
18
|
+
metadata = {
|
|
19
|
+
trip_id: trip.id,
|
|
20
|
+
service_origin_id: trip.service_origin_id.presence&.to_s
|
|
21
|
+
}.compact
|
|
22
|
+
|
|
18
23
|
line_item = order.line_items.new(
|
|
19
24
|
variant_id: variant.id,
|
|
20
25
|
quantity: quantity,
|
|
21
26
|
from_date: from_date,
|
|
22
27
|
to_date: to_date,
|
|
23
|
-
private_metadata:
|
|
24
|
-
trip_id: trip.id
|
|
25
|
-
}
|
|
28
|
+
private_metadata: metadata
|
|
26
29
|
)
|
|
27
30
|
|
|
28
31
|
build_guests_for!(line_item, quantity)
|
|
@@ -27,6 +27,7 @@ module SpreeCmCommissioner
|
|
|
27
27
|
attrs = attrs.merge(
|
|
28
28
|
tenant_id: vendor.tenant_id,
|
|
29
29
|
route_name: attrs[:route_name] || "#{origin_place.name} -> #{destination_place.name}",
|
|
30
|
+
service_origin_id: vendor.service_origin_id,
|
|
30
31
|
origin_place_id: origin_place.id,
|
|
31
32
|
destination_place_id: destination_place.id,
|
|
32
33
|
route_stops: route_stops
|
|
@@ -82,9 +82,10 @@ module SpreeCmCommissioner
|
|
|
82
82
|
direction: leg.direction,
|
|
83
83
|
trip_id: leg.trip_id.to_s,
|
|
84
84
|
boarding_trip_stop_id: leg.boarding_trip_stop_id.to_s,
|
|
85
|
-
drop_off_trip_stop_id: leg.drop_off_trip_stop_id.to_s
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
drop_off_trip_stop_id: leg.drop_off_trip_stop_id.to_s,
|
|
86
|
+
connected_trip_id: connected_trip_id.presence&.to_s,
|
|
87
|
+
service_origin_id: trip.service_origin_id.presence&.to_s
|
|
88
|
+
}.compact
|
|
88
89
|
|
|
89
90
|
line_item = order.line_items.new(
|
|
90
91
|
product_type: :transit,
|
|
@@ -15,6 +15,7 @@ module SpreeCmCommissioner
|
|
|
15
15
|
ApplicationRecord.transaction do
|
|
16
16
|
variant = create_variant!(vendor, trip_form)
|
|
17
17
|
trip = create_trip!(vendor, trip_form, variant)
|
|
18
|
+
assign_blocks_to_variant!(trip, variant)
|
|
18
19
|
calendar = setup_calendar!(variant.product, trip_form.service_calendar)
|
|
19
20
|
generate_inventory!(variant)
|
|
20
21
|
|
|
@@ -56,10 +57,13 @@ module SpreeCmCommissioner
|
|
|
56
57
|
|
|
57
58
|
# Creates the main trip record with details extracted from the trip form.
|
|
58
59
|
# Associates the trip with vendor, product, vehicle, route, and time.
|
|
60
|
+
|
|
59
61
|
def create_trip!(vendor, trip_form, variant)
|
|
60
62
|
first_stop = trip_form.trip_stops.first
|
|
61
63
|
last_stop = trip_form.trip_stops.last
|
|
62
64
|
|
|
65
|
+
route = vendor.routes.find(trip_form.route_id)
|
|
66
|
+
|
|
63
67
|
locations = vendor.locations.where(id: trip_form.trip_stops.map(&:location_id)).index_by(&:id)
|
|
64
68
|
|
|
65
69
|
# vendor_places are either stops or branches
|
|
@@ -73,12 +77,13 @@ module SpreeCmCommissioner
|
|
|
73
77
|
vehicle: SpreeCmCommissioner::Vehicle.find_by(id: first_stop.vehicle_id),
|
|
74
78
|
origin_place_id: locations[first_stop.location_id.to_i].place_id,
|
|
75
79
|
destination_place_id: locations[last_stop.location_id.to_i].place_id,
|
|
76
|
-
|
|
80
|
+
service_origin_id: route.service_origin_id || vendor.service_origin_id,
|
|
81
|
+
route: route,
|
|
77
82
|
departure_time: first_stop.departure_time,
|
|
78
83
|
duration: trip_form.total_duration_seconds,
|
|
79
84
|
allow_booking: trip_form.allow_booking,
|
|
80
85
|
allow_seat_selection: trip_form.allow_seat_selection,
|
|
81
|
-
route_type: trip_form.route_type ||
|
|
86
|
+
route_type: trip_form.route_type || route&.route_type
|
|
82
87
|
)
|
|
83
88
|
|
|
84
89
|
create_trip_stops(trip, trip_form, locations, vendor_places)
|
|
@@ -125,6 +130,18 @@ module SpreeCmCommissioner
|
|
|
125
130
|
res.value[:calendar]
|
|
126
131
|
end
|
|
127
132
|
|
|
133
|
+
# Assigns sellable blocks from the trip's seat layout to the variant.
|
|
134
|
+
# Only assigns blocks with nil variant_id to avoid overwriting existing assignments.
|
|
135
|
+
def assign_blocks_to_variant!(trip, variant)
|
|
136
|
+
return if trip.seat_layout.blank?
|
|
137
|
+
|
|
138
|
+
sellable_block_types = SpreeCmCommissioner::Block.block_types.slice('seat', 'sleeping_seat', 'standing').values
|
|
139
|
+
|
|
140
|
+
trip.seat_layout.blocks
|
|
141
|
+
.where(variant_id: nil, block_type: sellable_block_types)
|
|
142
|
+
.update_all(variant_id: variant.id) # rubocop:disable Rails/SkipsModelValidations
|
|
143
|
+
end
|
|
144
|
+
|
|
128
145
|
# Triggers asynchronous generation of permanent inventory items for the variant.
|
|
129
146
|
def generate_inventory!(variant)
|
|
130
147
|
SpreeCmCommissioner::Stock::PermanentInventoryItemsGeneratorJob.perform_later(variant_ids: [variant[:id]])
|
|
@@ -4,6 +4,7 @@ module Spree
|
|
|
4
4
|
mattr_reader :route_attributes
|
|
5
5
|
|
|
6
6
|
@@vendor_attributes << :logo
|
|
7
|
+
@@vendor_attributes << :service_origin_id
|
|
7
8
|
|
|
8
9
|
# Permitted all guest attributes for now as permitting only some guest attributes is not working by design
|
|
9
10
|
# of spree add_item service, if we want to only permit some guest attributes,
|
|
@@ -2,7 +2,7 @@ FactoryBot.define do
|
|
|
2
2
|
factory :pricing_rule_nationality, class: 'SpreeCmCommissioner::PricingRules::Nationality' do
|
|
3
3
|
association :pricing_rule_group, factory: :pricing_rule_group
|
|
4
4
|
rule_type { 'any' }
|
|
5
|
-
nationalities { [
|
|
5
|
+
nationalities { [create(:taxon, name: 'Cambodian').id] }
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
factory :pricing_rule_extra_pick_up_distance, class: 'SpreeCmCommissioner::PricingRules::ExtraPickUpDistance' do
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: spree_cm_commissioner
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.5.
|
|
4
|
+
version: 2.5.13.pre.pre2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- You
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-02-
|
|
11
|
+
date: 2026-02-09 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: spree
|
|
@@ -1771,6 +1771,7 @@ files:
|
|
|
1771
1771
|
- app/overrides/spree/admin/vendors/_form/note.html.erb.deface
|
|
1772
1772
|
- app/overrides/spree/admin/vendors/_form/option_type.html.erb.deface
|
|
1773
1773
|
- app/overrides/spree/admin/vendors/_form/product_type.html.erb.deface
|
|
1774
|
+
- app/overrides/spree/admin/vendors/_form/service_origin.html.erb.deface
|
|
1774
1775
|
- app/overrides/spree/admin/vendors/_form/short_description.html.erb.deface
|
|
1775
1776
|
- app/overrides/spree/admin/vendors/_form/star_rating.html.erb.deface
|
|
1776
1777
|
- app/overrides/spree/admin/vendors/_form/vendor_min_max_price.html.erb.deface
|
|
@@ -3017,6 +3018,9 @@ files:
|
|
|
3017
3018
|
- db/migrate/20260128093313_add_metadata_to_cm_exports.rb
|
|
3018
3019
|
- db/migrate/20260129082338_remove_preferences_file_name_columns_from_cm_exports.rb
|
|
3019
3020
|
- db/migrate/20260204092321_add_type_to_cm_exports.rb
|
|
3021
|
+
- db/migrate/20260204100000_add_service_origin_to_spree_vendors.rb
|
|
3022
|
+
- db/migrate/20260204100001_add_service_origin_to_cm_routes.rb
|
|
3023
|
+
- db/migrate/20260204100002_add_service_origin_to_cm_trips.rb
|
|
3020
3024
|
- db/migrate/20260204183545_add_term_accepted_at_to_spree_orders.rb
|
|
3021
3025
|
- db/migrate/20260207040752_clear_cm_exports.rb
|
|
3022
3026
|
- docker-compose.yml
|
|
@@ -3202,9 +3206,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
3202
3206
|
version: '2.7'
|
|
3203
3207
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
3204
3208
|
requirements:
|
|
3205
|
-
- - "
|
|
3209
|
+
- - ">"
|
|
3206
3210
|
- !ruby/object:Gem::Version
|
|
3207
|
-
version:
|
|
3211
|
+
version: 1.3.1
|
|
3208
3212
|
requirements:
|
|
3209
3213
|
- none
|
|
3210
3214
|
rubygems_version: 3.4.1
|