spree_cm_commissioner 2.0.0.pre.pre → 2.0.0

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 (259) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +3 -0
  3. data/.github/workflows/test_and_build_gem.yml +2 -16
  4. data/.gitignore +1 -2
  5. data/Gemfile.lock +1 -32
  6. data/Rakefile +4 -33
  7. data/app/assets/images/cm-hangmeas-checkout_image.svg +63 -0
  8. data/app/assets/images/cm-hangmeas-failed.svg +56 -0
  9. data/app/assets/images/cm-hangmeas-loader.svg +50 -0
  10. data/app/assets/images/cm-hangmeas-success.svg +51 -0
  11. data/app/assets/images/mailer/mail.png +0 -0
  12. data/app/assets/images/mailer/tenant_phone.png +0 -0
  13. data/app/assets/images/mailer/tenant_user.png +0 -0
  14. data/app/assets/javascripts/spree_cm_commissioner/backend.js +1 -0
  15. data/app/assets/javascripts/spree_cm_commissioner/tenant_payment_icon_fields.js +65 -0
  16. data/app/assets/stylesheets/spree_cm_commissioner/backend/calendar.scss +11 -8
  17. data/app/assets/stylesheets/spree_cm_commissioner/backend/commissioner_admin.css.scss +1 -0
  18. data/app/assets/stylesheets/spree_cm_commissioner/backend/tenant_payment_icon_fields.scss +60 -0
  19. data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +2 -1
  20. data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +44 -0
  21. data/app/controllers/spree/admin/event_blazer_queries_controller.rb +11 -4
  22. data/app/controllers/spree/admin/stock_managements_controller.rb +1 -63
  23. data/app/controllers/spree/admin/tenants_controller.rb +8 -0
  24. data/app/controllers/spree/admin/trip_blazer_queries_controller.rb +35 -0
  25. data/app/controllers/spree/api/v2/organizer/invite_crews_controller.rb +33 -0
  26. data/app/controllers/spree/api/v2/organizer/invite_guests_controller.rb +1 -1
  27. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +31 -14
  28. data/app/controllers/spree/api/v2/storefront/dynamic_field_options_controller.rb +5 -1
  29. data/app/controllers/spree/api/v2/storefront/guests_controller.rb +30 -4
  30. data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
  31. data/app/controllers/spree/api/v2/tenant/checkout_controller.rb +2 -0
  32. data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +1 -1
  33. data/app/controllers/spree_cm_commissioner/api/v2/storefront/checkout_controller_decorator.rb +11 -0
  34. data/app/controllers/spree_cm_commissioner/well_known_controller.rb +31 -17
  35. data/app/factory/spree_cm_commissioner/invite_guest_claimed_telegram_message_factory.rb +23 -81
  36. data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +20 -0
  37. data/app/interactors/spree_cm_commissioner/apple_app_site_association_fetcher.rb +27 -0
  38. data/app/interactors/spree_cm_commissioner/asset_links_fetcher.rb +27 -0
  39. data/app/interactors/spree_cm_commissioner/create_ticket.rb +6 -5
  40. data/app/interactors/spree_cm_commissioner/crew_invite_link_handler.rb +48 -0
  41. data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +0 -1
  42. data/app/interactors/spree_cm_commissioner/sms.rb +1 -1
  43. data/app/interactors/spree_cm_commissioner/telegram_chats_auto_finder.rb +144 -0
  44. data/app/interactors/spree_cm_commissioner/user_id_token_authenticator.rb +7 -3
  45. data/app/interactors/spree_cm_commissioner/user_id_token_checker.rb +11 -3
  46. data/app/interactors/spree_cm_commissioner/user_identity_checker.rb +12 -6
  47. data/app/interactors/spree_cm_commissioner/user_registration_with_id_token.rb +7 -1
  48. data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +5 -1
  49. data/app/jobs/spree_cm_commissioner/application_job.rb +0 -20
  50. data/app/jobs/spree_cm_commissioner/application_unique_job.rb +0 -20
  51. data/app/jobs/spree_cm_commissioner/sms_pin_code_job.rb +1 -1
  52. data/app/mailers/spree/order_mailer_decorator.rb +18 -3
  53. data/app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb +30 -0
  54. data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +15 -9
  55. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +13 -1
  56. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -39
  57. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +3 -1
  58. data/app/models/concerns/spree_cm_commissioner/product_type.rb +0 -10
  59. data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -1
  60. data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +5 -0
  61. data/app/models/spree_cm_commissioner/blazer_queryable.rb +8 -0
  62. data/app/models/spree_cm_commissioner/branch.rb +12 -0
  63. data/app/models/spree_cm_commissioner/crew_invite_link.rb +4 -0
  64. data/app/models/spree_cm_commissioner/dynamic_field.rb +37 -3
  65. data/app/models/spree_cm_commissioner/dynamic_field_option.rb +7 -1
  66. data/app/models/spree_cm_commissioner/guest.rb +57 -19
  67. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +61 -3
  68. data/app/models/spree_cm_commissioner/invite.rb +4 -6
  69. data/app/models/spree_cm_commissioner/invite_team.rb +3 -1
  70. data/app/models/spree_cm_commissioner/line_item_decorator.rb +78 -46
  71. data/app/models/spree_cm_commissioner/line_item_seat.rb +10 -0
  72. data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
  73. data/app/models/spree_cm_commissioner/option_type_decorator.rb +11 -1
  74. data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +8 -0
  75. data/app/models/spree_cm_commissioner/order_decorator.rb +1 -30
  76. data/app/models/spree_cm_commissioner/pin_code.rb +3 -2
  77. data/app/models/spree_cm_commissioner/pin_code_telegram.rb +28 -0
  78. data/app/models/spree_cm_commissioner/place.rb +3 -1
  79. data/app/models/spree_cm_commissioner/product_decorator.rb +26 -10
  80. data/app/models/spree_cm_commissioner/promotion_category_decorator.rb +11 -0
  81. data/app/models/spree_cm_commissioner/service_calendar.rb +2 -0
  82. data/app/models/spree_cm_commissioner/state_decorator.rb +1 -0
  83. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +25 -26
  84. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +1 -2
  85. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  86. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +0 -17
  87. data/app/models/spree_cm_commissioner/stop.rb +23 -0
  88. data/app/models/spree_cm_commissioner/taxon_decorator.rb +6 -2
  89. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +6 -0
  90. data/app/models/spree_cm_commissioner/telegram_chat.rb +6 -0
  91. data/app/models/spree_cm_commissioner/trip.rb +10 -12
  92. data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
  93. data/app/models/spree_cm_commissioner/trip_stop.rb +3 -2
  94. data/app/models/spree_cm_commissioner/user_identity_provider.rb +26 -4
  95. data/app/models/spree_cm_commissioner/user_taxon.rb +1 -0
  96. data/app/models/spree_cm_commissioner/variant_decorator.rb +47 -36
  97. data/app/models/spree_cm_commissioner/variant_options.rb +23 -0
  98. data/app/models/spree_cm_commissioner/vehicle.rb +14 -9
  99. data/app/models/spree_cm_commissioner/vehicle_seat.rb +11 -0
  100. data/app/models/spree_cm_commissioner/vehicle_type.rb +76 -0
  101. data/app/models/spree_cm_commissioner/vendor_decorator.rb +13 -7
  102. data/app/models/spree_cm_commissioner/vendor_place.rb +5 -6
  103. data/app/models/spree_cm_commissioner/vendor_stop.rb +2 -1
  104. data/app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface +18 -0
  105. data/app/overrides/spree/admin/variants/_form/kyc_field.html.erb.deface +2 -2
  106. data/app/queries/spree_cm_commissioner/guest_searcher_query.rb +45 -3
  107. data/app/queries/spree_cm_commissioner/trip_query.rb +26 -23
  108. data/app/queries/spree_cm_commissioner/trip_search_query.rb +76 -0
  109. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +45 -0
  110. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +55 -0
  111. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +0 -3
  112. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  113. data/app/serializers/spree/v2/organizer/invite_crews_serializer.rb +11 -0
  114. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +0 -2
  115. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +0 -1
  116. data/app/serializers/spree/v2/tenant/user_serializer.rb +1 -0
  117. data/app/serializers/spree_cm_commissioner/v2/operator/dashboard_crew_event_serializer.rb +4 -1
  118. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_option_serializer.rb +1 -3
  119. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +1 -3
  120. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_dynamic_field_serializer.rb +2 -1
  121. data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +23 -15
  122. data/app/services/spree_cm_commissioner/user_authenticator.rb +1 -1
  123. data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +11 -0
  124. data/app/views/blazer/queries/_content.html.erb +8 -0
  125. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +2 -7
  126. data/app/views/spree/admin/stock_managements/index.html.erb +6 -55
  127. data/app/views/spree/admin/tenant_vendors/index.html.erb +9 -2
  128. data/app/views/spree/admin/tenants/_form.html.erb +118 -42
  129. data/app/views/spree/admin/tenants/edit.html.erb +2 -1
  130. data/app/views/spree/admin/tenants/index.html.erb +7 -1
  131. data/app/views/spree/admin/vendors/_form.html.erb +14 -0
  132. data/app/views/spree/order_mailer/confirm_email.html.erb +27 -16
  133. data/app/views/spree_cm_commissioner/layouts/order_mailer.html.erb +5 -1
  134. data/app/views/spree_cm_commissioner/order_mailer/_mailer_stylesheets.html.erb +41 -4
  135. data/app/views/spree_cm_commissioner/order_mailer/tenant/_customer_info.html.erb +42 -0
  136. data/app/views/spree_cm_commissioner/order_mailer/tenant/_footer.html.erb +25 -0
  137. data/app/views/spree_cm_commissioner/order_mailer/tenant/_greeting.html.erb +19 -0
  138. data/app/views/spree_cm_commissioner/order_mailer/tenant/_support_contact.html.erb +33 -0
  139. data/config/initializers/spree_permitted_attributes.rb +2 -5
  140. data/config/locales/en.yml +10 -1
  141. data/config/routes.rb +6 -22
  142. data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +1 -3
  143. data/db/migrate/20250616084219_add_description_to_cm_vendor_place.rb +5 -0
  144. data/db/migrate/20250630103536_create_cm_telegram_chats.rb +13 -0
  145. data/db/migrate/20250701093203_add_configurations_to_cm_dynamic_field.rb +6 -0
  146. data/db/migrate/20250702091305_add_dynamic_field_option_to_guest_dynamic_field.rb +5 -0
  147. data/db/migrate/20250702091935_add_status_to_dynamic_field_option.rb +5 -0
  148. data/db/migrate/20250707032008_add_vendor_id_to_spree_category.rb +7 -0
  149. data/db/migrate/20250709073455_add_email_fields_to_spree_vendors.rb +6 -0
  150. data/db/migrate/20250711092937_add_position_to_cm_dynamic_fields.rb +11 -0
  151. data/db/migrate/20250711093045_add_position_to_cm_dynamic_field_options.rb +11 -0
  152. data/db/migrate/20250714121508_rename_cm_taxon_blazer_query_to_blazer_queryables.rb +7 -0
  153. data/db/migrate/20250714124323_make_cm_blazer_queryables_polymorphic.rb +19 -0
  154. data/db/migrate/20250715103333_remove_indexes_from_cm_user_identity_providers.rb +13 -0
  155. data/db/migrate/20250718071620_add_data_fill_stage_to_dynamic_fields.rb +5 -0
  156. data/docker-compose.yml +1 -1
  157. data/lib/cm_app_logger.rb +4 -11
  158. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +11 -14
  159. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_dashboard/spree_cm_commissioner → spree_cm_commissioner}/utilities.js +0 -4
  160. data/lib/spree_cm_commissioner/calendar_event.rb +1 -11
  161. data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +12 -0
  162. data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +8 -0
  163. data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +8 -0
  164. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +0 -10
  165. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  166. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  167. data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +7 -0
  168. data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +30 -6
  169. data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +36 -0
  170. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +34 -18
  171. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  172. data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +14 -0
  173. data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +8 -0
  174. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +3 -10
  175. data/lib/spree_cm_commissioner/test_helper/factories/user_identity_provider_factory.rb +1 -1
  176. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +19 -41
  177. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
  178. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +8 -0
  179. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +96 -0
  180. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -1
  181. data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +11 -0
  182. data/lib/spree_cm_commissioner/version.rb +1 -1
  183. data/lib/spree_cm_commissioner.rb +1 -35
  184. data/spree_cm_commissioner.gemspec +0 -7
  185. metadata +66 -135
  186. data/app/controllers/spree/admin/inventory_items_controller.rb +0 -83
  187. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +0 -42
  188. data/app/finders/spree_cm_commissioner/accommodations/find.rb +0 -37
  189. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +0 -32
  190. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +0 -40
  191. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +0 -25
  192. data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +0 -44
  193. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +0 -13
  194. data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +0 -15
  195. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +0 -75
  196. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +0 -32
  197. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +0 -7
  198. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +0 -7
  199. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +0 -11
  200. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +0 -11
  201. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +0 -9
  202. data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +0 -44
  203. data/app/models/spree_cm_commissioner/block.rb +0 -23
  204. data/app/models/spree_cm_commissioner/inventory.rb +0 -11
  205. data/app/models/spree_cm_commissioner/inventory_item.rb +0 -69
  206. data/app/models/spree_cm_commissioner/price_decorator.rb +0 -9
  207. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -41
  208. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +0 -126
  209. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +0 -36
  210. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +0 -25
  211. data/app/models/spree_cm_commissioner/reserved_block.rb +0 -30
  212. data/app/models/spree_cm_commissioner/seat_layout.rb +0 -20
  213. data/app/models/spree_cm_commissioner/seat_section.rb +0 -16
  214. data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +0 -30
  215. data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +0 -53
  216. data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +0 -49
  217. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +0 -4
  218. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +0 -4
  219. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +0 -4
  220. data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +0 -4
  221. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -44
  222. data/app/models/spree_cm_commissioner/taxon_blazer_query.rb +0 -8
  223. data/app/models/spree_cm_commissioner/variant_block.rb +0 -9
  224. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +0 -19
  225. data/app/views/spree/admin/inventory_items/show.html.erb +0 -72
  226. data/app/views/spree/admin/stock_managements/calendar.html.erb +0 -56
  227. data/config/initializers/paper_trail.rb +0 -1
  228. data/db/migrate/20250304293518_create_cm_inventory_items.rb +0 -21
  229. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +0 -5
  230. data/db/migrate/20250502025848_add_index_to_spree_products.rb +0 -5
  231. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +0 -5
  232. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +0 -5
  233. data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +0 -7
  234. data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +0 -5
  235. data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +0 -5
  236. data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +0 -9
  237. data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +0 -5
  238. data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +0 -9
  239. data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +0 -5
  240. data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +0 -5
  241. data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +0 -5
  242. data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +0 -6
  243. data/db/migrate/20250620090001_create_cm_seat_layouts.rb +0 -17
  244. data/db/migrate/20250620090002_create_cm_seat_sections.rb +0 -18
  245. data/db/migrate/20250620090003_create_cm_blocks.rb +0 -18
  246. data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +0 -29
  247. data/db/migrate/20250626083642_create_cm_variant_blocks.rb +0 -24
  248. data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +0 -13
  249. data/lib/spree_cm_commissioner/cached_inventory_item.rb +0 -23
  250. data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +0 -9
  251. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +0 -9
  252. data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +0 -27
  253. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +0 -8
  254. data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +0 -8
  255. data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +0 -6
  256. data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +0 -7
  257. data/lib/tasks/create_default_non_permanent_inventory_items.rake +0 -16
  258. data/lib/tasks/ensure_correct_product_type.rake +0 -7
  259. data/lib/tasks/generate_inventory_items.rake +0 -7
