spree_cm_commissioner 2.9.4 → 2.9.6

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/app/controllers/concerns/spree_cm_commissioner/turnstile_protectable.rb +9 -7
  4. data/app/controllers/spree/api/v2/operator/event_charts_controller.rb +1 -0
  5. data/app/controllers/spree/api/v2/operator/guest_json_gzips_controller.rb +14 -4
  6. data/app/controllers/spree/api/v2/storefront/account_checker_controller.rb +4 -0
  7. data/app/controllers/spree/api/v2/tenant/account/orders_controller.rb +1 -1
  8. data/app/controllers/spree/api/v2/tenant/my_votes_controller.rb +51 -0
  9. data/app/controllers/spree/api/v2/tenant/show_people_controller.rb +1 -4
  10. data/app/controllers/spree/api/v2/tenant/show_person_assignments_controller.rb +4 -1
  11. data/app/controllers/spree/api/v2/tenant/voting_contestants_controller.rb +6 -2
  12. data/app/interactors/spree_cm_commissioner/host_matcher.rb +6 -5
  13. data/app/interactors/spree_cm_commissioner/turnstile_token_validator.rb +43 -13
  14. data/app/models/concerns/spree_cm_commissioner/event_metadata.rb +5 -0
  15. data/app/models/concerns/spree_cm_commissioner/order_qr_codeable.rb +39 -0
  16. data/app/models/concerns/spree_cm_commissioner/order_scopes.rb +5 -0
  17. data/app/models/spree_cm_commissioner/check_in_session.rb +36 -0
  18. data/app/models/spree_cm_commissioner/exports/operator_guest_json_gzip.rb +26 -1
  19. data/app/models/spree_cm_commissioner/guest.rb +4 -0
  20. data/app/models/spree_cm_commissioner/maintenance_tasks/event.rb +9 -1
  21. data/app/models/spree_cm_commissioner/order_decorator.rb +2 -37
  22. data/app/models/spree_cm_commissioner/role_decorator.rb +52 -4
  23. data/app/models/spree_cm_commissioner/role_user_decorator.rb +11 -0
  24. data/app/models/spree_cm_commissioner/show_person.rb +5 -1
  25. data/app/models/spree_cm_commissioner/show_person_assignment.rb +1 -1
  26. data/app/models/spree_cm_commissioner/taxon_decorator.rb +2 -0
  27. data/app/models/spree_cm_commissioner/tenant.rb +17 -6
  28. data/app/models/spree_cm_commissioner/user_decorator.rb +35 -0
  29. data/app/models/spree_cm_commissioner/voting_contestant.rb +2 -0
  30. data/app/queries/spree_cm_commissioner/event_chart_queries.rb +23 -7
  31. data/app/queries/spree_cm_commissioner/guest_searcher_query.rb +16 -3
  32. data/app/queries/spree_cm_commissioner/pie_chart_event_aggregator_queries.rb +1 -0
  33. data/app/queries/spree_cm_commissioner/user_votes_per_contestant_query.rb +48 -0
  34. data/app/serializers/spree/v2/tenant/my_vote_serializer.rb +19 -0
  35. data/app/serializers/spree/v2/tenant/show_serializer.rb +2 -1
  36. data/app/serializers/spree/v2/tenant/voting_contestant_serializer.rb +2 -0
  37. data/app/services/spree_cm_commissioner/check_ins/create_bulk.rb +10 -6
  38. data/app/services/spree_cm_commissioner/imports/contestants/create.rb +19 -1
  39. data/app/services/spree_cm_commissioner/operator_guest_json_gzips/create.rb +14 -7
  40. data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +12 -11
  41. data/app/services/spree_cm_commissioner/show_contestants/normalize_video_highlights.rb +5 -1
  42. data/app/views/spree/admin/tenants/_form.html.erb +13 -1
  43. data/config/locales/en.yml +12 -7
  44. data/config/locales/km.yml +12 -4
  45. data/config/routes.rb +1 -0
  46. data/db/migrate/20260720000001_add_check_in_fields_to_spree_roles.rb +11 -0
  47. data/db/migrate/20260723000000_add_payment_host_to_cm_tenants.rb +6 -0
  48. data/db/migrate/20260723000001_add_metadata_to_spree_roles.rb +11 -0
  49. data/db/migrate/20260728074153_add_role_to_cm_exports.rb +5 -0
  50. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
  51. data/lib/spree_cm_commissioner/version.rb +1 -1
  52. metadata +10 -2
