spree_cm_commissioner 2.8.7.pre.pre2 → 2.8.8

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 (174) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -6
  3. data/Gemfile.lock +1 -1
  4. data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +0 -2
  5. data/app/controllers/spree/admin/homepage_section_controller.rb +1 -4
  6. data/app/controllers/spree/admin/taxons_controller_decorator.rb +0 -19
  7. data/app/controllers/spree/api/v2/storefront/homepage_sections_controller.rb +0 -1
  8. data/app/controllers/spree/api/v2/tenant/base_controller.rb +0 -4
  9. data/app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb +0 -1
  10. data/app/controllers/spree/api/v2/tenant/products_controller.rb +1 -1
  11. data/app/controllers/spree/api/v2/tenant/taxons_controller.rb +1 -1
  12. data/app/controllers/spree_cm_commissioner/admin/products_controller_decorator.rb +0 -19
  13. data/app/finders/spree_cm_commissioner/events/find_matches.rb +0 -1
  14. data/app/helpers/spree_cm_commissioner/admin/homepage_segment_helper.rb +0 -2
  15. data/app/interactors/spree_cm_commissioner/waiting_guests_caller.rb +39 -10
  16. data/app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb +1 -2
  17. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -2
  18. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +1 -11
  19. data/app/models/concerns/spree_cm_commissioner/product_type.rb +1 -1
  20. data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -3
  21. data/app/models/spree_cm_commissioner/import.rb +1 -2
  22. data/app/models/spree_cm_commissioner/product_decorator.rb +0 -52
  23. data/app/models/spree_cm_commissioner/role_decorator.rb +1 -4
  24. data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -23
  25. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +1 -19
  26. data/app/models/spree_cm_commissioner/tenant.rb +0 -9
  27. data/app/models/spree_cm_commissioner/user_decorator.rb +0 -5
  28. data/app/models/spree_cm_commissioner/variant_decorator.rb +0 -4
  29. data/app/models/spree_cm_commissioner/variant_options.rb +0 -4
  30. data/app/models/spree_cm_commissioner/vendor_decorator.rb +0 -4
  31. data/app/serializers/spree/v2/storefront/homepage_section_serializer.rb +1 -1
  32. data/app/serializers/spree/v2/storefront/product_serializer_decorator.rb +1 -2
  33. data/app/serializers/spree/v2/storefront/role_serializer.rb +1 -1
  34. data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +1 -2
  35. data/app/serializers/spree/v2/tenant/homepage_section_serializer.rb +1 -1
  36. data/app/serializers/spree/v2/tenant/role_serializer.rb +1 -1
  37. data/app/services/spree_cm_commissioner/api_caches/invalidate.rb +0 -12
  38. data/app/services/spree_cm_commissioner/waiting_room/publish_lobby_path.rb +11 -2
  39. data/app/services/spree_cm_commissioner/waiting_room/stamp_queue_positions.rb +37 -8
  40. data/app/views/spree/admin/homepage_section/_form.html.erb +0 -5
  41. data/config/initializers/spree_permitted_attributes.rb +0 -8
  42. data/config/locales/en.yml +3 -45
  43. data/config/locales/km.yml +1 -32
  44. data/config/routes.rb +0 -28
  45. data/lib/spree_cm_commissioner/version.rb +1 -1
  46. data/lib/spree_cm_commissioner.rb +1 -7
  47. data/spree_cm_commissioner.gemspec +1 -1
  48. metadata +3 -130
  49. data/app/controllers/spree/api/v2/storefront/preview_products_controller.rb +0 -48
  50. data/app/controllers/spree/api/v2/storefront/preview_sections_controller.rb +0 -27
  51. data/app/controllers/spree/api/v2/storefront/preview_taxons_controller.rb +0 -18
  52. data/app/controllers/spree/api/v2/storefront/products_controller_decorator.rb +0 -15
  53. data/app/controllers/spree/api/v2/storefront/taxons_controller_decorator.rb +0 -15
  54. data/app/controllers/spree/api/v2/tenant/ad_campaigns_controller.rb +0 -25
  55. data/app/controllers/spree/api/v2/tenant/episodes_controller.rb +0 -38
  56. data/app/controllers/spree/api/v2/tenant/free_vote_claims_controller.rb +0 -37
  57. data/app/controllers/spree/api/v2/tenant/preview_products_controller.rb +0 -47
  58. data/app/controllers/spree/api/v2/tenant/preview_sections_controller.rb +0 -26
  59. data/app/controllers/spree/api/v2/tenant/preview_shows_controller.rb +0 -19
  60. data/app/controllers/spree/api/v2/tenant/preview_taxons_controller.rb +0 -19
  61. data/app/controllers/spree/api/v2/tenant/show_contestants_controller.rb +0 -52
  62. data/app/controllers/spree/api/v2/tenant/show_elimination_sessions_controller.rb +0 -57
  63. data/app/controllers/spree/api/v2/tenant/show_people_controller.rb +0 -49
  64. data/app/controllers/spree/api/v2/tenant/show_person_assignments_controller.rb +0 -36
  65. data/app/controllers/spree/api/v2/tenant/shows_controller.rb +0 -36
  66. data/app/controllers/spree/api/v2/tenant/votes_controller.rb +0 -94
  67. data/app/controllers/spree/api/v2/tenant/voting_contestants_controller.rb +0 -43
  68. data/app/controllers/spree/api/v2/tenant/voting_credit_transactions_controller.rb +0 -41
  69. data/app/controllers/spree/api/v2/tenant/voting_credits_controller.rb +0 -31
  70. data/app/jobs/spree_cm_commissioner/show_contestants/import_job.rb +0 -9
  71. data/app/jobs/spree_cm_commissioner/vote_fraud_event_job.rb +0 -9
  72. data/app/jobs/spree_cm_commissioner/voting_credit_allocation_job.rb +0 -10
  73. data/app/jobs/spree_cm_commissioner/voting_credit_de_allocation_job.rb +0 -10
  74. data/app/models/concerns/spree_cm_commissioner/voting_session_live_stream_concern.rb +0 -41
  75. data/app/models/spree_cm_commissioner/imports/import_contestant.rb +0 -7
  76. data/app/models/spree_cm_commissioner/maintenance_tasks/voting_session.rb +0 -36
  77. data/app/models/spree_cm_commissioner/preview_role.rb +0 -8
  78. data/app/models/spree_cm_commissioner/role_user_decorator.rb +0 -8
  79. data/app/models/spree_cm_commissioner/show.rb +0 -163
  80. data/app/models/spree_cm_commissioner/show_contestant.rb +0 -39
  81. data/app/models/spree_cm_commissioner/show_contestant_image.rb +0 -11
  82. data/app/models/spree_cm_commissioner/show_contestant_video.rb +0 -15
  83. data/app/models/spree_cm_commissioner/show_episode.rb +0 -108
  84. data/app/models/spree_cm_commissioner/show_person.rb +0 -15
  85. data/app/models/spree_cm_commissioner/show_person_assignment.rb +0 -21
  86. data/app/models/spree_cm_commissioner/show_person_image.rb +0 -11
  87. data/app/models/spree_cm_commissioner/vote.rb +0 -16
  88. data/app/models/spree_cm_commissioner/vote_fraud_event.rb +0 -20
  89. data/app/models/spree_cm_commissioner/voting_contestant.rb +0 -100
  90. data/app/models/spree_cm_commissioner/voting_credit.rb +0 -72
  91. data/app/models/spree_cm_commissioner/voting_credit_transaction.rb +0 -55
  92. data/app/models/spree_cm_commissioner/voting_session.rb +0 -216
  93. data/app/models/spree_cm_commissioner/voting_session_stat.rb +0 -8
  94. data/app/overrides/spree/admin/products/_form/preview_checkbox.html.erb.deface +0 -9
  95. data/app/overrides/spree/admin/taxons/_form/preview_checkbox.html.erb.deface +0 -7
  96. data/app/serializers/spree/v2/tenant/ad_campaign_serializer.rb +0 -13
  97. data/app/serializers/spree/v2/tenant/advertisement_serializer.rb +0 -11
  98. data/app/serializers/spree/v2/tenant/show_contestant_serializer.rb +0 -21
  99. data/app/serializers/spree/v2/tenant/show_episode_serializer.rb +0 -20
  100. data/app/serializers/spree/v2/tenant/show_parent_serializer.rb +0 -13
  101. data/app/serializers/spree/v2/tenant/show_person_assignment_serializer.rb +0 -16
  102. data/app/serializers/spree/v2/tenant/show_person_serializer.rb +0 -13
  103. data/app/serializers/spree/v2/tenant/show_serializer.rb +0 -23
  104. data/app/serializers/spree/v2/tenant/video_serializer.rb +0 -9
  105. data/app/serializers/spree/v2/tenant/vote_package_serializer.rb +0 -9
  106. data/app/serializers/spree/v2/tenant/vote_serializer.rb +0 -14
  107. data/app/serializers/spree/v2/tenant/voting_contestant_serializer.rb +0 -23
  108. data/app/serializers/spree/v2/tenant/voting_credit_serializer.rb +0 -10
  109. data/app/serializers/spree/v2/tenant/voting_credit_transaction_serializer.rb +0 -14
  110. data/app/serializers/spree/v2/tenant/voting_session_serializer.rb +0 -21
  111. data/app/services/spree_cm_commissioner/fraud_check.rb +0 -299
  112. data/app/services/spree_cm_commissioner/imports/contestants/create.rb +0 -153
  113. data/app/services/spree_cm_commissioner/show_contestants/normalize_video_highlights.rb +0 -57
  114. data/app/services/spree_cm_commissioner/show_persons/contestant_assigner.rb +0 -51
  115. data/app/services/spree_cm_commissioner/url_embed/youtube_embed.rb +0 -44
  116. data/app/services/spree_cm_commissioner/vote_counters/audit_counters.rb +0 -43
  117. data/app/services/spree_cm_commissioner/vote_counters/base.rb +0 -31
  118. data/app/services/spree_cm_commissioner/vote_counters/increment.rb +0 -44
  119. data/app/services/spree_cm_commissioner/vote_counters/per_contestant_counter.rb +0 -68
  120. data/app/services/spree_cm_commissioner/vote_counters/rebuild_from_db.rb +0 -70
  121. data/app/services/spree_cm_commissioner/vote_counters/snapshot_to_db.rb +0 -113
  122. data/app/services/spree_cm_commissioner/vote_credit_deductor.rb +0 -68
  123. data/app/services/spree_cm_commissioner/vote_package/create.rb +0 -145
  124. data/app/services/spree_cm_commissioner/vote_package/update.rb +0 -91
  125. data/app/services/spree_cm_commissioner/vote_processor.rb +0 -144
  126. data/app/services/spree_cm_commissioner/voting_contestants/advancer.rb +0 -335
  127. data/app/services/spree_cm_commissioner/voting_contestants/assigner.rb +0 -40
  128. data/app/services/spree_cm_commissioner/voting_contestants/bulk_updater.rb +0 -106
  129. data/app/services/spree_cm_commissioner/voting_credits/allocate.rb +0 -77
  130. data/app/services/spree_cm_commissioner/voting_credits/claim_free_votes.rb +0 -119
  131. data/app/services/spree_cm_commissioner/voting_credits/credit_calculator.rb +0 -35
  132. data/app/services/spree_cm_commissioner/voting_credits/de_allocate.rb +0 -87
  133. data/app/services/spree_cm_commissioner/voting_leaderboards/calculate_score.rb +0 -67
  134. data/app/services/spree_cm_commissioner/voting_leaderboards/combined_result.rb +0 -190
  135. data/app/services/spree_cm_commissioner/voting_sessions/finalize.rb +0 -105
  136. data/db/migrate/20260309230148_create_cm_show_people.rb +0 -14
  137. data/db/migrate/20260309230149_create_cm_show_people_assignments.rb +0 -16
  138. data/db/migrate/20260310082711_create_cm_show_contestants.rb +0 -28
  139. data/db/migrate/20260310082720_create_cm_voting_sessions.rb +0 -21
  140. data/db/migrate/20260310082721_create_cm_voting_contestants.rb +0 -23
  141. data/db/migrate/20260310082734_add_voting_fields_to_spree_taxons.rb +0 -9
  142. data/db/migrate/20260310082735_add_type_to_spree_products.rb +0 -6
  143. data/db/migrate/20260310082749_create_cm_voting_credits.rb +0 -27
  144. data/db/migrate/20260326080200_create_cm_voting_credit_transactions.rb +0 -27
  145. data/db/migrate/20260330160000_create_cm_votes.rb +0 -25
  146. data/db/migrate/20260401072500_add_advanced_from_to_cm_voting_contestants.rb +0 -7
  147. data/db/migrate/20260402000001_add_voting_credit_scope_to_spree_taxons.rb +0 -6
  148. data/db/migrate/20260402000002_rename_scopeable_to_votable_in_cm_voting_credits.rb +0 -12
  149. data/db/migrate/20260403070000_add_name_to_cm_voting_sessions.rb +0 -5
  150. data/db/migrate/20260406000001_add_vendor_id_to_voting_tables.rb +0 -6
  151. data/db/migrate/20260406000001_rename_votes_remaining_to_amount_in_cm_voting_credits.rb +0 -11
  152. data/db/migrate/20260408085255_add_show_id_and_vendor_id_to_cm_voting_sessions.rb +0 -9
  153. data/db/migrate/20260420000001_rename_type_to_credit_type_in_cm_voting_credits.rb +0 -25
  154. data/db/migrate/20260422000001_create_cm_vote_fraud_events.rb +0 -23
  155. data/db/migrate/20260423000001_add_preview_to_taxons_products_and_sections.rb +0 -11
  156. data/db/migrate/20260423000002_create_preview_roles.rb +0 -24
  157. data/db/migrate/20260515120000_add_public_metadata_to_cm_voting_sessions.rb +0 -5
  158. data/db/migrate/20260518090920_add_unique_voter_count_to_voting_contestants.rb +0 -5
  159. data/db/migrate/20260518094322_create_cm_voting_session_stats.rb +0 -17
  160. data/db/migrate/20260520000001_add_scoring_model_to_cm_voting_sessions.rb +0 -5
  161. data/db/migrate/20260520000001_optimize_cm_votes_indexes.rb +0 -22
  162. data/db/migrate/20260525042257_add_vote_number_to_cm_voting_contestants.rb +0 -18
  163. data/db/migrate/20260527035430_add_confirmed_rank_to_cm_voting_contestants.rb +0 -5
  164. data/db/migrate/20260527062005_add_eliminated_at_to_cm_show_contestants.rb +0 -5
  165. data/db/migrate/20260603063652_add_parent_to_voting_sessions.rb +0 -9
  166. data/db/migrate/20260603090000_add_session_type_to_cm_voting_sessions.rb +0 -6
  167. data/db/migrate/20260608000000_add_display_to_cm_voting_sessions.rb +0 -5
  168. data/docs/sql/jsonb_query_guide.md +0 -57
  169. data/lib/spree_cm_commissioner/test_helper/factories/show_episode_factory.rb +0 -12
  170. data/lib/spree_cm_commissioner/test_helper/factories/show_factory.rb +0 -120
  171. data/lib/spree_cm_commissioner/test_helper/factories/vote_credit_factory.rb +0 -37
  172. data/lib/spree_cm_commissioner/test_helper/factories/vote_factory.rb +0 -28
  173. data/lib/spree_cm_commissioner/test_helper/factories/voting_credit_transaction_factory.rb +0 -11
  174. data/lib/spree_cm_commissioner/test_helper/factories/voting_session_factory.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5f8d7b76d756c273ceb72a1549b5ecd5b0226957d7e126c534eb6a0823658a13