@@ -0,0 +1,44 @@
1
+ module SpreeCmCommissioner
2
+ module Transit
3
+ module TaxonBitwise
4
+ extend ActiveSupport::Concern
5
+
6
+ BIT_STOP = 0b001
7
+ BIT_STATION = 0b010
8
+ BIT_BRANCH = 0b100
9
+ BIT_LOCATION = 0b1000
10
+
11
+ included do
12
+ attr_accessor :stop, :station, :branch, :location
13
+
14
+ before_validation :at_least_one_checkbox_selected
15
+ end
16
+
17
+ def stop?
18
+ data_type & BIT_STOP != 0
19
+ end
20
+
21
+ def station?
22
+ data_type & BIT_STATION != 0
23
+ end
24
+
25
+ def branch?
26
+ data_type & BIT_BRANCH != 0
27
+ end
28
+
29
+ def location?
30
+ data_type & BIT_LOCATION != 0
31
+ end
32
+
33
+ private
34
+
35
+ def at_least_one_checkbox_selected
36
+ if stop.nil? && station.nil? && branch.nil? && location.nil?
37
+ nil
38
+ elsif stop.to_i.zero? && station.to_i.zero? && branch.to_i.zero? && location.to_i.zero?
39
+ errors.add(:base, 'At least one checkbox (stop, branch, or location) must be selected')
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -2,21 +2,28 @@ module Spree
2
2
  module Admin
