spree_cm_commissioner 2.1.4.pre.pre1 → 2.1.5.pre.pre1

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 (26) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/app/controllers/spree/api/v2/tenant/base_controller.rb +12 -0
  4. data/app/controllers/spree/api/v2/tenant/cart_controller.rb +1 -1
  5. data/app/controllers/spree/api/v2/tenant/checkout_controller.rb +1 -1
  6. data/app/controllers/spree/api/v2/tenant/dynamic_field_options_controller.rb +32 -0
  7. data/app/controllers/spree/api/v2/tenant/dynamic_fields_controller.rb +38 -0
  8. data/app/controllers/spree/api/v2/tenant/guests_controller.rb +29 -10
  9. data/app/controllers/spree/api/v2/tenant/product_dynamic_fields_controller.rb +41 -0
  10. data/app/interactors/spree_cm_commissioner/guest_dynamic_fields_manager.rb +33 -0
  11. data/app/interactors/spree_cm_commissioner/sms.rb +2 -3
  12. data/app/models/spree_cm_commissioner/guest.rb +6 -1
  13. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +4 -0
  14. data/app/models/spree_cm_commissioner/sms_log.rb +2 -0
  15. data/app/models/spree_cm_commissioner/taxon_decorator.rb +4 -0
  16. data/app/serializers/spree/v2/tenant/cart_serializer.rb +24 -1
  17. data/app/serializers/spree/v2/tenant/dynamic_field_option_serializer.rb +9 -0
  18. data/app/serializers/spree/v2/tenant/dynamic_field_serializer.rb +11 -0
  19. data/app/serializers/spree/v2/tenant/guest_dynamic_field_serializer.rb +12 -0
  20. data/app/serializers/spree/v2/tenant/guest_serializer.rb +2 -0
  21. data/app/serializers/spree/v2/tenant/product_dynamic_field_serializer.rb +11 -0
  22. data/app/serializers/spree/v2/tenant/product_serializer.rb +3 -0
  23. data/config/routes.rb +4 -0
  24. data/db/migrate/20250912084944_add_send_type_to_sms_log.rb +9 -0
  25. data/lib/spree_cm_commissioner/version.rb +1 -1
  26. metadata +11 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 53fa91ddf6ab2cbf7d0fecc25664116e5e8689f212e0db8a1319d6f37ba58f69
4
- data.tar.gz: 3b64416fc5ecb2b21578f1a736cbffe887f264e51433d42fb28c009b72b2259c
3
+ metadata.gz: d85338c01f8051cd2aff1de565907e13f401f0044b766cca7738056f1089a7d1
4
+ data.tar.gz: 32b15e97d40db31db7749ee684bb02f3b01bfaa44afc32bc79d1a259960fae50
5
5
  SHA512:
6
- metadata.gz: '029fc4d782f0b7e61af6675999f36905e345d4406f55098728959c05cebd26b32562c29d63af8b472dc2d98f50657b627e6ba1d8880ef81968d1611f115d8c2b'
7
- data.tar.gz: ca652af048f6c0a6d2efd16c9a1b59d14eccbb2d7861a8403ffa5822bb32cdc8501c92277bcd894ca58e568ea04df4fd6367cd36992816e580a28e0459b4dcd0
6
+ metadata.gz: 3a2d72ee902e1a625713777268aa727d2c92e25cea7a912bd799dd999d4e99f0c7ec5eeb2e5cce49575205d4e01606cf0aa4776e5844074348728ce00eaa4efd
7
+ data.tar.gz: 5dc5ad4f7c7ff9121503d09fa49e67903b15cc86e21cbd468494fa2119ca758712410c3bb3896a1fa6013bb7e9429b793e6dac1856a676c67caf928950a8b271
data/Gemfile.lock CHANGED
@@ -34,7 +34,7 @@ GIT
34
34
  PATH
35
35
  remote: .
36
36
  specs:
37
- spree_cm_commissioner (2.1.4.pre.pre1)
37
+ spree_cm_commissioner (2.1.5.pre.pre1)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
@@ -4,6 +4,8 @@ module Spree
4
4
  module Tenant
5
5
  class BaseController < ::Spree::Api::V2::ResourceController
6
6
  include Spree::Api::V2::CollectionOptionsHelpers