4
- data.tar.gz: d191fab60ac9d96c42677d0190a2a0f5546e98febe9c7fd72587874c0310a62c
3
+ metadata.gz: ca304c9bd308649d477548d5a5930737a651dc8fa9f1dc55eaff6d60c5b91ba0
4
+ data.tar.gz: e3fc4442166c3a178f759ec32ddc1feb39d7240505623be3d8437a55bffc963d
5
5
  SHA512:
6
- metadata.gz: 4b75b6d9677233ba25b3bce1f7c36629b63304486e1c90e05d89cbb38c6b4d5a065709b9fcb85ddfb50cc95f2d3c2965f02c86127fbf84d0373277f52420bba8
7
- data.tar.gz: 5241b014525d37014ba84baae757d9738de28bca55b71542d68745a710c58593138f66ba3f4e11653da6bf2e48df76f17b2938f389756eba6fdc486e713d6d7e
6
+ metadata.gz: f469ec325a78e226309906f0ccf6a1b9d66d3354505919cca451c16dd70c8dec2229c9c44fbe6cf17a8d0109d1a4805c1cd38fb1787ccf0f8d3d0ed174164f64
7
+ data.tar.gz: 78d7c13c8c6107ff36203f79e290f44b3543a2db9fa994772ed08a049da97dac9368102855b0726e1b3417f17a22ec7feb4be0778627dd7dd7057d81f2f54d98
data/.gitignore CHANGED
@@ -34,9 +34,3 @@ vendor/bundle/
34
34
  # Cursor