3
3
  class EventBlazerQueriesController < Spree::Admin::ResourceController
4
4
  def model_class
5
- SpreeCmCommissioner::TaxonBlazerQuery
5
+ SpreeCmCommissioner::BlazerQueryable
6
6
  end
7
7
 
8
8
  def object_name
9
- 'spree_cm_commissioner_taxon_blazer_query'
9
+ 'spree_cm_commissioner_blazer_queryable'
10
10
  end
11
11
 
12
12
  def create
13
- event_blazer = SpreeCmCommissioner::TaxonBlazerQuery.new(taxon_id: params[:event_id], blazer_query_id: params[:blazer_query_id])
13
+ queryable = Spree::Taxon.find(params[:event_id])
14
+
15
+ event_blazer = SpreeCmCommissioner::BlazerQueryable.new(
16
+ queryable: queryable,
17
+ blazer_query_id: params[:blazer_query_id]
18
+ )
19
+
14
20
  if event_blazer.save
15
21
  flash[:success] = I18n.t('event_blazer_queries.success')
16
22
  else
17
23
  flash[:alert] = event_blazer.errors.full_messages.join(', ')
18
24
  end
19
- redirect_to blazer.query_path(id: event_blazer.blazer_query_id, event_id: event_blazer.taxon_id)
25
+
26
+ redirect_to blazer.query_path(id: event_blazer.blazer_query_id, event_id: queryable.id)
20
27
  end