7
+ rescue_from ActiveRecord::RecordInvalid, with: :handle_record_invalid
8
+ rescue_from ActiveRecord::RecordNotFound, with: :handle_record_not_found
7
9
 
8
10
  set_current_tenant_through_filter
9
11
  before_action :require_tenant
@@ -24,6 +26,16 @@ module Spree
24
26
  def scope
25
27
  raise 'scope should be implemented in a sub-class'
26
28
  end
29
+
30
+ private
31
+
32
+ def handle_record_invalid(exception)
33
+ render_error_payload(exception.record.errors, 422)
34
+ end
35
+
36
+ def handle_record_not_found(exception)
37
+ render_error_payload({ base: [exception.message] }, 404)
38
+ end
27
39
  end
28
40
  end
29
41
  end
@@ -156,7 +156,7 @@ module Spree
156
156
  end
157
157
 
158
158
  def resource_serializer
159
- Spree::Api::Dependencies.storefront_cart_serializer.constantize
159
+ Spree::V2::Tenant::CartSerializer
160
160
  end
161
161
 
162
162
  def create_service
@@ -67,7 +67,7 @@ module Spree
67
67
  end
68
68
 
69
69
  def resource_serializer
70
- Spree::Api::Dependencies.storefront_cart_serializer.constantize
70
+ Spree::V2::Tenant::CartSerializer
71
71
  end
72
72
 
73
73
  def next_service
@@ -0,0 +1,32 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Tenant
5
+ class DynamicFieldOptionsController < BaseController
6
+ # override
7
+ def collection
8
+ return @collection if defined?(@collection)
9
+ return SpreeCmCommissioner::DynamicFieldOption.none if params[:dynamic_field_id].blank?
10
+
11
+ @collection = SpreeCmCommissioner::DynamicFieldOption
12
+ .where(dynamic_field_id: params[:dynamic_field_id])
13
+ .active
14
+ .order(position: :asc)
15
+
16
+ @collection = @collection.where('value LIKE ?', "%#{params[:query]}%") if params[:query].present?
17
+ @collection
18
+ end
19
+
20
+ # override
21
+ def collection_serializer
22
+ Spree::V2::Tenant::DynamicFieldOptionSerializer
23
+ end
24
+
25
+ def model_class
26
+ SpreeCmCommissioner::DynamicFieldOption
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,38 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Tenant
5
+ class DynamicFieldsController < BaseController
6
+ before_action :load_product, only: :index
7
+
8
+ # override
9
+ def collection
10
+ return @collection if defined?(@collection)
11
+
12
+ dynamic_fields = @product.dynamic_fields.includes(:dynamic_field_options)
13
+ if params[:phase].present?
14
+ requested_phase = params[:phase].to_s
15
+ if SpreeCmCommissioner::DynamicField.data_fill_stages.key?(requested_phase)
16
+ dynamic_fields = dynamic_fields.where(data_fill_stage: requested_phase)
17
+ end
18
+ end
19
+
20
+ @collection = dynamic_fields.order(:position)
21
+ end
22
+
23
+ private
24
+
25
+ def load_product
26
+ return render_error_payload({ error: 'product_id is required' }, 400) if params[:product_id].blank?
27
+
28
+ @product ||= Spree::Product.find(params[:product_id])
29
+ end
30
+
31
+ def collection_serializer
32
+ Spree::V2::Tenant::DynamicFieldSerializer
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -27,23 +27,28 @@ module Spree
27
27
  def create
28
28
  spree_authorize! :update, spree_current_order, order_token
29
29
 
30
- resource = scope.new(guest_params)
30
+ resource = scope.new(guest_params.except(:guest_dynamic_fields_attributes))
31
31
 
32
- if resource.save
33
- render_serialized_payload(201) { serialize_resource(resource) }
34
- else
35
- render_error_payload(resource.errors, 400)
32
+ ActiveRecord::Base.transaction do
33
+ resource.save!
34
+ run_dynamic_fields(resource)
35
+ resource.save_and_move_to_next_stage
36
36
  end
37
+
38
+ render_serialized_payload(201) { serialize_resource(resource) }
37
39
  end
38
40
 
39
41
  def update
40
42
  spree_authorize! :update, spree_current_order, order_token
41
43
 