35
35
  .cursor
36
36
  dump.rdb
37
- # Added by code-review-graph
38
- .code-review-graph/
39
- .cursorrules
40
- .claude
41
- CLAUDE.md
42
- AGENTS.md
data/Gemfile.lock CHANGED
@@ -34,7 +34,7 @@ GIT
34
34
  PATH
35
35
  remote: .
36
36
  specs:
37
- spree_cm_commissioner (2.8.7.pre.pre2)
37
+ spree_cm_commissioner (2.8.8)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
@@ -16,7 +16,6 @@ module SpreeCmCommissioner
16
16
  GuestCardClassesController
17
17
  SeatLayoutController
18
18
  CmsPagesController
19
- AdvertisementsController
20
19
  ].freeze
21
20
 
22
21
  # Priority 2: Semi-Static (1 hour)
@@ -26,7 +25,6 @@ module SpreeCmCommissioner
26
25
  HomepageDataController
27
26
  PopularRoutesController
28
27
  RoutePlacesController
29
- ShowsController
30
28
  ].freeze
31
29
 
32
30
  # Priority 3: Moderate Freshness (30 minutes)
@@ -51,10 +51,7 @@ module Spree
51
51
  def permitted_resource_params
52
52
  segment_value = helpers.calculate_segment_value(params[:spree_cm_commissioner_homepage_section])
