spree_cm_commissioner 2.8.3.pre.pre5 → 2.8.3.pre6

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 (455) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +1 -0
  3. data/.github/workflows/test_and_build_gem.yml +1 -2
  4. data/.gitignore +0 -6
  5. data/Gemfile.lock +1 -1
  6. data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +0 -2
  7. data/app/controllers/spree/admin/guests_controller.rb +1 -1
  8. data/app/controllers/spree/admin/homepage_section_controller.rb +1 -4
  9. data/app/controllers/spree/admin/order_ticket_transfers_controller.rb +25 -0
  10. data/app/controllers/spree/admin/stock_managements_controller.rb +1 -1
  11. data/app/controllers/spree/admin/taxons_controller_decorator.rb +0 -19
  12. data/app/controllers/spree/admin/ticket_transfer_rules_controller.rb +47 -0
  13. data/app/controllers/spree/admin/ticket_transfers_controller.rb +61 -0
  14. data/app/controllers/spree/api/v2/storefront/account/recipients_controller.rb +32 -0
  15. data/app/controllers/spree/api/v2/storefront/homepage_sections_controller.rb +0 -1
  16. data/app/controllers/spree/api/v2/storefront/ticket_transfer_acceptances_controller.rb +32 -0
  17. data/app/controllers/spree/api/v2/storefront/ticket_transfers_controller.rb +117 -0
  18. data/app/controllers/spree/api/v2/storefront/transit/item_availabilities_controller.rb +66 -0
  19. data/app/controllers/spree/api/v2/storefront/trip_search_controller.rb +6 -4
  20. data/app/controllers/spree/api/v2/tenant/base_controller.rb +0 -4
  21. data/app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb +0 -1
  22. data/app/controllers/spree/api/v2/tenant/products_controller.rb +1 -1
  23. data/app/controllers/spree/api/v2/tenant/taxons_controller.rb +1 -1
  24. data/app/controllers/spree/api/v2/tenant/trips_controller.rb +11 -0
  25. data/app/controllers/spree_cm_commissioner/admin/orders_controller_decorator.rb +7 -3
  26. data/app/controllers/spree_cm_commissioner/admin/products_controller_decorator.rb +0 -19
  27. data/app/factory/spree_cm_commissioner/event_telegram_message_factory.rb +68 -0
  28. data/app/factory/spree_cm_commissioner/order_telegram_message_factory.rb +31 -17
  29. data/app/factory/spree_cm_commissioner/telegram_message_factory.rb +6 -0
  30. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +2 -2
  31. data/app/finders/spree_cm_commissioner/events/find_matches.rb +0 -1
  32. data/app/helpers/spree_cm_commissioner/admin/guest_helper.rb +10 -0
  33. data/app/helpers/spree_cm_commissioner/admin/homepage_segment_helper.rb +0 -2
  34. data/app/helpers/spree_cm_commissioner/admin/ticket_transfers_helper.rb +32 -0
  35. data/app/interactors/spree_cm_commissioner/invalidate_cache_request.rb +5 -1
  36. data/app/jobs/spree_cm_commissioner/audit_event_job.rb +29 -0
  37. data/app/jobs/spree_cm_commissioner/event_creation_telegram_alert_sender_job.rb +10 -0
  38. data/app/jobs/spree_cm_commissioner/expire_ticket_transfer_job.rb +10 -0
  39. data/app/jobs/spree_cm_commissioner/invalidate_cache_request_job.rb +4 -1
  40. data/app/jobs/spree_cm_commissioner/inventory_items/bulk_adjust_quantities_job.rb +4 -2
  41. data/app/jobs/spree_cm_commissioner/inventory_items/bulk_adjust_quantities_on_hold_job.rb +4 -2
  42. data/app/jobs/spree_cm_commissioner/oauth_access_tokens/cleanup_expired_job.rb +11 -0
  43. data/app/jobs/spree_cm_commissioner/route_metrics/decrease_trip_count_job.rb +8 -2
  44. data/app/jobs/spree_cm_commissioner/route_metrics/increase_trip_count_job.rb +5 -2
  45. data/app/jobs/spree_cm_commissioner/vendor_route_metrics/decrease_trip_count_job.rb +17 -0
  46. data/app/jobs/spree_cm_commissioner/vendor_route_metrics/increase_trip_count_job.rb +14 -0
  47. data/app/models/concerns/spree_cm_commissioner/audit_wrapper.rb +139 -0
  48. data/app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb +1 -2
  49. data/app/models/concerns/spree_cm_commissioner/integrations/inventory_sync_cachable.rb +9 -0
  50. data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +8 -0
  51. data/app/models/concerns/spree_cm_commissioner/line_items_filter_scope.rb +5 -0
  52. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -2
  53. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -10
  54. data/app/models/concerns/spree_cm_commissioner/product_type.rb +1 -1
  55. data/app/models/concerns/spree_cm_commissioner/service_origin.rb +22 -0
  56. data/app/models/concerns/spree_cm_commissioner/store_preference.rb +1 -0
  57. data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -3
  58. data/app/models/concerns/spree_cm_commissioner/ticket_transferable.rb +15 -0
  59. data/app/models/concerns/spree_cm_commissioner/variant_metadata.rb +24 -0
  60. data/app/models/concerns/spree_cm_commissioner/vehicle_kind.rb +1 -1
  61. data/app/models/spree_cm_commissioner/audit_event.rb +11 -0
  62. data/app/models/spree_cm_commissioner/currency_rate.rb +15 -0
  63. data/app/models/spree_cm_commissioner/guest.rb +20 -0
  64. data/app/models/spree_cm_commissioner/import.rb +1 -1
  65. data/app/models/spree_cm_commissioner/integration.rb +31 -0
  66. data/app/models/spree_cm_commissioner/integrations/book_me_bus_v1.rb +56 -0
  67. data/app/models/spree_cm_commissioner/integrations/larryta.rb +81 -0
  68. data/app/models/spree_cm_commissioner/integrations/stadium_x_v1.rb +4 -10
  69. data/app/models/spree_cm_commissioner/integrations/vireak_buntham.rb +82 -0
  70. data/app/models/spree_cm_commissioner/inventory_item.rb +23 -2
  71. data/app/models/spree_cm_commissioner/line_item_decorator.rb +7 -0
  72. data/app/models/spree_cm_commissioner/maintenance_tasks/cache_invalidation.rb +2 -0
  73. data/app/models/spree_cm_commissioner/notification.rb +10 -1
  74. data/app/models/spree_cm_commissioner/order_decorator.rb +15 -3
  75. data/app/models/spree_cm_commissioner/payment_decorator.rb +19 -0
  76. data/app/models/spree_cm_commissioner/payment_method_decorator.rb +8 -0
  77. data/app/models/spree_cm_commissioner/place.rb +2 -0
  78. data/app/models/spree_cm_commissioner/product_decorator.rb +0 -50
  79. data/app/models/spree_cm_commissioner/reserved_block.rb +2 -0
  80. data/app/models/spree_cm_commissioner/role_decorator.rb +1 -4
  81. data/app/models/spree_cm_commissioner/route.rb +7 -1
  82. data/app/models/spree_cm_commissioner/seat_layout.rb +2 -0
  83. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +4 -0
  84. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +3 -0
  85. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +4 -3
  86. data/app/models/spree_cm_commissioner/taxon_decorator.rb +7 -20
  87. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +1 -19
  88. data/app/models/spree_cm_commissioner/tenant.rb +0 -9
  89. data/app/models/spree_cm_commissioner/ticket_transfer.rb +191 -0
  90. data/app/models/spree_cm_commissioner/ticket_transfer_rule.rb +88 -0
  91. data/app/models/spree_cm_commissioner/trip.rb +48 -3
  92. data/app/models/spree_cm_commissioner/trip_stop.rb +2 -0
  93. data/app/models/spree_cm_commissioner/user_decorator.rb +1 -5
  94. data/app/models/spree_cm_commissioner/variant_decorator.rb +1 -0
  95. data/app/models/spree_cm_commissioner/variant_options.rb +0 -4
  96. data/app/models/spree_cm_commissioner/vehicle.rb +3 -0
  97. data/app/models/spree_cm_commissioner/vehicle_type.rb +1 -0
  98. data/app/models/spree_cm_commissioner/vendor_decorator.rb +17 -4
  99. data/app/models/spree_cm_commissioner/vendor_place.rb +2 -0
  100. data/app/models/spree_cm_commissioner/vendor_route_metric.rb +25 -0
  101. data/app/notifications/spree_cm_commissioner/ticket_transfer_accepted_notification.rb +48 -0
  102. data/app/notifications/spree_cm_commissioner/ticket_transfer_completed_notification.rb +48 -0
  103. data/app/notifications/spree_cm_commissioner/ticket_transfer_expired_notification.rb +46 -0
  104. data/app/notifications/spree_cm_commissioner/ticket_transfer_received_notification.rb +48 -0
  105. data/app/notifications/spree_cm_commissioner/ticket_transfer_rejected_notification.rb +48 -0
  106. data/app/overrides/spree/admin/products/_form/allow_gift_transfer.html.erb.deface +9 -0
  107. data/app/overrides/spree/admin/products/_form/allow_transfer.html.erb.deface +9 -0
  108. data/app/overrides/spree/admin/shared/_order_tabs/ticket_transfers.html.erb.deface +10 -0
  109. data/app/overrides/spree/admin/shared/sub_menu/_product/ticket_transfers_tab.html.erb.deface +3 -0
  110. data/app/overrides/spree/admin/stores/_form/store_preferences.html.erb.deface +9 -0
  111. data/app/queries/spree_cm_commissioner/multi_leg_trips_query.rb +77 -50
  112. data/app/queries/spree_cm_commissioner/recipient_searcher_query.rb +14 -0
  113. data/app/queries/spree_cm_commissioner/single_leg_trips_query.rb +67 -31
  114. data/app/queries/spree_cm_commissioner/trip_query.rb +2 -4
  115. data/app/serializables/spree_cm_commissioner/item_availability_sync.rb +10 -0
  116. data/app/serializers/spree/v2/storefront/homepage_section_serializer.rb +1 -1
  117. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +4 -2
  118. data/app/serializers/spree/v2/storefront/product_serializer_decorator.rb +3 -2
  119. data/app/serializers/spree/v2/storefront/role_serializer.rb +1 -1
  120. data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +1 -2
  121. data/app/serializers/spree/v2/tenant/dynamic_field_serializer.rb +1 -1
  122. data/app/serializers/spree/v2/tenant/homepage_section_serializer.rb +1 -1
  123. data/app/serializers/spree/v2/tenant/role_serializer.rb +1 -1
  124. data/app/serializers/spree_cm_commissioner/v2/storefront/amenity_serializer.rb +3 -0
  125. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +1 -1
  126. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_minimal_serializer.rb +30 -0
  127. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_serializer.rb +3 -1
  128. data/app/serializers/spree_cm_commissioner/v2/storefront/item_availability_sync_serializer.rb +10 -0
  129. data/app/serializers/spree_cm_commissioner/v2/storefront/line_item_minimal_serializer.rb +57 -0
  130. data/app/serializers/spree_cm_commissioner/v2/storefront/recipient_serializer.rb +13 -0
  131. data/app/serializers/spree_cm_commissioner/v2/storefront/reserved_block_serializer.rb +1 -1
  132. data/app/serializers/spree_cm_commissioner/v2/storefront/ticket_transfer_minimal_serializer.rb +17 -0
  133. data/app/serializers/spree_cm_commissioner/v2/storefront/ticket_transfer_serializer.rb +20 -0
  134. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_query_result_serializer.rb +2 -1
  135. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_result_serializer.rb +8 -3
  136. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_stop_serializer.rb +1 -0
  137. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vehicle_type_serializer.rb +6 -3
  138. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vendor_serializer.rb +6 -2
  139. data/app/services/spree_cm_commissioner/api_caches/invalidate.rb +0 -12
  140. data/app/services/spree_cm_commissioner/audit_logger.rb +59 -0
  141. data/app/services/spree_cm_commissioner/check_ins/create_bulk.rb +11 -5
  142. data/app/services/spree_cm_commissioner/checkout/complete_decorator.rb +22 -0
  143. data/app/services/spree_cm_commissioner/currency_converter/create.rb +27 -0
  144. data/app/services/spree_cm_commissioner/currency_rates/manage.rb +99 -0
  145. data/app/services/spree_cm_commissioner/google_maps_geocoder.rb +41 -0
  146. data/app/services/spree_cm_commissioner/integrations/base/sync_manager.rb +1 -2
  147. data/app/services/spree_cm_commissioner/integrations/base/sync_result.rb +11 -0
  148. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/external_client/client.rb +261 -0
  149. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/external_client/connection.rb +147 -0
  150. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/inventory/external_inventory_item_status.rb +52 -0
  151. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/inventory/external_inventory_items.rb +91 -0
  152. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/inventory/unstock_inventory.rb +140 -0
  153. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_inventory.rb +52 -0
  154. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_item_availability.rb +249 -0
  155. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_locations.rb +103 -0
  156. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_product.rb +66 -0
  157. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_route_stops.rb +113 -0
  158. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_routes.rb +128 -0
  159. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_seat_layout.rb +345 -0
  160. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_service_calendars.rb +59 -0
  161. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_trip_stop.rb +179 -0
  162. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_trips.rb +597 -0
  163. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_variant.rb +58 -0
  164. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/sync_vehicle_types.rb +87 -0
  165. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/polling/time_parser.rb +19 -0
  166. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/base.rb +40 -0
  167. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/branch.rb +65 -0
  168. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/direction.rb +51 -0
  169. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/inventory_item_status.rb +148 -0
  170. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/location.rb +55 -0
  171. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/operator.rb +17 -0
  172. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/reservation_cart.rb +85 -0
  173. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/seat.rb +128 -0
  174. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/seat_layout.rb +363 -0
  175. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/stop.rb +84 -0
  176. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/trip.rb +199 -0
  177. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/resources/wallet_payment.rb +40 -0
  178. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/sync_manager.rb +22 -0
  179. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/sync_strategies/full_sync_strategy.rb +117 -0
  180. data/app/services/spree_cm_commissioner/integrations/book_me_bus_v1/sync_strategies/incremental_sync_strategy.rb +64 -0
  181. data/app/services/spree_cm_commissioner/integrations/larryta/external_client/client.rb +344 -0
  182. data/app/services/spree_cm_commissioner/integrations/larryta/external_client/connection.rb +74 -0
  183. data/app/services/spree_cm_commissioner/integrations/larryta/inventory/external_inventory_item_status.rb +53 -0
  184. data/app/services/spree_cm_commissioner/integrations/larryta/inventory/external_inventory_items.rb +106 -0
  185. data/app/services/spree_cm_commissioner/integrations/larryta/inventory/hold_seats.rb +143 -0
  186. data/app/services/spree_cm_commissioner/integrations/larryta/inventory/release_seats.rb +90 -0
  187. data/app/services/spree_cm_commissioner/integrations/larryta/inventory/unstock_inventory.rb +113 -0
  188. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_item_availability.rb +261 -0
  189. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_product.rb +72 -0
  190. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_routes.rb +142 -0
  191. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_seat_layout.rb +255 -0
  192. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_stock_item.rb +55 -0
  193. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_trip_stop.rb +167 -0
  194. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_trips.rb +319 -0
  195. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_variant.rb +63 -0
  196. data/app/services/spree_cm_commissioner/integrations/larryta/polling/sync_vehicle_type.rb +79 -0
  197. data/app/services/spree_cm_commissioner/integrations/larryta/resources/base.rb +39 -0
  198. data/app/services/spree_cm_commissioner/integrations/larryta/resources/booking.rb +113 -0
  199. data/app/services/spree_cm_commissioner/integrations/larryta/resources/booking_session.rb +43 -0
  200. data/app/services/spree_cm_commissioner/integrations/larryta/resources/booking_transaction.rb +238 -0
  201. data/app/services/spree_cm_commissioner/integrations/larryta/resources/direction.rb +71 -0
  202. data/app/services/spree_cm_commissioner/integrations/larryta/resources/passenger.rb +48 -0
  203. data/app/services/spree_cm_commissioner/integrations/larryta/resources/schedule.rb +150 -0
  204. data/app/services/spree_cm_commissioner/integrations/larryta/resources/seat.rb +31 -0
  205. data/app/services/spree_cm_commissioner/integrations/larryta/resources/seat_availability.rb +49 -0
  206. data/app/services/spree_cm_commissioner/integrations/larryta/resources/seat_layout.rb +211 -0
  207. data/app/services/spree_cm_commissioner/integrations/larryta/sync_manager.rb +17 -0
  208. data/app/services/spree_cm_commissioner/integrations/larryta/sync_strategies/full_sync_strategy.rb +79 -0
  209. data/app/services/spree_cm_commissioner/integrations/larryta/sync_strategies/incremental_sync_strategy.rb +58 -0
  210. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/external_client/client.rb +14 -15
  211. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/polling/sync_matches.rb +7 -4
  212. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/polling/sync_zones.rb +6 -3
  213. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_manager.rb +0 -3
  214. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_strategies/full_sync_strategy.rb +1 -3
  215. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_strategies/incremental_sync_strategy.rb +1 -3
  216. data/app/services/spree_cm_commissioner/integrations/stadium_x_v1/sync_strategies/webhook_sync_strategy.rb +1 -2
  217. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/external_client/client.rb +206 -0
  218. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/external_client/connection.rb +59 -0
  219. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/inventory/external_inventory_item_status.rb +48 -0
  220. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/inventory/external_inventory_items.rb +97 -0
  221. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/inventory/unstock_inventory.rb +208 -0
  222. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_item_availability.rb +270 -0
  223. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_locations.rb +96 -0
  224. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_nationality_pricing.rb +76 -0
  225. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_product.rb +69 -0
  226. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_routes.rb +110 -0
  227. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_seat_layout.rb +207 -0
  228. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_stock_item.rb +43 -0
  229. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_trip_stop.rb +187 -0
  230. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_trips.rb +300 -0
  231. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_variant.rb +56 -0
  232. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/polling/sync_vehicle_type.rb +51 -0
  233. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/base.rb +32 -0
  234. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/booking.rb +48 -0
  235. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/booking_transaction.rb +46 -0
  236. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/cell.rb +53 -0
  237. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/confirm_booking_request.rb +43 -0
  238. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/location.rb +37 -0
  239. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/schedule.rb +138 -0
  240. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/seat.rb +48 -0
  241. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/resources/seat_layout.rb +79 -0
  242. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/sync_manager.rb +17 -0
  243. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/sync_strategies/full_sync_strategy.rb +87 -0
  244. data/app/services/spree_cm_commissioner/integrations/vireak_buntham/sync_strategies/incremental_sync_strategy.rb +53 -0
  245. data/app/services/spree_cm_commissioner/inventory_holds/acquire.rb +3 -0
  246. data/app/services/spree_cm_commissioner/inventory_holds/convert.rb +7 -2
  247. data/app/services/spree_cm_commissioner/inventory_holds/release.rb +7 -2
  248. data/app/services/spree_cm_commissioner/inventory_items/bulk_adjust_quantities.rb +36 -4
  249. data/app/services/spree_cm_commissioner/inventory_items/bulk_adjust_quantities_on_hold.rb +39 -4
  250. data/app/services/spree_cm_commissioner/inventory_items/bulk_generate_permanent_items.rb +4 -6
  251. data/app/services/spree_cm_commissioner/inventory_items/generate_permanent_item.rb +48 -0
  252. data/app/services/spree_cm_commissioner/inventory_items/reset.rb +1 -1
  253. data/app/services/spree_cm_commissioner/oauth_access_tokens/cleanup_expired.rb +59 -0
  254. data/app/services/spree_cm_commissioner/order_holds/hold.rb +17 -0
  255. data/app/services/spree_cm_commissioner/order_holds/release.rb +17 -0
  256. data/app/services/spree_cm_commissioner/place_resolver.rb +95 -0
  257. data/app/services/spree_cm_commissioner/pricing_models/preview.rb +15 -6
  258. data/app/services/spree_cm_commissioner/redis_stock/base.rb +2 -1
  259. data/app/services/spree_cm_commissioner/reserved_blocks/reserve.rb +2 -1
  260. data/app/services/spree_cm_commissioner/route_metrics/decrease_trip_count.rb +3 -15
  261. data/app/services/spree_cm_commissioner/route_metrics/increase_trip_count.rb +7 -15
  262. data/app/services/spree_cm_commissioner/routes/create.rb +0 -5
  263. data/app/services/spree_cm_commissioner/telegram_alerts/event_creation.rb +35 -0
  264. data/app/services/spree_cm_commissioner/ticket_transfers/accept.rb +132 -0
  265. data/app/services/spree_cm_commissioner/ticket_transfers/cancel.rb +54 -0
  266. data/app/services/spree_cm_commissioner/ticket_transfers/complete.rb +68 -0
  267. data/app/services/spree_cm_commissioner/ticket_transfers/eligibility_checker.rb +99 -0
  268. data/app/services/spree_cm_commissioner/ticket_transfers/expire.rb +47 -0
  269. data/app/services/spree_cm_commissioner/ticket_transfers/fee_calculator.rb +57 -0
  270. data/app/services/spree_cm_commissioner/ticket_transfers/initiate.rb +98 -0
  271. data/app/services/spree_cm_commissioner/ticket_transfers/preview_rule.rb +38 -0
  272. data/app/services/spree_cm_commissioner/ticket_transfers/reject.rb +55 -0
  273. data/app/services/spree_cm_commissioner/ticket_transfers/transfer_guest.rb +29 -0
  274. data/app/services/spree_cm_commissioner/transit_order/create.rb +8 -2
  275. data/app/services/spree_cm_commissioner/trips/create_multi_leg.rb +5 -16
  276. data/app/services/spree_cm_commissioner/trips/create_single_leg.rb +0 -1
  277. data/app/services/spree_cm_commissioner/vendor_route_metrics/decrease_trip_count.rb +19 -0
  278. data/app/services/spree_cm_commissioner/vendor_route_metrics/increase_trip_count.rb +24 -0
  279. data/app/views/spree/admin/guests/_table.html.erb +82 -87
  280. data/app/views/spree/admin/homepage_section/_form.html.erb +0 -5
  281. data/app/views/spree/admin/integrations/_book_me_bus_v1_fields.html.erb +47 -0
  282. data/app/views/spree/admin/integrations/_form.html.erb +12 -0
  283. data/app/views/spree/admin/integrations/_larryta_fields.html.erb +58 -0
  284. data/app/views/spree/admin/integrations/_vireak_buntham_fields.html.erb +75 -0
  285. data/app/views/spree/admin/integrations/index.html.erb +1 -1
  286. data/app/views/spree/admin/line_items/_form.html.erb +2 -3
  287. data/app/views/spree/admin/order_ticket_transfers/show.html.erb +7 -0
  288. data/app/views/spree/admin/shared/_ticket_transfer_details.html.erb +226 -0
  289. data/app/views/spree/admin/shared/_ticket_transfer_tabs.html.erb +14 -0
  290. data/app/views/spree/admin/ticket_transfer_rules/_form.html.erb +193 -0
  291. data/app/views/spree/admin/ticket_transfer_rules/edit.html.erb +11 -0
  292. data/app/views/spree/admin/ticket_transfer_rules/index.html.erb +79 -0
  293. data/app/views/spree/admin/ticket_transfer_rules/new.html.erb +11 -0
  294. data/app/views/spree/admin/ticket_transfers/_search_form.html.erb +70 -0
  295. data/app/views/spree/admin/ticket_transfers/_tabs.html.erb +14 -0
  296. data/app/views/spree/admin/ticket_transfers/index.html.erb +74 -0
  297. data/app/views/spree/admin/ticket_transfers/show.html.erb +13 -0
  298. data/app/views/spree/admin/ticket_transfers/state_changes.html.erb +47 -0
  299. data/config/initializers/spree_permitted_attributes.rb +1 -8
  300. data/config/locales/en.yml +64 -41
  301. data/config/locales/km.yml +61 -28
  302. data/config/routes.rb +21 -28
  303. data/db/migrate/20260303101440_add_allow_transfer_to_spree_products.rb +5 -0
  304. data/db/migrate/20260303101907_create_cm_ticket_transfers.rb +32 -0
  305. data/db/migrate/20260303102316_add_state_to_cm_guests.rb +7 -0
  306. data/db/migrate/20260327143200_create_cm_audit_events.rb +21 -0
  307. data/db/migrate/20260408100000_create_cm_ticket_transfer_rules.rb +28 -0
  308. data/db/migrate/20260410045815_create_cm_currency_rates.rb +23 -0
  309. data/db/migrate/20260410120000_add_transfer_type_to_cm_ticket_transfers.rb +5 -0
  310. data/db/migrate/20260411102139_add_metadata_to_cm_inventory_items.rb +6 -0
  311. data/db/migrate/20260422120000_add_settlement_status_to_cm_ticket_transfers.rb +6 -0
  312. data/db/migrate/20260507000000_add_index_to_cm_ticket_transfers_completed_at.rb +5 -0
  313. data/db/migrate/20260520000000_add_number_to_cm_ticket_transfers.rb +6 -0
  314. data/db/migrate/20260605120908_add_description_to_cm_dynamic_fields.rb +5 -0
  315. data/db/migrate/20260608000000_add_allow_gift_transfer_to_spree_products.rb +5 -0
  316. data/db/migrate/20260608000000_create_cm_vendor_route_metrics.rb +25 -0
  317. data/db/migrate/20260608152251_add_gender_to_cm_reserved_blocks.rb +5 -0
  318. data/lib/spree_cm_commissioner/test_helper/factories/integration_factory.rb +11 -0
  319. data/lib/spree_cm_commissioner/test_helper/factories/ticket_transfer_factory.rb +18 -0
  320. data/lib/spree_cm_commissioner/test_helper/factories/vendor_route_metric_factory.rb +10 -0
  321. data/lib/spree_cm_commissioner/trip_query_result.rb +34 -1
  322. data/lib/spree_cm_commissioner/trip_result.rb +52 -22
  323. data/lib/spree_cm_commissioner/version.rb +1 -1
  324. data/lib/spree_cm_commissioner.rb +1 -7
  325. data/lib/tasks/backfill_route_metrics.rake +21 -0
  326. data/lib/tasks/backfill_vendor_route_metrics.rake +23 -0
  327. data/spree_cm_commissioner.gemspec +1 -1
  328. metadata +192 -130
  329. data/app/controllers/spree/api/v2/storefront/preview_products_controller.rb +0 -48
  330. data/app/controllers/spree/api/v2/storefront/preview_sections_controller.rb +0 -27
  331. data/app/controllers/spree/api/v2/storefront/preview_taxons_controller.rb +0 -18
  332. data/app/controllers/spree/api/v2/storefront/products_controller_decorator.rb +0 -15
  333. data/app/controllers/spree/api/v2/storefront/taxons_controller_decorator.rb +0 -15
  334. data/app/controllers/spree/api/v2/tenant/advertisements_controller.rb +0 -24
  335. data/app/controllers/spree/api/v2/tenant/episodes_controller.rb +0 -38
  336. data/app/controllers/spree/api/v2/tenant/free_vote_claims_controller.rb +0 -37
  337. data/app/controllers/spree/api/v2/tenant/preview_products_controller.rb +0 -47
  338. data/app/controllers/spree/api/v2/tenant/preview_sections_controller.rb +0 -26
  339. data/app/controllers/spree/api/v2/tenant/preview_shows_controller.rb +0 -19
  340. data/app/controllers/spree/api/v2/tenant/preview_taxons_controller.rb +0 -19
  341. data/app/controllers/spree/api/v2/tenant/show_contestants_controller.rb +0 -52
  342. data/app/controllers/spree/api/v2/tenant/show_elimination_sessions_controller.rb +0 -57
  343. data/app/controllers/spree/api/v2/tenant/show_people_controller.rb +0 -49
  344. data/app/controllers/spree/api/v2/tenant/show_person_assignments_controller.rb +0 -36
  345. data/app/controllers/spree/api/v2/tenant/shows_controller.rb +0 -36
  346. data/app/controllers/spree/api/v2/tenant/votes_controller.rb +0 -94
  347. data/app/controllers/spree/api/v2/tenant/voting_contestants_controller.rb +0 -43
  348. data/app/controllers/spree/api/v2/tenant/voting_credit_transactions_controller.rb +0 -41
  349. data/app/controllers/spree/api/v2/tenant/voting_credits_controller.rb +0 -31
  350. data/app/jobs/spree_cm_commissioner/cleanup_expired_access_tokens_job.rb +0 -9
  351. data/app/jobs/spree_cm_commissioner/show_contestants/import_job.rb +0 -9
  352. data/app/jobs/spree_cm_commissioner/vote_fraud_event_job.rb +0 -9
  353. data/app/jobs/spree_cm_commissioner/voting_credit_allocation_job.rb +0 -10
  354. data/app/jobs/spree_cm_commissioner/voting_credit_de_allocation_job.rb +0 -10
  355. data/app/models/concerns/spree_cm_commissioner/voting_session_live_stream_concern.rb +0 -41
  356. data/app/models/spree_cm_commissioner/imports/import_contestant.rb +0 -7
  357. data/app/models/spree_cm_commissioner/maintenance_tasks/voting_session.rb +0 -36
  358. data/app/models/spree_cm_commissioner/preview_role.rb +0 -8
  359. data/app/models/spree_cm_commissioner/role_user_decorator.rb +0 -8
  360. data/app/models/spree_cm_commissioner/show.rb +0 -163
  361. data/app/models/spree_cm_commissioner/show_contestant.rb +0 -39
  362. data/app/models/spree_cm_commissioner/show_contestant_image.rb +0 -11
  363. data/app/models/spree_cm_commissioner/show_contestant_video.rb +0 -15
  364. data/app/models/spree_cm_commissioner/show_episode.rb +0 -110
  365. data/app/models/spree_cm_commissioner/show_person.rb +0 -15
  366. data/app/models/spree_cm_commissioner/show_person_assignment.rb +0 -20
  367. data/app/models/spree_cm_commissioner/show_person_image.rb +0 -11
  368. data/app/models/spree_cm_commissioner/vote.rb +0 -16
  369. data/app/models/spree_cm_commissioner/vote_fraud_event.rb +0 -20
  370. data/app/models/spree_cm_commissioner/voting_contestant.rb +0 -89
  371. data/app/models/spree_cm_commissioner/voting_credit.rb +0 -72
  372. data/app/models/spree_cm_commissioner/voting_credit_transaction.rb +0 -55
  373. data/app/models/spree_cm_commissioner/voting_session.rb +0 -215
  374. data/app/models/spree_cm_commissioner/voting_session_stat.rb +0 -8
  375. data/app/overrides/spree/admin/products/_form/preview_checkbox.html.erb.deface +0 -9
  376. data/app/overrides/spree/admin/taxons/_form/preview_checkbox.html.erb.deface +0 -7
  377. data/app/overrides/spree/layouts/admin/map_head.html.erb.deface +0 -2
  378. data/app/serializers/spree/v2/tenant/advertisement_serializer.rb +0 -11
  379. data/app/serializers/spree/v2/tenant/campaign_serializer.rb +0 -17
  380. data/app/serializers/spree/v2/tenant/show_contestant_serializer.rb +0 -21
  381. data/app/serializers/spree/v2/tenant/show_episode_serializer.rb +0 -19
  382. data/app/serializers/spree/v2/tenant/show_person_assignment_serializer.rb +0 -16
  383. data/app/serializers/spree/v2/tenant/show_person_serializer.rb +0 -13
  384. data/app/serializers/spree/v2/tenant/show_serializer.rb +0 -21
  385. data/app/serializers/spree/v2/tenant/video_serializer.rb +0 -9
  386. data/app/serializers/spree/v2/tenant/vote_serializer.rb +0 -14
  387. data/app/serializers/spree/v2/tenant/voting_contestant_serializer.rb +0 -23
  388. data/app/serializers/spree/v2/tenant/voting_credit_serializer.rb +0 -10
  389. data/app/serializers/spree/v2/tenant/voting_credit_transaction_serializer.rb +0 -14
  390. data/app/serializers/spree/v2/tenant/voting_session_serializer.rb +0 -21
  391. data/app/services/spree_cm_commissioner/advertisements/sorted_advertisements.rb +0 -61
  392. data/app/services/spree_cm_commissioner/cleanup_expired_access_tokens.rb +0 -52
  393. data/app/services/spree_cm_commissioner/fraud_check.rb +0 -299
  394. data/app/services/spree_cm_commissioner/imports/contestants/create.rb +0 -153
  395. data/app/services/spree_cm_commissioner/show_contestants/normalize_video_highlights.rb +0 -57
  396. data/app/services/spree_cm_commissioner/url_embed/youtube_embed.rb +0 -44
  397. data/app/services/spree_cm_commissioner/vote_counters/audit_counters.rb +0 -43
  398. data/app/services/spree_cm_commissioner/vote_counters/base.rb +0 -31
  399. data/app/services/spree_cm_commissioner/vote_counters/increment.rb +0 -44
  400. data/app/services/spree_cm_commissioner/vote_counters/per_contestant_counter.rb +0 -68
  401. data/app/services/spree_cm_commissioner/vote_counters/rebuild_from_db.rb +0 -70
  402. data/app/services/spree_cm_commissioner/vote_counters/snapshot_to_db.rb +0 -113
  403. data/app/services/spree_cm_commissioner/vote_credit_deductor.rb +0 -68
  404. data/app/services/spree_cm_commissioner/vote_package/create.rb +0 -145
  405. data/app/services/spree_cm_commissioner/vote_package/update.rb +0 -91
  406. data/app/services/spree_cm_commissioner/vote_processor.rb +0 -144
  407. data/app/services/spree_cm_commissioner/voting_contestants/advancer.rb +0 -335
  408. data/app/services/spree_cm_commissioner/voting_contestants/assigner.rb +0 -40
  409. data/app/services/spree_cm_commissioner/voting_contestants/bulk_updater.rb +0 -106
  410. data/app/services/spree_cm_commissioner/voting_credits/allocate.rb +0 -77
  411. data/app/services/spree_cm_commissioner/voting_credits/claim_free_votes.rb +0 -119
  412. data/app/services/spree_cm_commissioner/voting_credits/credit_calculator.rb +0 -35
  413. data/app/services/spree_cm_commissioner/voting_credits/de_allocate.rb +0 -87
  414. data/app/services/spree_cm_commissioner/voting_leaderboards/calculate_score.rb +0 -67
  415. data/app/services/spree_cm_commissioner/voting_leaderboards/combined_result.rb +0 -183
  416. data/app/services/spree_cm_commissioner/voting_sessions/finalize.rb +0 -96
  417. data/db/migrate/20260309230148_create_cm_show_people.rb +0 -14
  418. data/db/migrate/20260309230149_create_cm_show_people_assignments.rb +0 -16
  419. data/db/migrate/20260310082711_create_cm_show_contestants.rb +0 -28
  420. data/db/migrate/20260310082720_create_cm_voting_sessions.rb +0 -21
  421. data/db/migrate/20260310082721_create_cm_voting_contestants.rb +0 -23
  422. data/db/migrate/20260310082734_add_voting_fields_to_spree_taxons.rb +0 -9
  423. data/db/migrate/20260310082735_add_type_to_spree_products.rb +0 -6
  424. data/db/migrate/20260310082749_create_cm_voting_credits.rb +0 -27
  425. data/db/migrate/20260326080200_create_cm_voting_credit_transactions.rb +0 -27
  426. data/db/migrate/20260330160000_create_cm_votes.rb +0 -25
  427. data/db/migrate/20260401072500_add_advanced_from_to_cm_voting_contestants.rb +0 -7
  428. data/db/migrate/20260402000001_add_voting_credit_scope_to_spree_taxons.rb +0 -6
  429. data/db/migrate/20260402000002_rename_scopeable_to_votable_in_cm_voting_credits.rb +0 -12
  430. data/db/migrate/20260403070000_add_name_to_cm_voting_sessions.rb +0 -5
  431. data/db/migrate/20260406000001_add_vendor_id_to_voting_tables.rb +0 -6
  432. data/db/migrate/20260406000001_rename_votes_remaining_to_amount_in_cm_voting_credits.rb +0 -11
  433. data/db/migrate/20260408085255_add_show_id_and_vendor_id_to_cm_voting_sessions.rb +0 -9
  434. data/db/migrate/20260420000001_rename_type_to_credit_type_in_cm_voting_credits.rb +0 -25
  435. data/db/migrate/20260422000001_create_cm_vote_fraud_events.rb +0 -23
  436. data/db/migrate/20260423000001_add_preview_to_taxons_products_and_sections.rb +0 -11
  437. data/db/migrate/20260423000002_create_preview_roles.rb +0 -24
  438. data/db/migrate/20260515120000_add_public_metadata_to_cm_voting_sessions.rb +0 -5
  439. data/db/migrate/20260518090920_add_unique_voter_count_to_voting_contestants.rb +0 -5
  440. data/db/migrate/20260518094322_create_cm_voting_session_stats.rb +0 -17
  441. data/db/migrate/20260520000001_add_scoring_model_to_cm_voting_sessions.rb +0 -5
  442. data/db/migrate/20260520000001_optimize_cm_votes_indexes.rb +0 -22
  443. data/db/migrate/20260525042257_add_vote_number_to_cm_voting_contestants.rb +0 -18
  444. data/db/migrate/20260527035430_add_confirmed_rank_to_cm_voting_contestants.rb +0 -5
  445. data/db/migrate/20260527062005_add_eliminated_at_to_cm_show_contestants.rb +0 -5
  446. data/db/migrate/20260603063652_add_parent_to_voting_sessions.rb +0 -9
  447. data/db/migrate/20260603090000_add_session_type_to_cm_voting_sessions.rb +0 -6
  448. data/db/migrate/20260608000000_add_display_to_cm_voting_sessions.rb +0 -5
  449. data/docs/sql/jsonb_query_guide.md +0 -57
  450. data/lib/spree_cm_commissioner/test_helper/factories/show_episode_factory.rb +0 -12
  451. data/lib/spree_cm_commissioner/test_helper/factories/show_factory.rb +0 -120
  452. data/lib/spree_cm_commissioner/test_helper/factories/vote_credit_factory.rb +0 -37
  453. data/lib/spree_cm_commissioner/test_helper/factories/vote_factory.rb +0 -28
  454. data/lib/spree_cm_commissioner/test_helper/factories/voting_credit_transaction_factory.rb +0 -11
  455. 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: 145ade12d325f15a3f1963b4fd75e56093cbb182e1f3ac115d0101c0c6cad285
