spree_cm_commissioner 2.8.3.pre.pre4 → 2.8.3

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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +1 -0
  3. data/.gitignore +0 -4
  4. data/Gemfile.lock +1 -1
  5. data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +0 -2
  6. data/app/controllers/spree/admin/homepage_section_controller.rb +1 -4
  7. data/app/controllers/spree/admin/taxons_controller_decorator.rb +0 -19
  8. data/app/controllers/spree/api/v2/storefront/homepage_sections_controller.rb +0 -1
  9. data/app/controllers/spree/api/v2/storefront/trip_search_controller.rb +6 -4
  10. data/app/controllers/spree/api/v2/tenant/base_controller.rb +0 -4
  11. data/app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb +0 -1
  12. data/app/controllers/spree/api/v2/tenant/products_controller.rb +1 -1
  13. data/app/controllers/spree/api/v2/tenant/taxons_controller.rb +1 -1
  14. data/app/controllers/spree_cm_commissioner/admin/products_controller_decorator.rb +0 -19
  15. data/app/factory/spree_cm_commissioner/event_telegram_message_factory.rb +68 -0
  16. data/app/factory/spree_cm_commissioner/order_telegram_message_factory.rb +31 -17
  17. data/app/factory/spree_cm_commissioner/telegram_message_factory.rb +6 -0
  18. data/app/finders/spree_cm_commissioner/events/find_matches.rb +0 -1
  19. data/app/helpers/spree_cm_commissioner/admin/homepage_segment_helper.rb +0 -2
  20. data/app/interactors/spree_cm_commissioner/invalidate_cache_request.rb +5 -1
  21. data/app/jobs/spree_cm_commissioner/event_creation_telegram_alert_sender_job.rb +10 -0
  22. data/app/jobs/spree_cm_commissioner/invalidate_cache_request_job.rb +4 -1
  23. data/app/jobs/spree_cm_commissioner/inventory_items/bulk_adjust_quantities_job.rb +4 -2
  24. data/app/jobs/spree_cm_commissioner/inventory_items/bulk_adjust_quantities_on_hold_job.rb +4 -2
  25. data/app/jobs/spree_cm_commissioner/oauth_access_tokens/cleanup_expired_job.rb +11 -0
  26. data/app/jobs/spree_cm_commissioner/route_metrics/decrease_trip_count_job.rb +8 -2
  27. data/app/jobs/spree_cm_commissioner/route_metrics/increase_trip_count_job.rb +5 -2
  28. data/app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb +1 -2
  29. data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +8 -0
  30. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -2
  31. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -10
  32. data/app/models/concerns/spree_cm_commissioner/product_type.rb +1 -1
  33. data/app/models/concerns/spree_cm_commissioner/service_origin.rb +22 -0
  34. data/app/models/concerns/spree_cm_commissioner/store_preference.rb +1 -0
  35. data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -3
  36. data/app/models/spree_cm_commissioner/import.rb +1 -1
  37. data/app/models/spree_cm_commissioner/inventory_item.rb +17 -2
  38. data/app/models/spree_cm_commissioner/maintenance_tasks/cache_invalidation.rb +2 -0
  39. data/app/models/spree_cm_commissioner/order_decorator.rb +1 -0
  40. data/app/models/spree_cm_commissioner/product_decorator.rb +0 -50
  41. data/app/models/spree_cm_commissioner/role_decorator.rb +1 -4
  42. data/app/models/spree_cm_commissioner/route.rb +6 -1
  43. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +0 -3
  44. data/app/models/spree_cm_commissioner/taxon_decorator.rb +7 -18
  45. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +1 -19
  46. data/app/models/spree_cm_commissioner/tenant.rb +0 -9
  47. data/app/models/spree_cm_commissioner/trip.rb +15 -2
  48. data/app/models/spree_cm_commissioner/user_decorator.rb +0 -5
  49. data/app/models/spree_cm_commissioner/variant_options.rb +0 -4
  50. data/app/models/spree_cm_commissioner/vendor_decorator.rb +0 -4
  51. data/app/overrides/spree/admin/stores/_form/store_preferences.html.erb.deface +9 -0
  52. data/app/queries/spree_cm_commissioner/multi_leg_trips_query.rb +48 -44
  53. data/app/queries/spree_cm_commissioner/single_leg_trips_query.rb +36 -31
  54. data/app/queries/spree_cm_commissioner/trip_query.rb +2 -4
  55. data/app/serializers/spree/v2/storefront/homepage_section_serializer.rb +1 -1
  56. data/app/serializers/spree/v2/storefront/product_serializer_decorator.rb +1 -1
  57. data/app/serializers/spree/v2/storefront/role_serializer.rb +1 -1
  58. data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +1 -2
  59. data/app/serializers/spree/v2/tenant/homepage_section_serializer.rb +1 -1
  60. data/app/serializers/spree/v2/tenant/role_serializer.rb +1 -1
  61. data/app/serializers/spree_cm_commissioner/v2/storefront/amenity_serializer.rb +3 -0
  62. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_query_result_serializer.rb +1 -1
  63. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_result_serializer.rb +8 -3
  64. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vehicle_type_serializer.rb +6 -3
  65. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vendor_serializer.rb +6 -2
  66. data/app/services/spree_cm_commissioner/api_caches/invalidate.rb +0 -12
  67. data/app/services/spree_cm_commissioner/inventory_holds/acquire.rb +3 -0
  68. data/app/services/spree_cm_commissioner/inventory_holds/convert.rb +7 -2
  69. data/app/services/spree_cm_commissioner/inventory_holds/release.rb +7 -2
  70. data/app/services/spree_cm_commissioner/inventory_items/bulk_adjust_quantities.rb +36 -4
  71. data/app/services/spree_cm_commissioner/inventory_items/bulk_adjust_quantities_on_hold.rb +39 -4
  72. data/app/services/spree_cm_commissioner/inventory_items/bulk_generate_permanent_items.rb +4 -6
  73. data/app/services/spree_cm_commissioner/oauth_access_tokens/cleanup_expired.rb +59 -0
  74. data/app/services/spree_cm_commissioner/pricing_models/preview.rb +15 -6
  75. data/app/services/spree_cm_commissioner/redis_stock/base.rb +2 -1
  76. data/app/services/spree_cm_commissioner/route_metrics/decrease_trip_count.rb +3 -15
  77. data/app/services/spree_cm_commissioner/route_metrics/increase_trip_count.rb +7 -15
  78. data/app/services/spree_cm_commissioner/routes/create.rb +0 -5
  79. data/app/services/spree_cm_commissioner/telegram_alerts/event_creation.rb +35 -0
  80. data/app/services/spree_cm_commissioner/transit_order/create.rb +8 -2
  81. data/app/services/spree_cm_commissioner/trips/create_multi_leg.rb +5 -16
  82. data/app/services/spree_cm_commissioner/trips/create_single_leg.rb +0 -1
  83. data/app/views/spree/admin/homepage_section/_form.html.erb +0 -5
  84. data/app/views/spree/admin/line_items/_form.html.erb +2 -3
  85. data/config/initializers/spree_permitted_attributes.rb +1 -8
  86. data/config/locales/en.yml +0 -36
  87. data/config/locales/km.yml +0 -18
  88. data/config/routes.rb +0 -27
  89. data/lib/spree_cm_commissioner/trip_query_result.rb +25 -1
  90. data/lib/spree_cm_commissioner/trip_result.rb +48 -21
  91. data/lib/spree_cm_commissioner/version.rb +1 -1
  92. data/lib/spree_cm_commissioner.rb +1 -7
  93. data/spree_cm_commissioner.gemspec +1 -1
  94. metadata +10 -130
  95. data/app/controllers/spree/api/v2/storefront/preview_products_controller.rb +0 -48
  96. data/app/controllers/spree/api/v2/storefront/preview_sections_controller.rb +0 -27
  97. data/app/controllers/spree/api/v2/storefront/preview_taxons_controller.rb +0 -18
  98. data/app/controllers/spree/api/v2/storefront/products_controller_decorator.rb +0 -15
  99. data/app/controllers/spree/api/v2/storefront/taxons_controller_decorator.rb +0 -15
  100. data/app/controllers/spree/api/v2/tenant/advertisements_controller.rb +0 -24
  101. data/app/controllers/spree/api/v2/tenant/free_vote_claims_controller.rb +0 -37
  102. data/app/controllers/spree/api/v2/tenant/preview_products_controller.rb +0 -47
  103. data/app/controllers/spree/api/v2/tenant/preview_sections_controller.rb +0 -26
  104. data/app/controllers/spree/api/v2/tenant/preview_shows_controller.rb +0 -19
  105. data/app/controllers/spree/api/v2/tenant/preview_taxons_controller.rb +0 -19
  106. data/app/controllers/spree/api/v2/tenant/show_contestants_controller.rb +0 -52
  107. data/app/controllers/spree/api/v2/tenant/show_elimination_sessions_controller.rb +0 -57
  108. data/app/controllers/spree/api/v2/tenant/show_people_controller.rb +0 -49
  109. data/app/controllers/spree/api/v2/tenant/show_person_assignments_controller.rb +0 -36
  110. data/app/controllers/spree/api/v2/tenant/shows_controller.rb +0 -34
  111. data/app/controllers/spree/api/v2/tenant/votes_controller.rb +0 -94
  112. data/app/controllers/spree/api/v2/tenant/voting_contestants_controller.rb +0 -40
  113. data/app/controllers/spree/api/v2/tenant/voting_credit_transactions_controller.rb +0 -41
  114. data/app/controllers/spree/api/v2/tenant/voting_credits_controller.rb +0 -31
  115. data/app/jobs/spree_cm_commissioner/cleanup_expired_access_tokens_job.rb +0 -9
  116. data/app/jobs/spree_cm_commissioner/show_contestants/import_job.rb +0 -9
  117. data/app/jobs/spree_cm_commissioner/vote_fraud_event_job.rb +0 -9
  118. data/app/jobs/spree_cm_commissioner/voting_credit_allocation_job.rb +0 -10
  119. data/app/jobs/spree_cm_commissioner/voting_credit_de_allocation_job.rb +0 -10
  120. data/app/models/concerns/spree_cm_commissioner/voting_session_live_stream_concern.rb +0 -41
  121. data/app/models/spree_cm_commissioner/imports/import_contestant.rb +0 -7
  122. data/app/models/spree_cm_commissioner/maintenance_tasks/voting_session.rb +0 -36
  123. data/app/models/spree_cm_commissioner/preview_role.rb +0 -8
  124. data/app/models/spree_cm_commissioner/role_user_decorator.rb +0 -8
  125. data/app/models/spree_cm_commissioner/show.rb +0 -163
  126. data/app/models/spree_cm_commissioner/show_contestant.rb +0 -39
  127. data/app/models/spree_cm_commissioner/show_contestant_image.rb +0 -11
  128. data/app/models/spree_cm_commissioner/show_contestant_video.rb +0 -15
  129. data/app/models/spree_cm_commissioner/show_episode.rb +0 -110
  130. data/app/models/spree_cm_commissioner/show_person.rb +0 -15
  131. data/app/models/spree_cm_commissioner/show_person_assignment.rb +0 -20
  132. data/app/models/spree_cm_commissioner/show_person_image.rb +0 -11
  133. data/app/models/spree_cm_commissioner/vote.rb +0 -16
  134. data/app/models/spree_cm_commissioner/vote_fraud_event.rb +0 -20
  135. data/app/models/spree_cm_commissioner/voting_contestant.rb +0 -61
  136. data/app/models/spree_cm_commissioner/voting_credit.rb +0 -72
  137. data/app/models/spree_cm_commissioner/voting_credit_transaction.rb +0 -55
  138. data/app/models/spree_cm_commissioner/voting_session.rb +0 -215
  139. data/app/models/spree_cm_commissioner/voting_session_stat.rb +0 -8
  140. data/app/overrides/spree/admin/products/_form/preview_checkbox.html.erb.deface +0 -9
  141. data/app/overrides/spree/admin/taxons/_form/preview_checkbox.html.erb.deface +0 -7
  142. data/app/overrides/spree/layouts/admin/map_head.html.erb.deface +0 -2
  143. data/app/serializers/spree/v2/tenant/advertisement_serializer.rb +0 -11
  144. data/app/serializers/spree/v2/tenant/campaign_serializer.rb +0 -13
  145. data/app/serializers/spree/v2/tenant/show_contestant_serializer.rb +0 -21
  146. data/app/serializers/spree/v2/tenant/show_episode_serializer.rb +0 -17
  147. data/app/serializers/spree/v2/tenant/show_person_assignment_serializer.rb +0 -16
  148. data/app/serializers/spree/v2/tenant/show_person_serializer.rb +0 -13
  149. data/app/serializers/spree/v2/tenant/show_serializer.rb +0 -19
  150. data/app/serializers/spree/v2/tenant/video_serializer.rb +0 -9
  151. data/app/serializers/spree/v2/tenant/vote_serializer.rb +0 -14
  152. data/app/serializers/spree/v2/tenant/voting_contestant_serializer.rb +0 -22
  153. data/app/serializers/spree/v2/tenant/voting_credit_serializer.rb +0 -10
  154. data/app/serializers/spree/v2/tenant/voting_credit_transaction_serializer.rb +0 -14
  155. data/app/serializers/spree/v2/tenant/voting_session_serializer.rb +0 -19
  156. data/app/services/spree_cm_commissioner/advertisements/weight_validator.rb +0 -43
  157. data/app/services/spree_cm_commissioner/cleanup_expired_access_tokens.rb +0 -52
  158. data/app/services/spree_cm_commissioner/fraud_check.rb +0 -299
  159. data/app/services/spree_cm_commissioner/imports/contestants/create.rb +0 -153
  160. data/app/services/spree_cm_commissioner/show_contestants/normalize_video_highlights.rb +0 -57
  161. data/app/services/spree_cm_commissioner/url_embed/youtube_embed.rb +0 -44
  162. data/app/services/spree_cm_commissioner/vote_counters/audit_counters.rb +0 -43
  163. data/app/services/spree_cm_commissioner/vote_counters/base.rb +0 -31
  164. data/app/services/spree_cm_commissioner/vote_counters/increment.rb +0 -44
  165. data/app/services/spree_cm_commissioner/vote_counters/per_contestant_counter.rb +0 -68
  166. data/app/services/spree_cm_commissioner/vote_counters/rebuild_from_db.rb +0 -70
  167. data/app/services/spree_cm_commissioner/vote_counters/snapshot_to_db.rb +0 -113
  168. data/app/services/spree_cm_commissioner/vote_credit_deductor.rb +0 -68
  169. data/app/services/spree_cm_commissioner/vote_package/create.rb +0 -145
  170. data/app/services/spree_cm_commissioner/vote_package/update.rb +0 -91
  171. data/app/services/spree_cm_commissioner/vote_processor.rb +0 -144
  172. data/app/services/spree_cm_commissioner/voting_contestants/advancer.rb +0 -334
  173. data/app/services/spree_cm_commissioner/voting_contestants/assigner.rb +0 -32
  174. data/app/services/spree_cm_commissioner/voting_contestants/bulk_updater.rb +0 -106
  175. data/app/services/spree_cm_commissioner/voting_credits/allocate.rb +0 -77
  176. data/app/services/spree_cm_commissioner/voting_credits/claim_free_votes.rb +0 -119
  177. data/app/services/spree_cm_commissioner/voting_credits/credit_calculator.rb +0 -35
  178. data/app/services/spree_cm_commissioner/voting_credits/de_allocate.rb +0 -87
  179. data/app/services/spree_cm_commissioner/voting_leaderboards/calculate_score.rb +0 -67
  180. data/app/services/spree_cm_commissioner/voting_leaderboards/combined_result.rb +0 -183
  181. data/app/services/spree_cm_commissioner/voting_sessions/finalize.rb +0 -66
  182. data/db/migrate/20260309230148_create_cm_show_people.rb +0 -14
  183. data/db/migrate/20260309230149_create_cm_show_people_assignments.rb +0 -16
  184. data/db/migrate/20260310082711_create_cm_show_contestants.rb +0 -28
  185. data/db/migrate/20260310082720_create_cm_voting_sessions.rb +0 -21
  186. data/db/migrate/20260310082721_create_cm_voting_contestants.rb +0 -23
  187. data/db/migrate/20260310082734_add_voting_fields_to_spree_taxons.rb +0 -9
  188. data/db/migrate/20260310082735_add_type_to_spree_products.rb +0 -6
  189. data/db/migrate/20260310082749_create_cm_voting_credits.rb +0 -27
  190. data/db/migrate/20260326080200_create_cm_voting_credit_transactions.rb +0 -27
  191. data/db/migrate/20260330160000_create_cm_votes.rb +0 -25
  192. data/db/migrate/20260401072500_add_advanced_from_to_cm_voting_contestants.rb +0 -7
  193. data/db/migrate/20260402000001_add_voting_credit_scope_to_spree_taxons.rb +0 -6
  194. data/db/migrate/20260402000002_rename_scopeable_to_votable_in_cm_voting_credits.rb +0 -12
  195. data/db/migrate/20260403070000_add_name_to_cm_voting_sessions.rb +0 -5
  196. data/db/migrate/20260406000001_add_vendor_id_to_voting_tables.rb +0 -6
  197. data/db/migrate/20260406000001_rename_votes_remaining_to_amount_in_cm_voting_credits.rb +0 -11
  198. data/db/migrate/20260408085255_add_show_id_and_vendor_id_to_cm_voting_sessions.rb +0 -9
  199. data/db/migrate/20260420000001_rename_type_to_credit_type_in_cm_voting_credits.rb +0 -25
  200. data/db/migrate/20260422000001_create_cm_vote_fraud_events.rb +0 -23
  201. data/db/migrate/20260423000001_add_preview_to_taxons_products_and_sections.rb +0 -11
  202. data/db/migrate/20260423000002_create_preview_roles.rb +0 -24
  203. data/db/migrate/20260515120000_add_public_metadata_to_cm_voting_sessions.rb +0 -5
  204. data/db/migrate/20260518090920_add_unique_voter_count_to_voting_contestants.rb +0 -5
  205. data/db/migrate/20260518094322_create_cm_voting_session_stats.rb +0 -17
  206. data/db/migrate/20260520000001_add_scoring_model_to_cm_voting_sessions.rb +0 -5
  207. data/db/migrate/20260520000001_optimize_cm_votes_indexes.rb +0 -22
  208. data/db/migrate/20260525042257_add_vote_number_to_cm_voting_contestants.rb +0 -18
  209. data/db/migrate/20260527035430_add_confirmed_rank_to_cm_voting_contestants.rb +0 -5
  210. data/db/migrate/20260527062005_add_eliminated_at_to_cm_show_contestants.rb +0 -5
  211. data/db/migrate/20260603063652_add_parent_to_voting_sessions.rb +0 -9
  212. data/db/migrate/20260603090000_add_session_type_to_cm_voting_sessions.rb +0 -6
  213. data/docs/sql/jsonb_query_guide.md +0 -57
  214. data/lib/spree_cm_commissioner/test_helper/factories/show_episode_factory.rb +0 -12
  215. data/lib/spree_cm_commissioner/test_helper/factories/show_factory.rb +0 -120
  216. data/lib/spree_cm_commissioner/test_helper/factories/vote_credit_factory.rb +0 -37
  217. data/lib/spree_cm_commissioner/test_helper/factories/vote_factory.rb +0 -28
  218. data/lib/spree_cm_commissioner/test_helper/factories/voting_credit_transaction_factory.rb +0 -11
  219. 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: 8bd441927a9bb64c823a003b5a1f0ecbb7591a90de805f3e3edfdcaaa48180ba