53
53
 
54
- params
55
- .require(:spree_cm_commissioner_homepage_section)
56
- .permit(:title, :description, :active, :tenant_id, :preview)
57
- .merge(segment: segment_value)
54
+ params.require(:spree_cm_commissioner_homepage_section).permit(:title, :description, :active, :tenant_id).merge(segment: segment_value)
58
55
  end
59
56
 
60
57
  def load_tenants
@@ -3,7 +3,6 @@ module Spree
3
3
  module TaxonsControllerDecorator
4
4
  def self.prepended(base)
5
5
  base.before_action :build_assets, only: %i[create update]
6
- base.before_action :normalize_sti_taxon_params, only: %i[create update]
7
6
  end
8
7
 
9
8
  # override
@@ -56,24 +55,6 @@ module Spree
56
55
  @taxon.build_ad_banner(attachment: permitted_resource_params.delete(:ad_banner)) if permitted_resource_params[:ad_banner]
57
56
  @taxon.build_video_banner(attachment: permitted_resource_params.delete(:video_banner)) if permitted_resource_params[:video_banner]
58
57
  end
59
-
60
- # Some admin forms submit STI records under their class key
61
- # (e.g. :spree_cm_commissioner_show) while Spree update reads :taxon.
62
- # Merge both into :taxon so all edited fields are persisted.
63
- def normalize_sti_taxon_params
64
- return unless @taxon
65
-
66
- sti_key = @taxon.class.model_name.param_key.to_sym
67
- sti_params = params[sti_key]
68
- return unless sti_params.is_a?(::ActionController::Parameters)
69
-
70
- base_params = params[:taxon]
71
- base_hash = base_params.is_a?(::ActionController::Parameters) ? base_params.to_unsafe_h : {}
72
- sti_hash = sti_params.to_unsafe_h
73
- merged_params = ::ActionController::Parameters.new(base_hash.merge(sti_hash))
74
-
75
- params[:taxon] = merged_params
76
- end
77
58
  end
78
59
  end
79
60
  end
@@ -19,7 +19,6 @@ module Spree
19
19
  @collection ||= model_class.filter_by_segment(params[:homepage_id] || :general)
20
20
  .active
21
21
  .where(tenant_id: nil)
22
- .where(preview: false)
23
22
  .order(position: :asc)
24
23
  end
25
24
  end
@@ -16,10 +16,6 @@ module Spree
16
16
  set_current_tenant(@tenant)
17
17
  end
18
18
 
19
- def current_vendor
20
- @current_vendor ||= @tenant.active_vendor
21
- end
22
-
23
19
  def render_serialized_payload(status = 200)
24
20
  render json: yield, status: status, content_type: content_type
25
21
  end
@@ -5,7 +5,6 @@ module Spree
5
5
  class HomepageSectionsController < BaseController
6
6
  def collection
7
7
  @collection ||= scope.filter_by_segment(params[:homepage_id] || :general)
8
- .where(preview: false)
9
8
  .active
10
9
  .order(position: :asc)
11
10
  end
@@ -21,7 +21,7 @@ module Spree
21
21
 
22
22
  def scope
23
23
  MultiTenant.with(@tenant) do
24
- model_class.where(tenant_id: MultiTenant.current_tenant_id, preview: false)
24
+ model_class.where(tenant_id: MultiTenant.current_tenant_id)
25
25
  end
26
26
  end
27
27
 
@@ -31,7 +31,7 @@ module Spree
31
31
 
32
32
  def scope
33
33
  MultiTenant.with(@tenant) do
34
- model_class.where(preview: false)
34
+ model_class
35
35
  end
36
36
  end
37
37
 
@@ -6,7 +6,6 @@ module SpreeCmCommissioner
6
6
  base.around_action :set_writing_role, only: %i[index]
7
7
  base.after_action :set_tenant_after_update, only: %i[update]
8
8
  base.before_action :merge_industry_taxons_into_taxons, only: [:update]
9
- base.before_action :normalize_sti_product_params, only: %i[create update]
10
9
  end
11
10
 
12
11
  # Override
@@ -52,24 +51,6 @@ module SpreeCmCommissioner
52
51
 
53
52
  protected
54
53
 
55
- # Some admin forms submit STI records under their class key while
56
- # Spree update reads :product. Merge both into :product so all edited
57
- # fields are persisted for STI product subclasses.
58
- def normalize_sti_product_params
59
- return unless @product
60
-
61
- sti_key = @product.class.model_name.param_key.to_sym
62
- sti_params = params[sti_key]
63
- return unless sti_params.is_a?(::ActionController::Parameters)
64
-
65
- base_params = params[:product]
66
- base_hash = base_params.is_a?(::ActionController::Parameters) ? base_params.to_unsafe_h : {}
67
- sti_hash = sti_params.to_unsafe_h
68
- merged_params = ::ActionController::Parameters.new(base_hash.merge(sti_hash))
69
-
70
- params[:product] = merged_params
71
- end
72
-
73
54
  def merge_industry_taxons_into_taxons
74
55
  return if params[:product].blank?
75
56
 
@@ -7,7 +7,6 @@ module SpreeCmCommissioner
7
7
  def execute
