spree_cm_commissioner 2.8.3.pre.pre14 → 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 (304) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_and_build_gem.yml +1 -2
  3. data/.gitignore +0 -6
  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/guests_controller.rb +1 -1
  7. data/app/controllers/spree/admin/homepage_section_controller.rb +1 -4
  8. data/app/controllers/spree/admin/stock_managements_controller.rb +1 -1
  9. data/app/controllers/spree/admin/system/waiting_room_controller.rb +0 -15
  10. data/app/controllers/spree/admin/taxons_controller_decorator.rb +0 -19
  11. data/app/controllers/spree/api/v2/storefront/homepage_sections_controller.rb +0 -1
  12. data/app/controllers/spree/api/v2/storefront/transit/draft_orders_controller.rb +1 -3
  13. data/app/controllers/spree/api/v2/tenant/base_controller.rb +0 -4
  14. data/app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb +0 -1
  15. data/app/controllers/spree/api/v2/tenant/products_controller.rb +1 -1
  16. data/app/controllers/spree/api/v2/tenant/taxons_controller.rb +1 -1
  17. data/app/controllers/spree/api/v2/tenant/transit/draft_orders_controller.rb +1 -3
  18. data/app/controllers/spree/api/v2/tenant/trips_controller.rb +0 -11
  19. data/app/controllers/spree_cm_commissioner/admin/orders_controller_decorator.rb +3 -7
  20. data/app/controllers/spree_cm_commissioner/admin/products_controller_decorator.rb +0 -19
  21. data/app/finders/spree_cm_commissioner/events/find_matches.rb +0 -1
  22. data/app/helpers/spree_cm_commissioner/admin/guest_helper.rb +0 -10
  23. data/app/helpers/spree_cm_commissioner/admin/homepage_segment_helper.rb +0 -2
  24. data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +5 -62
  25. data/app/interactors/spree_cm_commissioner/waiting_guests_caller.rb +7 -49
  26. data/app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb +1 -2
  27. data/app/models/concerns/spree_cm_commissioner/line_item_open_dated_trippable.rb +7 -50
  28. data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +1 -0
  29. data/app/models/concerns/spree_cm_commissioner/line_items_filter_scope.rb +0 -5
  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/taxon_kind.rb +1 -3
  34. data/app/models/spree_cm_commissioner/guest.rb +0 -20
  35. data/app/models/spree_cm_commissioner/import.rb +1 -1
  36. data/app/models/spree_cm_commissioner/line_item_decorator.rb +0 -7
  37. data/app/models/spree_cm_commissioner/notification.rb +1 -10
  38. data/app/models/spree_cm_commissioner/order_decorator.rb +3 -13
  39. data/app/models/spree_cm_commissioner/payment_decorator.rb +0 -19
  40. data/app/models/spree_cm_commissioner/payment_method_decorator.rb +0 -8
  41. data/app/models/spree_cm_commissioner/pin_code.rb +9 -62
  42. data/app/models/spree_cm_commissioner/product_decorator.rb +0 -56
  43. data/app/models/spree_cm_commissioner/reserved_block.rb +0 -2
  44. data/app/models/spree_cm_commissioner/role_decorator.rb +1 -4
  45. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +0 -4
  46. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -3
  47. data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -23
  48. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +1 -19
  49. data/app/models/spree_cm_commissioner/tenant.rb +0 -9
  50. data/app/models/spree_cm_commissioner/trip.rb +12 -33
  51. data/app/models/spree_cm_commissioner/user_decorator.rb +0 -18
  52. data/app/models/spree_cm_commissioner/variant_decorator.rb +0 -4
  53. data/app/models/spree_cm_commissioner/variant_options.rb +0 -4
  54. data/app/models/spree_cm_commissioner/vendor_decorator.rb +0 -5
  55. data/app/queries/spree_cm_commissioner/multi_leg_trips_query.rb +8 -31
  56. data/app/queries/spree_cm_commissioner/single_leg_trips_query.rb +5 -57
  57. data/app/serializers/spree/v2/storefront/homepage_section_serializer.rb +1 -1
  58. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +2 -4
  59. data/app/serializers/spree/v2/storefront/product_serializer_decorator.rb +2 -5
  60. data/app/serializers/spree/v2/storefront/role_serializer.rb +1 -1
  61. data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +1 -2
  62. data/app/serializers/spree/v2/tenant/dynamic_field_serializer.rb +1 -1
  63. data/app/serializers/spree/v2/tenant/homepage_section_serializer.rb +1 -1
  64. data/app/serializers/spree/v2/tenant/role_serializer.rb +1 -1
  65. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +1 -1
  66. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_serializer.rb +1 -3
  67. data/app/serializers/spree_cm_commissioner/v2/storefront/pin_code_serializer.rb +1 -1
  68. data/app/serializers/spree_cm_commissioner/v2/storefront/reserved_block_serializer.rb +1 -1
  69. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_query_result_serializer.rb +1 -4
  70. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_result_serializer.rb +1 -2
  71. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_stop_serializer.rb +0 -1
  72. data/app/services/spree_cm_commissioner/api_caches/invalidate.rb +0 -12
  73. data/app/services/spree_cm_commissioner/check_ins/create_bulk.rb +5 -11
  74. data/app/services/spree_cm_commissioner/inventory_items/reset.rb +1 -1
  75. data/app/services/spree_cm_commissioner/open_dated_trips/redeem.rb +36 -80
  76. data/app/services/spree_cm_commissioner/reserved_blocks/reserve.rb +1 -2
  77. data/app/services/spree_cm_commissioner/transit_order/create.rb +14 -48
  78. data/app/services/spree_cm_commissioner/trips/create_multi_leg.rb +2 -1
  79. data/app/services/spree_cm_commissioner/trips/create_open_dated_trip.rb +98 -0
  80. data/app/services/spree_cm_commissioner/trips/update_open_dated_trip.rb +67 -0
  81. data/app/services/spree_cm_commissioner/trips/variants/create.rb +2 -1
  82. data/app/views/spree/admin/guests/_table.html.erb +87 -82
  83. data/app/views/spree/admin/homepage_section/_form.html.erb +0 -5
  84. data/app/views/spree/admin/system/waiting_room/show.html.erb +0 -53
  85. data/config/initializers/spree_permitted_attributes.rb +0 -8
  86. data/config/locales/en.yml +7 -110
  87. data/config/locales/km.yml +4 -104
  88. data/config/routes.rb +0 -50
  89. data/lib/spree_cm_commissioner/transit/trip_form.rb +13 -0
  90. data/lib/spree_cm_commissioner/trip_query_result.rb +6 -46
  91. data/lib/spree_cm_commissioner/trip_result.rb +7 -9
  92. data/lib/spree_cm_commissioner/version.rb +1 -1
  93. data/lib/spree_cm_commissioner.rb +1 -7
  94. data/spree_cm_commissioner.gemspec +1 -1
  95. metadata +6 -214
  96. data/app/controllers/spree/admin/order_ticket_transfers_controller.rb +0 -25
  97. data/app/controllers/spree/admin/ticket_transfer_rules_controller.rb +0 -47
  98. data/app/controllers/spree/admin/ticket_transfers_controller.rb +0 -61
  99. data/app/controllers/spree/api/v2/storefront/account/recipients_controller.rb +0 -32
  100. data/app/controllers/spree/api/v2/storefront/preview_products_controller.rb +0 -48
  101. data/app/controllers/spree/api/v2/storefront/preview_sections_controller.rb +0 -27
  102. data/app/controllers/spree/api/v2/storefront/preview_taxons_controller.rb +0 -18
  103. data/app/controllers/spree/api/v2/storefront/products_controller_decorator.rb +0 -15
  104. data/app/controllers/spree/api/v2/storefront/taxons_controller_decorator.rb +0 -15
  105. data/app/controllers/spree/api/v2/storefront/ticket_transfer_acceptances_controller.rb +0 -32
  106. data/app/controllers/spree/api/v2/storefront/ticket_transfers_controller.rb +0 -117
  107. data/app/controllers/spree/api/v2/tenant/ad_campaigns_controller.rb +0 -25
  108. data/app/controllers/spree/api/v2/tenant/episodes_controller.rb +0 -38
  109. data/app/controllers/spree/api/v2/tenant/free_vote_claim_controller.rb +0 -58
  110. data/app/controllers/spree/api/v2/tenant/preview_products_controller.rb +0 -47
  111. data/app/controllers/spree/api/v2/tenant/preview_sections_controller.rb +0 -26
  112. data/app/controllers/spree/api/v2/tenant/preview_shows_controller.rb +0 -19
  113. data/app/controllers/spree/api/v2/tenant/preview_taxons_controller.rb +0 -19
  114. data/app/controllers/spree/api/v2/tenant/show_contestants_controller.rb +0 -52
  115. data/app/controllers/spree/api/v2/tenant/show_elimination_sessions_controller.rb +0 -57
  116. data/app/controllers/spree/api/v2/tenant/show_people_controller.rb +0 -49
  117. data/app/controllers/spree/api/v2/tenant/show_person_assignments_controller.rb +0 -36
  118. data/app/controllers/spree/api/v2/tenant/shows_controller.rb +0 -36
  119. data/app/controllers/spree/api/v2/tenant/vote_packages_controller.rb +0 -33
  120. data/app/controllers/spree/api/v2/tenant/votes_controller.rb +0 -94
  121. data/app/controllers/spree/api/v2/tenant/voting_contestants_controller.rb +0 -43
  122. data/app/controllers/spree/api/v2/tenant/voting_credit_transactions_controller.rb +0 -41
  123. data/app/controllers/spree/api/v2/tenant/voting_credits_controller.rb +0 -31
  124. data/app/helpers/spree_cm_commissioner/admin/ticket_transfers_helper.rb +0 -32
  125. data/app/jobs/spree_cm_commissioner/expire_ticket_transfer_job.rb +0 -10
  126. data/app/jobs/spree_cm_commissioner/show_contestants/import_job.rb +0 -9
  127. data/app/jobs/spree_cm_commissioner/telegram_gateway/pin_code_sender_job.rb +0 -18
  128. data/app/jobs/spree_cm_commissioner/vendor_route_metrics/decrease_trip_count_job.rb +0 -17
  129. data/app/jobs/spree_cm_commissioner/vendor_route_metrics/increase_trip_count_job.rb +0 -14
  130. data/app/jobs/spree_cm_commissioner/vote_fraud_event_job.rb +0 -9
  131. data/app/jobs/spree_cm_commissioner/voting_credit_allocation_job.rb +0 -10
  132. data/app/jobs/spree_cm_commissioner/voting_credit_de_allocation_job.rb +0 -10
  133. data/app/jobs/spree_cm_commissioner/waiting_room/publish_lobby_path_job.rb +0 -17
  134. data/app/models/concerns/spree_cm_commissioner/ticket_transferable.rb +0 -15
  135. data/app/models/concerns/spree_cm_commissioner/voting_session_live_stream_concern.rb +0 -41
  136. data/app/models/spree_cm_commissioner/imports/import_contestant.rb +0 -7
  137. data/app/models/spree_cm_commissioner/maintenance_tasks/voting_session.rb +0 -36
  138. data/app/models/spree_cm_commissioner/preview_role.rb +0 -8
  139. data/app/models/spree_cm_commissioner/role_user_decorator.rb +0 -8
  140. data/app/models/spree_cm_commissioner/show.rb +0 -169
  141. data/app/models/spree_cm_commissioner/show_contestant.rb +0 -39
  142. data/app/models/spree_cm_commissioner/show_contestant_image.rb +0 -11
  143. data/app/models/spree_cm_commissioner/show_contestant_video.rb +0 -15
  144. data/app/models/spree_cm_commissioner/show_episode.rb +0 -108
  145. data/app/models/spree_cm_commissioner/show_person.rb +0 -15
  146. data/app/models/spree_cm_commissioner/show_person_assignment.rb +0 -21
  147. data/app/models/spree_cm_commissioner/show_person_image.rb +0 -11
  148. data/app/models/spree_cm_commissioner/ticket_transfer.rb +0 -191
  149. data/app/models/spree_cm_commissioner/ticket_transfer_rule.rb +0 -88
  150. data/app/models/spree_cm_commissioner/vendor_route_metric.rb +0 -25
  151. data/app/models/spree_cm_commissioner/vote.rb +0 -16
  152. data/app/models/spree_cm_commissioner/vote_fraud_event.rb +0 -20
  153. data/app/models/spree_cm_commissioner/voting_contestant.rb +0 -100
  154. data/app/models/spree_cm_commissioner/voting_credit.rb +0 -72
  155. data/app/models/spree_cm_commissioner/voting_credit_transaction.rb +0 -55
  156. data/app/models/spree_cm_commissioner/voting_session.rb +0 -216
  157. data/app/models/spree_cm_commissioner/voting_session_stat.rb +0 -8
  158. data/app/notifications/spree_cm_commissioner/ticket_transfer_accepted_notification.rb +0 -48
  159. data/app/notifications/spree_cm_commissioner/ticket_transfer_completed_notification.rb +0 -48
  160. data/app/notifications/spree_cm_commissioner/ticket_transfer_expired_notification.rb +0 -46
  161. data/app/notifications/spree_cm_commissioner/ticket_transfer_received_notification.rb +0 -48
  162. data/app/notifications/spree_cm_commissioner/ticket_transfer_rejected_notification.rb +0 -48
  163. data/app/overrides/spree/admin/products/_form/allow_gift_transfer.html.erb.deface +0 -9
  164. data/app/overrides/spree/admin/products/_form/allow_transfer.html.erb.deface +0 -9
  165. data/app/overrides/spree/admin/products/_form/preview_checkbox.html.erb.deface +0 -9
  166. data/app/overrides/spree/admin/shared/_order_tabs/ticket_transfers.html.erb.deface +0 -10
  167. data/app/overrides/spree/admin/shared/sub_menu/_product/ticket_transfers_tab.html.erb.deface +0 -3
  168. data/app/overrides/spree/admin/taxons/_form/preview_checkbox.html.erb.deface +0 -7
  169. data/app/queries/spree_cm_commissioner/recipient_searcher_query.rb +0 -14
  170. data/app/serializers/spree/v2/tenant/ad_campaign_serializer.rb +0 -13
  171. data/app/serializers/spree/v2/tenant/advertisement_serializer.rb +0 -11
  172. data/app/serializers/spree/v2/tenant/free_vote_claim_serializer.rb +0 -9
  173. data/app/serializers/spree/v2/tenant/show_contestant_serializer.rb +0 -21
  174. data/app/serializers/spree/v2/tenant/show_episode_serializer.rb +0 -20
  175. data/app/serializers/spree/v2/tenant/show_person_assignment_serializer.rb +0 -16
  176. data/app/serializers/spree/v2/tenant/show_person_serializer.rb +0 -13
  177. data/app/serializers/spree/v2/tenant/show_serializer.rb +0 -21
  178. data/app/serializers/spree/v2/tenant/video_serializer.rb +0 -9
  179. data/app/serializers/spree/v2/tenant/vote_package_serializer.rb +0 -12
  180. data/app/serializers/spree/v2/tenant/vote_serializer.rb +0 -14
  181. data/app/serializers/spree/v2/tenant/voting_contestant_serializer.rb +0 -23
  182. data/app/serializers/spree/v2/tenant/voting_credit_serializer.rb +0 -10
  183. data/app/serializers/spree/v2/tenant/voting_credit_transaction_serializer.rb +0 -14
  184. data/app/serializers/spree/v2/tenant/voting_session_serializer.rb +0 -21
  185. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_minimal_serializer.rb +0 -30
  186. data/app/serializers/spree_cm_commissioner/v2/storefront/line_item_minimal_serializer.rb +0 -57
  187. data/app/serializers/spree_cm_commissioner/v2/storefront/recipient_serializer.rb +0 -13
  188. data/app/serializers/spree_cm_commissioner/v2/storefront/ticket_transfer_minimal_serializer.rb +0 -17
  189. data/app/serializers/spree_cm_commissioner/v2/storefront/ticket_transfer_serializer.rb +0 -20
  190. data/app/services/spree_cm_commissioner/checkout/complete_decorator.rb +0 -22
  191. data/app/services/spree_cm_commissioner/fraud_check.rb +0 -299
  192. data/app/services/spree_cm_commissioner/imports/contestants/create.rb +0 -153
  193. data/app/services/spree_cm_commissioner/show_contestants/normalize_video_highlights.rb +0 -57
  194. data/app/services/spree_cm_commissioner/show_persons/contestant_assigner.rb +0 -51
  195. data/app/services/spree_cm_commissioner/telegram_gateway/pin_code_sender.rb +0 -99
  196. data/app/services/spree_cm_commissioner/ticket_transfers/accept.rb +0 -132
  197. data/app/services/spree_cm_commissioner/ticket_transfers/cancel.rb +0 -54
  198. data/app/services/spree_cm_commissioner/ticket_transfers/complete.rb +0 -68
  199. data/app/services/spree_cm_commissioner/ticket_transfers/eligibility_checker.rb +0 -99
  200. data/app/services/spree_cm_commissioner/ticket_transfers/expire.rb +0 -47
  201. data/app/services/spree_cm_commissioner/ticket_transfers/fee_calculator.rb +0 -57
  202. data/app/services/spree_cm_commissioner/ticket_transfers/initiate.rb +0 -98
  203. data/app/services/spree_cm_commissioner/ticket_transfers/preview_rule.rb +0 -38
  204. data/app/services/spree_cm_commissioner/ticket_transfers/reject.rb +0 -55
  205. data/app/services/spree_cm_commissioner/ticket_transfers/transfer_guest.rb +0 -29
  206. data/app/services/spree_cm_commissioner/trips/add_ons/create.rb +0 -124
  207. data/app/services/spree_cm_commissioner/trips/add_ons/update_price.rb +0 -36
  208. data/app/services/spree_cm_commissioner/url_embed/youtube_embed.rb +0 -44
  209. data/app/services/spree_cm_commissioner/vendor_route_metrics/decrease_trip_count.rb +0 -19
  210. data/app/services/spree_cm_commissioner/vendor_route_metrics/increase_trip_count.rb +0 -24
  211. data/app/services/spree_cm_commissioner/vote_counters/audit_counters.rb +0 -43
  212. data/app/services/spree_cm_commissioner/vote_counters/base.rb +0 -31
  213. data/app/services/spree_cm_commissioner/vote_counters/increment.rb +0 -44
  214. data/app/services/spree_cm_commissioner/vote_counters/per_contestant_counter.rb +0 -68
  215. data/app/services/spree_cm_commissioner/vote_counters/rebuild_from_db.rb +0 -70
  216. data/app/services/spree_cm_commissioner/vote_counters/snapshot_to_db.rb +0 -113
  217. data/app/services/spree_cm_commissioner/vote_credit_deductor.rb +0 -68
  218. data/app/services/spree_cm_commissioner/vote_package/create.rb +0 -145
  219. data/app/services/spree_cm_commissioner/vote_package/update.rb +0 -91
  220. data/app/services/spree_cm_commissioner/vote_processor.rb +0 -144
  221. data/app/services/spree_cm_commissioner/voting_contestants/advancer.rb +0 -335
  222. data/app/services/spree_cm_commissioner/voting_contestants/assigner.rb +0 -40
  223. data/app/services/spree_cm_commissioner/voting_contestants/bulk_updater.rb +0 -106
  224. data/app/services/spree_cm_commissioner/voting_credits/allocate.rb +0 -77
  225. data/app/services/spree_cm_commissioner/voting_credits/claim_free_votes.rb +0 -116
  226. data/app/services/spree_cm_commissioner/voting_credits/credit_calculator.rb +0 -35
  227. data/app/services/spree_cm_commissioner/voting_credits/de_allocate.rb +0 -87
  228. data/app/services/spree_cm_commissioner/voting_leaderboards/calculate_score.rb +0 -67
  229. data/app/services/spree_cm_commissioner/voting_leaderboards/combined_result.rb +0 -190
  230. data/app/services/spree_cm_commissioner/voting_sessions/finalize.rb +0 -105
  231. data/app/services/spree_cm_commissioner/waiting_room/publish_lobby_path.rb +0 -48
  232. data/app/services/spree_cm_commissioner/waiting_room_lobby_metadata_fetcher.rb +0 -47
  233. data/app/services/telegram_gateway_adapter/client.rb +0 -124
  234. data/app/views/spree/admin/order_ticket_transfers/show.html.erb +0 -7
  235. data/app/views/spree/admin/shared/_ticket_transfer_details.html.erb +0 -226
  236. data/app/views/spree/admin/shared/_ticket_transfer_tabs.html.erb +0 -14
  237. data/app/views/spree/admin/ticket_transfer_rules/_form.html.erb +0 -193
  238. data/app/views/spree/admin/ticket_transfer_rules/edit.html.erb +0 -11
  239. data/app/views/spree/admin/ticket_transfer_rules/index.html.erb +0 -79
  240. data/app/views/spree/admin/ticket_transfer_rules/new.html.erb +0 -11
  241. data/app/views/spree/admin/ticket_transfers/_search_form.html.erb +0 -70
  242. data/app/views/spree/admin/ticket_transfers/_tabs.html.erb +0 -14
  243. data/app/views/spree/admin/ticket_transfers/index.html.erb +0 -74
  244. data/app/views/spree/admin/ticket_transfers/show.html.erb +0 -13
  245. data/app/views/spree/admin/ticket_transfers/state_changes.html.erb +0 -47
  246. data/db/migrate/20260303101440_add_allow_transfer_to_spree_products.rb +0 -5
  247. data/db/migrate/20260303101907_create_cm_ticket_transfers.rb +0 -32
  248. data/db/migrate/20260303102316_add_state_to_cm_guests.rb +0 -7
  249. data/db/migrate/20260309230148_create_cm_show_people.rb +0 -14
  250. data/db/migrate/20260309230149_create_cm_show_people_assignments.rb +0 -16
  251. data/db/migrate/20260310082711_create_cm_show_contestants.rb +0 -28
  252. data/db/migrate/20260310082720_create_cm_voting_sessions.rb +0 -21
  253. data/db/migrate/20260310082721_create_cm_voting_contestants.rb +0 -23
  254. data/db/migrate/20260310082734_add_voting_fields_to_spree_taxons.rb +0 -9
  255. data/db/migrate/20260310082735_add_type_to_spree_products.rb +0 -6
  256. data/db/migrate/20260310082749_create_cm_voting_credits.rb +0 -27
  257. data/db/migrate/20260326080200_create_cm_voting_credit_transactions.rb +0 -27
  258. data/db/migrate/20260330160000_create_cm_votes.rb +0 -25
  259. data/db/migrate/20260401072500_add_advanced_from_to_cm_voting_contestants.rb +0 -7
  260. data/db/migrate/20260402000001_add_voting_credit_scope_to_spree_taxons.rb +0 -6
  261. data/db/migrate/20260402000002_rename_scopeable_to_votable_in_cm_voting_credits.rb +0 -12
  262. data/db/migrate/20260403070000_add_name_to_cm_voting_sessions.rb +0 -5
  263. data/db/migrate/20260406000001_add_vendor_id_to_voting_tables.rb +0 -6
  264. data/db/migrate/20260406000001_rename_votes_remaining_to_amount_in_cm_voting_credits.rb +0 -11
  265. data/db/migrate/20260408085255_add_show_id_and_vendor_id_to_cm_voting_sessions.rb +0 -9
  266. data/db/migrate/20260408100000_create_cm_ticket_transfer_rules.rb +0 -28
  267. data/db/migrate/20260410120000_add_transfer_type_to_cm_ticket_transfers.rb +0 -5
  268. data/db/migrate/20260420000001_rename_type_to_credit_type_in_cm_voting_credits.rb +0 -25
  269. data/db/migrate/20260422000001_create_cm_vote_fraud_events.rb +0 -23
  270. data/db/migrate/20260422120000_add_settlement_status_to_cm_ticket_transfers.rb +0 -6
  271. data/db/migrate/20260423000001_add_preview_to_taxons_products_and_sections.rb +0 -11
  272. data/db/migrate/20260423000002_create_preview_roles.rb +0 -24
  273. data/db/migrate/20260507000000_add_index_to_cm_ticket_transfers_completed_at.rb +0 -5
  274. data/db/migrate/20260515120000_add_public_metadata_to_cm_voting_sessions.rb +0 -5
  275. data/db/migrate/20260518090920_add_unique_voter_count_to_voting_contestants.rb +0 -5
  276. data/db/migrate/20260518094322_create_cm_voting_session_stats.rb +0 -17
  277. data/db/migrate/20260520000000_add_number_to_cm_ticket_transfers.rb +0 -6
  278. data/db/migrate/20260520000001_add_scoring_model_to_cm_voting_sessions.rb +0 -5
  279. data/db/migrate/20260520000001_optimize_cm_votes_indexes.rb +0 -22
  280. data/db/migrate/20260525042257_add_vote_number_to_cm_voting_contestants.rb +0 -18
  281. data/db/migrate/20260527035430_add_confirmed_rank_to_cm_voting_contestants.rb +0 -5
  282. data/db/migrate/20260527062005_add_eliminated_at_to_cm_show_contestants.rb +0 -5
  283. data/db/migrate/20260603063652_add_parent_to_voting_sessions.rb +0 -9
  284. data/db/migrate/20260603090000_add_session_type_to_cm_voting_sessions.rb +0 -6
  285. data/db/migrate/20260605120908_add_description_to_cm_dynamic_fields.rb +0 -5
  286. data/db/migrate/20260608000000_add_allow_gift_transfer_to_spree_products.rb +0 -5
  287. data/db/migrate/20260608000000_add_display_to_cm_voting_sessions.rb +0 -5
  288. data/db/migrate/20260608000000_create_cm_vendor_route_metrics.rb +0 -25
  289. data/db/migrate/20260608152251_add_gender_to_cm_reserved_blocks.rb +0 -5
  290. data/db/migrate/20260610000001_add_delivery_channel_to_cm_pin_codes.rb +0 -6
  291. data/db/migrate/20260610000001_drop_is_open_dated_from_cm_trips.rb +0 -6
  292. data/db/migrate/20260614000001_change_code_limit_in_cm_pin_codes.rb +0 -5
  293. data/db/migrate/20260615000002_add_index_to_code_on_cm_pin_codes.rb +0 -5
  294. data/docs/sql/jsonb_query_guide.md +0 -57
  295. data/lib/spree_cm_commissioner/test_helper/factories/show_episode_factory.rb +0 -12
  296. data/lib/spree_cm_commissioner/test_helper/factories/show_factory.rb +0 -120
  297. data/lib/spree_cm_commissioner/test_helper/factories/ticket_transfer_factory.rb +0 -18
  298. data/lib/spree_cm_commissioner/test_helper/factories/vendor_route_metric_factory.rb +0 -10
  299. data/lib/spree_cm_commissioner/test_helper/factories/vote_credit_factory.rb +0 -37
  300. data/lib/spree_cm_commissioner/test_helper/factories/vote_factory.rb +0 -28
  301. data/lib/spree_cm_commissioner/test_helper/factories/voting_credit_transaction_factory.rb +0 -11
  302. data/lib/spree_cm_commissioner/test_helper/factories/voting_session_factory.rb +0 -11
  303. data/lib/tasks/backfill_route_metrics.rake +0 -21
  304. data/lib/tasks/backfill_vendor_route_metrics.rake +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e14575f7ac52d9cfa8c454de179107ec31f080a9b8bdc2ff1bfdebeeb5a42f46