4
- data.tar.gz: 3a5b5097a6b2daf1edf5d2b8a55d3d87cc6de0127022b3859817ffe3994ae75d
3
+ metadata.gz: 0774f6d0c4fad7ae396f14326fd6d0965164b74d89f355c3966bc8d1fd9563f9
4
+ data.tar.gz: 002d84c9f1273b54f01d5a25bdecc5f3b475a12e07b32d8e1846c19107fe776f
5
5
  SHA512:
6
- metadata.gz: 37bcbc34200db68f4647ff333e5e923939b42d46f669ea04b721be9652f7280e12f047ad9541b538054723cd16a63350f62cc586d978fa8ad94a7e4625695ca9
7
- data.tar.gz: ab2ee51768d3b2d9c7b1145120b0d70defa14c6cbb6ea7c9a550a11f7ec2496b3674bdbba48f0a37f452c11f7fc5c7ba2d567eacd4f9de0380a18c06ce1fe68e
6
+ metadata.gz: 260d54db1f9dd63dbfef02edf2944d02e2c582972b8903815462e438be9cbfb6f5561a7b4a4b64c2cda4af18908c8c7a91958213c06764d1f7ee4d8e2c16dec3
7
+ data.tar.gz: 003d6ecd547b0215851266f06e823f2f7c5e7a8da35f5b4a8051784855a4d095d088b79f700dcadca8820d561d7a9989a3ee0d9eb7940943c3c5777cc7a4742c
data/.env.example CHANGED
@@ -34,6 +34,7 @@ DISTANCE_SIGNING_KEY=hei********************VY
34
34
 