@@ -34,7 +34,7 @@
34
34
  <% end %>
35
35
  <% end %>
36
36
  </div>
37
- <div class="col-12">
37
+ <div class="col-6">
38
38
  <%= f.field_container :host do %>
39
39
  <%= f.label :host, raw(Spree.t(:host) + required_span_tag) %>
40
40
  <%= f.text_field :host, required: true, class: 'form-control', placeholder: 'example.com' %>
@@ -43,6 +43,18 @@
43
43
  <% end %>
44
44
  <% end %>
45
45
  </div>
46
+ <div class="col-6">
47
+ <%= f.field_container :payment_host do %>
48
+ <%= f.label :payment_host, raw(Spree.t(:payment_host)) %>
49
+ <span class="text-muted" style="font-size: 0.875rem; font-weight: normal; margin-left: 8px;">(eg. server.example.com)</span>
50
+ <span title="When set, this tenant's payment URLs (ABA callback + iframe pages) point directly at this host instead of routing through the tenant's client domain."
51
+ style="cursor: help; margin-left: 4px;">&#9432;</span>
52
+ <%= f.text_field :payment_host, class: 'form-control', placeholder: 'server.example.com' %>
53
+ <% if f.object.errors[:payment_host].any? %>
54
+ <div class="error text-danger"><%= f.object.errors[:payment_host].join(', ') %></div>
55
+ <% end %>
56
+ <% end %>
57
+ </div>
46
58
  <div class="col-6">
47
59
  <%= f.field_container :state do %>
48
60
  <%= f.label :state, raw(Spree.t(:state)) %>
@@ -77,7 +77,11 @@ en:
77
77
  action_not_matched: "Action is not matched"
78
78
 
79
79
  turnstile:
80
+ token_missing: "Verification token is missing"
80
81
  verification_failed: "Human verification failed. Please try again."
82
+ token_expired: "Verification expired. Please try again."
83
+ invalid_token: "Verification token is invalid. Please try again."
84
+ service_unavailable: "Verification service is temporarily unavailable. Please try again shortly."
81
85
 
82
86
  taxon:
83
87
  icon: Icon (Square)
@@ -244,6 +248,7 @@ en:
244
248
  no_internal_note: "No note"
245
249
  save_internal_note: "Save Note"
246
250
  internal_note_updated: "Internal note updated"
251
+ payment_host: "Payment Host"
247
252
  voting_contestant_advancer:
248
253
  reversion_error: "Cannot eliminate here yet. This contestant appears in a later session."
249
254
  is_open_dated: "Is Open Dated Trip?"
@@ -538,6 +543,12 @@ en:
538
543
  already_checked_in: "Guest has already checked in for this session"
539
544
  check_in_session_required: "Check-in session required"
540
545
  check_in_session_is_not_allowed_or_invalid: "Check-in session is not allowed or invalid for this guest/ticket"
546
+ check_in_group_not_allowed: "This ticket is not in your check-in group"
547
+ order_canceled: "Cannot check in guest from a cancelled order"
548
+ guest_locked: "Guest is locked and cannot be checked in"
549
+ guest_transferred: "Guest has been transferred and cannot be checked in"
550
+ check_in_session:
551
+ end_time_after_start_time: "End time must be after start time"
541
552
  load_test:
542
553
  nav_label: "Load Testing"