4
- data.tar.gz: fde706a204a681e6c94931be9dfc915ed5090f3abd81d2481120d598b1e168dd
3
+ metadata.gz: 0774f6d0c4fad7ae396f14326fd6d0965164b74d89f355c3966bc8d1fd9563f9
4
+ data.tar.gz: 002d84c9f1273b54f01d5a25bdecc5f3b475a12e07b32d8e1846c19107fe776f
5
5
  SHA512:
6
- metadata.gz: c69e06e635df7a5259a6fbcab7d1fba55b93eac89ed5c12592e0070baf1bfbaa3ad442754604fd7cffe435d069c340a0f6b427abf39049d5fa5855b5a68fc64f
7
- data.tar.gz: 33bf29761d4ee458f559c067c5872db8e381c0f9de7805ce02efaa76bde07229e97a5c20f42ba81a77eb585820dc4360eadbcd035cb4be740364ff1d2d947440
6
+ metadata.gz: 260d54db1f9dd63dbfef02edf2944d02e2c582972b8903815462e438be9cbfb6f5561a7b4a4b64c2cda4af18908c8c7a91958213c06764d1f7ee4d8e2c16dec3
7
+ data.tar.gz: 003d6ecd547b0215851266f06e823f2f7c5e7a8da35f5b4a8051784855a4d095d088b79f700dcadca8820d561d7a9989a3ee0d9eb7940943c3c5777cc7a4742c
@@ -164,8 +164,7 @@ jobs:
164
164
  env:
165
165
  DATABASE_URL: postgres://myuser:mypassword@localhost:5432/test_db
166
166
  run: |
167
- # Using --no-threads to bypass a known Ruby 3.2.0 GC segmentation fault in CI.
168
- bundle exec brakeman --no-threads --no-exit-on-warn
167
+ bundle exec brakeman --no-exit-on-warn
169
168
 
170
169
  test:
171
170
  needs: [setup]
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.3.pre.pre14)
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)
@@ -55,7 +55,7 @@ module Spree
55
55
  if result.success?
56
56
  flash[:success] = "Guest #{@guest.full_name} has been checked in."
57
57
  else
58
- flash[:error] = result.error.value.to_s.titleize
58
+ flash[:error] = result.message.to_s.titleize
59
59
  end
60
60
 
61
61
  redirect_to collection_url
@@ -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
@@ -92,7 +92,7 @@ module Spree
92
92
  .call
93
93
  .index_by(&:inventory_item_id)
94
94
  @reserved_stocks = Spree::LineItem
95
- .affecting_inventory
95
+ .complete
96
96
  .where(variant_id: @variants.pluck(:id))
97
97
  .group('spree_line_items.variant_id')
98
98
  .sum(:quantity)
@@ -4,10 +4,7 @@ module Spree
4
4
  class WaitingRoomController < Spree::Admin::BaseController