42
- if resource.update(guest_params)
43
- render_serialized_payload { serialize_resource(resource) }
44
- else
45
- render_error_payload(resource, 400)
44
+ ActiveRecord::Base.transaction do
45
+ run_dynamic_fields(resource) if guest_params[:guest_dynamic_fields_attributes]
46
+ resource.assign_attributes(guest_params.except(:guest_dynamic_fields_attributes))
47
+ resource.save!
48
+ resource.save_and_move_to_next_stage
46
49
  end
50
+
51
+ render_serialized_payload { serialize_resource(resource) }
47
52
  end
48
53
 
49
54
  private
@@ -78,7 +83,21 @@ module Spree
78
83
  :address,
79
84
  :other_organization,
80
85
  :expectation,
81
- :upload_later
86
+ :upload_later,
87
+ guest_dynamic_fields_attributes: %i[
88
+ id
89
+ dynamic_field_id
90
+ dynamic_field_option_id
91
+ value
92
+ _destroy
93
+ ]
94
+ )
95
+ end
96
+
97
+ def run_dynamic_fields(resource)
98
+ SpreeCmCommissioner::GuestDynamicFieldsManager.call(
99
+ resource: resource,
100
+ dynamic_fields_attributes: guest_params[:guest_dynamic_fields_attributes]
82
101
  )
83
102
  end
84
103
  end
@@ -0,0 +1,41 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Tenant
5
+ class ProductDynamicFieldsController < BaseController
6
+ before_action :load_product, only: :index
7
+
8
+ # override
9
+ def collection
10
+ return @collection if defined?(@collection)
11
+
12
+ product_dynamic_fields = @product.product_dynamic_fields.includes(dynamic_field: :dynamic_field_options)
13
+
14
+ if params[:phase].present?
15
+ requested_phase = params[:phase].to_s
16
+ if SpreeCmCommissioner::DynamicField.data_fill_stages.key?(requested_phase)
17
+ product_dynamic_fields = product_dynamic_fields.joins(:dynamic_field)
18
+ .where(dynamic_field: { data_fill_stage: requested_phase })
19
+ .order(:position)
20
+ end
21
+ end
22
+
23
+ @collection = product_dynamic_fields.order(:section)
24
+ end
25
+
26
+ private
27
+
28
+ def load_product
29
+ return render_error_payload({ error: 'product_id is required' }, 400) if params[:product_id].blank?
30
+
31
+ @product ||= Spree::Product.find(params[:product_id])
32
+ end
33
+
34
+ def collection_serializer
35
+ Spree::V2::Tenant::ProductDynamicFieldSerializer
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,33 @@
1
+ module SpreeCmCommissioner
2
+ class GuestDynamicFieldsManager < BaseInteractor
3
+ delegate :resource, :dynamic_fields_attributes, to: :context
4
+
5
+ def call
6
+ return if dynamic_fields_attributes.blank?
7
+
8
+ dynamic_fields_attributes.each { |attr| upsert_or_destroy_field(attr) }
9
+ end
10
+
11
+ private
12
+
13
+ def upsert_or_destroy_field(attr)
14
+ if attr[:_destroy] == '1' && attr[:id].present?
15
+ resource.guest_dynamic_fields.find_by(id: attr[:id])&.destroy!
16
+ return
17
+ end
18
+
19
+ return if attr[:dynamic_field_id].blank?
20
+
21
+ field = attr[:id].present? ? resource.guest_dynamic_fields.find(attr[:id]) : resource.guest_dynamic_fields.build
22
+ field.assign_attributes(attr.except(:id, :_destroy))
23
+ associate_dynamic_field_option(field)
24
+ field.save!
25
+ end
26
+
27
+ def associate_dynamic_field_option(field)
28
+ return unless field.value.to_s.match?(/\A\d+\z/)
29
+
30
+ field.dynamic_field_option = field.dynamic_field.dynamic_field_options.find_by(id: field.value.to_i)
31
+ end
32
+ end
33
+ end
@@ -8,8 +8,7 @@ module SpreeCmCommissioner
8
8
  create_sms_log(sms_options)
9
9
  create_message(sms_options)
10
10
  rescue StandardError => e
11
- context.sms_log.error = e.message
12
- context.sms_log.save
11
+ context.sms_log.update(error: e.message, status: :failed)
13
12
  context.fail!(message: e.message)
14
13
 
15
14
  log_error_to_telegram(e.message)
@@ -29,7 +28,7 @@ module SpreeCmCommissioner
29
28
  # sms adapter can decide whether to update additional sms log fields