35
35
  # Cache durations (in seconds) for different content types
36
36
  # See: app/controllers/concerns/spree_cm_commissioner/content_cachable.rb
37
+ CACHE_AUTO_INVALIDATION_DISABLED="" # Set to yes to disable CDN cache invalidation entirely (kill switch)
37
38
  CACHE_CDN_MAX_AGE=86400 # CDN/server-side cache duration for all responses
38
39
  CACHE_STATIC_MAX_AGE=86400 # Static content (countries, provinces, seat layouts, CMS pages) - 1 day
39
40
  CACHE_SEMI_STATIC_MAX_AGE=3600 # Semi-static content (menus, homepage backgrounds, routes) - 1 hour
data/.gitignore CHANGED
@@ -34,7 +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
data/Gemfile.lock CHANGED
@@ -34,7 +34,7 @@ GIT
34
34
  PATH
35
35
  remote: .
36
36
  specs:
37
- spree_cm_commissioner (2.8.3.pre.pre4)
37
+ spree_cm_commissioner (2.8.3)
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
@@ -51,24 +50,6 @@ module Spree
51
50
  @taxon.build_home_banner(attachment: permitted_resource_params.delete(:home_banner)) if permitted_resource_params[:home_banner]
52
51
  @taxon.build_video_banner(attachment: permitted_resource_params.delete(:video_banner)) if permitted_resource_params[:video_banner]