5
5
  def show
6
6
  @fetcher = SpreeCmCommissioner::WaitingRoomSystemMetadataFetcher.new
7
- @lobby_fetcher = SpreeCmCommissioner::WaitingRoomLobbyMetadataFetcher.new
8
-
9
7
  @fetcher.load_document_data
10
- @lobby_fetcher.load_document_data
11
8
 
12
9
  @active_sesions_count = SpreeCmCommissioner::WaitingRoomSession.active.count
13
10
  end
@@ -32,18 +29,6 @@ module Spree
32
29
 
33
30
  redirect_back fallback_location: admin_system_waiting_room_path
34
31
  end
35
-
36
- def publish_lobby_path
37
- result = SpreeCmCommissioner::WaitingRoom::PublishLobbyPath.call
38
-
39
- if result.success?
40
- flash[:success] = "Published waiting guests records path: #{result.value[:records_path]}"
41
- else
42
- flash[:error] = result.error.to_s
43
- end
44
-
45
- redirect_back fallback_location: admin_system_waiting_room_path
46
- end
47
32
  end
48
33
  end
49
34
  end
@@ -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
@@ -11,7 +11,6 @@ module Spree
11
11
  # - inbound_date: Date of inbound transit (optional)
12
12
  # - outbound_legs: Array of outbound leg details (required)
