spree_cm_commissioner 2.8.1.pre.3 → 2.8.2

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 (306) 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/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/storefront/trip_search_controller.rb +0 -1
  9. data/app/controllers/spree/api/v2/tenant/base_controller.rb +0 -4
  10. data/app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb +0 -1
  11. data/app/controllers/spree/api/v2/tenant/products_controller.rb +1 -1
  12. data/app/controllers/spree/api/v2/tenant/taxons_controller.rb +1 -1
  13. data/app/controllers/spree_cm_commissioner/admin/products_controller_decorator.rb +0 -19
  14. data/app/factory/spree_cm_commissioner/event_telegram_message_factory.rb +68 -0
  15. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +2 -2
  16. data/app/finders/spree_cm_commissioner/events/find_matches.rb +0 -1
  17. data/app/helpers/spree_cm_commissioner/admin/homepage_segment_helper.rb +0 -2
  18. data/app/jobs/spree_cm_commissioner/event_creation_telegram_alert_sender_job.rb +10 -0
  19. data/app/jobs/spree_cm_commissioner/oauth_access_tokens/cleanup_expired_job.rb +11 -0
  20. data/app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb +1 -2
  21. data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +8 -0
  22. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -2
  23. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -10
  24. data/app/models/concerns/spree_cm_commissioner/product_type.rb +1 -1
  25. data/app/models/concerns/spree_cm_commissioner/service_origin.rb +22 -0
  26. data/app/models/concerns/spree_cm_commissioner/store_preference.rb +1 -0
  27. data/app/models/concerns/spree_cm_commissioner/vehicle_kind.rb +1 -1
  28. data/app/models/spree_cm_commissioner/integration.rb +0 -31
  29. data/app/models/spree_cm_commissioner/integrations/stadium_x_v1.rb +10 -4
  30. data/app/models/spree_cm_commissioner/inventory_item.rb +17 -8
  31. data/app/models/spree_cm_commissioner/maintenance_tasks/cache_invalidation.rb +2 -0
  32. data/app/models/spree_cm_commissioner/order_decorator.rb +0 -1
  33. data/app/models/spree_cm_commissioner/place.rb +0 -2
  34. data/app/models/spree_cm_commissioner/product_decorator.rb +0 -39
  35. data/app/models/spree_cm_commissioner/role_decorator.rb +1 -4
  36. data/app/models/spree_cm_commissioner/route.rb +6 -2
  37. data/app/models/spree_cm_commissioner/seat_layout.rb +0 -2
  38. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +0 -7
  39. data/app/models/spree_cm_commissioner/taxon_decorator.rb +7 -15
  40. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +1 -10
  41. data/app/models/spree_cm_commissioner/tenant.rb +0 -9
  42. data/app/models/spree_cm_commissioner/trip.rb +6 -2
  43. data/app/models/spree_cm_commissioner/trip_stop.rb +0 -2
  44. data/app/models/spree_cm_commissioner/user_decorator.rb +0 -5
  45. data/app/models/spree_cm_commissioner/variant_decorator.rb +0 -1
  46. data/app/models/spree_cm_commissioner/variant_options.rb +0 -4
  47. data/app/models/spree_cm_commissioner/vehicle.rb +0 -3
  48. data/app/models/spree_cm_commissioner/vehicle_type.rb +0 -1
  49. data/app/models/spree_cm_commissioner/vendor_decorator.rb +0 -21
  50. data/app/models/spree_cm_commissioner/vendor_place.rb +0 -2
  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 +26 -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/trip_result_serializer.rb +7 -2
  62. data/app/services/spree_cm_commissioner/integrations/base/sync_manager.rb +2 -1
  63. data/app/services/spree_cm_commissioner/integrations/base/sync_result.rb +0 -11
  64. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/external_client/client.rb +15 -14
  65. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/polling/sync_matches.rb +4 -7
  66. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/polling/sync_zones.rb +3 -6
  67. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_manager.rb +3 -0
  68. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_strategies/full_sync_strategy.rb +3 -1
  69. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_strategies/incremental_sync_strategy.rb +3 -1
  70. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_strategies/webhook_sync_strategy.rb +2 -1
  71. data/app/services/spree_cm_commissioner/oauth_access_tokens/cleanup_expired.rb +53 -0
  72. data/app/services/spree_cm_commissioner/order_holds/hold.rb +0 -17
  73. data/app/services/spree_cm_commissioner/order_holds/release.rb +0 -17
  74. data/app/services/spree_cm_commissioner/pricing_models/preview.rb +15 -6
  75. data/app/services/spree_cm_commissioner/routes/create.rb +0 -5
  76. data/app/services/spree_cm_commissioner/telegram_alerts/event_creation.rb +35 -0
  77. data/app/services/spree_cm_commissioner/trips/create_multi_leg.rb +5 -16
  78. data/app/services/spree_cm_commissioner/trips/create_single_leg.rb +0 -1
  79. data/app/views/spree/admin/homepage_section/_form.html.erb +0 -5
  80. data/app/views/spree/admin/integrations/_form.html.erb +0 -12
  81. data/app/views/spree/admin/integrations/index.html.erb +1 -1
  82. data/config/initializers/spree_permitted_attributes.rb +1 -8
  83. data/config/locales/en.yml +0 -13
  84. data/config/locales/km.yml +0 -7
  85. data/config/routes.rb +0 -26
  86. data/lib/spree_cm_commissioner/test_helper/factories/integration_factory.rb +0 -11
  87. data/lib/spree_cm_commissioner/trip_result.rb +48 -21
  88. data/lib/spree_cm_commissioner/version.rb +1 -1
  89. data/lib/spree_cm_commissioner.rb +1 -7
  90. metadata +10 -220
  91. data/app/controllers/spree/api/v2/storefront/preview_products_controller.rb +0 -48
  92. data/app/controllers/spree/api/v2/storefront/preview_sections_controller.rb +0 -27
  93. data/app/controllers/spree/api/v2/storefront/preview_taxons_controller.rb +0 -18
  94. data/app/controllers/spree/api/v2/storefront/products_controller_decorator.rb +0 -15
  95. data/app/controllers/spree/api/v2/storefront/taxons_controller_decorator.rb +0 -15
  96. data/app/controllers/spree/api/v2/storefront/transit/item_availabilities_controller.rb +0 -66
  97. data/app/controllers/spree/api/v2/tenant/free_vote_claims_controller.rb +0 -37
  98. data/app/controllers/spree/api/v2/tenant/preview_products_controller.rb +0 -47
  99. data/app/controllers/spree/api/v2/tenant/preview_sections_controller.rb +0 -26
  100. data/app/controllers/spree/api/v2/tenant/preview_shows_controller.rb +0 -19
  101. data/app/controllers/spree/api/v2/tenant/preview_taxons_controller.rb +0 -19
  102. data/app/controllers/spree/api/v2/tenant/show_contestants_controller.rb +0 -51
  103. data/app/controllers/spree/api/v2/tenant/show_people_controller.rb +0 -49
  104. data/app/controllers/spree/api/v2/tenant/show_person_assignments_controller.rb +0 -36
  105. data/app/controllers/spree/api/v2/tenant/shows_controller.rb +0 -34
  106. data/app/controllers/spree/api/v2/tenant/votes_controller.rb +0 -94
  107. data/app/controllers/spree/api/v2/tenant/voting_contestants_controller.rb +0 -40
  108. data/app/controllers/spree/api/v2/tenant/voting_credit_transactions_controller.rb +0 -41
  109. data/app/controllers/spree/api/v2/tenant/voting_credits_controller.rb +0 -31
  110. data/app/jobs/spree_cm_commissioner/audit_event_job.rb +0 -29
  111. data/app/jobs/spree_cm_commissioner/cleanup_expired_access_tokens_job.rb +0 -9
  112. data/app/jobs/spree_cm_commissioner/vote_fraud_event_job.rb +0 -9
  113. data/app/jobs/spree_cm_commissioner/voting_credit_allocation_job.rb +0 -10
  114. data/app/jobs/spree_cm_commissioner/voting_credit_de_allocation_job.rb +0 -10
  115. data/app/models/concerns/spree_cm_commissioner/audit_wrapper.rb +0 -139
  116. data/app/models/concerns/spree_cm_commissioner/integrations/inventory_sync_cachable.rb +0 -9
  117. data/app/models/concerns/spree_cm_commissioner/variant_metadata.rb +0 -24
  118. data/app/models/spree_cm_commissioner/audit_event.rb +0 -11
  119. data/app/models/spree_cm_commissioner/currency_rate.rb +0 -15
  120. data/app/models/spree_cm_commissioner/integrations/book_me_bus_v1.rb +0 -56
  121. data/app/models/spree_cm_commissioner/integrations/larryta.rb +0 -81
  122. data/app/models/spree_cm_commissioner/integrations/vireak_buntham.rb +0 -82
  123. data/app/models/spree_cm_commissioner/maintenance_tasks/voting_session.rb +0 -34
  124. data/app/models/spree_cm_commissioner/preview_role.rb +0 -8
  125. data/app/models/spree_cm_commissioner/role_user_decorator.rb +0 -8
  126. data/app/models/spree_cm_commissioner/show.rb +0 -157
  127. data/app/models/spree_cm_commissioner/show_contestant.rb +0 -34
  128. data/app/models/spree_cm_commissioner/show_contestant_image.rb +0 -11
  129. data/app/models/spree_cm_commissioner/show_contestant_video.rb +0 -15
  130. data/app/models/spree_cm_commissioner/show_episode.rb +0 -135
  131. data/app/models/spree_cm_commissioner/show_person.rb +0 -15
  132. data/app/models/spree_cm_commissioner/show_person_assignment.rb +0 -20
  133. data/app/models/spree_cm_commissioner/show_person_image.rb +0 -11
  134. data/app/models/spree_cm_commissioner/vote.rb +0 -16
  135. data/app/models/spree_cm_commissioner/vote_fraud_event.rb +0 -19
  136. data/app/models/spree_cm_commissioner/voting_contestant.rb +0 -34
  137. data/app/models/spree_cm_commissioner/voting_credit.rb +0 -72
  138. data/app/models/spree_cm_commissioner/voting_credit_transaction.rb +0 -55
  139. data/app/models/spree_cm_commissioner/voting_session.rb +0 -194
  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/serializables/spree_cm_commissioner/item_availability_sync.rb +0 -10
  143. data/app/serializers/spree/v2/tenant/show_contestant_serializer.rb +0 -21
  144. data/app/serializers/spree/v2/tenant/show_episode_serializer.rb +0 -17
  145. data/app/serializers/spree/v2/tenant/show_person_assignment_serializer.rb +0 -16
  146. data/app/serializers/spree/v2/tenant/show_person_serializer.rb +0 -13
  147. data/app/serializers/spree/v2/tenant/show_serializer.rb +0 -26
  148. data/app/serializers/spree/v2/tenant/video_serializer.rb +0 -9
  149. data/app/serializers/spree/v2/tenant/vote_serializer.rb +0 -14
  150. data/app/serializers/spree/v2/tenant/voting_contestant_serializer.rb +0 -18
  151. data/app/serializers/spree/v2/tenant/voting_credit_serializer.rb +0 -10
  152. data/app/serializers/spree/v2/tenant/voting_credit_transaction_serializer.rb +0 -14
  153. data/app/serializers/spree/v2/tenant/voting_session_serializer.rb +0 -15
  154. data/app/serializers/spree_cm_commissioner/v2/storefront/item_availability_sync_serializer.rb +0 -10
  155. data/app/services/spree_cm_commissioner/audit_logger.rb +0 -59
  156. data/app/services/spree_cm_commissioner/cleanup_expired_access_tokens.rb +0 -52
  157. data/app/services/spree_cm_commissioner/currency_converter/create.rb +0 -27
  158. data/app/services/spree_cm_commissioner/currency_rates/manage.rb +0 -99
  159. data/app/services/spree_cm_commissioner/fraud_check.rb +0 -279
  160. data/app/services/spree_cm_commissioner/google_maps_geocoder.rb +0 -41
  161. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/external_client/client.rb +0 -261
  162. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/external_client/connection.rb +0 -147
  163. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/inventory/external_inventory_item_status.rb +0 -52
  164. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/inventory/external_inventory_items.rb +0 -91
  165. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/inventory/unstock_inventory.rb +0 -140
  166. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_inventory.rb +0 -52
  167. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_item_availability.rb +0 -249
  168. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_locations.rb +0 -103
  169. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_product.rb +0 -66
  170. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_route_stops.rb +0 -113
  171. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_routes.rb +0 -128
  172. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_seat_layout.rb +0 -342
  173. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_service_calendars.rb +0 -59
  174. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_trip_stop.rb +0 -179
  175. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_trips.rb +0 -597
  176. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_variant.rb +0 -58
  177. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_vehicle_types.rb +0 -87
  178. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/time_parser.rb +0 -19
  179. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/base.rb +0 -40
  180. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/branch.rb +0 -65
  181. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/direction.rb +0 -51
  182. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/inventory_item_status.rb +0 -148
  183. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/location.rb +0 -55
  184. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/operator.rb +0 -17
  185. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/reservation_cart.rb +0 -85
  186. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/seat.rb +0 -128
  187. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/seat_layout.rb +0 -363
  188. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/stop.rb +0 -84
  189. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/trip.rb +0 -199
  190. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/wallet_payment.rb +0 -40
  191. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/sync_manager.rb +0 -22
  192. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/sync_strategies/full_sync_strategy.rb +0 -117
  193. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/sync_strategies/incremental_sync_strategy.rb +0 -64
  194. data/app/services/spree_cm_commissioner/integrations/larryta/external_client/client.rb +0 -344
  195. data/app/services/spree_cm_commissioner/integrations/larryta/external_client/connection.rb +0 -74
  196. data/app/services/spree_cm_commissioner/integrations/larryta/inventory/external_inventory_item_status.rb +0 -53
  197. data/app/services/spree_cm_commissioner/integrations/larryta/inventory/external_inventory_items.rb +0 -106
  198. data/app/services/spree_cm_commissioner/integrations/larryta/inventory/hold_seats.rb +0 -143
  199. data/app/services/spree_cm_commissioner/integrations/larryta/inventory/release_seats.rb +0 -90
  200. data/app/services/spree_cm_commissioner/integrations/larryta/inventory/unstock_inventory.rb +0 -113
  201. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_item_availability.rb +0 -261
  202. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_product.rb +0 -72
  203. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_routes.rb +0 -142
  204. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_seat_layout.rb +0 -255
  205. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_stock_item.rb +0 -55
  206. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_trip_stop.rb +0 -167
  207. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_trips.rb +0 -320
  208. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_variant.rb +0 -63
  209. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_vehicle_type.rb +0 -79
  210. data/app/services/spree_cm_commissioner/integrations/larryta/resources/base.rb +0 -39
  211. data/app/services/spree_cm_commissioner/integrations/larryta/resources/booking.rb +0 -113
  212. data/app/services/spree_cm_commissioner/integrations/larryta/resources/booking_session.rb +0 -43
  213. data/app/services/spree_cm_commissioner/integrations/larryta/resources/booking_transaction.rb +0 -236
  214. data/app/services/spree_cm_commissioner/integrations/larryta/resources/direction.rb +0 -71
  215. data/app/services/spree_cm_commissioner/integrations/larryta/resources/passenger.rb +0 -48
  216. data/app/services/spree_cm_commissioner/integrations/larryta/resources/schedule.rb +0 -150
  217. data/app/services/spree_cm_commissioner/integrations/larryta/resources/seat.rb +0 -31
  218. data/app/services/spree_cm_commissioner/integrations/larryta/resources/seat_availability.rb +0 -49
  219. data/app/services/spree_cm_commissioner/integrations/larryta/resources/seat_layout.rb +0 -211
  220. data/app/services/spree_cm_commissioner/integrations/larryta/sync_manager.rb +0 -17
  221. data/app/services/spree_cm_commissioner/integrations/larryta/sync_strategies/full_sync_strategy.rb +0 -79
  222. data/app/services/spree_cm_commissioner/integrations/larryta/sync_strategies/incremental_sync_strategy.rb +0 -58
  223. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/external_client/client.rb +0 -206
  224. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/external_client/connection.rb +0 -59
  225. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/inventory/external_inventory_item_status.rb +0 -48
  226. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/inventory/external_inventory_items.rb +0 -97
  227. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/inventory/unstock_inventory.rb +0 -208
  228. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_item_availability.rb +0 -270
  229. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_locations.rb +0 -96
  230. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_nationality_pricing.rb +0 -76
  231. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_product.rb +0 -69
  232. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_routes.rb +0 -110
  233. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_seat_layout.rb +0 -207
  234. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_stock_item.rb +0 -43
  235. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_trip_stop.rb +0 -185
  236. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_trips.rb +0 -300
  237. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_variant.rb +0 -56
  238. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_vehicle_type.rb +0 -51
  239. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/base.rb +0 -32
  240. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/booking.rb +0 -48
  241. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/booking_transaction.rb +0 -46
  242. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/cell.rb +0 -53
  243. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/confirm_booking_request.rb +0 -43
  244. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/location.rb +0 -37
  245. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/schedule.rb +0 -138
  246. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/seat.rb +0 -48
  247. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/seat_layout.rb +0 -79
  248. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/sync_manager.rb +0 -17
  249. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/sync_strategies/full_sync_strategy.rb +0 -87
  250. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/sync_strategies/incremental_sync_strategy.rb +0 -53
  251. data/app/services/spree_cm_commissioner/inventory_items/generate_permanent_item.rb +0 -48
  252. data/app/services/spree_cm_commissioner/place_resolver.rb +0 -95
  253. data/app/services/spree_cm_commissioner/show_contestants/normalize_video_highlights.rb +0 -56
  254. data/app/services/spree_cm_commissioner/url_embed/youtube_embed.rb +0 -49
  255. data/app/services/spree_cm_commissioner/vote_counters/audit_counters.rb +0 -43
  256. data/app/services/spree_cm_commissioner/vote_counters/base.rb +0 -31
  257. data/app/services/spree_cm_commissioner/vote_counters/increment.rb +0 -44
  258. data/app/services/spree_cm_commissioner/vote_counters/per_contestant_counter.rb +0 -66
  259. data/app/services/spree_cm_commissioner/vote_counters/rebuild_from_db.rb +0 -70
  260. data/app/services/spree_cm_commissioner/vote_credit_deductor.rb +0 -68
  261. data/app/services/spree_cm_commissioner/vote_package/create.rb +0 -145
  262. data/app/services/spree_cm_commissioner/vote_package/update.rb +0 -91
  263. data/app/services/spree_cm_commissioner/vote_processor.rb +0 -144
  264. data/app/services/spree_cm_commissioner/voting_contestants/advancer.rb +0 -334
  265. data/app/services/spree_cm_commissioner/voting_contestants/assigner.rb +0 -32
  266. data/app/services/spree_cm_commissioner/voting_contestants/bulk_updater.rb +0 -104
  267. data/app/services/spree_cm_commissioner/voting_credits/allocate.rb +0 -77
  268. data/app/services/spree_cm_commissioner/voting_credits/claim_free_votes.rb +0 -119
  269. data/app/services/spree_cm_commissioner/voting_credits/credit_calculator.rb +0 -35
  270. data/app/services/spree_cm_commissioner/voting_credits/de_allocate.rb +0 -87
  271. data/app/views/spree/admin/integrations/_book_me_bus_v1_fields.html.erb +0 -47
  272. data/app/views/spree/admin/integrations/_larryta_fields.html.erb +0 -58
  273. data/app/views/spree/admin/integrations/_vireak_buntham_fields.html.erb +0 -75
  274. data/db/migrate/20260309230148_create_cm_show_people.rb +0 -14
  275. data/db/migrate/20260309230149_create_cm_show_people_assignments.rb +0 -16
  276. data/db/migrate/20260310082711_create_cm_show_contestants.rb +0 -28
  277. data/db/migrate/20260310082720_create_cm_voting_sessions.rb +0 -21
  278. data/db/migrate/20260310082721_create_cm_voting_contestants.rb +0 -23
  279. data/db/migrate/20260310082734_add_voting_fields_to_spree_taxons.rb +0 -9
  280. data/db/migrate/20260310082735_add_type_to_spree_products.rb +0 -6
  281. data/db/migrate/20260310082749_create_cm_voting_credits.rb +0 -27
  282. data/db/migrate/20260326080200_create_cm_voting_credit_transactions.rb +0 -27
  283. data/db/migrate/20260327143200_create_cm_audit_events.rb +0 -21
  284. data/db/migrate/20260330160000_create_cm_votes.rb +0 -25
  285. data/db/migrate/20260401072500_add_advanced_from_to_cm_voting_contestants.rb +0 -7
  286. data/db/migrate/20260402000001_add_voting_credit_scope_to_spree_taxons.rb +0 -6
  287. data/db/migrate/20260402000002_rename_scopeable_to_votable_in_cm_voting_credits.rb +0 -12
  288. data/db/migrate/20260403070000_add_name_to_cm_voting_sessions.rb +0 -5
  289. data/db/migrate/20260406000001_add_vendor_id_to_voting_tables.rb +0 -6
  290. data/db/migrate/20260406000001_rename_votes_remaining_to_amount_in_cm_voting_credits.rb +0 -11
  291. data/db/migrate/20260408085255_add_show_id_and_vendor_id_to_cm_voting_sessions.rb +0 -9
  292. data/db/migrate/20260410045815_create_cm_currency_rates.rb +0 -23
  293. data/db/migrate/20260411102139_add_metadata_to_cm_inventory_items.rb +0 -6
  294. data/db/migrate/20260420000001_rename_type_to_credit_type_in_cm_voting_credits.rb +0 -25
  295. data/db/migrate/20260422000001_create_cm_vote_fraud_events.rb +0 -23
  296. data/db/migrate/20260423000001_add_preview_to_taxons_products_and_sections.rb +0 -11
  297. data/db/migrate/20260423000002_create_preview_roles.rb +0 -24
  298. data/db/migrate/20260515120000_add_public_metadata_to_cm_voting_sessions.rb +0 -5
  299. data/db/migrate/20260520000001_optimize_cm_votes_indexes.rb +0 -22
  300. data/docs/sql/jsonb_query_guide.md +0 -57
  301. data/lib/spree_cm_commissioner/test_helper/factories/show_episode_factory.rb +0 -12
  302. data/lib/spree_cm_commissioner/test_helper/factories/show_factory.rb +0 -96
  303. data/lib/spree_cm_commissioner/test_helper/factories/vote_credit_factory.rb +0 -37
  304. data/lib/spree_cm_commissioner/test_helper/factories/vote_factory.rb +0 -28
  305. data/lib/spree_cm_commissioner/test_helper/factories/voting_credit_transaction_factory.rb +0 -11
  306. 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: 8250d9a96dcceb058991c416ad4b91380fa42f5d43e301c366e74bfe9eb0e27b