53
52
  end
54
-
55
- # Some admin forms submit STI records under their class key
56
- # (e.g. :spree_cm_commissioner_show) while Spree update reads :taxon.
57
- # Merge both into :taxon so all edited fields are persisted.
58
- def normalize_sti_taxon_params
59
- return unless @taxon
60
-
61
- sti_key = @taxon.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[:taxon]
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[:taxon] = merged_params
71
- end
72
53
  end
73
54
  end
74
55
  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
@@ -39,7 +39,6 @@ module Spree
39
39
  params[:date],
40
40
  params[:route_type],
41
41
  params[:vendor_id],
42
- params[:featured],
43
42
  params[:number_of_guests],
44
43
  resource_includes&.sort&.join(','),
45
44
  sparse_fields&.sort&.join(','),
@@ -65,8 +64,7 @@ module Spree
65
64
  'trips.vendor',
66
65
  'trips.vendor.logo',
67
66
  'trips.vehicle_type',
68
- 'trips.vehicle_type.vehicle_photos',
69
- 'trips.amenities'
67
+ 'trips.vehicle_type.vehicle_photos'
70
68
  ]
71
69
  end
72
70
 
@@ -100,7 +98,11 @@ module Spree
100
98
 
101
99
  # override
102
100
  def serializer_params