4
- data.tar.gz: e47239cbfa8a359ce7e0b0ed2f73e5270876f679d3047a2d88be89493683004a
3
+ metadata.gz: 03105af0ab1e480deee42cf481634c850da1a67603e5b443353d4aad31017181
4
+ data.tar.gz: 1add556af176fac0f8ac9be335406537e857c438dacd38a3a0769fa841a60e99
5
5
  SHA512:
6
- metadata.gz: '06134389566fe49ae2dfe58a65919130cc57dcf43694d33af480d2930d517cfbba1ba97c7714f0b011cdb063a9a7d1611dc205fdcce1cf7f77fd4618c6d9ffd9'
7
- data.tar.gz: 60d6491f501f2baa87fb971bee6a906f3180425d9f72917462adc2d266c0f3302a44bf532c39fe9885b3b965d7c94fdae9b158d0c7bc9263879b2d2e43197e23
6
+ metadata.gz: d6e85ae08be39fc2a66791c42a049ae3be212fa16af34bc0edaa7366c1b4b22305a381029f0d76a0f03807e7bc1e53ed82c35d8dd5b88f05cb806dc39f520492
7
+ data.tar.gz: fc23fd4348e6b70720c5e803b278f07e9c6303e37c3ea1080b254a511da02fd75c30426bbfe9107b925efa8280f6b10b5d4d84edc42d5e38b9643cc4f3190375
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
@@ -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.pre5)
37
+ spree_cm_commissioner (2.8.3.pre6)
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.message.to_s.titleize
58
+ flash[:error] = result.error.value.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
@@ -0,0 +1,25 @@
1
+ module Spree
2
+ module Admin
3
+ class OrderTicketTransfersController < Spree::Admin::ResourceController
4
+ include Spree::Admin::OrderConcern
5
+
6
+ helper SpreeCmCommissioner::Admin::TicketTransfersHelper
7
+
8
+ before_action :load_order
9
+
10
+ def show
11
+ @ticket_transfer = model_class.includes(:order, from_guest: :event).find(params[:id])
12
+ end
13
+
14
+ private
15
+
16
+ def model_class
17
+ SpreeCmCommissioner::TicketTransfer
18
+ end
19
+
20
+ def object_name
21
+ 'spree_cm_commissioner_ticket_transfer'
22
+ end
23
+ end
24
+ end
25
+ end
@@ -92,7 +92,7 @@ module Spree
92
92
  .call