21
28
  end
22
29
  end
@@ -5,8 +5,6 @@ module Spree
5
5
 
6
6
  before_action :load_parent
7
7
 
8
- helper_method :inventory_item_message
9
-
10
8
  def load_parent
11
9
  @product = Spree::Product.find_by(slug: params[:product_id])
12
10
  end
@@ -14,59 +12,9 @@ module Spree
14
12
  def index
15
13
  @variants = @product.variants.includes(:images, stock_items: :stock_location, option_values: :option_type)
16
14
  @variants = [@product.master] if @variants.empty?
17
- @stock_locations = (@variants.flat_map(&:stock_locations) + @product.vendor.stock_locations).uniq
18
-
19
- load_inventories unless @product.permanent_stock?
20
- end
21
-
22
- def create
23
- result = SpreeCmCommissioner::Stock::StockMovementCreator.call(
24
- variant_id: params[:variant_id],
25
- stock_location_id: params[:stock_location_id],
26
- current_store: current_store,
27
- stock_movement_params: stock_movement_params
28
- )
29
-
30
- if result.success?
31
- flash[:success] = flash_message_for(result.stock_movement, :successfully_created)
32
- else
33
- flash[:error] = result.message
34
- end
35
-
36
- redirect_back fallback_location: admin_product_stock_managements_path(@product)
37
- end
38
-
39
- # GET /products/:slug/stock_managements/calendar?year=
40
- def calendar
41
- @year = params[:year].present? ? params[:year].to_i : Time.zone.today.year
42
15
 
43
- from_date = Date.new(@year, 1, 1).beginning_of_year
44
- to_date = Date.new(@year, 1, 1).end_of_year
45
-
46
- @inventory_items = @product.inventory_items.includes(:variant, :prices).where(inventory_date: from_date..to_date).to_a
47
- @cached_inventory_items = ::SpreeCmCommissioner::RedisStock::CachedInventoryItemsBuilder.new(@inventory_items)
48
- .call
49
- .index_by(&:inventory_item_id)
50
- @events = SpreeCmCommissioner::CalendarEvent.from_inventory_items(@inventory_items)
51
- end
52
-
53
- def inventory_item_message(inventory_item, cached_inventory_item)
54
- synced = inventory_item.quantity_available == cached_inventory_item.quantity_available
55
-
56
- if synced
57
- "Synced: Quantity available matches in both DB and Redis (#{cached_inventory_item.quantity_available})."
58
- else
59
- "Out of sync: Redis shows #{cached_inventory_item.quantity_available} available, which doesn't match the database."
60
- end
61
- end
62
-
63
- private
16
+ @stock_locations = (@variants.flat_map(&:stock_locations) + @product.vendor.stock_locations).uniq
64
17
 