103
- params.permit(:include).to_hash
101
+ super.merge(
102
+ exclude_vendor_kind_option_types: true,
103
+ exclude_vendor_kind_option_values: true,
104
+ exclude_vehicle_type_amenities: true
105
+ )
104
106
  end
105
107
 
106
108
  # override
@@ -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
 
@@ -0,0 +1,68 @@
1
+ # 🎉 ---[Event]---
2
+ #
3
+ # 📋 Event: {{event.name}}
4
+ #
5
+ # 👤 Organizer: {{vendor.name}}
6
+ #
7
+ # 🗓️ Start Date: {{from_date}}
8
+ # 🗓️ End Date: {{to_date}}
9
+ # 🔗 URL: ......
10
+ #
11
+ module SpreeCmCommissioner
12
+ class EventTelegramMessageFactory < TelegramMessageFactory
13
+ attr_reader :event
14
+
15
+ def initialize(event:)
16
+ @event = event
17
+
18
+ title = "✨ #{event.name} ✨"
19
+
20
+ super(title: title)
21
+ end
22
+
23
+ def body
24
+ [
25
+ event_name_line,
26
+ organizer_line,
27
+ [start_date_line, end_date_line].compact.join("\n"),
28
+ event_url_line
29
+ ].compact_blank.join("\n\n")
30
+ end
31
+
32
+ private
33
+
34
+ def event_name_line
35
+ "📋 Event: #{event.name}" if event.name.present?
36
+ end
37
+
38
+ def organizer_line
39
+ return if event.vendor&.name.blank?
40
+
41
+ "👤 Organizer: #{bold(event.vendor.name)}"
42
+ end
43
+
44
+ def start_date_line
45
+ return if event.from_date.blank?
46
+
47
+ "🗓️ Start Date: #{pretty_datetime(event.from_date)}"
48
+ end
49
+
50
+ def end_date_line
51
+ return if event.to_date.blank?
52
+
53
+ "🗓️ End Date: #{pretty_datetime(event.to_date)}"
54
+ end
55
+
56
+ def pretty_datetime(date)
57
+ return '' if date.blank?
58
+
59
+ date.strftime('%b %d, %Y · %H:%M')
60
+ end
61
+
62
+ def event_url_line
63
+ return if event.event_url.blank?
64
+
65
+ "🔗 URL: #{event.event_url}"
66
+ end
67
+ end
68
+ end
@@ -48,7 +48,7 @@ module SpreeCmCommissioner
48
48
  end