93
93
  .index_by(&:inventory_item_id)
94
94
  @reserved_stocks = Spree::LineItem
95
- .complete
95
+ .affecting_inventory
96
96
  .where(variant_id: @variants.pluck(:id))
97
97
  .group('spree_line_items.variant_id')
98
98
  .sum(:quantity)
@@ -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
@@ -0,0 +1,47 @@
1
+ module Spree
2
+ module Admin
3
+ class TicketTransferRulesController < Spree::Admin::ResourceController
4
+ def index
5
+ @search = model_class.ransack(params[:q])
6
+ @ticket_transfer_rules = @search.result
7
+ .order(ruleable_type: :asc, ruleable_id: :asc, currency: :asc)
8
+ .page(params[:page])
9
+ .per(25)
10
+ end
11
+
12
+ private
13
+
14
+ def model_class
15
+ SpreeCmCommissioner::TicketTransferRule
16
+ end
17
+
18
+ def object_name
19
+ 'spree_cm_commissioner_ticket_transfer_rule'
20
+ end
21
+
22
+ def collection_url
23
+ admin_ticket_transfer_rules_url
24
+ end
25
+
26
+ def location_after_save
27
+ edit_admin_ticket_transfer_rule_path(@object)
28
+ end
29
+
30
+ def permitted_resource_params
31
+ params.require(:spree_cm_commissioner_ticket_transfer_rule).permit(
32
+ :ruleable_type,
33
+ :ruleable_id,
34
+ :active,
35
+ :currency,
36
+ :fee_percentage,
37
+ :fee_flat_amount,
38
+ :cooldown_hours,
39
+ :max_transfers_per_ticket,
40
+ :event_cutoff_hours,
41
+ :min_price,
42
+ :max_price
43
+ )
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,61 @@
1
+ module Spree
2
+ module Admin
3
+ class TicketTransfersController < Spree::Admin::ResourceController
4
+ helper SpreeCmCommissioner::Admin::TicketTransfersHelper
5
+
6
+ def index
7
+ @search = model_class.includes(:from_user, :to_user, :from_guest).ransack(params[:q])
8
+ @ticket_transfers = @search.result.order(created_at: :desc).page(params[:page]).per(15)
9
+ end
10
+
11
+ def show
12
+ @ticket_transfer = model_class.includes(:order, from_guest: [:event, { line_item: :order }]).find(params[:id])
13
+ end
14
+
15
+ def state_changes
16
+ @ticket_transfer = model_class.find(params[:id])
17
+ @state_changes = @ticket_transfer.state_changes.includes(:user).order(created_at: :desc)
18
+ end
19
+
20
+ def cancel
21
+ @ticket_transfer = model_class.find(params[:id])
22
+ result = SpreeCmCommissioner::TicketTransfers::Cancel.call(
23
+ ticket_transfer: @ticket_transfer,
24
+ acting_user: try_spree_current_user
25
+ )
26
+
27
+ if result.success?
28
+ flash[:success] = 'Ticket transfer has been cancelled' # rubocop:disable Rails/I18nLocaleTexts
29
+ else
30
+ flash[:error] = result.error.value
31
+ end
32
+ redirect_to admin_ticket_transfer_path(@ticket_transfer)
33
+ end
34
+
35
+ def update_settlement_status
36
+ @ticket_transfer = model_class.find(params[:id])
37
+ new_status = params[:settlement_status]
38
+
39
+ unless @ticket_transfer.purchase? && @ticket_transfer.completed?
40
+ flash[:error] = 'Settlement status can only be updated for completed purchase transfers' # rubocop:disable Rails/I18nLocaleTexts
41
+ redirect_to admin_ticket_transfer_path(@ticket_transfer)
42
+ return
43
+ end
44
+
45
+ if @ticket_transfer.update(settlement_status: new_status)
46
+ @ticket_transfer.log_settlement_status_changes(user_id: try_spree_current_user&.id)
47
+ flash[:success] = "Settlement status updated to #{new_status}"
48
+ else
49
+ flash[:error] = @ticket_transfer.errors.full_messages.to_sentence.presence || 'Failed to update settlement status'
50
+ end
51
+ redirect_to admin_ticket_transfer_path(@ticket_transfer)
52
+ end
53
+
54
+ private
55
+
56
+ def model_class
57
+ SpreeCmCommissioner::TicketTransfer
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,32 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ module Account
6
+ class RecipientsController < ::Spree::Api::V2::ResourceController
7
+ before_action :require_spree_current_user
8
+
9
+ def show
10
+ identifier = params[:q].to_s.strip
11
+ return render_error_payload('Missing q parameter', 400) if identifier.blank?
12
+
13
+ user = SpreeCmCommissioner::RecipientSearcherQuery.new(identifier, MultiTenant.current_tenant_id).call
14
+
15
+ if user
16
+ render_serialized_payload { serialize_resource(user) }
17
+ else
18
+ render_error_payload('User not found', 404)
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def resource_serializer
25
+ SpreeCmCommissioner::V2::Storefront::RecipientSerializer
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ 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
@@ -0,0 +1,32 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ class TicketTransferAcceptancesController < ::Spree::Api::V2::ResourceController
6
+ before_action :require_spree_current_user
7
+
8
+ def create
9
+ ticket_transfer = SpreeCmCommissioner::TicketTransfer.find_by!(token: params[:ticket_transfer_id])
10
+
11
+ result = SpreeCmCommissioner::TicketTransfers::Accept.call(
12
+ ticket_transfer: ticket_transfer,
13
+ buyer: spree_current_user
14
+ )
15
+
16
+ if result.success?
17
+ render_serialized_payload(201) { serialize_resource(result.value[:ticket_transfer]) }
18
+ else
19
+ render_error_payload(result.error)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def resource_serializer
26
+ SpreeCmCommissioner::V2::Storefront::TicketTransferSerializer
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,117 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ class TicketTransfersController < ::Spree::Api::V2::ResourceController
6
+ before_action :require_spree_current_user
7
+
8
+ def index
9
+ render_serialized_payload do
10
+ serialize_collection(paginated_collection)
11
+ end
12
+ end
13
+
14
+ def show
15
+ ticket_transfer = model_class.includes(:order, from_guest: [:event, { line_item: :product }]).find_by!(token: params[:id])
16
+ return render_error_payload(I18n.t('ticket_transfer.unauthorized_view'), 403) unless authorized_to_view?(ticket_transfer)
17
+
18
+ render_serialized_payload { serialize_resource(ticket_transfer) }
19
+ end
20
+
21
+ def preview_rule
22
+ result = SpreeCmCommissioner::TicketTransfers::PreviewRule.call(
23
+ from_guest_id: params[:guest_id],
24
+ currency: params[:currency] || 'USD'
25
+ )
26
+
27
+ if result.success?
28
+ render json: { data: result.value }
29
+ else
30
+ render_error_payload(result.error)
31
+ end
32
+ end
33
+
34
+ def create
35
+ result = SpreeCmCommissioner::TicketTransfers::Initiate.call(
36
+ from_user_id: spree_current_user.id,
37
+ to_user_id: ticket_transfer_params[:to_user_id],
38
+ from_guest_id: ticket_transfer_params[:guest_id],
39
+ price: ticket_transfer_params[:price] || 0,
40
+ currency: ticket_transfer_params[:currency] || 'USD',
41
+ expires_at: ticket_transfer_params[:expires_at],
42
+ transfer_type: ticket_transfer_params[:transfer_type] || 'purchase'
43
+ )
44
+
45
+ if result.success?
46
+ render_serialized_payload(201) { serialize_resource(result.value[:ticket_transfer]) }
47
+ else
48
+ render_error_payload(result.error)
49
+ end
50
+ end
51
+
52
+ def cancel
53
+ ticket_transfer = model_class.find_by!(token: params[:id])
54
+
55
+ result = SpreeCmCommissioner::TicketTransfers::Cancel.call(
56
+ ticket_transfer: ticket_transfer,
57
+ acting_user: spree_current_user
58
+ )
59
+
60
+ if result.success?
61
+ render_serialized_payload { serialize_resource(result.value[:ticket_transfer]) }
62
+ else
63
+ render_error_payload(result.error)
64
+ end
65
+ end
66
+
67
+ def reject
68
+ ticket_transfer = model_class.find_by!(token: params[:id])
69
+
70
+ result = SpreeCmCommissioner::TicketTransfers::Reject.call(
71
+ ticket_transfer: ticket_transfer,
72
+ acting_user: spree_current_user
73
+ )
74
+
75
+ if result.success?
76
+ render_serialized_payload { serialize_resource(result.value[:ticket_transfer]) }
77
+ else
78
+ render_error_payload(result.error)
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def model_class
85
+ SpreeCmCommissioner::TicketTransfer
86
+ end
87
+
88
+ def collection
89
+ SpreeCmCommissioner::TicketTransfer.includes(:order,
90
+ from_guest: [:event, { line_item: :product }]
91
+ ).where(from_user_id: spree_current_user.id)
92
+ end
93
+
94
+ def resource_serializer
95
+ SpreeCmCommissioner::V2::Storefront::TicketTransferSerializer
96
+ end
97
+
98
+ def collection_serializer
99
+ SpreeCmCommissioner::V2::Storefront::TicketTransferSerializer
100
+ end
101
+
102
+ def ticket_transfer_params
103
+ params.require(:ticket_transfer).permit(:to_user_id, :guest_id, :price, :currency, :expires_at, :transfer_type)
104
+ end
105
+
106
+ # When sending to a specific user, only sender and that buyer can access.
107
+ def authorized_to_view?(ticket_transfer)
108
+ return true if ticket_transfer.to_user_id.blank?
109
+
110
+ current_user_id = spree_current_user&.id
111
+ ticket_transfer.from_user_id == current_user_id || ticket_transfer.to_user_id == current_user_id
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,66 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ module Transit
6
+ class ItemAvailabilitiesController < ::Spree::Api::V2::ResourceController
7
+ include SpreeCmCommissioner::Integrations::InventorySyncCachable
8
+
9
+ def create
10
+ sync_result = sync_item_availability!
11
+
12
+ unless sync_result.success?
13
+ error_message = sync_result.to_h.dig(:error, :message) || 'Sync failed'
14
+ return render_error_payload(error_message, 422)
15
+ end
16
+
17
+ item_availability = SpreeCmCommissioner::ItemAvailabilitySync.new(
18
+ id: trip.id,
19
+ last_sync_at: sync_result.last_synced_at
20
+ )
21
+ render_serialized_payload { serialize_resource(item_availability) }
22
+ rescue ActiveRecord::RecordNotFound => e
23
+ render_error_payload(e.message, 404)
24
+ end
25
+
26
+ private
27
+
28
+ def trip
29
+ @trip ||= SpreeCmCommissioner::Trip.find(params[:trip_id])
30
+ end
31
+
32
+ def integration
33
+ @integration ||= trip.vendor&.integration
34
+ end
35
+
36
+ def sync_item_availability!
37
+ # Return success result if vendor has no integration
38
+ return SpreeCmCommissioner::Integrations::Base::SyncResult.new if integration.nil?
39
+
40
+ # Check cache first for successful results only
41
+ cached_result = Rails.cache.read(sync_cache_key)
42
+ return cached_result if cached_result
43
+
44
+ # Perform sync
45
+ result = integration.sync_item_availability!(trip_id: trip.id, on_date: params[:on_date])
46
+
47
+ # Only cache successful results to avoid sticky failures
48
+ Rails.cache.write(sync_cache_key, result, expires_in: sync_cache_ttl) if result.success?
49
+
50
+ result
51
+ end
52
+
53
+ def sync_cache_key
54
+ # Include trip.updated_at to auto-bust cache when trip is updated by background syncs
55
+ "item_availability_syncs:#{trip.id}:#{params[:on_date]}:#{trip.updated_at.to_i}"
56
+ end
57
+
58
+ def resource_serializer
59
+ SpreeCmCommissioner::V2::Storefront::ItemAvailabilitySyncSerializer
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -39,7 +39,6 @@ module Spree
39
39
  params[:date],