13
13
  # - inbound_legs: Array of inbound leg details (optional)
14
- # - include_return: Whether to add the trip's "return included" add-on as a line item (optional)
15
14
  def create
16
15
  @outbound_legs = params[:outbound_legs].is_a?(Array) && params[:outbound_legs].any? ? build_legs(:outbound, params[:outbound_legs]) : []
17
16
  @inbound_legs = params[:inbound_legs].is_a?(Array) && params[:inbound_legs].any? ? build_legs(:inbound, params[:inbound_legs]) : []
@@ -21,8 +20,7 @@ module Spree
21
20
  inbound_date: params[:inbound_date]&.to_date,
22
21
  outbound_legs: @outbound_legs,
23
22
  inbound_legs: @inbound_legs,
24
- user: spree_current_user,
25
- include_return: ActiveModel::Type::Boolean.new.cast(params[:include_return])
23
+ user: spree_current_user
26
24
  )
27
25
 
28
26
  if result.success?
@@ -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
 
@@ -11,7 +11,6 @@ module Spree
11
11
  # - inbound_date: Date of inbound transit (optional)
12
12
  # - outbound_legs: Array of outbound leg details (required)
13
13
  # - inbound_legs: Array of inbound leg details (optional)
14
- # - include_return: Whether to add the trip's "return included" add-on as a line item (optional)
15
14
  def create