4
- data.tar.gz: a8c9301047c15f6ef760bdda1cc9087ac4f7a3539cd6aa86b43a99ab97fc6f16
3
+ metadata.gz: cc101fbc1fb46a184c311e3cdf1827cd6515ae3b0399d77ca67c48560b3417bc
4
+ data.tar.gz: 5437f4e82b8c48ce55753432d2ce529935b0c63d472946f03153e817ba3c3038
5
5
  SHA512:
6
- metadata.gz: 87bba18fe41a801abf62fc7a83c444452f5b3780b23edaa44bbf86b98271b06877bc8c52bddfc5761b5fdee5953226201c52556cfba30405c1e1f95af2067861
7
- data.tar.gz: 2a7fd81827d6be81291146d17f46ff54a61a59aa4194a552f89ccc59463dc93a4ccc742c0534fd5c18354136314b2e9db571e97b6e8822fff3bbc6c116f3114d
6
+ metadata.gz: 74c7a8c0fbb21ae704c905b4f14b8d878b701adf82fc569a0db9d3bb780cae702eb93303c29db6bd08f602e9270fb89caed7bf5ebdb3a21d474057cef17d2157
7
+ data.tar.gz: 981dc574b4b68c1fec6ed7a665ec47ef52bfb60ef89476ab119e72da1311c9e2ae01e78a69436a8663ba185b460df46c6fd5836ccc52531c5e4a13eeaa5c3209
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.1.pre.3)
37
+ spree_cm_commissioner (2.8.2)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
@@ -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(','),
@@ -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
@@ -15,8 +15,8 @@ module SpreeCmCommissioner
15
15
  .joins(:inventory_items)