65
- def load_inventories
66
- @inventory_items = @product.inventory_items.group_by { |item| item.variant.id }
67
- @cached_inventory_items = ::SpreeCmCommissioner::RedisStock::CachedInventoryItemsBuilder.new(@product.inventory_items)
68
- .call
69
- .index_by(&:inventory_item_id)
70
18
  @reserved_stocks = Spree::LineItem
71
19
  .complete
72
20
  .where(variant_id: @variants.pluck(:id))
@@ -77,16 +25,6 @@ module Spree
77
25
  def model_class
78
26
  Spree::StockItem
79
27
  end
80
-
81
- # This method processes the parameters for stock movement creation.
82
- # Expected attributes for `stock_movement` include:
83
- # - :quantity (Integer): The quantity of stock to move.
84
- # - :action (String): The type of stock movement (e.g., "add" or "remove").
85
- # - :originator_id, :originator_ty (String, optional): The ID and type of the entity creating the stock movement.
86
- # Ensure that `permitted_stock_movement_attributes` is updated to reflect any changes.
87
- def stock_movement_params
88
- params.require(:stock_movement).permit(permitted_stock_movement_attributes)
89
- end
90
28
  end
91
29
  end
92
30
  end
@@ -1,6 +1,8 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class TenantsController < Spree::Admin::ResourceController
4
+ before_action :load_vector_icons, only: %i[new edit]
5
+
4
6
  # override
5
7
  def collection
6
8
  params[:q] = {} if params[:q].blank?
@@ -31,6 +33,12 @@ module Spree
31
33
  def collection_url(options = {})
32
34
  admin_tenants_url(options)
33
35
  end
36
+
37
+ private
38
+
39
+ def load_vector_icons
40
+ @vector_icons = SpreeCmCommissioner::VectorIcon.all
41
+ end
34
42
  end
35
43
  end
36
44
  end
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ module Admin
3
+ class TripBlazerQueriesController < Spree::Admin::ResourceController
4
+ def model_class
5
+ SpreeCmCommissioner::BlazerQueryable
6
+ end
7
+
8
+ def object_name
9
+ 'spree_cm_commissioner_blazer_queryable'
10
+ end
11
+
12
+ def create
13
+ queryable = SpreeCmCommissioner::Trip.find_by(id: params[:trip_id])
14
+
15
+ if queryable.nil?
16
+ flash[:alert] = I18n.t('trip_blazer_queries.not_found')
17
+ redirect_to request.referer || spree.admin_trips_path and return
18
+ end
19
+
20
+ trip_blazer = SpreeCmCommissioner::BlazerQueryable.new(
21
+ queryable: queryable,
22
+ blazer_query_id: params[:blazer_query_id]
23
+ )
24
+
25
+ if trip_blazer.save
26
+ flash[:success] = I18n.t('trip_blazer_queries.success')
27
+ else
28
+ flash[:alert] = trip_blazer.errors.full_messages.join(', ')
29
+ end
30
+
31
+ redirect_to blazer.query_path(id: trip_blazer.blazer_query_id, trip_id: queryable.id)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,33 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Organizer
5
+ class InviteCrewsController < ::Spree::Api::V2::Organizer::BaseController
6
+ def show
7
+ render_serialized_payload { serialize_resource(invite) }
8
+ end
9
+
10
+ def update
11
+ context = SpreeCmCommissioner::CrewInviteLinkHandler.call(
12
+ params: params
13
+ )
14
+
15
+ if context.success?
16
+ render_serialized_payload { serialize_resource(context.invite) }
17
+ else
18
+ render_error_payload(context.message || I18n.t('invite.accept_fail'))
19
+ end
20
+ end
21
+
22
+ def invite
23
+ @invite ||= SpreeCmCommissioner::Invite.find_by!(token: params[:id])
24
+ end
25
+
26
+ def resource_serializer
27
+ ::Spree::V2::Organizer::InviteCrewsSerializer
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -20,7 +20,7 @@ module Spree
20
20
 
21
21
  if guest.save
22
22
  @invite_guest.update(claimed_status: :claimed) if @line_item.guests.count == @invite_guest.quantity
23
- send_guest_claimed_invitation_telegram_alert_to_vendor(guest)
23
+ send_guest_claimed_invitation_telegram_alert_to_vendor(guest) if guest.event.vendor.preferred_telegram_chat_id.present?
24
24
 
25
25
  render json: SpreeCmCommissioner::V2::Storefront::GuestSerializer.new(guest.reload).serializable_hash
26
26
  else
@@ -5,38 +5,55 @@ module Spree
5
5
  class AccommodationsController < ::Spree::Api::V2::ResourceController
6
6
  private
7
7
 
8
- # override
9
8
  def collection