16
15
  @outbound_legs = params[:outbound_legs].is_a?(Array) && params[:outbound_legs].any? ? build_legs(:outbound, params[:outbound_legs]) : []
17
16
  @inbound_legs = params[:inbound_legs].is_a?(Array) && params[:inbound_legs].any? ? build_legs(:inbound, params[:inbound_legs]) : []
@@ -21,8 +20,7 @@ module Spree
21
20
  inbound_date: params[:inbound_date]&.to_date,
22
21
  outbound_legs: @outbound_legs,
23
22
  inbound_legs: @inbound_legs,
24
- user: spree_current_user,
25
- include_return: ActiveModel::Type::Boolean.new.cast(params[:include_return])
23
+ user: spree_current_user
26
24
  )
27
25
 
28
26
  if result.success?
@@ -25,17 +25,6 @@ module Spree
25
25
  def resource_serializer
26
26
  Spree::V2::Tenant::TripSerializer
27
27
  end
28
-
29
- # override
30
- def serializer_params
31
- super.merge(
32
- include_details: include_details?
33
- )
34
- end
35
-
36
- def include_details?
37
- params.fetch(:include_details, 'true') == 'true'
38
- end
39
28
  end
40
29
  end
41
30
  end
@@ -40,13 +40,9 @@ module SpreeCmCommissioner
40
40
 
41
41
  # override
42
42
  def cancel
43
- if @order.guests_in_transfer?
44
- flash[:error] = Spree.t('admin.orders.cannot_cancel_guest_transfer')
45
- else
46
- internal_note = params.dig(:order, :internal_note)
47
- @order.canceled_by(try_spree_current_user, cancellation_reason: internal_note)
48
- flash[:success] = Spree.t(:order_canceled)
49
- end
43
+ internal_note = params.dig(:order, :internal_note)
44
+ @order.canceled_by(try_spree_current_user, cancellation_reason: internal_note)
45
+ flash[:success] = Spree.t(:order_canceled)
50
46
  redirect_back fallback_location: spree.edit_admin_order_url(@order)
51
47
  end
52
48
 
@@ -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
@@ -61,16 +61,6 @@ module SpreeCmCommissioner
61
61
  'badge-info'
62
62
  end
63
63
  end
64
-
65
- def guest_state_badge(guest)
66
- badge_class = case guest.state
67
- when 'active' then 'badge-success'
68
- when 'locked' then 'badge-warning'
69
- when 'transferred' then 'badge-secondary'
70
- else 'badge-info'
71
- end
72
- content_tag(:span, guest.state.humanize, class: "badge #{badge_class}")
73
- end
74
64
  end
75
65
  end
76
66
  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
@@ -6,7 +6,7 @@ module SpreeCmCommissioner
6
6
  context.fail!(message: I18n.t('pincode_sender.pincode.blank')) if context.pin_code.nil?
7
7
 
8
8
  if context.pin_code.phone_number?
9
- send_phone_otp
9
+ send_sms
10
10
  else
11
11
  send_email
12
12
  end
@@ -16,73 +16,18 @@ module SpreeCmCommissioner
16
16
 
17
17
  private
18
18
 