40
40
  params[:route_type],
41
41
  params[:vendor_id],
42
- params[:featured],
43
42
  params[:number_of_guests],
44
43
  resource_includes&.sort&.join(','),
45
44
  sparse_fields&.sort&.join(','),
@@ -65,8 +64,7 @@ module Spree
65
64
  'trips.vendor',
66
65
  'trips.vendor.logo',
67
66
  'trips.vehicle_type',
68
- 'trips.vehicle_type.vehicle_photos',
69
- 'trips.amenities'
67
+ 'trips.vehicle_type.vehicle_photos'
70
68
  ]
71
69
  end
72
70
 
@@ -100,7 +98,11 @@ module Spree
100
98
 
101
99
  # override
102
100
  def serializer_params
103
- params.permit(:include).to_hash
101
+ super.merge(
102
+ exclude_vendor_kind_option_types: true,
103
+ exclude_vendor_kind_option_values: true,
104
+ exclude_vehicle_type_amenities: true
105
+ )
104
106
  end
105
107
 
106
108
  # override
@@ -16,10 +16,6 @@ module Spree
16
16
  set_current_tenant(@tenant)
17
17
  end
18
18
 
19
- def current_vendor
20
- @current_vendor ||= @tenant.active_vendor
21
- end
22
-
23
19
  def render_serialized_payload(status = 200)