8
8
  scope.joins(:integration_mappings).where(
9
9
  kind: :event,
10
- preview: false,
11
10
  integration_mappings: { status: :active }
12
11
  ).distinct
13
12
  end
@@ -15,8 +15,6 @@ module SpreeCmCommissioner
15
15
  'badge badge-success text-uppercase'
16
16
  when :football
17
17
  'badge badge-dark text-uppercase'
18
- when :show
19
- 'badge badge-danger text-uppercase'
20
18
  else
21
19
  'badge'
22
20
  end
@@ -13,25 +13,31 @@ module SpreeCmCommissioner
13
13
  FIRESTORE_BATCH_SIZE = (ENV['WAITING_ROOM_FIRESTORE_BATCH_SIZE'] || 500).to_i
14
14
 
15
15
  def call
16
+ started_at = Time.zone.now
16
17
  available_slots = fetch_available_slots
17
- return unless available_slots.positive?
18
18
 
19
- long_waiting_guests = fetch_long_waiting_guests(available_slots)
20
- calling_all(long_waiting_guests)
19
+ # Always run through to mark_as — even with no slots — so the lobby keeps a fresh heartbeat
20
+ # (logs.waiting_guests_caller_job) during peak/full periods instead of going stale
21
+ # and looking like a dead cron.
22
+ long_waiting_guests = available_slots.positive? ? fetch_long_waiting_guests(available_slots) : []
23
+ calling_all(long_waiting_guests) if long_waiting_guests.any?
21
24
 
22
25
  mark_as(
23
26
  full: long_waiting_guests.size >= available_slots,
24
27
  available_slots: available_slots - long_waiting_guests.size,
25
28
  avg_wait_to_enter_seconds: compute_avg_wait_to_enter_seconds(long_waiting_guests),
26
29
  avg_queue_to_enter_seconds: compute_avg_queue_to_enter_seconds(long_waiting_guests),
27
- slots_per_call: available_slots
30
+ recent_slots_per_call: available_slots.positive? ? available_slots : nil,
31
+ active_sessions: @active_sessions,
32
+ max_sessions: @max_sessions,
33
+ logs: call_logs(started_at: started_at, called_count: long_waiting_guests.size)
28
34
  )
29
35
  end
30
36
 
31
37
  def fetch_available_slots
32
- max_sessions = fetch_max_sessions
33
- active_sessions = SpreeCmCommissioner::WaitingRoomSession.active.count
34
- max_sessions - active_sessions
38
+ @max_sessions = fetch_max_sessions
39
+ @active_sessions = SpreeCmCommissioner::WaitingRoomSession.active.count
40
+ @max_sessions - @active_sessions
35
41
  end
36
42
 
37
43
  # This query requires an index; create it in Firebase beforehand.
@@ -100,21 +106,44 @@ module SpreeCmCommissioner
100
106
  end
101
107
 
102
108
  # merge: true so we preserve the published `waiting_guests_records_path` on the lobby doc.
103
- def mark_as(
109
+ # App-facing fields plus live capacity state (full / available_slots / active_sessions /
110
+ # max_sessions / ETAs) stay top-level; this run's observability snapshot is namespaced under
111
+ # `logs.waiting_guests_caller_job` (see #call_logs). merge: true deep-merges nested maps, so
112
+ # each job owns its own key under `logs` without clobbering the others.
113
+ def mark_as( # rubocop:disable Metrics/ParameterLists
104
114
  full:,
105
115
  available_slots:,
106
116
  avg_wait_to_enter_seconds: nil,
107
117
  avg_queue_to_enter_seconds: nil,
108
- slots_per_call: nil
118
+ recent_slots_per_call: nil,
119
+ active_sessions: nil,
120
+ max_sessions: nil,
121
+ logs: nil
109
122
  )
110
123
  data = { full: full, available_slots: available_slots }
111
124
  data[:avg_wait_to_enter_seconds] = avg_wait_to_enter_seconds if avg_wait_to_enter_seconds
112
125
  data[:avg_queue_to_enter_seconds] = avg_queue_to_enter_seconds if avg_queue_to_enter_seconds
113
- data[:slots_per_call] = slots_per_call if slots_per_call
126
+ data[:recent_slots_per_call] = recent_slots_per_call if recent_slots_per_call
127
+ data[:active_sessions] = active_sessions unless active_sessions.nil?
128
+ data[:max_sessions] = max_sessions unless max_sessions.nil?
129
+ data[:logs] = { waiting_guests_caller_job: logs } if logs
114
130
 
115
131
  lobby_document.set(data, merge: true)
116
132
  end
117
133
 
134
+ # Point-in-time snapshot (overwritten each run, never cumulative) of this caller run: last-run
135
+ # timing (heartbeat) and how many guests were called. Capacity state (active/max sessions,
136
+ # available_slots) lives top-level, not here.
137
+ def call_logs(started_at:, called_count:)
138
+ finished_at = Time.zone.now
139
+ {
140
+ called_count: called_count,
141
+ last_started_at: started_at,
142
+ last_finished_at: finished_at,
143
+ last_duration_ms: ((finished_at - started_at) * 1000).round
144
+ }
145
+ end
146
+
118
147
  # Average total wait (queued_at → allow_to_enter_room_at) for just-called guests.
119
148
  # Used for the Waiting Room step ETA: how long until I get in from when I joined.
120
149
  def compute_avg_wait_to_enter_seconds(guests)
@@ -8,8 +8,7 @@ module SpreeCmCommissioner
8
8
  tour: 0b00100,
9
9
  accommodation: 0b01000,
10
10
  things_to_do: 0b10000,
11
- football: 0b100000,
12
- show: 0b1000000
11
+ football: 0b100000
13
12
  }.freeze
14
13
 
15
14
  BIT_SEGMENT.each do |segment, bit_value|
@@ -45,8 +45,7 @@ module SpreeCmCommissioner
45
45
  'color' => 'color',
46
46
  'ticket-type' => 'string',
47
47
  'seat-type' => 'string',
48
- 'intercity-taxi' => 'string',
49
- 'vote-package' => 'integer'
48
+ 'intercity-taxi' => 'string'
50
49
  }.freeze