19
- # Channel selection for phone-number OTPs lives here so the routing is
20
- # easy to find and reason about. Telegram Gateway is primary; SMS is the fallback.
21
- def send_phone_otp
22
- if telegram_gateway_available?
23
- send_via_telegram_gateway
24
- else
25
- send_via_sms
26
- end
27
- end
28
-
29
- def telegram_gateway_available?
30
- return false unless telegram_gateway_enabled?
31
- return false if telegram_gateway_api_key.blank?
32
-
33
- ability = telegram_gateway_adapter.check_send_ability(context.pin_code.contact)
34
- context.telegram_gateway_request_id = ability.request_id if ability.ok?
35
- ability.ok?
36
- rescue TelegramGatewayAdapter::Error, Faraday::Error
37
- false
38
- end
39
-
40
- def send_via_telegram_gateway
19
+ def send_sms
41
20
  from_number = sms_from_number
42
21
  return if from_number.blank?
43
22
 
44
- # Save the chosen channel + the Telegram request_id synchronously so
45
- # (a) the API response already reflects the channel for the mobile UI,
46
- # (b) verification can reach Telegram even if the user submits the OTP
47
- # before the async send job has run. For Telegram-delivered codes
48
- # the `code` column stores Telegram's request_id (Telegram generates
49
- # and holds the actual OTP).
50
- context.pin_code.update!(
51
- delivery_channel: :telegram_gateway,
52
- code: context.telegram_gateway_request_id
53
- )
54
-
55
- SpreeCmCommissioner::TelegramGateway::PinCodeSenderJob.perform_later(
56
- pin_code_id: context.pin_code.id,
57
- from: from_number,
58
- request_id: context.telegram_gateway_request_id,
59
- tenant_id: context.pin_code&.application&.tenant_id
60
- )
61
- end
62
-
63
- def send_via_sms
64
- from_number = sms_from_number
65
- return if from_number.blank?
66
-
67
- SpreeCmCommissioner::SmsPinCodeJob.perform_later(
68
- pin_code_id: context.pin_code.id,
23
+ options = {
69
24
  from: from_number,
70
25
  to: context.pin_code.contact,
71
26
  body: I18n.t('pincode_sender.sms.body', code: context.pin_code.code, readable_type: context.pin_code.readable_type),
72
27
  tenant_id: context.pin_code&.application&.tenant_id
73
- )
74
- end
75
-
76
- def telegram_gateway_enabled?
77
- ENV['TELEGRAM_GATEWAY_ENABLED'] == 'yes'
78
- end
79
-
80
- def telegram_gateway_api_key
81
- @telegram_gateway_api_key ||= ENV.fetch('TELEGRAM_GATEWAY_API_KEY', nil)
82
- end
28
+ }
83
29
 
84
- def telegram_gateway_adapter
85
- @telegram_gateway_adapter ||= TelegramGatewayAdapter::Client.new
30
+ SpreeCmCommissioner::SmsPinCodeJob.perform_later(options)
86
31
  end
87
32
 
88
33
  def sms_from_number
@@ -93,8 +38,6 @@ module SpreeCmCommissioner
93
38
  end
94
39
 
95
40
  def send_email