10
- @collection ||= SpreeCmCommissioner::Accommodations::Find.new(
11
- from_date: params[:from_date]&.to_date,
12
- to_date: params[:to_date]&.to_date,
13
- state_id: params[:province_id],
14
- number_of_adults: params[:adult].to_i,
15
- number_of_kids: params[:children].to_i
16
- ).execute
9
+ @collection ||= collection_finder.call(params: params).value
10
+ end
11
+
12
+ def paginated_collection
13
+ return @paginated_collection if defined?(@paginated_collection)
14
+
15
+ @paginated_collection = super
16
+ @paginated_collection = apply_service_availability(@paginated_collection)
17
17
  end
18
18
 
19
- # override
20
19
  def resource
21
- @resource ||= collection.find_by!(slug: params[:id])
20
+ resource = resource_finder.call(params: params).value
21
+ raise ActiveRecord::RecordNotFound if resource.nil?
22
+
23
+ apply_service_availability(resource)
24
+ end
25
+
26
+ def apply_service_availability(resource)
27
+ SpreeCmCommissioner::ApplyServiceAvailability.call(calendarable: resource,
28
+ from_date: params[:from_date].to_date,
29
+ to_date: params[:to_date].to_date
30
+ ).value
22
31
  end
23
32
 
24
- # override
25
33
  def allowed_sort_attributes
26
34
  super << :min_price << :max_price
27
35
  end
28
36
 
29
- # override
37
+ def model_class
38
+ Spree::Vendor
39
+ end
40
+
30
41
  def resource_serializer
31
42
  Spree::V2::Storefront::AccommodationSerializer
32
43
  end
33
44
 
34
- # override
35
45
  def collection_serializer
36
46
  Spree::V2::Storefront::AccommodationSerializer
37
47
  end
38
48
 
39
- # override
49
+ def collection_finder
50
+ SpreeCmCommissioner::AccommodationSearchDetail
51
+ end
52
+
53
+ def resource_finder
54
+ SpreeCmCommissioner::AccommodationSearchDetail
55
+ end
56
+
40
57
  def required_schema
41
58
  SpreeCmCommissioner::AccommodationRequestSchema
42
59
  end
@@ -8,7 +8,11 @@ module Spree
8
8
  return @collection if defined?(@collection)
9
9
  return SpreeCmCommissioner::DynamicFieldOption.none if params[:dynamic_field_id].blank?
10
10
 
11
- @collection = SpreeCmCommissioner::DynamicFieldOption.where(dynamic_field_id: params[:dynamic_field_id])
11
+ @collection = SpreeCmCommissioner::DynamicFieldOption
12
+ .where(dynamic_field_id: params[:dynamic_field_id])
13
+ .active
14
+ .order(position: :asc)
15
+
12
16
  @collection = @collection.where('value LIKE ?', "%#{params[:query]}%") if params[:query].present?
13
17
  @collection
14
18
  end
@@ -38,10 +38,25 @@ module Spree
38
38
  def update
39
39
  spree_authorize! :update, spree_current_order, order_token
40
40
 
41
- if resource.update(guest_params)
41
+ begin
42
+ ActiveRecord::Base.transaction do
43
+ if guest_params[:guest_dynamic_fields_attributes]
44
+ dynamic_field_ids = guest_params[:guest_dynamic_fields_attributes].pluck(:dynamic_field_id)
45
+ resource.guest_dynamic_fields.where(dynamic_field_id: dynamic_field_ids).destroy_all
46
+
47
+ guest_params[:guest_dynamic_fields_attributes].each do |attr|
48
+ field = build_dynamic_field(attr)
49
+ field.save!
50
+ end
51
+ end
52
+
53
+ resource.assign_attributes(guest_params.except(:guest_dynamic_fields_attributes))
54
+ resource.save!
55
+ end
56
+
42
57
  render_serialized_payload { serialize_resource(resource) }
43
- else
44
- render_error_payload(resource, 400)
58
+ rescue ActiveRecord::RecordInvalid => e
59
+ render_error_payload(e.record.errors, 400)
45
60
  end
46
61
  end
47
62
 
@@ -76,9 +91,20 @@ module Spree
76
91
  :upload_later,
77
92
  :country_code,
78
93
  :contact,
79
- guest_dynamic_fields_attributes: %i[id dynamic_field_id value _destroy]
94
+ guest_dynamic_fields_attributes: %i[id dynamic_field_id dynamic_field_option_id value _destroy]
80
95
  )
81
96
  end
97
+
98
+ def build_dynamic_field(attr)
99
+ field = resource.guest_dynamic_fields.build(attr.except(:id))
100
+
101
+ if field.dynamic_field.requires_dynamic_field_options?
102
+ option = field.dynamic_field.dynamic_field_options.find_by(id: field.value)
103
+ field.dynamic_field_option = option if option
104
+ end
105
+
106
+ field
107
+ end
82
108
  end
83
109
  end
84
110
  end
@@ -12,9 +12,9 @@ module Spree
12
12
  spree_authorize! :update, spree_current_order, order_token
13
13
  spree_authorize! :show, @variant
14
14
 
15
- availability_checker = SpreeCmCommissioner::Stock::AvailabilityChecker.new(@variant, add_item_params[:options])
15
+ availability_checker = SpreeCmCommissioner::Stock::AvailabilityChecker.new(@variant)
16
16
 
17
- unless availability_checker.can_supply?(add_item_params[:quantity].to_i)
17
+ unless availability_checker.can_supply?(add_item_params[:quantity].to_i, add_item_params[:options])
18
18
  return render_error_payload(availability_checker.error_message || I18n.t('variant_availability.items_out_of_stock'))