51
50
 
52
51
  included do
@@ -1,7 +1,7 @@
1
1
  # Make sure to put this concern below other concern or methods that generating additional order info like guests, seat number, etc.
2
2
  # This will ensure that when each notification is sent with neccessary data.
3
3
  module SpreeCmCommissioner
4
- module OrderStateMachine # rubocop:disable Metrics/ModuleLength
4
+ module OrderStateMachine
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do # rubocop:disable Metrics/BlockLength
@@ -26,10 +26,8 @@ module SpreeCmCommissioner
26
26
 
27
27
  state_machine.after_transition to: :canceled, do: :precalculate_conversion
28
28
  state_machine.after_transition to: :canceled, do: :restock_inventory!
29
- state_machine.after_transition to: :canceled, do: :de_allocate_resources
30
29
 
31
30
  state_machine.after_transition to: :complete, do: :increment_route_fulfilled_order_count
32
- state_machine.after_transition to: :complete, do: :allocate_resources
33
31
  state_machine.after_transition to: :complete, do: :run_order_complete_alerts
34
32
 
35
33
  scope :accepted, -> { where(request_state: 'accepted') }
@@ -362,13 +360,5 @@ module SpreeCmCommissioner
362
360
  factory = OrderTelegramMessageFactory.new(title: title, order: self)
363
361
  TelegramNotificationSenderJob.perform_later(chat_id: chat_id, message: factory.message, parse_mode: factory.parse_mode)
364
362
  end
365
-
366
- def allocate_resources
367
- SpreeCmCommissioner::VotingCreditAllocationJob.perform_later(order_id: id)
368
- end
369
-
370
- def de_allocate_resources
371
- SpreeCmCommissioner::VotingCreditDeAllocationJob.perform_later(order_id: id)
372
- end
373
363
  end
374
364
  end
@@ -5,7 +5,7 @@ module SpreeCmCommissioner
5
5
  module ProductType
6
6
  extend ActiveSupport::Concern
7
7
 
8
- PRODUCT_TYPES = %i[accommodation service ecommerce transit show_episode vote_package advertisement].freeze
8
+ PRODUCT_TYPES = %i[accommodation service ecommerce transit].freeze
9
9
  PERMANENT_STOCK_PRODUCT_TYPES = %w[accommodation service transit].freeze
10
10
  PRE_INVENTORY_DAYS = { 'transit' => 90, 'accommodation' => 365, 'service' => 30 }.freeze
11
11
 
@@ -3,9 +3,7 @@ module SpreeCmCommissioner
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- enum kind: { category: 0, cms: 1, event: 2, occupation: 3, nationality: 4, organization: 5, transit: 6, industry: 7, agency_category: 8,
7
- ads: 9
8
- }
6
+ enum kind: { category: 0, cms: 1, event: 2, occupation: 3, nationality: 4, organization: 5, transit: 6, industry: 7, agency_category: 8 }
9
7
  end
10
8
  end
11
9
  end
@@ -3,8 +3,7 @@ module SpreeCmCommissioner
3
3
  extend FriendlyId
4
4
 
5
5
  enum :status, { :queue => 0, :progress => 1, :done => 2, :failed => 3, :canceling => 4, :canceled => 5 }
6
- enum :import_type, { :new_order => 0, :existing_order => 1, :aba_payment_reference => 2, :contestant_import => 3 }
7
-
6
+ enum :import_type, { :new_order => 0, :existing_order => 1, :aba_payment_reference => 2 }
8
7
  has_one_attached :imported_file
9
8
  friendly_id :name, use: :slugged
10
9
 
@@ -12,10 +12,6 @@ module SpreeCmCommissioner
12
12
  base.include SpreeCmCommissioner::StoreMetadata
13
13
  base.include SpreeCmCommissioner::HomepageSectionRelatableConcern
14
14
 
15
- base.delegate :is_open_dated, :is_open_dated?, to: :trip, allow_nil: true
16
-
17
- base.has_many :voting_sessions, class_name: 'SpreeCmCommissioner::VotingSession', foreign_key: :episode_id, dependent: :destroy
18
-
19
15
  base.has_many :variant_kind_option_types, -> { where(kind: :variant).order(:position) },
20
16
  through: :product_option_types, source: :option_type
21
17
 
@@ -63,45 +59,8 @@ module SpreeCmCommissioner
63
59
 
64
60
  base.belongs_to :event, class_name: 'Spree::Taxon', optional: true
65
61
 
66
- base.has_many :preview_roles, class_name: 'SpreeCmCommissioner::PreviewRole', as: :previewable
67
62
  base.has_many :industry_classifications, -> { joins(:taxon).where(spree_taxons: { kind: :industry }) }, class_name: 'Spree::Classification'
68
63
  base.has_many :industry_taxons, through: :industry_classifications, source: :taxon
69
- base.scope :visible_to, lambda { |user|
70
- publicly_available = where(status: :active, preview: false)
71
-
72
- if user
73
- # Resolved through associations — avoids hardcoding class names.
74
- taxon_type = reflect_on_association(:taxons).klass.polymorphic_name
75
-
76
- # IDs of products that have been explicitly assigned their own PreviewRole.
77
- products_with_own_roles = SpreeCmCommissioner::PreviewRole
78
- .where(previewable_type: polymorphic_name)
79
- .select(:previewable_id)
80
-
81
- # Path A: product has its own PreviewRole → user must hold that role directly.
82
- # Taxon membership is irrelevant for these products.
83
- via_product_role = where(status: :active, preview: true)
84
- .where(id: products_with_own_roles)
85
- .where(id: user.preview_roles.where(previewable_type: polymorphic_name).select(:previewable_id))
86
-
87
- # Path B: product has no own PreviewRole → inherit access from its event or taxons.
88
- # Accessible if the user holds a preview role for the product's event_id or any
89
- # taxon the product belongs to via the classifications join table.
90
- allowed_taxon_ids = user.preview_roles.where(previewable_type: taxon_type).select(:previewable_id)
91
- preview_no_own = where(status: :active, preview: true).where.not(id: products_with_own_roles)
92
-
93
- via_event_id = preview_no_own.where(event_id: allowed_taxon_ids)
94
- via_taxon_join = preview_no_own.joins(:taxons).where(spree_taxons: { id: allowed_taxon_ids })
95
-
96
- publicly_available
97
- .or(via_product_role)
98
- .or(where(id: via_event_id.select(:id)))
99
- .or(where(id: via_taxon_join.select(:id)))
100
- else
101
- publicly_available
102
- end
103
- }
104
-
105
64
  base.scope :min_price, lambda { |vendor|
106
65
  joins(:prices_including_master)
107
66
  .where(vendor_id: vendor.id, product_type: vendor.primary_product_type)
@@ -114,12 +73,6 @@ module SpreeCmCommissioner
114
73
  .maximum('spree_prices.price').to_f
115
74
  }