96
- context.pin_code.update!(delivery_channel: :email)
97
-
98
41
  SpreeCmCommissioner::PinCodeMailer.send_pin_code(
99
42
  context.pin_code.id,
100
43
  context.pin_code.readable_type,
@@ -19,47 +19,18 @@ module SpreeCmCommissioner
19
19
  max_sessions - active_sessions
20
20
  end
21
21
 
22
- # This query requires an index; create it in Firebase beforehand.
23
- # Client must create waiting_guests documents with :queued_at and :allow_to_enter_room_at set to nil to allow filter + order queries.
24
- #
25
- # Yesterday's guests are always older than today's, so fill from yesterday first, then use any
26
- # leftover slots for today. This way no one queued before the midnight rollover gets skipped.
27
- # e.g. 5 slots, 2 waiting in yesterday -> take both, then take 3 from today.
22
+ # This query required index. create them in Firebase beforehand.
23
+ # Client side must create waiting_guests document with :queued_at & :allow_to_enter_room_at to null to allow fillter & order.
28
24
  def fetch_long_waiting_guests(available_slots)
29
- previous_guests = eligible_guests_in(previous_records_path, available_slots)
30
-
31
- # Pre-flip window: the lobby pointer still points at yesterday, so both paths resolve to the
32
- # same partition — return now to avoid querying (and double-counting) it twice.
33
- return previous_guests if records_path == previous_records_path
34
-
35
- remaining_slots = available_slots - previous_guests.size
36
- return previous_guests if remaining_slots <= 0
37
-
38
- previous_guests + eligible_guests_in(records_path, remaining_slots)
39
- end
40
-
41
- def eligible_guests_in(records_path, limit)
42
- firestore.col(records_path)
25
+ firestore.col('waiting_guests')
26
+ .doc(current_date)
27
+ .col('records')
43
28
  .where('allow_to_enter_room_at', '==', nil)
44
29
  .order('queued_at')
45
- .limit(limit)
30
+ .limit(available_slots)
46
31
  .get.to_a
47
32
  end
48
33
 
49
- # Published path is authoritative; fall back to the server's own date if not yet published.
50
- def records_path
51
- lobby_data&.dig(:waiting_guests_records_path).presence || default_records_path(current_date)
52
- end
53
-
54
- # Drain target is derived from the server date, never the (possibly stale) lobby pointer.
55
- def previous_records_path
56
- default_records_path(previous_date)
57
- end
58
-
59
- def default_records_path(date)
60
- "waiting_guests/#{date}/records"
61
- end
62
-
63
34
  # For alert waiting guests to enter room, we just update :allow_to_enter_room_at.
64
35
  # App will listen to firebase & start refresh session token to enter room.
65
36
  def calling_all(waiting_guests)
@@ -74,22 +45,9 @@ module SpreeCmCommissioner
74
45
  Time.zone.now.strftime('%Y-%m-%d')
75
46
  end
76
47
 
77
- def previous_date
78
- 1.day.ago.strftime('%Y-%m-%d')
79
- end
80
-
81
48
  # When open app, app request to check whether room is full or not via Firebase instead of server to minimize server requests.
82
- # merge: true so we preserve the published `waiting_guests_records_path` on the lobby doc.
83
49
  def mark_as(full:, available_slots:)
84
- lobby_document.set({ full: full, available_slots: available_slots }, merge: true)
85
- end
86
-
87
- def lobby_data
88
- @lobby_data ||= lobby_document.get.data
89
- end
90
-
91
- def lobby_document
92
- @lobby_document ||= firestore.col('waiting_rooms').doc('lobby')
50
+ firestore.col('waiting_rooms').doc('lobby').set({ full: full, available_slots: available_slots })
93
51
  end
94
52
 
95
53
  def fetch_max_sessions
@@ -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|
@@ -1,28 +1,13 @@
1
1
  module SpreeCmCommissioner
2
- # Makes an open-return entitlement line item redeemable.
3
- #
4
- # New design: the open return is no longer a fake open-dated *trip* line item. It is a plain
5
- # ecommerce add-on (a Spree::Product linked to the outbound trip's product via an
6
- # `open_dated_pair` ProductRelation) sold as a regular ecommerce line item at checkout.
7
- #
8
- # Redemption swaps that ecommerce line item in place into a concrete transit ticket on a chosen
9
- # return trip (see SpreeCmCommissioner::OpenDatedTrips::Redeem). Once swapped, the line item is a
10
- # `transit` item.
11
2
  module LineItemOpenDatedTrippable
12
3
  extend ActiveSupport::Concern
13
4
 
14
5
  included do
15
6
  include SpreeCmCommissioner::StoreMetadata
16
7
 
17
- store_private_metadata :open_dated_product_id, :integer
18
-
19
- # The endpoints (Place ids) the *return* trip must run between — already reversed from the
20
- # outbound journey at purchase time (return origin = outbound destination, and vice versa).
21
- # Storing the return direction means every consumer reads it directly: redemption is a plain
22
- # id match and the search needs no flip. Endpoints rather than a trip keep this
23
- # leg-count-independent: a multi-leg outbound still has exactly one origin and one destination.
24
- store_private_metadata :open_dated_return_origin_place_id, :integer
25
- store_private_metadata :open_dated_return_destination_place_id, :integer
8
+ # Open dated trip metadata
9
+ store_public_metadata :is_open_dated, :boolean, default: false
10
+ store_public_metadata :original_trip_id, :integer # Original template trip ID BEFORE redemption
26
11
 
27
12
  # Alias existing columns for better semantic meaning
28
13
  alias_attribute :valid_until, :to_date # Expiration date
@@ -34,47 +19,19 @@ module SpreeCmCommissioner
34
19
  accepter
35
20
  end
36
21
 
37
- def open_dated?
38
- open_dated_return_origin_place_id.present? && open_dated_return_destination_place_id.present?
39
- end
40
-
41
- def open_dated_product
42
- return nil if open_dated_product_id.blank?
43
-
44
- @open_dated_product ||= Spree::Product.find_by(id: open_dated_product_id)
45
- end
46
-
47
- # Origin place the return trip must depart from (= outbound destination).
48
- def open_dated_return_origin_place
49
- return nil if open_dated_return_origin_place_id.blank?
50
-
51
- @open_dated_return_origin_place ||= SpreeCmCommissioner::Place.find_by(id: open_dated_return_origin_place_id)
52
- end
53
-
54
- # Destination place the return trip must arrive at (= outbound origin).
55
- def open_dated_return_destination_place
56
- return nil if open_dated_return_destination_place_id.blank?
57
-
58
- @open_dated_return_destination_place ||= SpreeCmCommissioner::Place.find_by(id: open_dated_return_destination_place_id)
59
- end
60
-
61
- # Human-readable return journey, e.g. "Siem Reap → Phnom Penh". Nil when endpoints are missing.
62
- def open_dated_route_label
63
- return nil if open_dated_return_origin_place.blank? || open_dated_return_destination_place.blank?
64
-
65
- "#{open_dated_return_origin_place.full_path_name} → #{open_dated_return_destination_place.full_path_name}"
66
- end
67
-
22
+ # Check if ticket has been redeemed
68
23
  def redeemed?
69
24
  redeemed_at.present?
70
25
  end
71
26
 
27
+ # Check if ticket is expired
72
28
  def expired?
73
29
  valid_until.present? && valid_until.to_date < Date.current
74
30
  end
75
31
 
32
+ # Check if ticket can be redeemed
76
33
  def can_redeem?
77
- open_dated? && !redeemed? && !expired?
34
+ is_open_dated? && !redeemed? && !expired?
78
35
  end
79
36
  end
80
37
  end
@@ -138,6 +138,7 @@ module SpreeCmCommissioner
138
138
 
139
139
  trip = SpreeCmCommissioner::Trip.find_by(id: trip_id)
140
140
  return unless trip # Skip if trip doesn't exist (will be caught by other validations)
141
+ return if trip.open_dated? # Skip validation for open-dated trips
141
142
 
142
143
  # For scheduled trips, require valid trip stops
143
144
  errors.add(:boarding_trip_stop_id, 'must be greater than 0') if boarding_trip_stop_id.present? && boarding_trip_stop_id <= 0
@@ -10,11 +10,6 @@ module SpreeCmCommissioner
10
10
  scope :accepted, -> { joins(:order).merge(Spree::Order.accepted) }
11
11
  scope :paid, -> { joins(:order).merge(Spree::Order.paid) }
12
12
  scope :with_bib_prefix, -> { joins(:option_types).where(option_types: { name: 'bib-prefix' }) }
13
- scope :exclude_ticket_transfer_orders, -> { joins(:order).merge(Spree::Order.not_ticket_transfer) }
14
-
15
- # Centralizes the rule so that adjustments (e.g. excluding new order kinds in the
16
- # future) only need to be made here. Use this anywhere inventory is computed.
17
- scope :affecting_inventory, -> { complete.exclude_ticket_transfer_orders }
18
13
 
19
14
  scope :filter_by_event, lambda { |event|
20
15
  case event
@@ -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