16
16
  .where(vendor_id: vendor_id)
17
17
  .where(inventory_items: { inventory_date: stay_dates })
18
- .where('CAST(spree_variants.public_metadata->\'cm_options\'->>\'number-of-adults\' AS INTEGER) +
19
- CAST(spree_variants.public_metadata->\'cm_options\'->>\'number-of-kids\' AS INTEGER) >= ?', number_of_guests
18
+ .where('CAST(public_metadata->\'cm_options\'->>\'number-of-adults\' AS INTEGER) +
19
+ CAST(public_metadata->\'cm_options\'->>\'number-of-kids\' AS INTEGER) >= ?', number_of_guests
20
20
  )
21
21
  .where('inventory_items.quantity_available > 0')
22
22
  .distinct
@@ -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
@@ -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
@@ -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
@@ -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].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
 
@@ -0,0 +1,22 @@
1
+ module SpreeCmCommissioner
2
+ # Defaults service_origin (nationality) from parent associations during validation (on create).
3
+ # Vendor → Route → Trip → LineItem.
4
+ # Pricing rules use this to determine local vs foreigner rates.
5
+ module ServiceOrigin
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ before_validation :assign_service_origin_id, on: :create
10
+ end
11
+
12
+ private
13
+
14
+ def assign_service_origin_id
15
+ self.service_origin_id ||= resolve_service_origin_id
16
+ end
17
+
18
+ def resolve_service_origin_id
19
+ nil
20
+ end
21
+ end
22
+ end
@@ -7,6 +7,7 @@ module SpreeCmCommissioner
7
7
  preference :telegram_order_alert_chat_id, :string
8
8
  preference :telegram_order_request_alert_chat_id, :string
9
9
  preference :telegram_new_vendor_alert_chat_id, :string
10
+ preference :telegram_new_event_alert_chat_id, :string
10
11
  preference :assetlinks, :string, default: ''
11
12
  preference :apple_app_site_association, :string, default: ''
12
13
  end
@@ -2,7 +2,7 @@ module SpreeCmCommissioner
2
2
  module VehicleKind
3
3
  extend ActiveSupport::Concern
4
4
 
5
- VEHICLE_KINDS = %i[suv sedan minivan van sleeping_bus luxury_van air_bus bus ferry boat].freeze
5
+ VEHICLE_KINDS = %i[suv sedan minivan van sleeping_bus luxury_van air_bus bus ferry].freeze
6
6
 
7
7
  included do
8
8
  enum kind: VEHICLE_KINDS if table_exists? && column_names.include?('kind')
@@ -25,36 +25,5 @@ module SpreeCmCommissioner
25
25
  def unstock_external_inventory!(_order, _line_items)
26
26
  raise NotImplementedError, 'Subclasses must implement the unstock_external_inventory! method'
27
27
  end
28
-
29
- def sync_item_availability!(_options = {})
30
- raise NotImplementedError, 'Subclasses must implement the sync_item_availability! method'
31
- end
32
-
33
- def hold_inventory!(_order, _line_items)
34
- raise NotImplementedError, 'Subclasses must implement the hold_inventory! method'
35
- end
36
-
37
- # Integrations that manage external inventory reservations should override this to return true
38
- def supports_external_inventory_holding?
39
- false
40
- end
41
-
42
- # Integrations that support automatically releasing external inventory
43
- # after reservation expiration or order cancellation should override this to return true
44
- def supports_auto_release_inventory?
45
- false
46
- end
47
-
48
- def release_inventory!(_order, _line_items)
49
- raise NotImplementedError, 'Subclasses must implement the release_inventory! method'
50
- end
51
-
52
- def external_inventory_items(_order)
53
- raise NotImplementedError, 'Subclasses must implement the external_inventory_items method'
54
- end
55
-
56
- def external_inventory_item_status(_order, _options)
57
- raise NotImplementedError, 'Subclasses must implement the external_inventory_item_status method'
58
- end
59
28
  end
60
29
  end
@@ -5,7 +5,10 @@ class SpreeCmCommissioner::Integrations::StadiumXV1 < SpreeCmCommissioner::Integ
5
5
 
6
6
  # override
7
7
  def sync_manager
8
- SpreeCmCommissioner::Integrations::StadiumXV1::SyncManager.new(integration: self)
8
+ SpreeCmCommissioner::Integrations::StadiumXV1::SyncManager.new(
9
+ integration: self,
10
+ client: client
11
+ )
9
12
  end
10
13
 
11
14
  # override
@@ -15,6 +18,7 @@ class SpreeCmCommissioner::Integrations::StadiumXV1 < SpreeCmCommissioner::Integ
15
18
  order: order,
16
19
  line_items: line_items
17
20
  )
21
+
18
22
  raise SpreeCmCommissioner::Integrations::SyncError, result.error unless result.success?
19
23
  end
20
24
 
@@ -23,9 +27,11 @@ class SpreeCmCommissioner::Integrations::StadiumXV1 < SpreeCmCommissioner::Integ
23
27
  raise SpreeCmCommissioner::Integrations::SyncError, 'Ticket cannot be cancelled'
24
28
  end
25
29
 
26
- def sync_item_availability!(_options = {}); end
27
-
28
30
  def client
29
- @client ||= SpreeCmCommissioner::Integrations::StadiumXV1::ExternalClient::Client.new(integration: self)
31
+ SpreeCmCommissioner::Integrations::StadiumXV1::ExternalClient::Client.new(
32
+ public_key: public_key,
33
+ private_key: private_key,
34
+ base_url: base_url
35
+ )
30
36
  end
31
37
  end
@@ -1,15 +1,9 @@
1
1
  module SpreeCmCommissioner
2
2
  class InventoryItem < Base
3
3
  include SpreeCmCommissioner::ProductType
4
- include SpreeCmCommissioner::StoreMetadata
5
- include SpreeCmCommissioner::Integrations::IntegrationMappable
6
4
 
7
5
  MAX_DISPLAY_STOCK = 20
8
6
 
9
- store_public_metadata :last_synced_at, :datetime
10
- store_public_metadata :original_price, :integer
11
- store_public_metadata :currency, :string
12
-
13
7
  # Association
14
8
  belongs_to :variant, class_name: 'Spree::Variant', optional: false
15
9
 
@@ -29,8 +23,23 @@ module SpreeCmCommissioner
29
23
 
30
24
  before_save -> { self.product_type = variant.product_type }, if: -> { product_type.nil? }
31
25
 
32
- # Create maintaining task to purge product related caches
33
- after_commit { SpreeCmCommissioner::MaintenanceTasks::CacheInvalidation.pending.create_or_find_by(maintainable: variant.product) }
26
+ after_commit :schedule_product_cache_invalidation
27
+
28
+ # Only for ecommerce: the app uses product.in_stock? (derived from quantity_available) for product cards.
29
+ # Other types (e.g. accommodation, bus) have many inventory items (including daily-generated ones),
30
+ # so invalidating per item would flood the task queue.
31
+ #
32
+ # This is temporary until we have a more robust cache invalidation strategy in place.
33
+ def schedule_product_cache_invalidation
34
+ return unless ecommerce?
35
+ return unless saved_change_to_quantity_available?
36
+
37
+ # Only fires on in_stock status transition (0 ↔ N); non-zero to non-zero changes are skipped.
38
+ old_val, new_val = saved_change_to_quantity_available
39
+ return if old_val.to_i.positive? && new_val.to_i.positive?
40
+
41
+ SpreeCmCommissioner::MaintenanceTasks::CacheInvalidation.pending.create_or_find_by(maintainable: variant.product)
42
+ end
34
43
 
35
44
  def public_quantity_available
36
45
  [quantity_available, MAX_DISPLAY_STOCK].min
@@ -3,6 +3,8 @@ module SpreeCmCommissioner
3
3
  module MaintenanceTasks
4
4
  class CacheInvalidation < MaintenanceTask
5
5
  def maintain
6
+ return if ENV['CACHE_AUTO_INVALIDATION_DISABLED'] == 'yes'
7
+
6
8
  if maintainable.is_a?(SpreeCmCommissioner::HomepageBackground) || maintainable.is_a?(Spree::Menu)
7
9
  SpreeCmCommissioner::HomepageDataLoader.clear_cache
8
10
  end
@@ -42,7 +42,6 @@ module SpreeCmCommissioner
42
42
  base.has_many :reserved_blocks, through: :guests, class_name: 'SpreeCmCommissioner::ReservedBlock'
43
43
  base.has_many :guest_card_classes, class_name: 'SpreeCmCommissioner::GuestCardClass', through: :variants
44
44
  base.has_many :product_completion_steps, class_name: 'SpreeCmCommissioner::ProductCompletionStep', through: :line_items
45
- base.has_many :audit_events, class_name: 'SpreeCmCommissioner::AuditEvent', as: :auditable
46
45
 
47
46
  base.delegate :customer, to: :user, allow_nil: true
48
47
 
@@ -1,7 +1,5 @@
1
1
  module SpreeCmCommissioner
2
2
  class Place < Base
3
- include SpreeCmCommissioner::Integrations::IntegrationMappable
4
-
5
3
  acts_as_nested_set
6
4
 
7
5
  validates :reference, presence: true, if: :validate_reference?
@@ -14,8 +14,6 @@ module SpreeCmCommissioner
14
14
 
15
15
  base.delegate :is_open_dated, :is_open_dated?, to: :trip, allow_nil: true
16
16
 
17
- base.has_many :voting_sessions, class_name: 'SpreeCmCommissioner::VotingSession', foreign_key: :episode_id, dependent: :destroy
18
-
19
17
  base.has_many :variant_kind_option_types, -> { where(kind: :variant).order(:position) },
20
18
  through: :product_option_types, source: :option_type
21
19
 
@@ -57,45 +55,8 @@ module SpreeCmCommissioner
57
55
 
58
56
  base.belongs_to :event, class_name: 'Spree::Taxon', optional: true
59
57
 
60
- base.has_many :preview_roles, class_name: 'SpreeCmCommissioner::PreviewRole', as: :previewable
61
58
  base.has_many :industry_classifications, -> { joins(:taxon).where(spree_taxons: { kind: :industry }) }, class_name: 'Spree::Classification'
62
59
  base.has_many :industry_taxons, through: :industry_classifications, source: :taxon
63
- base.scope :visible_to, lambda { |user|
64
- publicly_available = where(status: :active, preview: false)
65
-
66
- if user
67
- # Resolved through associations — avoids hardcoding class names.
68
- taxon_type = reflect_on_association(:taxons).klass.polymorphic_name
69
-
70
- # IDs of products that have been explicitly assigned their own PreviewRole.
71
- products_with_own_roles = SpreeCmCommissioner::PreviewRole
72
- .where(previewable_type: polymorphic_name)
73
- .select(:previewable_id)
74
-
75
- # Path A: product has its own PreviewRole → user must hold that role directly.
76
- # Taxon membership is irrelevant for these products.
77
- via_product_role = where(status: :active, preview: true)
78
- .where(id: products_with_own_roles)
79
- .where(id: user.preview_roles.where(previewable_type: polymorphic_name).select(:previewable_id))
80
-
81
- # Path B: product has no own PreviewRole → inherit access from its event or taxons.
82
- # Accessible if the user holds a preview role for the product's event_id or any
83
- # taxon the product belongs to via the classifications join table.
84
- allowed_taxon_ids = user.preview_roles.where(previewable_type: taxon_type).select(:previewable_id)
85
- preview_no_own = where(status: :active, preview: true).where.not(id: products_with_own_roles)
86
-
87
- via_event_id = preview_no_own.where(event_id: allowed_taxon_ids)
88
- via_taxon_join = preview_no_own.joins(:taxons).where(spree_taxons: { id: allowed_taxon_ids })
89
-
90
- publicly_available
91
- .or(via_product_role)
92
- .or(where(id: via_event_id.select(:id)))
93
- .or(where(id: via_taxon_join.select(:id)))
94
- else
95
- publicly_available
96
- end
97
- }
98
-
99
60
  base.scope :min_price, lambda { |vendor|
100
61
  joins(:prices_including_master)
101
62
  .where(vendor_id: vendor.id, product_type: vendor.primary_product_type)
@@ -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