19
19
  end
20
20
 
@@ -27,6 +27,8 @@ module Spree
27
27
  end
28
28
 
29
29
  def complete
30
+ return render_serialized_payload { serialized_current_order } if spree_current_order.confirm? || spree_current_order.complete?
31
+
30
32
  spree_authorize! :update, spree_current_order, order_token
31
33
 
32
34
  result = complete_service.call(order: spree_current_order)
@@ -37,7 +37,7 @@ module SpreeCmCommissioner
37
37
  bit_fields = SpreeCmCommissioner::KycBitwise::BIT_FIELDS.keys
38
38
 
39
39
  if permitted_resource_params[:use_product_kyc] == '1'
40
- permitted_resource_params[:kyc] = @product.kyc
40
+ permitted_resource_params[:kyc] = nil
41
41
  else
42
42
  @kyc_result = calculate_kyc_value(params[:variant])
43
43
  permitted_resource_params[:kyc] = @kyc_result
@@ -6,6 +6,17 @@ module SpreeCmCommissioner
6
6
  def self.prepended(base)
7
7
  base.include SpreeCmCommissioner::OrderConcern
8
8
  end
9
+
10
+ # Override Spree's default behavior:
11
+ # By default, Spree raises an error if `complete` is called on a completed or confirmed order.
12
+ # We want to allow this call to succeed, so the API can be used both to:
13
+ # - complete the order (if it's not yet complete), or
14
+ # - return the latest state of a confirmed or completed order without raising a forbidden error.
15
+ def complete
16
+ return render_serialized_payload { serialized_current_order } if spree_current_order.confirm? || spree_current_order.complete?
17
+
18
+ super
19
+ end
9
20
  end
10
21
  end
11
22
  end
@@ -3,18 +3,42 @@ module SpreeCmCommissioner
3
3
  before_action :identify_request_source
4
4
  rescue_from StandardError, with: :handle_error
5
5
 
6
- def show
7
- case params[:id]
8
- when 'assetlinks.json'
9
- render_preference(:preferred_assetlinks)
10
- when 'apple-app-site-association'
11
- render_preference(:preferred_apple_app_site_association)
6
+ def assetlinks_json
7
+ render_platform_link(:android)
8
+ end
9
+
10
+ def apple_app_site_association
11
+ render_platform_link(:ios)
12
+ end
13
+
14
+ private
15
+
16
+ def render_platform_link(platform)
17
+ fetcher_class = platform_link_finder(platform)
18
+
19
+ result = fetcher_class.call(
20
+ store: @store,
21
+ tenant: @tenant,
22
+ refreshed: params[:_refreshed].present?
23
+ )
24
+
25
+ if result.success? && result.contents.present?
26
+ render json: result.contents
12
27
  else
13
28
  render_not_found
14
29
  end
15
30
  end
16
31
 
17
- private
32
+ def platform_link_finder(platform)
33
+ case platform
34
+ when :android
35
+ SpreeCmCommissioner::AssetLinksFetcher
36
+ when :ios
37
+ SpreeCmCommissioner::AppleAppSiteAssociationFetcher
38
+ else
39
+ render_not_found
40
+ end
41
+ end
18
42
 
19
43
  def identify_request_source
20
44
  host = params[:original_host].presence || request.host.downcase
@@ -25,16 +49,6 @@ module SpreeCmCommissioner
25
49
  @tenant = result.tenant
26
50
  end
27
51
 
28
- def render_preference(preference_key)
29
- if @store&.send(preference_key).present?
30
- render json: @store.send(preference_key)
31
- elsif @tenant&.send(preference_key).present?
32
- render json: @tenant.send(preference_key)
33
- else
34
- render_not_found
35
- end
36
- end
37
-
38
52
  def render_not_found
39
53
  render json: { error: 'Not found' }, status: :not_found
40
54
  end
@@ -1,26 +1,16 @@
1
- # šŸŽŸļø --- [TICKET CLAIMED] ---
1
+ # šŸŽ« --- [NEW INVITATION CLAIMED] ---
2
2
  #
3
- # Order Number:
4
- # <code>R621016753</code>
5
- #
6
- # āœ… <b>Ticket Successfully Claimed!</b>
7
- #
8
- # [ x1 ]
9
- # <b>5km Running Ticket</b>
10
- # <i>šŸ‘‰ Distance: 5km, T-shirt: M</i>
11
- # <i>šŸ—“ļø Nov 15, 2023</i>
12
- # <i>šŸŖ Temple Run with Sai</i>
3
+ # <b>šŸ™ Claimed By</b>
4
+ # Name: Orng SreyMoch
5
+ # Tel: <code>+85570760548</code>
13
6
  #
14
- # [ x2 ]
15
7
  # <b>5km Running Ticket</b>
8
+ # Quantity: 1
16
9
  # <i>šŸ‘‰ Distance: 5km, T-shirt: S</i>
17
10
  # <i>šŸ—“ļø Nov 15, 2023 -> Nov 17, 2023</i>
18
- # <i>šŸŖ Temple Run with Sai</i>
19
11
  #
20
- # <b>šŸ™ Claimed By</b>
21
- # Name: Vaneath Awesome
22
- # Tel: <code>+85570760548</code>
23
- # Email: <code>admin_dev@cm.com</code>
12
+ # Order Number:
13
+ # <code>R621016753</code>
24
14
 
