spree_cm_commissioner 2.5.13.pre.pre8 → 2.5.13.pre.pre9
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 +8 -0
- data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +8 -1
- data/app/models/spree_cm_commissioner/exports/operator_guest_json_gzip.rb +37 -122
- 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/api/v2/platform/create_guest_adjustment_serializer.rb +10 -0
- data/app/serializers/spree/api/v2/platform/create_line_item_adjustment_serializer.rb +10 -0
- data/app/serializers/spree/api/v2/platform/create_route_adjustment_serializer.rb +10 -0
- data/app/serializers/spree/v2/tenant/guest_serializer.rb +1 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/pricing_action_serializer.rb +13 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/transit_line_item_serializer.rb +2 -1
- 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/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/version.rb +1 -1
- metadata +10 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ba2140773bad618354a2555600dc2dc6c1e76be537bc3004d4f798c9612bd32f
|
|
4
|
+
data.tar.gz: da771f3419c7ebc869e9e30137ff680bf84068686cdbc2369db2d1bd5413a81d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 315c8495b3bf43182dc4ff33e80d08ffdf6b86f54bb02ca8e99420967ad0cb02a6afd25cda7702462aebec63a8ccb684c60f0d22f6649eeb91ef831068ef068b
|
|
7
|
+
data.tar.gz: 7a602eac8abded453c0c1faee97a595ca8632036cf5c32017da2b5f78b118f2fa26575e0186883f14af7237d9391b9d1d9693860276ff8f3d776636904321732
|
data/Gemfile.lock
CHANGED
|
@@ -34,6 +34,7 @@ module Spree
|
|
|
34
34
|
|
|
35
35
|
ActiveRecord::Base.transaction do
|
|
36
36
|
resource.save!
|
|
37
|
+
recalculate_cart(resource.line_item)
|
|
37
38
|
run_dynamic_fields(resource)
|
|
38
39
|
resource.save_and_move_to_next_stage
|
|
39
40
|
end
|
|
@@ -48,6 +49,7 @@ module Spree
|
|
|
48
49
|
run_dynamic_fields(resource) if guest_params[:guest_dynamic_fields_attributes]
|
|
49
50
|
resource.assign_attributes(guest_params.except(:guest_dynamic_fields_attributes))
|
|
50
51
|
resource.save!
|
|
52
|
+
recalculate_cart(resource.line_item)
|
|
51
53
|
resource.save_and_move_to_next_stage
|
|
52
54
|
end
|
|
53
55
|
|
|
@@ -87,6 +89,8 @@ module Spree
|
|
|
87
89
|
:other_organization,
|
|
88
90
|
:expectation,
|
|
89
91
|
:upload_later,
|
|
92
|
+
:age_group,
|
|
93
|
+
:nationality_group,
|
|
90
94
|
guest_dynamic_fields_attributes: %i[
|
|
91
95
|
id
|
|
92
96
|
dynamic_field_id
|
|
@@ -111,6 +115,10 @@ module Spree
|
|
|
111
115
|
def handle_record_not_found(exception)
|
|
112
116
|
render_error_payload({ base: [exception.message] }, 404)
|
|
113
117
|
end
|
|
118
|
+
|
|
119
|
+
def recalculate_cart(line_item)
|
|
120
|
+
::Spree::Dependencies.cart_recalculate_service.constantize.call(line_item: line_item, order: spree_current_order)
|
|
121
|
+
end
|
|
114
122
|
end
|
|
115
123
|
end
|
|
116
124
|
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,148 +1,63 @@
|
|
|
1
1
|
module SpreeCmCommissioner
|
|
2
2
|
module Exports
|
|
3
3
|
class OperatorGuestJsonGzip < ::SpreeCmCommissioner::Export
|
|
4
|
-
BATCH_INCLUDES = [
|
|
5
|
-
:occupation, :user,
|
|
6
|
-
{ check_ins: %i[check_in_by check_in_session], line_item: [:variant, { order: :bill_address }] }
|
|
7
|
-
].freeze
|
|
8
|
-
|
|
9
4
|
# eg. ['check_ins', 'check_ins.check_in_by', 'line_item', 'line_item.order']
|
|
10
|
-
store_public_metadata :resource_includes, :array
|
|
11
|
-
store_public_metadata :guests_count, :integer
|
|
12
|
-
store_public_metadata :track_processed_messages, :array, default: []
|
|
5
|
+
store_public_metadata :resource_includes, :array
|
|
6
|
+
store_public_metadata :guests_count, :integer
|
|
13
7
|
|
|
14
8
|
# override
|
|
15
|
-
def export
|
|
16
|
-
|
|
9
|
+
def export # rubocop:disable Metrics/AbcSize
|
|
10
|
+
track_messages = []
|
|
17
11
|
track_messages << "Export started at #{Time.current.iso8601}"
|
|
18
12
|
update(status: :progress, track_messages: track_messages)
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
self.guests_count = guests_query.count(:id)
|
|
22
|
-
|
|
23
|
-
track_messages << "Processing #{guests_count} guests in batches"
|
|
24
|
-
update(track_messages: track_messages, guests_count: guests_count)
|
|
25
|
-
|
|
26
|
-
# We use 2 temp files to avoid loading everything into memory:
|
|
27
|
-
# - File 1: guest1,guest2,guest3... (just the data array content)
|
|
28
|
-
# - File 2: user1,order1,user2... (just the included array content)
|
|
29
|
-
# Then we merge them into: {"data":[File1],"included":[File2]}
|
|
30
|
-
guests_file = Tempfile.new(['guests', '.json'])
|
|
31
|
-
included_file = Tempfile.new(['included', '.json'])
|
|
32
|
-
output_gz_file = Tempfile.new(['export', '.json.gz'])
|
|
33
|
-
|
|
34
|
-
begin
|
|
35
|
-
stream_export_data_and_includes_to_separate_files(guests_query, guests_file, included_file)
|
|
36
|
-
stream_export_merge_and_compress_data_and_includes_to_a_single_file(guests_file, included_file, output_gz_file)
|
|
37
|
-
attach_file_to_record(output_gz_file)
|
|
38
|
-
ensure
|
|
39
|
-
cleanup_temp_files(guests_file, included_file, output_gz_file)
|
|
40
|
-
end
|
|
41
|
-
rescue StandardError => e
|
|
42
|
-
CmAppLogger.error(label: "#{self.class.name}#export", data: { export_id: id, error: e.message, backtrace: e.backtrace })
|
|
43
|
-
|
|
44
|
-
track_errors = []
|
|
45
|
-
track_errors << "Error: #{e.message} at #{Time.current.iso8601}"
|
|
46
|
-
track_errors << e.backtrace.take(5).join("\n") if e.backtrace.present?
|
|
47
|
-
|
|
48
|
-
update(status: :failed, track_errors: track_errors)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
private
|
|
52
|
-
|
|
53
|
-
def stream_export_data_and_includes_to_separate_files(guests_query, guests_file, included_file)
|
|
54
|
-
# Track "user:123", "order:456" to avoid duplicates includes. For current event scale, Set growth
|
|
55
|
-
# (~20-25 MB for 100K guests × 5 relationships) is manageable.
|
|
56
|
-
#
|
|
57
|
-
# In future, if needed: we can use solution such as integer-based keys, split exports into chunks,
|
|
58
|
-
# or delegate deduplication to a database table.
|
|
59
|
-
included_keys = Set.new
|
|
60
|
-
total_processed_guests = 0
|
|
61
|
-
|
|
62
|
-
# Track processed messages in a separate array to avoid bloating track_messages
|
|
63
|
-
# For processing with 10k+ guests, this message can grow very large, so we only keep the last 50 messages.
|
|
64
|
-
self.track_processed_messages = []
|
|
65
|
-
|
|
66
|
-
guests_query.in_batches(of: batch_size) do |batch|
|
|
67
|
-
# Load batch with associations
|
|
68
|
-
guests = batch.includes(BATCH_INCLUDES)
|
|
69
|
-
|
|
70
|
-
# Serialize to JSON:API format
|
|
71
|
-
# Note: This loads entire batch hash into memory (~10-50MB per batch depending on associations)
|
|
72
|
-
data = SpreeCmCommissioner::V2::Operator::GuestSerializer.new(
|
|
73
|
-
guests, { include: resource_includes }
|
|
74
|
-
).serializable_hash
|
|
14
|
+
guests = SpreeCmCommissioner::GuestSearcherQuery.new(event_id: exportable_id).call
|
|
75
15
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
guests_file.write(',') if total_processed_guests.positive? || idx.positive?
|
|
79
|
-
guests_file.write(JSON.generate(guest))
|
|
80
|
-
end
|
|
16
|
+
track_messages << "Eager loaded started at #{Time.current.iso8601}"
|
|
17
|
+
update(track_messages: track_messages)
|
|
81
18
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
included_file.write(JSON.generate(resource))
|
|
89
|
-
included_keys.add(key)
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
total_processed_guests += data[:data].size
|
|
93
|
-
track_processed_messages << "Processed #{total_processed_guests}/#{guests_count} guests"
|
|
94
|
-
|
|
95
|
-
# Write to DB less frequently to avoid performance hit, but often enough to provide progress visibility.
|
|
96
|
-
if (total_processed_guests % 1000).zero? || total_processed_guests == guests_count
|
|
97
|
-
update(track_processed_messages: track_processed_messages.last(50))
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def stream_export_merge_and_compress_data_and_includes_to_a_single_file(guests_file, included_file, output_gz_file)
|
|
103
|
-
Zlib::GzipWriter.open(output_gz_file.path) do |gzip|
|
|
104
|
-
gzip.write('{"data":[') # open data array
|
|
105
|
-
guests_file.rewind
|
|
106
|
-
IO.copy_stream(guests_file, gzip) # stream guests_file content
|
|
19
|
+
guests = guests.includes(
|
|
20
|
+
:occupation,
|
|
21
|
+
:user,
|
|
22
|
+
check_ins: %i[check_in_by check_in_session],
|
|
23
|
+
line_item: [:variant, { order: :bill_address }]
|
|
24
|
+
)
|
|
107
25
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
IO.copy_stream(included_file, gzip) # stream included_file content
|
|
26
|
+
track_messages << "Eager loaded ended at #{Time.current.iso8601}"
|
|
27
|
+
update(track_messages: track_messages)
|
|
111
28
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
29
|
+
hash = SpreeCmCommissioner::V2::Operator::GuestSerializer.new(
|
|
30
|
+
guests,
|
|
31
|
+
{ include: resource_includes }
|
|
32
|
+
).serializable_hash
|
|
115
33
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
end
|
|
34
|
+
track_messages << "Serialization completed at #{Time.current.iso8601}"
|
|
35
|
+
update(track_messages: track_messages)
|
|
119
36
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
# After Zlib::GzipWriter closes, file pointer is at EOF
|
|
123
|
-
# Must reset to beginning so the attachment reads the entire file
|
|
124
|
-
output_gz_file.rewind
|
|
125
|
-
file_size_bytes = output_gz_file.size
|
|
37
|
+
file_name = "exports_operator_guest_#{id}.json.gz"
|
|
38
|
+
json_gzip = ActiveSupport::Gzip.compress(JSON.generate(hash))
|
|
126
39
|
|
|
127
40
|
exported_file.attach(
|
|
128
|
-
io:
|
|
129
|
-
filename:
|
|
41
|
+
io: StringIO.new(json_gzip),
|
|
42
|
+
filename: file_name,
|
|
130
43
|
content_type: 'application/gzip'
|
|
131
44
|
)
|
|
132
45
|
|
|
133
46
|
track_messages << "Completed at #{Time.current.iso8601}"
|
|
134
|
-
update(
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
47
|
+
update(
|
|
48
|
+
file_size_bytes: json_gzip.bytesize,
|
|
49
|
+
guests_count: guests.size,
|
|
50
|
+
status: :done,
|
|
51
|
+
track_messages: track_messages
|
|
52
|
+
)
|
|
53
|
+
rescue StandardError => e
|
|
54
|
+
CmAppLogger.error(label: "#{self.class.name}#export", data: { export_id: id, error: e.message, backtrace: e.backtrace })
|
|
140
55
|
|
|
141
|
-
|
|
142
|
-
|
|
56
|
+
track_errors = []
|
|
57
|
+
track_errors << "Error: #{e.message} at #{Time.current.iso8601}"
|
|
58
|
+
track_errors << e.backtrace.take(5).join("\n")
|
|
143
59
|
|
|
144
|
-
|
|
145
|
-
output_gz_file&.unlink
|
|
60
|
+
update(status: :failed, track_errors: track_errors)
|
|
146
61
|
end
|
|
147
62
|
end
|
|
148
63
|
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 %>
|
|
@@ -5,7 +5,7 @@ module Spree
|
|
|
5
5
|
attributes :first_name, :last_name, :dob, :gender, :kyc_fields, :other_occupation, :created_at, :updated_at,
|
|
6
6
|
:qr_data, :social_contact_platform, :social_contact, :available_social_contact_platforms,
|
|
7
7
|
:age, :emergency_contact, :other_organization, :expectation, :upload_later, :address,
|
|
8
|
-
:formatted_bib_number, :phone_number, :user_id
|
|
8
|
+
:formatted_bib_number, :phone_number, :user_id, :age_group, :nationality_group
|
|
9
9
|
|
|
10
10
|
attribute :allowed_checkout, &:allowed_checkout?
|
|
11
11
|
attribute :allowed_upload_later, &:allowed_upload_later?
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
module V2
|
|
3
|
+
module Storefront
|
|
4
|
+
class PricingActionSerializer < BaseSerializer
|
|
5
|
+
attribute :type_name do |action|
|
|
6
|
+
action.class.name.underscore
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
has_one :calculator, if: proc { |action| action.respond_to?(:calculator) }
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -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,
|
|
@@ -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,
|
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.13.pre.
|
|
4
|
+
version: 2.5.13.pre.pre9
|
|
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-11 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
|
|
@@ -1818,6 +1819,9 @@ files:
|
|
|
1818
1819
|
- app/serializers/.gitkeep
|
|
1819
1820
|
- app/serializers/concerns/spree_cm_commissioner/api/v2/resource_serializer_concern_decorator.rb
|
|
1820
1821
|
- app/serializers/spree/api/v2/platform/create_date_specific_item_adjustment_serializer.rb
|
|
1822
|
+
- app/serializers/spree/api/v2/platform/create_guest_adjustment_serializer.rb
|
|
1823
|
+
- app/serializers/spree/api/v2/platform/create_line_item_adjustment_serializer.rb
|
|
1824
|
+
- app/serializers/spree/api/v2/platform/create_route_adjustment_serializer.rb
|
|
1821
1825
|
- app/serializers/spree/v2/organizer/asset_serializer.rb
|
|
1822
1826
|
- app/serializers/spree/v2/organizer/base_serializer.rb
|
|
1823
1827
|
- app/serializers/spree/v2/organizer/image_serializer.rb
|
|
@@ -1958,6 +1962,7 @@ files:
|
|
|
1958
1962
|
- app/serializers/spree_cm_commissioner/v2/storefront/menu_item_serializer_decorator.rb
|
|
1959
1963
|
- app/serializers/spree_cm_commissioner/v2/storefront/payment_method_group_serializer.rb
|
|
1960
1964
|
- app/serializers/spree_cm_commissioner/v2/storefront/pin_code_serializer.rb
|
|
1965
|
+
- app/serializers/spree_cm_commissioner/v2/storefront/pricing_action_serializer.rb
|
|
1961
1966
|
- app/serializers/spree_cm_commissioner/v2/storefront/product_dynamic_field_serializer.rb
|
|
1962
1967
|
- app/serializers/spree_cm_commissioner/v2/storefront/product_place_serializer.rb
|
|
1963
1968
|
- app/serializers/spree_cm_commissioner/v2/storefront/promotion_action_serializer.rb
|
|
@@ -3017,6 +3022,9 @@ files:
|
|
|
3017
3022
|
- db/migrate/20260128093313_add_metadata_to_cm_exports.rb
|
|
3018
3023
|
- db/migrate/20260129082338_remove_preferences_file_name_columns_from_cm_exports.rb
|
|
3019
3024
|
- db/migrate/20260204092321_add_type_to_cm_exports.rb
|
|
3025
|
+
- db/migrate/20260204100000_add_service_origin_to_spree_vendors.rb
|
|
3026
|
+
- db/migrate/20260204100001_add_service_origin_to_cm_routes.rb
|
|
3027
|
+
- db/migrate/20260204100002_add_service_origin_to_cm_trips.rb
|
|
3020
3028
|
- db/migrate/20260204183545_add_term_accepted_at_to_spree_orders.rb
|
|
3021
3029
|
- db/migrate/20260207040752_clear_cm_exports.rb
|
|
3022
3030
|
- docker-compose.yml
|