24
20
  render json: yield, status: status, content_type: content_type
25
21
  end
@@ -5,7 +5,6 @@ module Spree
5
5
  class HomepageSectionsController < BaseController
6
6
  def collection
7
7
  @collection ||= scope.filter_by_segment(params[:homepage_id] || :general)
8
- .where(preview: false)
9
8
  .active
10
9
  .order(position: :asc)
11
10
  end
@@ -21,7 +21,7 @@ module Spree
21
21
 
22
22
  def scope
23
23
  MultiTenant.with(@tenant) do
24
- model_class.where(tenant_id: MultiTenant.current_tenant_id, preview: false)
24
+ model_class.where(tenant_id: MultiTenant.current_tenant_id)
25
25
  end
26
26
  end
27
27
 
@@ -31,7 +31,7 @@ module Spree
31
31
 
32
32
  def scope
33
33
  MultiTenant.with(@tenant) do
34
- model_class.where(preview: false)
34
+ model_class
35
35
  end
36
36
  end
37
37
 
@@ -25,6 +25,17 @@ 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
28
39
  end
29
40
  end
30
41
  end
@@ -40,9 +40,13 @@ module SpreeCmCommissioner
40
40
 
41
41
  # override
42
42
  def cancel
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)
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
46
50
  redirect_back fallback_location: spree.edit_admin_order_url(@order)
47
51
  end
48
52
 
@@ -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