49
49
 
50
50
  def line_item_content(line_item)
51
- return intercity_taxi_line_item_content(line_item) if intercity_taxi?(line_item)
51
+ return transit_line_item_content(line_item) if line_item.transit?
52
52
 
53
53
  text = []
54
54
 
@@ -64,8 +64,8 @@ module SpreeCmCommissioner
64
64
  def pretty_date_for(line_item)
65
65
  return nil unless line_item.date_present?
66
66
 
67
- from_date = pretty_date(line_item.from_date)
68
- to_date = pretty_date(line_item.to_date)
67
+ from_date = pretty_datetime(line_item.from_date)
68
+ to_date = pretty_datetime(line_item.to_date)
69
69
 
70
70
  if from_date == to_date
71
71
  "🗓️ #{from_date}"
@@ -84,7 +84,7 @@ module SpreeCmCommissioner
84
84
  text << "Email: #{inline_code(order.email)}" if order.email.present?
85
85
  text << "Delivery Address: #{formatted_shipping_address.presence || 'N/A'}" if order.delivery_required?
86
86
 
87
- append_intercity_taxi_footer(text) if intercity_taxi_order?
87
+ append_transit_footer(text) if transit_order?
88
88
 
89
89
  if show_details_link && order.guests.any?
90
90
  text << ''
@@ -132,12 +132,12 @@ module SpreeCmCommissioner
132
132
 
133
133
  private
134
134
 
135
- def intercity_taxi?(line_item)
136
- trip_for(line_item)&.intercity_taxi?
135
+ def transit_order?
136
+ selected_line_items.any?(&:transit?)
137
137
  end
138
138
 
139
139
  def intercity_taxi_order?
140
- selected_line_items.any? { |li| intercity_taxi?(li) }
140
+ selected_line_items.any? { |li| trip_for(li)&.intercity_taxi? }
141
141
  end
142
142
 
143
143
  def trip_for(line_item)
@@ -147,10 +147,10 @@ module SpreeCmCommissioner
147
147
  @trip_cache[line_item.trip_id] ||= SpreeCmCommissioner::Trip.find_by(id: line_item.trip_id)
148
148
  end
149
149
 
150
- def intercity_taxi_line_item_content(line_item)
150
+ def transit_line_item_content(line_item)
151
151
  text = []
152
- route_text = taxi_route_text(line_item)
153
- departure_text = taxi_departure_text(line_item)
152
+ route_text = transit_route_text(line_item)
153
+ departure_text = transit_departure_text(line_item)
154
154
  text << bold('🚗 Trip Details')
155
155
  text << "Route: #{route_text}" if route_text.present?
156
156
  text << "Passengers: #{line_item.passenger_count || line_item.quantity}"
@@ -159,7 +159,7 @@ module SpreeCmCommissioner
159
159
  text.compact.join("\n")
160
160
  end
161
161
 
162
- def taxi_route_text(line_item)
162
+ def transit_route_text(line_item)
163
163
  trip = trip_for(line_item)
164
164
  return line_item.product.name if trip.blank?
165
165
 
@@ -171,21 +171,35 @@ module SpreeCmCommissioner
171
171
  vehicle.present? ? "#{parts} (#{vehicle})" : parts
172
172
  end
173
173
 