30
29
  def update_sms_log(attributes)
31
30
  attributes = attributes.slice(:external_ref)
32
- context.sms_log.update(attributes)
31
+ context.sms_log.update(attributes.merge(status: :sent))
33
32
  end
34
33
 
35
34
  def create_sms_log(sms_options)
@@ -40,7 +40,7 @@ module SpreeCmCommissioner
40
40
 
41
41
  has_many :state_changes, as: :stateful, class_name: 'Spree::StateChange'
42
42
  has_many :guest_dynamic_fields, dependent: :destroy, class_name: 'SpreeCmCommissioner::GuestDynamicField'
43
- accepts_nested_attributes_for :guest_dynamic_fields, allow_destroy: true
43
+ accepts_nested_attributes_for :guest_dynamic_fields, allow_destroy: true, reject_if: :reject_guest_dynamic_field?
44
44
 
45
45
  belongs_to :event, class_name: 'Spree::Taxon'
46
46
 
@@ -397,6 +397,11 @@ module SpreeCmCommissioner
397
397
 
398
398
  required_fields.reject { |field| filled_ids.include?(field.id) }
399
399
  end
400
+
401
+ def reject_guest_dynamic_field?(attributes)
402
+ # Reject if dynamic_field_id is blank or if _destroy is true
403
+ attributes[:dynamic_field_id].blank? || ActiveModel::Type::Boolean.new.cast(attributes[:_destroy])
404
+ end
400
405
  end
401
406
  end
402
407
  # rubocop:enable Metrics/ClassLength
@@ -46,6 +46,10 @@ module SpreeCmCommissioner
46
46
  return if dynamic_field.blank? || dynamic_field_option.blank?
47
47
  return if dynamic_field_option.dynamic_field_id == dynamic_field_id
48
48
 
49
+ # Only validate if both dynamic_field and dynamic_field_option are persisted
50
+ # This prevents validation errors during creation when associations might not be fully loaded
51
+ return if dynamic_field.new_record? || dynamic_field_option.new_record?
52
+
49
53
  errors.add(:dynamic_field_option, 'must belong to the same dynamic field')
50
54
  end
51
55
 
@@ -2,5 +2,7 @@ require_dependency 'spree_cm_commissioner'
2
2
 
3
3
  module SpreeCmCommissioner
4
4
  class SmsLog < ApplicationRecord
5
+ enum send_type: { otp: 0 }
6
+ enum status: { queued: 0, sent: 1, failed: 2 }
5
7
  end
6
8
  end
@@ -155,6 +155,10 @@ module SpreeCmCommissioner
155
155
  ::SpreeCmCommissioner::EventLineItemsDateSyncerJob.perform_later(id)
156
156
  end
157
157
 
158
+ def seat_layout
159
+ nil
160
+ end
161
+
158
162
  private
159
163
 
160
164
  def normalize_custom_redirect_url
@@ -1,7 +1,30 @@
1
1
  module Spree
2
2
  module V2
3
3
  module Tenant
4
- class CartSerializer < Spree::V2::Storefront::CartSerializer
4
+ class CartSerializer < BaseSerializer
5
+ attributes :number, :item_total, :total, :ship_total, :adjustment_total, :created_at,
6
+ :updated_at, :completed_at, :included_tax_total, :additional_tax_total, :display_additional_tax_total,
7
+ :display_included_tax_total, :tax_total, :currency, :state, :token, :email,
8
+ :display_item_total, :display_ship_total, :display_adjustment_total, :display_tax_total,
9
+ :promo_total, :display_promo_total, :item_count, :special_instructions, :display_total,
10
+ :pre_tax_item_amount, :display_pre_tax_item_amount, :pre_tax_total, :display_pre_tax_total,
11
+ :shipment_state, :payment_state, :public_metadata,
12
+ :phone_number, :intel_phone_number, :country_code, :request_state, :channel
13
+
14
+ belongs_to :user, serializer: Spree::V2::Tenant::UserSerializer
15
+ belongs_to :billing_address,
16
+ id_method_name: :bill_address_id,
17
+ serializer: :address,
18
+ record_type: :address
19
+
20
+ has_many :promotions, object_method_name: :valid_promotions, id_method_name: :valid_promotion_ids,
21
+ serializer: Spree::V2::Storefront::PromotionSerializer
22
+
23
+ has_many :variants, serializer: Spree::V2::Tenant::VariantSerializer
24
+ has_many :products, serializer: Spree::V2::Tenant::ProductSerializer
25
+ has_many :line_items, serializer: Spree::V2::Tenant::LineItemSerializer
26
+ has_many :payments, serializer: Spree::V2::Storefront::PaymentSerializer
27
+ has_many :guests, serializer: Spree::V2::Tenant::GuestSerializer
5
28
  end