116
75
  base.scope :subscribable, -> { where(subscribable: 1) }
117
- base.scope :advertisements, lambda {
118
- advertisement
119
- .available
120
- .where('spree_products.available_on IS NULL OR spree_products.available_on <= CURRENT_TIMESTAMP')
121
- .where('spree_products.discontinue_on IS NULL OR spree_products.discontinue_on > CURRENT_TIMESTAMP')
122
- }
123
76
 
124
77
  base.before_validation :set_event_id
125
78
 
@@ -134,11 +87,6 @@ module SpreeCmCommissioner
134
87
  base.store_public_metadata :enable_inventory_hold, :boolean, default: false
135
88
  base.store_public_metadata :enable_telegram_alert, :boolean, default: true
136
89
 
137
- base.store_private_metadata :advertise_weight, :integer, default: 1
138
- base.store_private_metadata :video_url, :string
139
- base.store_private_metadata :skip_after_seconds, :integer, default: 5
140
- base.store_private_metadata :duration_seconds, :integer, default: 30
141
-
142
90
  base.after_update :update_variants_vendor_id, if: :saved_change_to_vendor_id?
143
91
  base.after_update :sync_event_id_to_children, if: :saved_change_to_event_id?
144
92
 
@@ -1,11 +1,10 @@
1
1
  module SpreeCmCommissioner
2
2
  module RoleDecorator
3
3
  def self.prepended(base)
4
- base.enum role_type: { internal: 0, external: 1, preview: 2 }
4
+ base.enum role_type: { internal: 0, external: 1 }
5
5
 
6
6
  base.has_many :role_permissions, class_name: 'SpreeCmCommissioner::RolePermission'
7
7
  base.has_many :permissions, through: :role_permissions, class_name: 'SpreeCmCommissioner::Permission'
8
- base.has_many :preview_roles, class_name: 'SpreeCmCommissioner::PreviewRole'
9
8
 
10
9
  base.belongs_to :vendor, optional: true
11
10
 
@@ -14,8 +13,6 @@ module SpreeCmCommissioner
14
13
  where(vendor_id: vendor)
15
14
  }
16
15
  base.scope :filter_external, -> { where(role_type: :external) }
17
- base.scope :filter_internal, -> { where(role_type: :internal) }
18
- base.scope :filter_preview, -> { where(role_type: :preview) }
19
16
 
20
17
  base.accepts_nested_attributes_for :role_permissions, allow_destroy: true
21
18
 
@@ -84,29 +84,7 @@ module SpreeCmCommissioner
84
84
 
85
85
  base.has_many :import_orders, as: :importable, class_name: 'SpreeCmCommissioner::Imports::ImportOrder', dependent: :destroy
86
86
 
87
- base.scope :shows, -> { where(taxonomy_id: Spree::Taxonomy.shows.id, depth: 1) }
88
- base.scope :events, -> { where(taxonomy_id: Spree::Taxonomy.events.id, depth: 1) }
89
- base.scope :ad_campaigns, -> { where(taxonomy_id: Spree::Taxonomy.ads.id, depth: 1) }
90
-
91
- base.has_many :advertisements,
92
- -> { where(product_type: :advertisement, deleted_at: nil) },
93
- through: :classifications,
94
- class_name: 'Spree::Product',
95
- source: :product
96
-
97
87
  base.has_many :agencies, class_name: 'SpreeCmCommissioner::Agency', foreign_key: :agency_category_id
98
- base.has_many :preview_roles, class_name: 'SpreeCmCommissioner::PreviewRole', as: :previewable
99
-
100
- base.scope :visible_to, lambda { |user|
101
- publicly_available = where(preview: false)
102
-
103
- if user
104
- allowed_ids = user.preview_roles.where(previewable_type: polymorphic_name).select(:previewable_id)
105
- publicly_available.or(where(preview: true, id: allowed_ids))
106
- else
107
- publicly_available
108
- end
109
- }
110
88
 
111
89
  # Create maintaining task to purge taxon related caches
112
90
  base.after_save { SpreeCmCommissioner::MaintenanceTasks::CacheInvalidation.pending.create_or_find_by(maintainable: self) }
@@ -119,7 +97,6 @@ module SpreeCmCommissioner
119
97
  .joins('INNER JOIN cm_homepage_sections ON cm_homepage_section_relatables.homepage_section_id = cm_homepage_sections.id')
120
98
  .where(cm_homepage_sections: { tenant_id: nil, active: true })
121
99
  .where(kind: :event)
122
- .where(preview: false)
123
100
  end
124
101
 
125
102
  def base.find_event(id)
@@ -1,6 +1,6 @@
1
1
  module SpreeCmCommissioner
2
2
  module TaxonomyDecorator
3
- def self.prepended(base) # rubocop:disable Metrics/MethodLength
3
+ def self.prepended(base)
4
4
  base.include SpreeCmCommissioner::TaxonKind
5
5
 
6
6
  base.belongs_to :vendor, class_name: 'Spree::Vendor', optional: true
@@ -15,15 +15,6 @@ module SpreeCmCommissioner
15
15
  end