543
554
  back_to_load_testing: "Back to Load Testing"
@@ -671,9 +682,7 @@ en:
671
682
  paid_votes_amount:
672
683
  less_than_used: "cannot be less than paid votes used (%{used})"
673
684
  spree_cm_commissioner/tenant:
674
- attributes:
675
- host:
676
- format: "must not include protocol (http:// or https://)"
685
+ format: "must not include protocol (http:// or https://)"
677
686
 
678
687
  mail:
679
688
  order_mailer:
@@ -907,10 +916,6 @@ en:
907
916
  past_date: "Cannot redeem for a past date"
908
917
  return_before_outbound: "Return date must be after the outbound trip date"
909
918
  trip_not_available: "Trip is not available for redemption"
910
- turnstile:
911
- token_missing: "Verification token is missing"
912
- verification_failed: "Human verification failed"
913
- service_unavailable: "Verification service is temporarily unavailable"
914
919
  spree_cm_commissioner:
915
920
  draft_order:
916
921
  line_items_missing: "Line items are missing"
@@ -26,6 +26,10 @@ km:
26
26
  already_checked_in: "ភ្ញៀវបានចូលរួចហើយ"
27
27
  check_in_session_required: "ត្រូវតែមានវគ្គចុះឈ្មោះចូល"
28
28
  check_in_session_is_not_allowed_or_invalid: "វគ្គចុះឈ្មោះនេះមិនត្រឹមត្រូវ សម្រាប់ភ្ញៀវ ឬសំបុត្រនេះទេ"
29
+ check_in_group_not_allowed: "សំបុត្រនេះមិនស្ថិតក្នុងក្រុមចុះឈ្មោះចូលរបស់អ្នកទេ"
30
+ order_canceled: "មិនអាចចុះឈ្មោះចូលភ្ញៀវពីការបញ្ជាទិញដែលបានលុបចោលបានទេ"
31
+ guest_locked: "ភ្ញៀវត្រូវបានចាក់សោ មិនអាចចុះឈ្មោះចូលបានទេ"
32
+ guest_transferred: "ភ្ញៀវត្រូវបានផ្ទេរ មិនអាចចុះឈ្មោះចូលបានទេ"
29
33
 
30
34
  sms:
31
35
  to:
@@ -200,11 +204,14 @@ km:
200
204
  riel: "៛"
201
205
 
202
206
  spree:
207
+ check_in_session:
208
+ end_time_after_start_time: "កាលបរិច្ឆេទបញ្ចប់ត្រូវតែក្រោយកាលបរិច្ឆេទចាប់ផ្តើម"
203
209
  internal_note: "ចំណាំផ្ទៃក្នុង"
204
210
  add_internal_note: "បន្ថែមចំណាំ"
205
211
  no_internal_note: "គ្មានចំណាំ"
206
212
  save_internal_note: "រក្សាទុកចំណាំ"
207
213
  internal_note_updated: "បានរក្សាទុកចំណាំផ្ទៃក្នុង"
214
+ payment_host: "ម៉ាស៊ីនមេទូទាត់ប្រាក់"
208
215
  voting_contestant_advancer:
209
216
  reversion_error: "មិនអាចដកចេញនៅវគ្គនេះបានទេ។ បេក្ខជននេះមាននៅវគ្គបោះឆ្នោតក្រោយ។"
210
217
  registered_by:
@@ -441,9 +448,7 @@ km:
441
448
  paid_votes_amount:
442
449
  less_than_used: "មិនអាចតូចជាងចំនួនសំឡេងបង់ប្រាក់ដែលបានប្រើ (%{used})"
443
450
  spree_cm_commissioner/tenant:
444
- attributes:
445
- host:
446
- format: "មិនអនុញ្ញាតឱ្យបញ្ចូលឈ្មោះដែលភ្ជាប់ជាមួយ (http:// ឬ https://)"
451
+ format: "មិនអនុញ្ញាតឱ្យបញ្ចូលឈ្មោះដែលភ្ជាប់ជាមួយ (http:// ឬ https://)"
447
452
 