6
29
  end
7
30
  end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ module V2
3
+ module Tenant
4
+ class DynamicFieldOptionSerializer < BaseSerializer
5
+ attributes :id, :value, :dynamic_field_id, :status, :position
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module V2
3
+ module Tenant
4
+ class DynamicFieldSerializer < BaseSerializer
5
+ attributes :id, :label, :data_type, :vendor_id, :multiple_select, :position, :data_fill_stage
6
+
7
+ has_many :dynamic_field_options, serializer: Spree::V2::Tenant::DynamicFieldOptionSerializer
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module Spree
2
+ module V2
3
+ module Tenant
4
+ class GuestDynamicFieldSerializer < BaseSerializer
5
+ attributes :id, :value, :guest_id, :dynamic_field_id, :dynamic_field_option_id, :created_at, :updated_at
6
+
7
+ belongs_to :dynamic_field, serializer: Spree::V2::Tenant::DynamicFieldSerializer
8
+ belongs_to :dynamic_field_option, serializer: Spree::V2::Tenant::DynamicFieldOptionSerializer
9
+ end
10
+ end
11
+ end
12
+ end
@@ -13,7 +13,9 @@ module Spree
13
13
 
14
14
  belongs_to :occupation, serializer: Spree::V2::Tenant::TaxonSerializer
15
15
  belongs_to :nationality, serializer: Spree::V2::Tenant::TaxonSerializer
16
+ belongs_to :line_item, serializer: Spree::V2::Tenant::LineItemSerializer
16
17
  has_one :id_card, serializer: Spree::V2::Tenant::IdCardSerializer
18
+ has_many :guest_dynamic_fields, serializer: Spree::V2::Tenant::GuestDynamicFieldSerializer
17
19
 
18
20
  # allowed_checkout updates frequently
19
21
  cache_options store: nil
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module V2
3
+ module Tenant
4
+ class ProductDynamicFieldSerializer < BaseSerializer
5
+ attributes :id, :product_id, :dynamic_field_id, :section
6
+
7
+ belongs_to :dynamic_field, serializer: Spree::V2::Tenant::DynamicFieldSerializer
8
+ end
9
+ end
10
+ end
11
+ end
@@ -5,6 +5,9 @@ module Spree
5
5
  # This serializer extends the Storefront ProductSerializer
6
6
  # to include any additional attributes or relationships needed
7
7
  # for the Tenant context.
8
+
9
+ # Overrided dynamic fields relationship of the parent serializer(Storefront).
10
+ has_many :dynamic_fields, serializer: Spree::V2::Tenant::DynamicFieldSerializer
8
11
  end
9
12
  end
10
13
  end
data/config/routes.rb CHANGED
@@ -507,6 +507,10 @@ Spree::Core::Engine.add_routes do
507
507
  resources :id_cards, only: %i[create update destroy]
508
508
  end
509
509
 
510
+ resources :dynamic_fields, only: :index
511
+ resources :product_dynamic_fields, only: :index
512
+ resources :dynamic_field_options, only: :index
513
+
510
514
  resource :checkout, controller: :checkout, only: %i[update] do
511
515
  patch :next
512
516
  patch :advance
@@ -0,0 +1,9 @@
1
+ class AddSendTypeToSmsLog < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_sms_logs, :send_type, :integer, default: 0, null: false, if_not_exists: true
4
+ add_index :cm_sms_logs, :from_number, if_not_exists: true
5
+ if column_exists?(:cm_sms_logs, :status)
6
+ change_column_null :cm_sms_logs, :status, false, 0
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '2.1.4-pre1'.freeze
2
+ VERSION = '2.1.5-pre1'.freeze
3
3
 
4
4
  module_function
5
5
 
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.1.4.pre.pre1
4
+ version: 2.1.5.pre.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-09-12 00:00:00.000000000 Z
11
+ date: 2025-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree
@@ -976,6 +976,8 @@ files:
976
976
  - app/controllers/spree/api/v2/tenant/checkout_controller.rb