25
15
  module SpreeCmCommissioner
26
16
  class InviteGuestClaimedTelegramMessageFactory < TelegramMessageFactory
@@ -36,85 +26,37 @@ module SpreeCmCommissioner
36
26
  end
37
27
 
38
28
  def selected_line_items
39
- return order.line_items.for_vendor(vendor) if vendor.present?
40
-
41
- order.line_items
29
+ vendor.present? ? order.line_items.for_vendor(vendor) : order.line_items
42
30
  end
43
31
 
44
32
  # override
45
33
  def body
46
34
  text = []
47
- text << "Order Number:\n<code>#{order.number}</code>\n"
48
- text << "\nāœ… <b>Ticket Successfully Claimed!</b>\n"
49
- text << selected_line_items.map { |item| line_item_content(item) }.compact.join("\n\n")
50
- text.compact.join("\n")
51
- end
52
35
 
53
- def line_item_content(line_item)
54
- text = []
36
+ text << bold('šŸ™ Claimed By')
37
+ text << "Name: #{guest.first_name} #{guest.last_name}"
38
+ text << "Tel: #{inline_code(guest.phone_number)}"
39
+ text << ''
40
+
41
+ selected_line_items.each do |item|
42
+ text << bold(item.product.name.to_s)
43
+ text << "šŸŽŸļø Quantity: #{item.quantity}"
44
+ text << italic("šŸ‘‰ #{item.options_text}") if item.options_text.present?
45
+ text << italic(pretty_date_for(item)) if item.date_present?
46
+ text << ''
47
+ end
55
48
 
56
- text << bold(line_item.product.name.to_s)
57
- text << "Quantity: #{line_item.quantity}"
58
- text << italic("šŸ‘‰ #{line_item.options_text}") if line_item.options_text.present?
59
- text << italic(pretty_date_for(line_item)) if pretty_date_for(line_item).present?
60
- text << italic("šŸŖ #{line_item.vendor.name}") if line_item.vendor&.name.present? && vendor.blank?
49
+ text << bold('Order Number:')
50
+ text << inline_code(order.number)
61
51
 
62
52
  text.compact.join("\n")
63
53
  end
64
54
 
65
55
  def pretty_date_for(line_item)
66
- return nil unless line_item.date_present?
67
-
68
56
  from_date = pretty_date(line_item.from_date)
69
57
  to_date = pretty_date(line_item.to_date)
70
58
 
71
- if from_date == to_date
72
- "šŸ—“ļø #{from_date}"
73
- else
74
- "šŸ—“ļø #{from_date} -> #{to_date}"
75
- end
76
- end
77
-
78
- # override
79
- def footer
80
- text = []
81
-
82
- text << bold('šŸ™ Claimed By')
83
- text << "Name: #{guest.first_name} #{guest.last_name}" if guest.first_name.present? || guest.last_name.present?
84
- text << "Tel: #{inline_code(guest.intel_phone_number)}" if guest.intel_phone_number.present?
85
-
86
- if show_details_link && order.guests.any?
87
- text << ''
88
- text << 'View Tickets:'
89
- text += generate_guests_links(order.guests)
90
- end
91
-
92
- text.compact.join("\n")
93
- end
94
-
95
- # Result:
96
- # | No. A24 | No. A24 |
97
- # | No. A24 | No. A24 |
98
- # | No. A24 | No. A24 |
99
- # | No. A24 | No. A24 |
100
- # | No. A24 | No. A24 |
101
- # | No. A24 |
102
- def generate_guests_links(guests, guests_per_row = 2)
103
- rows = (guests.size.to_f / guests_per_row).ceil
104
- formatted_rows = []
105
-
106
- rows.times do |i|
107
- row_guests = guests.slice(i * guests_per_row, guests_per_row)
108
- formatted_row = row_guests.map do |guest|
109
- button_label = guest.seat_number.present? ? "No. #{guest.seat_number}" : "No. #{guest.formatted_bib_number || 'N/A'}"
110
- link = Rails.application.routes.url_helpers.guest_cards_url(guest.token)
111
- "| <a href='#{link}'>#{button_label}</a>"
112
- end.join(' ')
113
-
114
- formatted_rows << ("#{formatted_row} |")
115
- end
116
-
117
- formatted_rows
59
+ from_date == to_date ? "šŸ—“ļø #{from_date}" : "šŸ—“ļø #{from_date} -> #{to_date}"
118
60
  end
119
61
  end
120
62
  end
@@ -0,0 +1,20 @@
1
+ module SpreeCmCommissioner
2
+ module LineItems
3
+ module FindByVariantDecorator
4
+ # ovveride
5
+ def execute(order:, variant:, options: {})
6
+ return super unless variant.product.product_type == 'transit'
7
+
8
+ order.line_items.detect do |line_item|
9
+ next if options[:date].present? && !(line_item.variant_id == variant.id && line_item.date == options[:date])
10
+
11
+ Spree::Dependencies.cart_compare_line_items_service.constantize.call(order: order, line_item: line_item, options: options).value
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ unless Spree::LineItems::FindByVariant.included_modules.include?(SpreeCmCommissioner::LineItems::FindByVariantDecorator)
19
+ Spree::LineItems::FindByVariant.prepend(SpreeCmCommissioner::LineItems::FindByVariantDecorator)
20
+ end