448
453
  mail:
449
454
  order_mailer:
@@ -665,7 +670,10 @@ km:
665
670
 
666
671
  turnstile:
667
672
  token_missing: "សញ្ញាណផ្ទៀងផ្ទាត់គឺបាត់"
668
- service_unavailable: "សេវាកម្មពេលនេះមិនមានការផ្ទៀងផ្ទាត់"
673
+ verification_failed: "ការផ្ទៀងផ្ទាត់មនុស្សបានបរាជ័យ។ សូមព្យាយាមម្តងទៀត។"
674
+ token_expired: "ការផ្ទៀងផ្ទាត់បានផុតកំណត់។ សូមព្យាយាមម្តងទៀត។"
675
+ invalid_token: "សញ្ញាណផ្ទៀងផ្ទាត់មិនត្រឹមត្រូវ។ សូមព្យាយាមម្តងទៀត។"
676
+ service_unavailable: "សេវាកម្មផ្ទៀងផ្ទាត់បច្ចុប្បន្នមិនអាចប្រើបានទេ។ សូមព្យាយាមម្តងទៀតក្នុងពេលឆាប់ៗនេះ។"
669
677
 
670
678
  spree_cm_commissioner:
671
679
  draft_order:
data/config/routes.rb CHANGED
@@ -642,6 +642,7 @@ Spree::Core::Engine.add_routes do
642
642
  resources :voting_contestants, only: :index
643
643
  resources :voting_credits, only: :index
644
644
  resources :votes, only: %i[create index]
645
+ resource :my_votes, only: :show, controller: :my_votes
645
646
  end
646
647
 
647
648
  resources :voting_credit_transactions, only: :index
@@ -0,0 +1,11 @@
1
+ class AddCheckInFieldsToSpreeRoles < ActiveRecord::Migration[7.0]
2
+ def change
3
+ # A check-in group is a Spree::Role (role_type :check_in) scoped to one event via event_id.
4
+ add_column :spree_roles, :event_id, :bigint, if_not_exists: true
5
+ add_index :spree_roles, :event_id, if_not_exists: true
6
+
7
+ # 0 = all (check in every ticket, the default), 1 = include (only the group's listed tickets),
8
+ # 2 = exclude (all except them).
9
+ add_column :spree_roles, :check_in_mode, :integer, default: 0, null: false, if_not_exists: true
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ class AddPaymentHostToCmTenants < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_tenants, :payment_host, :string, if_not_exists: true
4
+ add_index :cm_tenants, :payment_host, if_not_exists: true
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ class AddMetadataToSpreeRoles < ActiveRecord::Migration[7.0]
2
+ def up
3
+ add_column :spree_roles, :public_metadata, :jsonb, default: '{}', if_not_exists: true
4
+ add_column :spree_roles, :private_metadata, :jsonb, default: '{}', if_not_exists: true
5
+ end
6
+
7
+ def down
8
+ remove_column :spree_roles, :public_metadata, if_exists: true
9
+ remove_column :spree_roles, :private_metadata, if_exists: true
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ class AddRoleToCmExports < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_reference :cm_exports, :role, foreign_key: { to_table: :spree_roles }, index: true, if_not_exists: true
4
+ end
5
+ end
@@ -3,7 +3,7 @@ FactoryBot.define do
3
3
  sequence(:name) { |n| "vehicle_#{n}" }
4
4
  sequence(:license_plate) { |n| "2KH-#{'%04d' % (n % 10000)}" }
5
5
  kind { :air_bus }
6
- association :vendor, factory: :vendor
6
+ vendor { |v| v.association(:cm_vendor) }
7
7
  association :vehicle_type, factory: :cm_vehicle_type
8
8
  end