977
977
  - app/controllers/spree/api/v2/tenant/cms_pages_controller.rb
978
978
  - app/controllers/spree/api/v2/tenant/customer_notifications_controller.rb
979
+ - app/controllers/spree/api/v2/tenant/dynamic_field_options_controller.rb
980
+ - app/controllers/spree/api/v2/tenant/dynamic_fields_controller.rb
979
981
  - app/controllers/spree/api/v2/tenant/guests_controller.rb
980
982
  - app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb
981
983
  - app/controllers/spree/api/v2/tenant/id_cards_controller.rb
@@ -984,6 +986,7 @@ files:
984
986
  - app/controllers/spree/api/v2/tenant/order_histories_controller.rb
985
987
  - app/controllers/spree/api/v2/tenant/pin_code_checkers_controller.rb
986
988
  - app/controllers/spree/api/v2/tenant/pin_code_generators_controller.rb
989
+ - app/controllers/spree/api/v2/tenant/product_dynamic_fields_controller.rb
987
990
  - app/controllers/spree/api/v2/tenant/products_controller.rb
988
991
  - app/controllers/spree/api/v2/tenant/profile_images_controller.rb
989
992
  - app/controllers/spree/api/v2/tenant/reset_passwords_controller.rb
@@ -1142,6 +1145,7 @@ files:
1142
1145
  - app/interactors/spree_cm_commissioner/firebase_email_fetcher_cron_executor.rb
1143
1146
  - app/interactors/spree_cm_commissioner/firebase_id_token_provider.rb
1144
1147
  - app/interactors/spree_cm_commissioner/google_places_fetcher.rb
1148
+ - app/interactors/spree_cm_commissioner/guest_dynamic_fields_manager.rb
1145
1149
  - app/interactors/spree_cm_commissioner/guest_id_card_manager.rb
1146
1150
  - app/interactors/spree_cm_commissioner/guest_seat_updater.rb
1147
1151
  - app/interactors/spree_cm_commissioner/host_matcher.rb
@@ -1741,7 +1745,10 @@ files:
1741
1745
  - app/serializers/spree/v2/tenant/cart_serializer.rb
1742
1746
  - app/serializers/spree/v2/tenant/customer_notification_serializer.rb
1743
1747
  - app/serializers/spree/v2/tenant/digital_link_serializer.rb
1748
+ - app/serializers/spree/v2/tenant/dynamic_field_option_serializer.rb
1749
+ - app/serializers/spree/v2/tenant/dynamic_field_serializer.rb
1744
1750
  - app/serializers/spree/v2/tenant/guest_card_class_serializer.rb
1751
+ - app/serializers/spree/v2/tenant/guest_dynamic_field_serializer.rb
1745
1752
  - app/serializers/spree/v2/tenant/guest_serializer.rb
1746
1753
  - app/serializers/spree/v2/tenant/homepage_section_relatable_serializer.rb
1747
1754
  - app/serializers/spree/v2/tenant/homepage_section_serializer.rb
@@ -1754,6 +1761,7 @@ files:
1754
1761
  - app/serializers/spree/v2/tenant/order_serializer.rb
1755
1762
  - app/serializers/spree/v2/tenant/payment_method_group_serializer.rb
1756
1763
  - app/serializers/spree/v2/tenant/payment_method_serializer.rb
1764
+ - app/serializers/spree/v2/tenant/product_dynamic_field_serializer.rb
1757
1765
  - app/serializers/spree/v2/tenant/product_serializer.rb
1758
1766
  - app/serializers/spree/v2/tenant/reset_password_serializer.rb
1759
1767
  - app/serializers/spree/v2/tenant/role_serializer.rb
@@ -2743,6 +2751,7 @@ files:
2743
2751
  - db/migrate/20250911100835_add_variant_id_to_cm_blocks.rb
2744
2752
  - db/migrate/20250911174607_add_metadata_columns_to_cm_vehicles.rb
2745
2753
  - db/migrate/20250911174653_add_metadata_columns_to_cm_trips.rb
2754
+ - db/migrate/20250912084944_add_send_type_to_sms_log.rb
2746
2755
  - docker-compose.yml
2747
2756
  - docs/option_types/attr_types.md
2748
2757
  - docs/private_key.pem