174
- def taxi_departure_text(line_item)
174
+ def transit_departure_text(line_item)
175
175
  return nil unless line_item.date_present?
176
176
 
177
177
  line_item.from_date.strftime('%b %d, %Y · %H:%M')
178
178
  end
179
179
 
180
180
  def nationality_text
181
- values = order.saved_guests.map { |sg| sg.nationality&.name.presence || sg.nationality_group&.humanize }.compact.uniq
182
- return nil if values.empty?
181
+ grouped = order.saved_guests.group_by { |sg| sg.nationality_group&.humanize }
182
+ grouped.delete(nil)
183
+ return nil if grouped.empty?
183
184
 
184
- values.join(', ')
185
+ grouped.map { |nationality_group, guests| customer_type_summary(nationality_group, guests) }.join(', ')
185
186
  end
186
187
 
187
- def append_intercity_taxi_footer(text)
188
- text << "Nationality: #{nationality_text}" if nationality_text.present?
188
+ # e.g. "Local (Adult x1, Child x1)". age_group is NOT NULL, so it is always present.
189
+ def customer_type_summary(nationality_group, guests)
190
+ age_breakdown = guests
191
+ .group_by { |sg| sg.age_group.humanize }
192
+ .map { |age_group, age_guests| "#{age_group} x#{age_guests.count}" }
193
+ .join(', ')
194
+
195
+ "#{nationality_group} (#{age_breakdown})"
196
+ end
197
+
198
+ def append_transit_footer(text)
199
+ nationality = nationality_text
200
+ text << "Nationality: #{nationality}" if nationality.present?
201
+
202
+ return unless intercity_taxi_order?
189
203
 
190
204
  pickup = selected_line_items.filter_map(&:pickup_map_place).first
191
205
  dropoff = selected_line_items.filter_map(&:dropoff_map_place).first
@@ -46,5 +46,11 @@ module SpreeCmCommissioner
46
46
 
47
47
  date.to_date.strftime('%b %d, %Y')
48
48
  end
49
+
50
+ def pretty_datetime(datetime)
51
+ return '' if datetime.blank?
52
+
53
+ datetime&.in_time_zone&.strftime('%b %d, %Y - %H:%M')
54
+ end
49
55
  end
50
56
  end
@@ -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
@@ -19,13 +19,17 @@ module SpreeCmCommissioner
19
19
  context.response = client.create_invalidation(
20
20
  distribution_id: ENV.fetch('ASSETS_SYNC_CF_DIST_ID'),
21
21
  invalidation_batch: {
22
- caller_reference: Time.now.to_i.to_s,
22
+ # Must be globally unique per distribution,
23
+ # Time.now.to_i collides when multiple jobs fire in the same second.
24
+ caller_reference: SecureRandom.uuid,
23
25
  paths: {
24
26
  quantity: patterns.size,
25
27
  items: patterns
26
28
  }
27
29
  }
28
30
  )
31
+ rescue Aws::CloudFront::Errors::TooManyInvalidationsInProgress => e
32
+ context.fail!(message: "Too many invalidations in progress: #{e}")
29
33
  end
30
34
  end
31
35
  end
@@ -0,0 +1,10 @@
1
+ module SpreeCmCommissioner
2
+ class EventCreationTelegramAlertSenderJob < ApplicationUniqueJob
3
+ queue_as :telegram_bot
4
+
5
+ def perform(options = {})
6
+ event = Spree::Taxon.find(options[:event_id])
7
+ SpreeCmCommissioner::TelegramAlerts::EventCreation.call(event: event)
8
+ end
9
+ end
10
+ end
@@ -1,7 +1,10 @@
1
1
  module SpreeCmCommissioner
2
2
  class InvalidateCacheRequestJob < ApplicationUniqueJob
3
+ queue_as :cache_invalidation
4
+
3
5
  def perform(options = {})
4
- SpreeCmCommissioner::InvalidateCacheRequest.call(patterns: options[:patterns])
6
+ result = SpreeCmCommissioner::InvalidateCacheRequest.call(patterns: options[:patterns])
7
+ raise result.error if result.failure?
5
8
  end
6
9
  end
7
10
  end
@@ -1,13 +1,15 @@
1
1
  module SpreeCmCommissioner
2
2
  module InventoryItems
3
3
  class BulkAdjustQuantitiesJob < ApplicationUniqueJob
4
- # :line_item_ids, :inventory_id_and_quantities
4
+ # :line_item_ids, :inventory_id_and_quantities, :caller_source
5
5
  #
6
6
  # :line_item_ids is included for unique job key generation to prevent duplicate jobs,
7
7
  # though it's not used in the perform method implementation.
8
+ # :caller_source is a string like "ClassName#method" identifying who enqueued the job.
8
9
  def perform(options = {})
9
10
  SpreeCmCommissioner::InventoryItems::BulkAdjustQuantities.call!(
10
- inventory_id_and_quantities: options[:inventory_id_and_quantities]
11
+ inventory_id_and_quantities: options[:inventory_id_and_quantities],
12
+ caller_source: options[:caller_source]
11
13
  )