9
9
  end
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '2.9.4'.freeze
2
+ VERSION = '2.9.6'.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.9.4
4
+ version: 2.9.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-07-22 00:00:00.000000000 Z
11
+ date: 2026-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree
@@ -1071,6 +1071,7 @@ files:
1071
1071
  - app/controllers/spree/api/v2/tenant/intercity_taxi/distance_calculator_controller.rb
1072
1072
  - app/controllers/spree/api/v2/tenant/intercity_taxi/draft_orders_controller.rb
1073
1073
  - app/controllers/spree/api/v2/tenant/line_items_controller.rb
1074
+ - app/controllers/spree/api/v2/tenant/my_votes_controller.rb
1074
1075
  - app/controllers/spree/api/v2/tenant/notifications_controller.rb
1075
1076
  - app/controllers/spree/api/v2/tenant/order_histories_controller.rb
1076
1077
  - app/controllers/spree/api/v2/tenant/pin_code_checkers_controller.rb
@@ -1472,6 +1473,7 @@ files:
1472
1473
  - app/models/concerns/spree_cm_commissioner/option_value_attr_type.rb
1473
1474
  - app/models/concerns/spree_cm_commissioner/order_holdable.rb
1474
1475
  - app/models/concerns/spree_cm_commissioner/order_integration.rb
1476
+ - app/models/concerns/spree_cm_commissioner/order_qr_codeable.rb
1475
1477
  - app/models/concerns/spree_cm_commissioner/order_scopes.rb
1476
1478
  - app/models/concerns/spree_cm_commissioner/order_state_machine.rb
1477
1479
  - app/models/concerns/spree_cm_commissioner/parameterize_name.rb
@@ -1958,6 +1960,7 @@ files:
1958
1960
  - app/queries/spree_cm_commissioner/tickets_searcher_query.rb
1959
1961
  - app/queries/spree_cm_commissioner/trip_query.rb
1960
1962
  - app/queries/spree_cm_commissioner/trip_seat_layout_query.rb
1963
+ - app/queries/spree_cm_commissioner/user_votes_per_contestant_query.rb
1961
1964
  - app/queries/spree_cm_commissioner/users_by_event_fetcher_query.rb
1962
1965
  - app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb
1963
1966
  - app/request_schemas/spree_cm_commissioner/application_request_schema.rb
@@ -2040,6 +2043,7 @@ files:
2040
2043
  - app/serializers/spree/v2/tenant/image_serializer.rb
2041
2044
  - app/serializers/spree/v2/tenant/intercity_taxi_cart_serializer.rb
2042
2045
  - app/serializers/spree/v2/tenant/line_item_serializer.rb
2046
+ - app/serializers/spree/v2/tenant/my_vote_serializer.rb
2043
2047
  - app/serializers/spree/v2/tenant/notification_serializer.rb
2044
2048
  - app/serializers/spree/v2/tenant/option_type_serializer.rb
2045
2049
  - app/serializers/spree/v2/tenant/option_value_serializer.rb
@@ -3450,6 +3454,10 @@ files:
3450
3454
  - db/migrate/20260708150000_add_name_and_short_name_to_cm_trips.rb
3451
3455
  - db/migrate/20260713022227_add_advanced_to_episode_id_to_cm_voting_contestants.rb
3452
3456
  - db/migrate/20260714002626_rename_data_fill_stage_phase_on_cm_guests.rb
3457
+ - db/migrate/20260720000001_add_check_in_fields_to_spree_roles.rb
3458
+ - db/migrate/20260723000000_add_payment_host_to_cm_tenants.rb
3459
+ - db/migrate/20260723000001_add_metadata_to_spree_roles.rb
3460
+ - db/migrate/20260728074153_add_role_to_cm_exports.rb
3453
3461
  - docker-compose.yml
3454
3462
  - docs/api/scoped-access-token-endpoints.md
3455
3463
  - docs/option_types/attr_types.md