spree_cm_commissioner 1.17.0.pre.pre6 → 1.17.0.pre.pre7
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/.env.example +3 -0
- data/Gemfile.lock +1 -1
- data/app/controllers/spree/api/v2/storefront/guests_controller.rb +19 -2
- data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +5 -1
- data/app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb +30 -0
- data/app/models/spree_cm_commissioner/dynamic_field.rb +15 -3
- data/app/models/spree_cm_commissioner/dynamic_field_option.rb +5 -1
- data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +21 -3
- data/app/models/spree_cm_commissioner/invite_team.rb +1 -1
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +1 -0
- data/app/models/spree_cm_commissioner/vendor_place.rb +1 -1
- data/app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface +18 -0
- data/app/queries/spree_cm_commissioner/guest_searcher_query.rb +45 -3
- data/app/serializers/spree_cm_commissioner/v2/operator/dashboard_crew_event_serializer.rb +4 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_option_serializer.rb +1 -3
- data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +1 -3
- data/app/serializers/spree_cm_commissioner/v2/storefront/guest_dynamic_field_serializer.rb +2 -1
- data/config/initializers/spree_permitted_attributes.rb +2 -0
- data/config/locales/en.yml +4 -0
- data/db/migrate/20250616084219_add_description_to_cm_vendor_place.rb +5 -0
- data/db/migrate/20250701093203_add_configurations_to_cm_dynamic_field.rb +6 -0
- data/db/migrate/20250702091305_add_dynamic_field_option_to_guest_dynamic_field.rb +5 -0
- data/db/migrate/20250702091935_add_status_to_dynamic_field_option.rb +5 -0
- data/lib/spree_cm_commissioner/version.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a00e3ade6665258924af6b63276add5be49a3b887d193942c41b8ba4a1fa573
|
4
|
+
data.tar.gz: c30315d4d2f4313a342f94be21cf567cab1dbc4bac07cd754542d61d5de17990
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30c14950496e7a3df59fd8a5e3233572a30437f750d0d546d4ec87cc405a8d24850912b161ca74eab4530d1d7cf27e3cb333625b0b4915e63102e3b45f1a3e94
|
7
|
+
data.tar.gz: 3062f419e60420e2e9a87c57b8720051292ebdbff63b4308bc739e32309b4aef55498b06c1b2134ee3761b9c4fca5cea8d0ecf912d3bf928701292123a23e11b
|
data/.env.example
CHANGED
data/Gemfile.lock
CHANGED
@@ -38,7 +38,24 @@ module Spree
|
|
38
38
|
def update
|
39
39
|
spree_authorize! :update, spree_current_order, order_token
|
40
40
|
|
41
|
-
if
|
41
|
+
if guest_params[:guest_dynamic_fields_attributes]
|
42
|
+
resource.guest_dynamic_fields.destroy_all
|
43
|
+
|
44
|
+
guest_params[:guest_dynamic_fields_attributes].each do |attr|
|
45
|
+
field = resource.guest_dynamic_fields.build(attr.except(:id))
|
46
|
+
|
47
|
+
if field.dynamic_field.requires_dynamic_field_options?
|
48
|
+
option = field.dynamic_field.dynamic_field_options.find_by(id: field.value)
|
49
|
+
field.dynamic_field_option = option if option
|
50
|
+
end
|
51
|
+
|
52
|
+
field.save!
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
resource.assign_attributes(guest_params.except(:guest_dynamic_fields_attributes))
|
57
|
+
|
58
|
+
if resource.save
|
42
59
|
render_serialized_payload { serialize_resource(resource) }
|
43
60
|
else
|
44
61
|
render_error_payload(resource, 400)
|
@@ -76,7 +93,7 @@ module Spree
|
|
76
93
|
:upload_later,
|
77
94
|
:country_code,
|
78
95
|
:contact,
|
79
|
-
guest_dynamic_fields_attributes: %i[id dynamic_field_id value _destroy]
|
96
|
+
guest_dynamic_fields_attributes: %i[id dynamic_field_id dynamic_field_option_id value _destroy]
|
80
97
|
)
|
81
98
|
end
|
82
99
|
end
|
@@ -93,6 +93,10 @@ module SpreeCmCommissioner
|
|
93
93
|
context.fail!(message: "User creation failed: #{context.user.errors.full_messages.join(', ')}")
|
94
94
|
end
|
95
95
|
|
96
|
+
def disable_services
|
97
|
+
'bus,ferry'
|
98
|
+
end
|
99
|
+
|
96
100
|
def construct_data
|
97
101
|
user = context.user
|
98
102
|
|
@@ -101,7 +105,7 @@ module SpreeCmCommissioner
|
|
101
105
|
name: user.full_name,
|
102
106
|
phone: user.phone_number,
|
103
107
|
email: user.email,
|
104
|
-
webUrl: "#{Spree::Store.default.formatted_url}/vattanac_bank_web_app?session_id=#{session_id}"
|
108
|
+
webUrl: "#{Spree::Store.default.formatted_url}/vattanac_bank_web_app?session_id=#{session_id}&ds=#{CGI.escape(disable_services)}"
|
105
109
|
}
|
106
110
|
|
107
111
|
json_data = raw_data.to_json
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module SpreeCmCommissioner
|
2
|
+
module EventCheckInFlowable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
preference :group_check_in_enabled, :boolean, default: true
|
7
|
+
preference :individual_check_in_enabled, :boolean, default: true
|
8
|
+
|
9
|
+
before_validation :validate_at_least_one_check_in_flow_presence
|
10
|
+
end
|
11
|
+
|
12
|
+
def check_in_flows
|
13
|
+
flows = []
|
14
|
+
flows << 'group' if group_check_in_enabled?
|
15
|
+
flows << 'individual' if individual_check_in_enabled?
|
16
|
+
flows
|
17
|
+
end
|
18
|
+
|
19
|
+
def group_check_in_enabled? = preferred_group_check_in_enabled
|
20
|
+
def individual_check_in_enabled? = preferred_individual_check_in_enabled
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def validate_at_least_one_check_in_flow_presence
|
25
|
+
return if check_in_flows.any?
|
26
|
+
|
27
|
+
errors.add(:check_in_flows, 'must have at least one flow selected')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -6,15 +6,27 @@ module SpreeCmCommissioner
|
|
6
6
|
has_many :guest_dynamic_fields, class_name: 'SpreeCmCommissioner::GuestDynamicField', dependent: :destroy
|
7
7
|
has_many :product_dynamic_fields, class_name: 'SpreeCmCommissioner::ProductDynamicField', dependent: :destroy
|
8
8
|
|
9
|
-
enum data_type: {
|
9
|
+
enum data_type: { text: 0, number: 1, boolean: 2, checkbox: 3, radio: 4, selection: 5, textarea: 6 }
|
10
10
|
|
11
11
|
accepts_nested_attributes_for :dynamic_field_options, allow_destroy: true, reject_if: :all_blank
|
12
12
|
|
13
13
|
validates :label, presence: true
|
14
14
|
validates :data_type, presence: true
|
15
|
+
validates :configurations, presence: true, allow_blank: false
|
15
16
|
|
16
|
-
def
|
17
|
-
checkbox? || radio?
|
17
|
+
def requires_dynamic_field_options?
|
18
|
+
checkbox? || radio? || selection?
|
19
|
+
end
|
20
|
+
|
21
|
+
def multiple_select
|
22
|
+
return nil unless selection?
|
23
|
+
|
24
|
+
configurations['multiple_select'] == true
|
25
|
+
end
|
26
|
+
|
27
|
+
def multiple_select=(value)
|
28
|
+
self.configurations ||= {}
|
29
|
+
self.configurations['multiple_select'] = ActiveModel::Type::Boolean.new.cast(value)
|
18
30
|
end
|
19
31
|
end
|
20
32
|
end
|
@@ -1,8 +1,12 @@
|
|
1
1
|
module SpreeCmCommissioner
|
2
2
|
class DynamicFieldOption < SpreeCmCommissioner::Base
|
3
3
|
belongs_to :dynamic_field, class_name: 'SpreeCmCommissioner::DynamicField', optional: false
|
4
|
+
has_many :guest_dynamic_fields, class_name: 'SpreeCmCommissioner::GuestDynamicField', dependent: :restrict_with_error
|
5
|
+
|
6
|
+
enum status: { active: 0, draft: 1, archived: 2 }
|
4
7
|
|
5
8
|
validates :value, presence: true, uniqueness: { scope: :dynamic_field_id }
|
9
|
+
validates :status, presence: true
|
6
10
|
validate :parent_field_must_be_selection_type
|
7
11
|
|
8
12
|
private
|
@@ -10,7 +14,7 @@ module SpreeCmCommissioner
|
|
10
14
|
def parent_field_must_be_selection_type
|
11
15
|
return unless dynamic_field
|
12
16
|
|
13
|
-
return if dynamic_field.
|
17
|
+
return if dynamic_field.requires_dynamic_field_options?
|
14
18
|
|
15
19
|
errors.add(:dynamic_field, 'must be a selection type field')
|
16
20
|
end
|
@@ -2,9 +2,11 @@ module SpreeCmCommissioner
|
|
2
2
|
class GuestDynamicField < SpreeCmCommissioner::Base
|
3
3
|
belongs_to :guest, class_name: 'SpreeCmCommissioner::Guest', optional: false
|
4
4
|
belongs_to :dynamic_field, class_name: 'SpreeCmCommissioner::DynamicField', optional: false
|
5
|
+
belongs_to :dynamic_field_option, class_name: 'SpreeCmCommissioner::DynamicFieldOption', optional: true
|
5
6
|
|
6
7
|
validates :value, presence: true
|
7
8
|
validate :validate_value_format, if: -> { value.present? && dynamic_field.present? }
|
9
|
+
validate :validate_option_reference, if: -> { dynamic_field_option.present? }
|
8
10
|
|
9
11
|
private
|
10
12
|
|
@@ -12,14 +14,30 @@ module SpreeCmCommissioner
|
|
12
14
|
return if dynamic_field.blank?
|
13
15
|
|
14
16
|
case dynamic_field.data_type.to_s
|
15
|
-
when '
|
17
|
+
when 'number'
|
16
18
|
errors.add(:value, 'must be a number') unless value.to_s.match?(/\A\d+\z/)
|
17
19
|
when 'boolean'
|
18
|
-
errors.add(:value, 'must be true or false') unless %w[true false
|
19
|
-
when 'checkbox', 'radio'
|
20
|
+
errors.add(:value, 'must be true or false') unless %w[true false].include?(value.to_s.downcase)
|
21
|
+
when 'checkbox', 'radio', 'selection'
|
22
|
+
validate_option_value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def validate_option_value
|
27
|
+
if dynamic_field_option.present?
|
28
|
+
self.value ||= dynamic_field_option.value
|
29
|
+
else
|
20
30
|
valid_options = dynamic_field.dynamic_field_options.pluck(:id).map(&:to_s)
|
21
31
|
errors.add(:value, 'is not a valid option') unless valid_options.include?(value)
|
22
32
|
end
|
23
33
|
end
|
34
|
+
|
35
|
+
def validate_option_reference
|
36
|
+
return if dynamic_field.blank? || dynamic_field_option.blank?
|
37
|
+
|
38
|
+
return if dynamic_field_option.dynamic_field_id == dynamic_field_id
|
39
|
+
|
40
|
+
errors.add(:dynamic_field_option, 'must belong to the same dynamic field')
|
41
|
+
end
|
24
42
|
end
|
25
43
|
end
|
@@ -4,6 +4,7 @@ module SpreeCmCommissioner
|
|
4
4
|
base.include SpreeCmCommissioner::TaxonKind
|
5
5
|
base.include SpreeCmCommissioner::Transit::TaxonBitwise
|
6
6
|
base.include SpreeCmCommissioner::ParticipationTypeBitwise
|
7
|
+
base.include SpreeCmCommissioner::EventCheckInFlowable
|
7
8
|
|
8
9
|
base.preference :background_color, :string
|
9
10
|
base.preference :foreground_color, :string
|
@@ -7,7 +7,7 @@ module SpreeCmCommissioner
|
|
7
7
|
belongs_to :place, class_name: 'SpreeCmCommissioner::Place', optional: false
|
8
8
|
|
9
9
|
validates :place_type, presence: true
|
10
|
-
validates :
|
10
|
+
validates :place_id, uniqueness: { scope: %i[vendor_id place_type] }
|
11
11
|
|
12
12
|
accepts_nested_attributes_for :place, allow_destroy: true
|
13
13
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<!-- insert_before "erb[loud]:contains('field_container :hide_from_nav')" -->
|
2
|
+
|
3
|
+
<%# Sections don't use video banner, so we hide the form here to avoid confusing admin. %>
|
4
|
+
|
5
|
+
<%= f.field_container :preferred_group_check_in_enabled, class: ['custom-control', 'custom-checkbox', 'my-4'] do %>
|
6
|
+
<%= f.check_box :preferred_group_check_in_enabled, class: 'custom-control-input' %>
|
7
|
+
<%= f.label :preferred_group_check_in_enabled, Spree.t(:enable_group_check_in), class: 'custom-control-label' %>
|
8
|
+
<%= f.error_message_on :preferred_group_check_in_enabled %>
|
9
|
+
<small class="form-text text-muted">
|
10
|
+
Enabled by default for most events where users can purchase multiple tickets or use group scanning. For large events (like PSK, ASK, etc.) or invitation-based events, you should disable this to ensure each ticket or invitation is scanned individually.
|
11
|
+
</small>
|
12
|
+
<% end if @taxon.event? && @taxon.depth == 1 %> %>
|
13
|
+
|
14
|
+
<%= f.field_container :preferred_individual_check_in_enabled, class: ['custom-control', 'custom-checkbox', 'my-4'] do %>
|
15
|
+
<%= f.check_box :preferred_individual_check_in_enabled, class: 'custom-control-input' %>
|
16
|
+
<%= f.label :preferred_individual_check_in_enabled, Spree.t(:enable_individual_check_in), class: 'custom-control-label' %>
|
17
|
+
<%= f.error_message_on :preferred_individual_check_in_enabled %>
|
18
|
+
<% end if @taxon.event? && @taxon.depth == 1 %> %>
|
@@ -8,20 +8,36 @@ module SpreeCmCommissioner
|
|
8
8
|
|
9
9
|
def event_id = params[:event_id]
|
10
10
|
|
11
|
-
def call
|
11
|
+
def call # rubocop:disable Metrics/PerceivedComplexity
|
12
12
|
return SpreeCmCommissioner::Guest.none if event_id.blank?
|
13
13
|
|
14
|
-
if params[:qr_data].present?
|
14
|
+
if params[:qr_data].present? && order_qr_data?
|
15
|
+
search_by_order_qr
|
16
|
+
elsif params[:qr_data].present? && line_item_qr_data?
|
17
|
+
search_by_line_item_qr
|
18
|
+
elsif params[:qr_data].present? && guest_qr_data?
|
15
19
|
search_by_guest_qr
|
16
20
|
elsif params[:term].present?
|
17
21
|
search_by_term
|
22
|
+
elsif params[:ids].present?
|
23
|
+
SpreeCmCommissioner::Guest.complete_or_canceled.where(event_id: event_id, id: params[:ids])
|
18
24
|
else
|
19
|
-
SpreeCmCommissioner::Guest.
|
25
|
+
SpreeCmCommissioner::Guest.complete_or_canceled.where(event_id: event_id)
|
20
26
|
end
|
21
27
|
end
|
22
28
|
|
23
29
|
private
|
24
30
|
|
31
|
+
def search_by_order_qr
|
32
|
+
order = Spree::Order.complete_or_canceled.search_by_qr_data!(params[:qr_data])
|
33
|
+
order.guests.where(event_id: event_id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def search_by_line_item_qr
|
37
|
+
line_item = Spree::LineItem.complete_or_canceled.search_by_qr_data!(params[:qr_data])
|
38
|
+
line_item.guests.where(event_id: event_id)
|
39
|
+
end
|
40
|
+
|
25
41
|
def search_by_guest_qr
|
26
42
|
SpreeCmCommissioner::Guest.complete_or_canceled.where(
|
27
43
|
token: params[:qr_data],
|
@@ -29,6 +45,32 @@ module SpreeCmCommissioner
|
|
29
45
|
)
|
30
46
|
end
|
31
47
|
|
48
|
+
def order_qr_data?
|
49
|
+
matches = construct_matches
|
50
|
+
matches&.size == 2
|
51
|
+
end
|
52
|
+
|
53
|
+
def line_item_qr_data?
|
54
|
+
matches = construct_matches
|
55
|
+
matches&.size == 3
|
56
|
+
end
|
57
|
+
|
58
|
+
def guest_qr_data?
|
59
|
+
matches = construct_matches
|
60
|
+
matches.nil?
|
61
|
+
end
|
62
|
+
|
63
|
+
def construct_matches
|
64
|
+
qr_data = params[:qr_data]
|
65
|
+
return nil unless qr_data
|
66
|
+
|
67
|
+
if qr_data =~ /-L\d+$/
|
68
|
+
qr_data.match(/(R\d+)-([A-Za-z0-9_\-]+)-(L\d+)/)&.captures
|
69
|
+
else
|
70
|
+
qr_data.match(/(R\d+)-([A-Za-z0-9_\-]+)/)&.captures
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
32
74
|
def search_by_term
|
33
75
|
terms = params[:term].split.map { |term| "%#{term.downcase}%" }
|
34
76
|
|
@@ -2,7 +2,10 @@ module SpreeCmCommissioner
|
|
2
2
|
module V2
|
3
3
|
module Operator
|
4
4
|
class DashboardCrewEventSerializer < BaseSerializer
|
5
|
-
attributes :id, :name, :permalink,
|
5
|
+
attributes :id, :name, :permalink,
|
6
|
+
:from_date, :to_date,
|
7
|
+
:check_in_flows,
|
8
|
+
:updated_at
|
6
9
|
|
7
10
|
has_many :children_classifications, serializer: :classification
|
8
11
|
has_one :category_icon, serializer: SpreeCmCommissioner::V2::Storefront::AssetSerializer
|
@@ -2,9 +2,7 @@ module SpreeCmCommissioner
|
|
2
2
|
module V2
|
3
3
|
module Storefront
|
4
4
|
class DynamicFieldOptionSerializer < BaseSerializer
|
5
|
-
|
6
|
-
|
7
|
-
attributes :id, :value, :dynamic_field_id, :created_at, :updated_at
|
5
|
+
attributes :id, :value, :dynamic_field_id, :status, :created_at, :updated_at
|
8
6
|
end
|
9
7
|
end
|
10
8
|
end
|
@@ -2,9 +2,7 @@ module SpreeCmCommissioner
|
|
2
2
|
module V2
|
3
3
|
module Storefront
|
4
4
|
class DynamicFieldSerializer < BaseSerializer
|
5
|
-
|
6
|
-
|
7
|
-
attributes :id, :label, :data_type, :vendor_id, :created_at, :updated_at
|
5
|
+
attributes :id, :label, :data_type, :vendor_id, :multiple_select, :created_at, :updated_at
|
8
6
|
|
9
7
|
has_many :dynamic_field_options, serializer: SpreeCmCommissioner::V2::Storefront::DynamicFieldOptionSerializer
|
10
8
|
end
|
@@ -4,9 +4,10 @@ module SpreeCmCommissioner
|
|
4
4
|
class GuestDynamicFieldSerializer < BaseSerializer
|
5
5
|
set_type :guest_dynamic_field
|
6
6
|
|
7
|
-
attributes :id, :value, :guest_id, :dynamic_field_id, :created_at, :updated_at
|
7
|
+
attributes :id, :value, :guest_id, :dynamic_field_id, :dynamic_field_option_id, :created_at, :updated_at
|
8
8
|
|
9
9
|
belongs_to :dynamic_field, serializer: SpreeCmCommissioner::V2::Storefront::DynamicFieldSerializer
|
10
|
+
belongs_to :dynamic_field_option, serializer: SpreeCmCommissioner::V2::Storefront::DynamicFieldOptionSerializer
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
data/config/locales/en.yml
CHANGED
@@ -459,6 +459,10 @@ en:
|
|
459
459
|
businesses_cant_be_blank: "Businesses can't be blank"
|
460
460
|
phone_number_cant_be_blank: "Phone number can't be blank"
|
461
461
|
quantity_cant_be_less_than_or_equal_to_zero: "Quantity can't be less or equal than 0"
|
462
|
+
spree_cm_commissioner/vendor_place:
|
463
|
+
attributes:
|
464
|
+
place_id:
|
465
|
+
taken: "has already existed with this place type"
|
462
466
|
|
463
467
|
mail:
|
464
468
|
order_mailer:
|
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: 1.17.0.pre.
|
4
|
+
version: 1.17.0.pre.pre7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- You
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-07-
|
11
|
+
date: 2025-07-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: spree
|
@@ -1185,6 +1185,7 @@ files:
|
|
1185
1185
|
- app/mailers/spree_cm_commissioner/pin_code_mailer.rb
|
1186
1186
|
- app/mailers/spree_cm_commissioner/team_invite_mailer.rb
|
1187
1187
|
- app/models/.gitkeep
|
1188
|
+
- app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb
|
1188
1189
|
- app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb
|
1189
1190
|
- app/models/concerns/spree_cm_commissioner/json_preference_validator.rb
|
1190
1191
|
- app/models/concerns/spree_cm_commissioner/kyc_bitwise.rb
|
@@ -1490,6 +1491,7 @@ files:
|
|
1490
1491
|
- app/overrides/spree/admin/taxons/_form/assets_form.html.erb.deface
|
1491
1492
|
- app/overrides/spree/admin/taxons/_form/available_on.html.erb.deface
|
1492
1493
|
- app/overrides/spree/admin/taxons/_form/background_color_and_foreground_color.html.erb.deface
|
1494
|
+
- app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface
|
1493
1495
|
- app/overrides/spree/admin/taxons/_form/custom_redirect_url.html.erb.deface
|
1494
1496
|
- app/overrides/spree/admin/taxons/_form/hide_video_banner.html.erb.deface
|
1495
1497
|
- app/overrides/spree/admin/taxons/_form/kind_html.erb.deface
|
@@ -2514,6 +2516,10 @@ files:
|
|
2514
2516
|
- db/migrate/20250610080108_add_contact_to_cm_guests.rb
|
2515
2517
|
- db/migrate/20250611023548_add_country_code_to_guests.rb
|
2516
2518
|
- db/migrate/20250612035937_add_intel_phone_number_to_guests.rb
|
2519
|
+
- db/migrate/20250616084219_add_description_to_cm_vendor_place.rb
|
2520
|
+
- db/migrate/20250701093203_add_configurations_to_cm_dynamic_field.rb
|
2521
|
+
- db/migrate/20250702091305_add_dynamic_field_option_to_guest_dynamic_field.rb
|
2522
|
+
- db/migrate/20250702091935_add_status_to_dynamic_field_option.rb
|
2517
2523
|
- docker-compose.yml
|
2518
2524
|
- docs/option_types/attr_types.md
|
2519
2525
|
- docs/private_key.pem
|