16
16
  end
17
17
 
18
- def base.shows
19
- ActiveRecord::Base.connected_to(role: :writing) do
20
- shows = Spree::Taxonomy.find_or_create_by(name: 'Shows', store: Spree::Store.default)
21
- shows.kind = :event
22
- shows.save if shows.changed?
23
- shows
24
- end
25
- end
26
-
27
18
  def base.businesses
28
19
  ActiveRecord::Base.connected_to(role: :writing) do
29
20
  businesses = Spree::Taxonomy.find_or_create_by(name: 'Businesses', store: Spree::Store.default)
@@ -41,15 +32,6 @@ module SpreeCmCommissioner
41
32
  agency_categories
42
33
  end
43
34
  end
44
-
45
- def base.ads
46
- ActiveRecord::Base.connected_to(role: :writing) do
47
- ads = Spree::Taxonomy.find_or_create_by(name: 'Ads', store: Spree::Store.default)
48
- ads.kind = :ads
49
- ads.save if ads.changed?
50
- ads
51
- end
52
- end
53
35
  end
54
36
  end
55
37
  end
@@ -24,8 +24,6 @@ module SpreeCmCommissioner
24
24
 
25
25
  before_validation :generate_slug, if: -> { slug.blank? && name.present? }
26
26
 
27
- validate :single_active_vendor
28
-
29
27
  def active_vendor
30
28
  vendors.where(state: :active).first
31
29
  end
@@ -45,12 +43,5 @@ module SpreeCmCommissioner
45
43
  def generate_slug
46
44
  self.slug = name.parameterize if slug.blank?
47
45
  end
48
-
49
- # Add Guardrails to ensure data integrity and make system predictable.
50
- def single_active_vendor
51
- return unless vendors.where(state: :active).count > 1
52
-
53
- errors.add(:base, 'must have at most one active vendor')
54
- end
55
46
  end
56
47
  end
@@ -19,8 +19,6 @@ module SpreeCmCommissioner
19
19
  base.has_many :payments, as: :payable, class_name: 'Spree::Payment', dependent: :nullify
20
20
  base.has_many :role_permissions, through: :spree_roles, class_name: 'SpreeCmCommissioner::RolePermission'
21
21
  base.has_many :permissions, through: :role_permissions, class_name: 'SpreeCmCommissioner::Permission'
22
- base.has_many :preview_spree_roles, -> { where(role_type: :preview) }, through: :role_users, source: :role, class_name: 'Spree::Role'
23
- base.has_many :preview_roles, through: :preview_spree_roles, class_name: 'SpreeCmCommissioner::PreviewRole'
24
22
  base.has_many :line_items, through: :orders, source: :line_items
25
23
  base.has_many :check_ins, foreign_key: 'check_in_by_id', class_name: 'SpreeCmCommissioner::CheckIn'
26
24
  base.has_many :user_events, class_name: 'SpreeCmCommissioner::UserEvent'
@@ -37,9 +35,6 @@ module SpreeCmCommissioner
37
35
  base.has_many :user_agencies, class_name: 'SpreeCmCommissioner::UserAgency'
38
36
  base.has_many :user_places, class_name: 'SpreeCmCommissioner::UserPlace'
39
37
  base.has_many :places, through: :user_places, class_name: 'SpreeCmCommissioner::Place'
40
- base.has_many :voting_credits, class_name: 'SpreeCmCommissioner::VotingCredit', dependent: :destroy
41
- base.has_many :votes, class_name: 'SpreeCmCommissioner::Vote', dependent: :destroy
42
- base.has_many :voting_credit_transactions, through: :voting_credits, class_name: 'SpreeCmCommissioner::VotingCreditTransaction'
43
38
 
44
39
  base.has_one :profile, as: :viewable, dependent: :destroy, class_name: 'SpreeCmCommissioner::UserProfile'
45
40
  base.has_one :customer, class_name: 'SpreeCmCommissioner::Customer'
@@ -48,10 +48,6 @@ module SpreeCmCommissioner
48
48
  public_metadata[:preload_options_text].presence || Spree::Variants::VisibleOptionsPresenter.new(self).to_sentence
49
49
  end
50
50
 
51
- def vote_credits
52
- options.vote_package_amount
53
- end
54
-
55
51
  def delivery_required?
56
52
  delivery_option == 'delivery'
57
53
  end
@@ -146,10 +146,6 @@ module SpreeCmCommissioner
146
146
  @seat_type ||= option_value_name_for(option_type_name: 'seat-type')
147
147
  end
148
148
 
149
- def vote_package_amount
150
- @vote_package_amount ||= option_value_name_for(option_type_name: 'vote-package')&.to_i
151
- end
152
-
153
149
  # can consider as customers.
154
150
  def number_of_guests
155
151
  number_of_adults + number_of_kids
@@ -33,10 +33,6 @@ module SpreeCmCommissioner
33
33
 
34
34
  base.has_many :taxon_vendors, class_name: 'SpreeCmCommissioner::TaxonVendor'
35
35
  base.has_many :taxons, through: :taxon_vendors
36
- base.has_many :shows, -> { where(spree_taxons: { type: 'SpreeCmCommissioner::Show' }) },
37
- through: :taxon_vendors, source: :taxon, class_name: 'SpreeCmCommissioner::Show'
38
-
39
- base.has_many :voting_sessions, class_name: 'SpreeCmCommissioner::VotingSession', dependent: :destroy
40
36
 
41
37
  base.has_many :promoted_option_types, -> { where(promoted: true).order(:position) },
42
38
  through: :vendor_option_types, source: :option_type
@@ -2,7 +2,7 @@ module Spree
2
2
  module V2
3
3
  module Storefront
4
4
  class HomepageSectionSerializer < BaseSerializer
5
- attributes :id, :title, :segments, :description, :active, :position, :preview, :created_at, :updated_at
5
+ attributes :id, :title, :segments, :description, :active, :position, :created_at, :updated_at
6
6
  has_many :homepage_section_relatables
7
7
  end
8
8
  end