12
14
  end
13
15
  end
@@ -3,16 +3,18 @@ module SpreeCmCommissioner
3
3
  class BulkAdjustQuantitiesOnHoldJob < ApplicationUniqueJob
4
4
  queue_as :default
5
5
 
6
- # :order_id, :inventory_id_and_quantities
6
+ # :order_id, :inventory_id_and_quantities, :caller_source
7
7
  #
8
8
  # :order_id is included for unique job key generation to prevent duplicate jobs,
9
9
  # though it's not used in the perform method implementation.
10
+ # :caller_source is a string like "ClassName#method" identifying who enqueued the job.
10
11
  def perform(options = {})
11
12
  raise ArgumentError, 'order_id is required' if options[:order_id].blank?
12
13
  raise ArgumentError, 'inventory_id_and_quantities is required' if options[:inventory_id_and_quantities].blank?
13
14
 
14
15
  SpreeCmCommissioner::InventoryItems::BulkAdjustQuantitiesOnHold.call(
15
- inventory_id_and_quantities: options[:inventory_id_and_quantities]
16
+ inventory_id_and_quantities: options[:inventory_id_and_quantities],
17
+ caller_source: options[:caller_source]
16
18
  )
17
19
  end
18
20
  end
@@ -0,0 +1,11 @@
1
+ module SpreeCmCommissioner
2
+ module OauthAccessTokens
3
+ class CleanupExpiredJob < SpreeCmCommissioner::ApplicationJob
4
+ queue_as :default
5
+
6
+ def perform
7
+ SpreeCmCommissioner::OauthAccessTokens::CleanupExpired.new.call
8
+ end
9
+ end
10
+ end
11
+ end
@@ -2,8 +2,14 @@ module SpreeCmCommissioner
2
2
  module RouteMetrics
3
3
  class DecreaseTripCountJob < ApplicationUniqueJob
4
4
  def perform(options = {})
5
- trip = SpreeCmCommissioner::Trip.find(options[:trip_id])
6
- SpreeCmCommissioner::RouteMetrics::DecreaseTripCount.call(trip: trip)
5
+ route_metric = SpreeCmCommissioner::RouteMetric.find_by(
6
+ origin_place_id: options[:origin_place_id],
7
+ destination_place_id: options[:destination_place_id],
8
+ route_type: options[:route_type]
9
+ )
10
+ return if route_metric.nil?
11
+
12
+ SpreeCmCommissioner::RouteMetrics::DecreaseTripCount.call(route_metric: route_metric)
7
13
  end
8
14
  end
9
15
  end
@@ -2,8 +2,11 @@ module SpreeCmCommissioner
2
2
  module RouteMetrics
3
3
  class IncreaseTripCountJob < ApplicationUniqueJob
4
4
  def perform(options = {})
5
- trip = SpreeCmCommissioner::Trip.find(options[:trip_id])
6
- SpreeCmCommissioner::RouteMetrics::IncreaseTripCount.call(trip: trip)
5
+ SpreeCmCommissioner::RouteMetrics::IncreaseTripCount.call(
6
+ origin_place_id: options[:origin_place_id],
7
+ destination_place_id: options[:destination_place_id],
8
+ route_type: options[:route_type]
9
+ )
7
10
  end
8
11
  end
9
12
  end
@@ -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|
@@ -23,6 +23,8 @@ module SpreeCmCommissioner
23
23
  TripKey = Struct.new(:trip_id, :direction, :boarding_trip_stop_id, :drop_off_trip_stop_id)
24
24
 
25
25
  included do
26
+ include SpreeCmCommissioner::ServiceOrigin
27
+
26
28
  validates :direction, inclusion: { in: DIRECTION }, allow_nil: true
27
29
  validates :trip_id, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
28
30
  validates :service_origin_id, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
@@ -125,6 +127,12 @@ module SpreeCmCommissioner
125
127
 
126
128
  private
127
129
 
130
+ def resolve_service_origin_id
131
+ return nil if trip_id.blank?
132
+
133
+ SpreeCmCommissioner::Trip.find_by(id: trip_id)&.service_origin_id
134
+ end
135
+
128
136
  def validate_trip_stops_for_scheduled_trips
129
137
  return if trip_id.blank? || trip_id.zero?
130
138
 
@@ -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
@@ -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
 
34
32
  scope :accepted, -> { where(request_state: 'accepted') }
35
33
 
@@ -330,13 +328,5 @@ module SpreeCmCommissioner
330
328
  factory = OrderTelegramMessageFactory.new(title: title, order: self)
331
329
  TelegramNotificationSenderJob.perform_later(chat_id: chat_id, message: factory.message, parse_mode: factory.parse_mode)
332
330
  end
333
-
334
- def allocate_resources
335
- SpreeCmCommissioner::VotingCreditAllocationJob.perform_later(order_id: id)
336
- end
337
-
338
- def de_allocate_resources
339
- SpreeCmCommissioner::VotingCreditDeAllocationJob.perform_later(order_id: id)
340
- end
341
331
  end
342
332
  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