spree_cm_commissioner 2.0.3.pre.pre.pre7 → 2.1.0.pre.pre1

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 (253) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_and_build_gem.yml +16 -2
  3. data/.gitignore +2 -1
  4. data/Gemfile.lock +39 -4
  5. data/Rakefile +33 -4
  6. data/app/assets/stylesheets/spree_cm_commissioner/backend/calendar.scss +8 -11
  7. data/app/controllers/spree/admin/inventory_items_controller.rb +83 -0
  8. data/app/controllers/spree/admin/locations_controller.rb +62 -0
  9. data/app/controllers/spree/admin/stock_managements_controller.rb +63 -1
  10. data/app/controllers/spree/api/v2/platform/places_controller.rb +4 -1
  11. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +42 -0
  12. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +14 -31
  13. data/app/controllers/spree/api/v2/storefront/dynamic_fields_controller.rb +1 -1
  14. data/app/controllers/spree/api/v2/storefront/guests_controller.rb +26 -18
  15. data/app/controllers/spree/api/v2/storefront/inventory_items_controller.rb +57 -0
  16. data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
  17. data/app/controllers/spree/api/v2/storefront/transit/draft_orders_controller.rb +46 -0
  18. data/app/controllers/spree/api/v2/storefront/trip_places_controller.rb +29 -0
  19. data/app/controllers/spree/api/v2/storefront/trip_search_controller.rb +62 -0
  20. data/app/controllers/spree/api/v2/storefront/trips_controller.rb +24 -0
  21. data/app/finders/spree_cm_commissioner/accommodations/find.rb +37 -0
  22. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +32 -0
  23. data/app/interactors/spree_cm_commissioner/billing_address_creator.rb +33 -0
  24. data/app/interactors/spree_cm_commissioner/customer_notification_sender.rb +7 -2
  25. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +40 -0
  26. data/app/interactors/spree_cm_commissioner/fetch_facebook_user_data.rb +45 -0
  27. data/app/interactors/spree_cm_commissioner/google_places_fetcher.rb +1 -0
  28. data/app/interactors/spree_cm_commissioner/intercity_taxi_order_creator.rb +106 -0
  29. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +25 -0
  30. data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +44 -0
  31. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +13 -0
  32. data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +15 -0
  33. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +75 -0
  34. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +32 -0
  35. data/app/interactors/spree_cm_commissioner/taxi_trip_creator.rb +66 -0
  36. data/app/interactors/spree_cm_commissioner/transit/draft_order_creator.rb +136 -0
  37. data/app/interactors/spree_cm_commissioner/trip_clone_creator.rb +155 -0
  38. data/app/interactors/spree_cm_commissioner/user_fb_token_authenticator.rb +37 -0
  39. data/app/interactors/spree_cm_commissioner/user_fb_token_checker.rb +20 -0
  40. data/app/interactors/spree_cm_commissioner/user_identity_checker.rb +8 -8
  41. data/app/interactors/spree_cm_commissioner/user_registration_with_fb_token.rb +62 -0
  42. data/app/interactors/spree_cm_commissioner/variant_block_updater.rb +62 -0
  43. data/app/interactors/spree_cm_commissioner/vehicle_updater.rb +41 -0
  44. data/app/jobs/spree_cm_commissioner/application_job.rb +20 -0
  45. data/app/jobs/spree_cm_commissioner/application_unique_job.rb +20 -0
  46. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +7 -0
  47. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +7 -0
  48. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +11 -0
  49. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +11 -0
  50. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +9 -0
  51. data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +18 -15
  52. data/app/models/concerns/spree_cm_commissioner/line_item_guests_concern.rb +29 -15
  53. data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +144 -0
  54. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +3 -12
  55. data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +44 -0
  56. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +39 -0
  57. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +1 -3
  58. data/app/models/concerns/spree_cm_commissioner/product_type.rb +10 -0
  59. data/app/models/concerns/spree_cm_commissioner/route_type.rb +1 -1
  60. data/app/models/concerns/spree_cm_commissioner/user_identity.rb +12 -4
  61. data/app/models/concerns/spree_cm_commissioner/variant_options_concern.rb +1 -0
  62. data/app/models/concerns/spree_cm_commissioner/vehicle_type.rb +11 -0
  63. data/app/models/spree_cm_commissioner/address_decorator.rb +36 -2
  64. data/app/models/spree_cm_commissioner/block.rb +43 -0
  65. data/app/models/spree_cm_commissioner/customer_notification.rb +6 -1
  66. data/app/models/spree_cm_commissioner/dynamic_field.rb +2 -0
  67. data/app/models/spree_cm_commissioner/guest.rb +39 -0
  68. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +4 -0
  69. data/app/models/spree_cm_commissioner/inventory.rb +11 -0
  70. data/app/models/spree_cm_commissioner/inventory_item.rb +82 -0
  71. data/app/models/spree_cm_commissioner/line_item_decorator.rb +47 -78
  72. data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
  73. data/app/models/spree_cm_commissioner/option_type_decorator.rb +1 -11
  74. data/app/models/spree_cm_commissioner/order/address_book_decorator.rb +30 -12
  75. data/app/models/spree_cm_commissioner/order_decorator.rb +38 -1
  76. data/app/models/spree_cm_commissioner/place.rb +3 -4
  77. data/app/models/spree_cm_commissioner/price_decorator.rb +9 -0
  78. data/app/models/spree_cm_commissioner/product_decorator.rb +13 -10
  79. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +41 -0
  80. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +126 -0
  81. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +36 -0
  82. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +25 -0
  83. data/app/models/spree_cm_commissioner/reserved_block.rb +31 -0
  84. data/app/models/spree_cm_commissioner/saved_guest.rb +21 -0
  85. data/app/models/spree_cm_commissioner/seat_layout.rb +20 -0
  86. data/app/models/spree_cm_commissioner/seat_section.rb +16 -0
  87. data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +30 -0
  88. data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +53 -0
  89. data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +49 -0
  90. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +4 -0
  91. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +4 -0
  92. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +4 -0
  93. data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +4 -0
  94. data/app/models/spree_cm_commissioner/service_calendar.rb +0 -2
  95. data/app/models/spree_cm_commissioner/state_decorator.rb +0 -1
  96. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +26 -25
  97. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +2 -1
  98. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  99. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +44 -0
  100. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +17 -0
  101. data/app/models/spree_cm_commissioner/taxon_decorator.rb +7 -1
  102. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +0 -6
  103. data/app/models/spree_cm_commissioner/trip.rb +19 -10
  104. data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
  105. data/app/models/spree_cm_commissioner/trip_stop.rb +10 -21
  106. data/app/models/spree_cm_commissioner/variant_block.rb +17 -0
  107. data/app/models/spree_cm_commissioner/variant_decorator.rb +37 -47
  108. data/app/models/spree_cm_commissioner/variant_options.rb +4 -23
  109. data/app/models/spree_cm_commissioner/vehicle.rb +12 -15
  110. data/app/models/spree_cm_commissioner/vendor_decorator.rb +14 -14
  111. data/app/models/spree_cm_commissioner/vendor_place.rb +13 -3
  112. data/app/overrides/spree/admin/shared/sub_menu/_configuration/locations_tab.html.erb.deface +5 -0
  113. data/app/queries/spree_cm_commissioner/trip_query.rb +110 -131
  114. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +3 -0
  115. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  116. data/app/request_schemas/spree_cm_commissioner/inventory_item_schema.rb +8 -0
  117. data/app/request_schemas/spree_cm_commissioner/trip_search_request_schema.rb +20 -0
  118. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +19 -0
  119. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +2 -0
  120. data/app/serializers/spree/v2/storefront/cart_serializer_decorator.rb +1 -0
  121. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +3 -1
  122. data/app/serializers/spree/v2/storefront/user_serializer_decorator.rb +1 -0
  123. data/app/serializers/spree_cm_commissioner/v2/storefront/amenity_serializer.rb +15 -0
  124. data/app/serializers/spree_cm_commissioner/v2/storefront/block_serializer.rb +11 -0
  125. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_serializer.rb +5 -1
  126. data/app/serializers/spree_cm_commissioner/v2/storefront/inventory_item_serializer.rb +42 -0
  127. data/app/serializers/spree_cm_commissioner/v2/storefront/reserved_block_serializer.rb +9 -0
  128. data/app/serializers/spree_cm_commissioner/v2/storefront/saved_guest_serializer.rb +21 -0
  129. data/app/serializers/spree_cm_commissioner/v2/storefront/seat_layout_serializer.rb +12 -0
  130. data/app/serializers/spree_cm_commissioner/v2/storefront/seat_section_serializer.rb +11 -0
  131. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_place_serializer.rb +10 -0
  132. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_query_result_serializer.rb +14 -0
  133. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_result_serializer.rb +17 -0
  134. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_serializer.rb +20 -0
  135. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_stop_serializer.rb +11 -0
  136. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_variant_serializer.rb +12 -0
  137. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vehicle_serializer.rb +16 -0
  138. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vendor_serializer.rb +16 -0
  139. data/app/serializers/spree_cm_commissioner/v2/storefront/variant_block_serializer.rb +9 -0
  140. data/app/services/spree_cm_commissioner/transit/legs_builder_service.rb +46 -0
  141. data/app/services/spree_cm_commissioner/user_authenticator.rb +10 -1
  142. data/app/views/shared/_map.html.erb +5 -4
  143. data/app/views/spree/admin/customer_notifications/_form.html.erb +3 -3
  144. data/app/views/spree/admin/inventory_items/show.html.erb +72 -0
  145. data/app/views/spree/admin/locations/_form.html.erb +133 -0
  146. data/app/views/spree/admin/locations/edit.html.erb +11 -0
  147. data/app/views/spree/admin/locations/index.html.erb +67 -0
  148. data/app/views/spree/admin/locations/new.html.erb +11 -0
  149. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +7 -2
  150. data/app/views/spree/admin/stock_managements/calendar.html.erb +56 -0
  151. data/app/views/spree/admin/stock_managements/index.html.erb +55 -6
  152. data/config/initializers/paper_trail.rb +1 -0
  153. data/config/initializers/spree_permitted_attributes.rb +24 -4
  154. data/config/locales/en.yml +2 -0
  155. data/config/routes.rb +32 -2
  156. data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +3 -1
  157. data/db/migrate/20250122000000_move_route_type_from_vehicles_to_trips.rb +7 -0
  158. data/db/migrate/20250304293518_create_cm_inventory_items.rb +21 -0
  159. data/db/migrate/20250428092706_add_active_to_cm_customer_notifications.rb +7 -0
  160. data/db/migrate/20250428103550_remove_tenant_id_and_vendor_id_from_cm_customer_notifications.rb +9 -0
  161. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +5 -0
  162. data/db/migrate/20250502025848_add_index_to_spree_products.rb +5 -0
  163. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +5 -0
  164. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +5 -0
  165. data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +7 -0
  166. data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +5 -0
  167. data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +5 -0
  168. data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +9 -0
  169. data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +5 -0
  170. data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +9 -0
  171. data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +5 -0
  172. data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +5 -0
  173. data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +5 -0
  174. data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +6 -0
  175. data/db/migrate/20250620090001_create_cm_seat_layouts.rb +17 -0
  176. data/db/migrate/20250620090002_create_cm_seat_sections.rb +18 -0
  177. data/db/migrate/20250620090003_create_cm_blocks.rb +18 -0
  178. data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +29 -0
  179. data/db/migrate/20250626083642_create_cm_variant_blocks.rb +24 -0
  180. data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +13 -0
  181. data/db/migrate/20250716022821_add_location_reference_to_cm_vendor_places.rb +5 -0
  182. data/db/migrate/20250716031743_drop_table_cm_vendor_stops.rb +5 -0
  183. data/db/migrate/20250717023824_add_vendor_reference_to_cm_trips.rb +5 -0
  184. data/db/migrate/20250717041414_add_location_place_reference_to_cm_trip_stops.rb +5 -0
  185. data/db/migrate/20250717042539_rename_cm_trip_stops_stop_id_column_to_stop_place_id.rb +7 -0
  186. data/db/migrate/20250717042707_rename_cm_trips_origin_and_destination_to_origin_place_and_destination_place.rb +11 -0
  187. data/db/migrate/20250721080738_add_vehicle_type_to_cm_vehicles.rb +7 -0
  188. data/db/migrate/20250725092713_add_block_type_to_cm_blocks.rb +5 -0
  189. data/db/migrate/20250731062816_add_departure_time_and_arrival_time_to_trip_stop.rb +6 -0
  190. data/db/migrate/20250807033035_create_spree_cm_commissioner_saved_guests.rb +23 -0
  191. data/db/migrate/20250807040000_generate_pickup_time_integer_option_values.rb +71 -0
  192. data/db/migrate/20250808054835_add_saved_guest_reference_to_cm_blocks.rb +5 -0
  193. data/docker-compose.yml +1 -1
  194. data/lib/cm_app_logger.rb +17 -1
  195. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +14 -11
  196. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_cm_commissioner → spree_dashboard/spree_cm_commissioner}/utilities.js +4 -0
  197. data/lib/spree_cm_commissioner/cached_inventory_item.rb +23 -0
  198. data/lib/spree_cm_commissioner/calendar_event.rb +11 -1
  199. data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +16 -0
  200. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +10 -0
  201. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  202. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +20 -0
  203. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  204. data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +6 -30
  205. data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +0 -36
  206. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +18 -34
  207. data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +27 -0
  208. data/lib/spree_cm_commissioner/test_helper/factories/saved_guest_factory.rb +8 -0
  209. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +11 -0
  210. data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +16 -0
  211. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  212. data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +6 -0
  213. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +11 -3
  214. data/lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb +13 -0
  215. data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +7 -0
  216. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +41 -19
  217. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
  218. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +6 -1
  219. data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +13 -1
  220. data/lib/spree_cm_commissioner/transit/leg.rb +37 -0
  221. data/lib/spree_cm_commissioner/transit/seat_selection.rb +27 -0
  222. data/lib/spree_cm_commissioner/trip_query_result.rb +50 -0
  223. data/lib/spree_cm_commissioner/trip_result.rb +19 -10
  224. data/lib/spree_cm_commissioner/version.rb +1 -1
  225. data/lib/spree_cm_commissioner.rb +37 -1
  226. data/lib/tasks/create_default_non_permanent_inventory_items.rake +16 -0
  227. data/lib/tasks/ensure_correct_product_type.rake +7 -0
  228. data/lib/tasks/generate_inventory_items.rake +7 -0
  229. data/spree_cm_commissioner.gemspec +7 -0
  230. metadata +195 -26
  231. data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +0 -44
  232. data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +0 -20
  233. data/app/models/spree_cm_commissioner/branch.rb +0 -12
  234. data/app/models/spree_cm_commissioner/line_item_seat.rb +0 -10
  235. data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +0 -8
  236. data/app/models/spree_cm_commissioner/stop.rb +0 -23
  237. data/app/models/spree_cm_commissioner/vehicle_seat.rb +0 -11
  238. data/app/models/spree_cm_commissioner/vehicle_type.rb +0 -76
  239. data/app/models/spree_cm_commissioner/vendor_stop.rb +0 -10
  240. data/app/queries/spree_cm_commissioner/trip_search_query.rb +0 -76
  241. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +0 -45
  242. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +0 -55
  243. data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +0 -54
  244. data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +0 -11
  245. data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +0 -12
  246. data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +0 -8
  247. data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +0 -8
  248. data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +0 -7
  249. data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +0 -14
  250. data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +0 -8
  251. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +0 -8
  252. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +0 -96
  253. data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +0 -11
@@ -0,0 +1,49 @@
1
+ module SpreeCmCommissioner
2
+ module Seats
3
+ class BlocksReserver
4
+ def initialize(line_item_ids:, reserve_by: nil)
5
+ @line_item_ids = line_item_ids
6
+ @reserve_by = reserve_by
7
+ end
8
+
9
+ # Mark blocks as reserved for the given line items.
10
+ #
11
+ # It ensures:
12
+ # - Raises an error if already reserved by same guest or other guest.
13
+ # - Raises an error if currently on_hold by someone else.
14
+ # - Otherwise, proceeds to reserve the given blocks.
15
+ def reserve_blocks!
16
+ line_items = Spree::LineItem.where(id: @line_item_ids).includes(:inventory_items, guests_with_blocks: :block)
17
+ guests_with_blocks = line_items.flat_map(&:guests_with_blocks).compact
18
+ inventory_items = line_items.flat_map(&:inventory_items).compact
19
+
20
+ ActiveRecord::Base.transaction do
21
+ guests_with_blocks.each do |guest|
22
+ inventory_items.each do |inventory_item|
23
+ reserve_specific_block!(inventory_item, guest)
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def reserve_specific_block!(inventory_item, guest)
30
+ reserved_block = SpreeCmCommissioner::ReservedBlock.find_or_initialize_by(inventory_item_id: inventory_item.id, block_id: guest.block_id)
31
+
32
+ raise Errors::BlocksAreReservedByOtherGuest if reserved_block.reserved? && reserved_block.guest_id != guest.id
33
+ raise Errors::BlocksAreReservedBySameGuest if reserved_block.reserved? && reserved_block.guest_id == guest.id
34
+ raise Errors::BlocksAreOnHoldByOtherGuest if reserved_block.active_on_hold? && reserved_block.guest_id != guest.id
35
+
36
+ # mark the block as reserved if not on_hold or lock by anyone but already expired
37
+ reserved_block.assign_attributes(
38
+ guest: guest,
39
+ status: :reserved,
40
+ expired_at: nil,
41
+ inventory_date: inventory_item.inventory_date,
42
+ updated_by: @reserve_by
43
+ )
44
+
45
+ raise Errors::UnableToSaveReservedBlockRecord unless reserved_block.save
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,4 @@
1
+ module SpreeCmCommissioner
2
+ class Seats::Errors::BlocksAreOnHoldByOtherGuest < StandardError
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module SpreeCmCommissioner
2
+ class Seats::Errors::BlocksAreReservedByOtherGuest < StandardError
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module SpreeCmCommissioner
2
+ class Seats::Errors::BlocksAreReservedBySameGuest < StandardError
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module SpreeCmCommissioner
2
+ class Seats::Errors::UnableToSaveReservedBlockRecord < StandardError
3
+ end
4
+ end
@@ -1,5 +1,3 @@
1
- require_dependency 'spree_cm_commissioner'
2
-
3
1
  module SpreeCmCommissioner
4
2
  class ServiceCalendar < SpreeCmCommissioner::Base
5
3
  # exception_rules = [
@@ -3,7 +3,6 @@ module SpreeCmCommissioner
3
3
  def self.prepended(base)
4
4
  base.whitelisted_ransackable_attributes |= %w[name abbr country_id]
5
5
  base.has_many :vendors, foreign_key: 'default_state_id', class_name: 'Spree::Vendor', inverse_of: :default_state, dependent: :nullify
6
- base.has_many :stops, class_name: 'SpreeCmCommissioner::Place'
7
6
 
8
7
  def update_total_inventory
9
8
  update(total_inventory: vendors.pluck(:total_inventory).compact.sum)
@@ -1,47 +1,48 @@
1
1
  module SpreeCmCommissioner
2
2
  module Stock
3
3
  class AvailabilityChecker
4
- attr_reader :variant, :error_message
4
+ attr_reader :variant, :options, :error_message
5
5
 
6
- def initialize(variant)
6
+ def initialize(variant, options = {})
7
7
  @variant = variant
8
+ @options = options
8
9
  @error_message = nil
9
10
  end
10
11
 
11
- def can_supply?(quantity = 1, options = {})
12
+ def can_supply?(quantity = 1)
12
13
  return false unless variant.available?
13
14
  return true unless variant.should_track_inventory?
14
15
  return true if variant.backorderable?
15
16
  return true if variant.need_confirmation?
16
17
 
17
- # when delivery required, shipment will dynamically add / remove unit from stock item.
18
- # so we can directly check can_supply with stock items directly.
19
- return variant.stock_items.sum(:count_on_hand) >= quantity if variant.delivery_required?
18
+ variant_available?(quantity)
19
+ end
20
20
 
21
- if variant.permanent_stock?
22
- permanent_stock_variant_available?(quantity, options)
23
- else
24
- variant_available?(quantity, options)
21
+ def variant_available?(quantity = 1)
22
+ return false if cached_inventory_items.empty?
23
+
24
+ cached_inventory_items.all? do |cached_inventory_item|
25
+ cached_inventory_item.active? && cached_inventory_item.quantity_available >= quantity
25
26
  end
26
27
  end
27
28
 
28
- def variant_available?(quantity = 1, options = {})
29
- query = SpreeCmCommissioner::VariantAvailability::NonPermanentStockQuery.new(
30
- variant: variant,
31
- except_line_item_id: options[:except_line_item_id]
32
- )
33
- result = query.available?(quantity)
34
- @error_message = query.error_message unless result
35
- result
29
+ def cached_inventory_items
30
+ return @cached_inventory_items if defined?(@cached_inventory_items)
31
+
32
+ if variant.permanent_stock?
33
+ return [] if options[:from_date].blank? || options[:to_date].blank?
34
+
35
+ dates = options[:from_date].to_date..options[:to_date].to_date
36
+ @cached_inventory_items = builder_klass.new(variant_id: variant.id, dates: dates).call
37
+ @cached_inventory_items = [] if @cached_inventory_items.size != dates.count
38
+ @cached_inventory_items
39
+ else
40
+ @cached_inventory_items = builder_klass.new(variant_id: variant.id).call
41
+ end
36
42
  end
37
43
 
38
- def permanent_stock_variant_available?(quantity = 1, options = {})
39
- SpreeCmCommissioner::VariantAvailability::PermanentStockQuery.new(
40
- variant: variant,
41
- from_date: options[:from_date].to_date,
42
- to_date: options[:to_date].to_date,
43
- except_line_item_id: options[:except_line_item_id]
44
- ).available?(quantity)
44
+ def builder_klass
45
+ ::SpreeCmCommissioner::RedisStock::VariantCachedInventoryItemsBuilder
45
46
  end
46
47
  end
47
48
  end
@@ -3,7 +3,8 @@ module SpreeCmCommissioner
3
3
  module AvailabilityValidatorDecorator
4
4
  # override
5
5
  def item_available?(line_item, quantity)
6
- SpreeCmCommissioner::Stock::LineItemAvailabilityChecker.new(line_item).can_supply?(quantity)
6
+ SpreeCmCommissioner::Stock::LineItemAvailabilityChecker.new(line_item)
7
+ .can_supply?(quantity)
7
8
  end
8
9
  end
9
10
  end
@@ -8,14 +8,14 @@ module SpreeCmCommissioner
8
8
  end
9
9
 
10
10
  def can_supply?(quantity)
11
- AvailabilityChecker.new(line_item.variant).can_supply?(quantity, options)
11
+ ::SpreeCmCommissioner::Stock::AvailabilityChecker.new(line_item.variant, options)
12
+ .can_supply?(quantity)
12
13
  end
13
14
 
14
15
  def options
15
16
  {
16
17
  from_date: line_item.from_date,
17
- to_date: line_item.to_date,
18
- except_line_item_id: line_item.id
18
+ to_date: line_item.to_date
19
19
  }
20
20
  end
21
21
  end
@@ -0,0 +1,44 @@
1
+ # On top of SpreeCmCommissioner::Stock::AvailabilityChecker, this class does the same thing but in bulk check with redis.
2
+ # Which mean, it check basic condition with db first, once pass, it check with redis.
3
+ module SpreeCmCommissioner
4
+ module Stock
5
+ class OrderAvailabilityChecker
6
+ attr_reader :order
7
+
8
+ def initialize(order)
9
+ @order = order
10
+ end
11
+
12
+ def can_supply_all?
13
+ insufficient_stock_lines.empty?
14
+ end
15
+
16
+ def insufficient_stock_lines
17
+ cached_inventory_items_group_by_line_item_id.map do |line_item_id, cached_inventory_items|
18
+ line_item = order.line_items.find { |item| item.id == line_item_id }
19
+ line_item unless sufficient_stock_for?(line_item, cached_inventory_items)
20
+ end.compact
21
+ end
22
+
23
+ # {
24
+ # 1: [ {inventory_key: "inventory:1", active: true, quantity_available: 5, inventory_item_id: 1, variant_id: 1}],
25
+ # 2: [ {inventory_key: "inventory:2", active: true, quantity_available: 5, inventory_item_id: 2, variant_id: 2}],
26
+ # }
27
+ def cached_inventory_items_group_by_line_item_id
28
+ @cached_inventory_items_group_by_line_item_id ||=
29
+ ::SpreeCmCommissioner::RedisStock::LineItemsCachedInventoryItemsBuilder.new(
30
+ line_item_ids: order.line_items.pluck(:id)
31
+ ).call
32
+ end
33
+
34
+ def sufficient_stock_for?(line_item, cached_inventory_items)
35
+ return false unless line_item.variant.available?
36
+ return true unless line_item.variant.should_track_inventory?
37
+ return true if line_item.variant.backorderable?
38
+ return true if line_item.variant.need_confirmation?
39
+
40
+ cached_inventory_items.all? { |item| item.active? && item.quantity_available >= line_item.quantity }
41
+ end
42
+ end
43
+ end
44
+ end
@@ -3,11 +3,28 @@ module SpreeCmCommissioner
3
3
  def self.prepended(base)
4
4
  base.has_one :vendor, through: :variant
5
5
  base.after_save :update_vendor_total_inventory, if: :saved_change_to_count_on_hand?
6
+
7
+ base.after_commit :create_inventory_items, on: :create
8
+ base.after_commit :adjust_inventory_items_async, on: :destroy
6
9
  end
7
10
 
8
11
  def update_vendor_total_inventory
9
12
  SpreeCmCommissioner::VendorJob.perform_later(vendor.id) if vendor.present?
10
13
  end
14
+
15
+ private
16
+
17
+ def create_inventory_items
18
+ SpreeCmCommissioner::Stock::InventoryItemsGeneratorJob.perform_later(variant_id: variant.id)
19
+ end
20
+
21
+ # When admin delete stock item, it will deduct stock from inventory item
22
+ def adjust_inventory_items_async
23
+ params = { variant_id: variant.id, quantity: -count_on_hand }
24
+ CmAppLogger.log(label: "#{self.class.name}#adjust_inventory_items_async", data: params) do
25
+ SpreeCmCommissioner::Stock::InventoryItemsAdjusterJob.perform_later(**params)
26
+ end
27
+ end
11
28
  end
12
29
  end
13
30
 
@@ -2,7 +2,6 @@ module SpreeCmCommissioner
2
2
  module TaxonDecorator
3
3
  def self.prepended(base) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
4
4
  base.include SpreeCmCommissioner::TaxonKind
5
- base.include SpreeCmCommissioner::Transit::TaxonBitwise
6
5
  base.include SpreeCmCommissioner::ParticipationTypeBitwise
7
6
  base.include SpreeCmCommissioner::EventCheckInFlowable
8
7
 
@@ -47,6 +46,7 @@ module SpreeCmCommissioner
47
46
  base.validates_associated :category_icon
48
47
  base.before_save :set_kind
49
48
  base.before_save :set_slug
49
+ base.before_save :normalize_custom_redirect_url
50
50
 
51
51
  base.after_update :sync_event_dates_to_line_items, if: -> { saved_change_to_from_date? || saved_change_to_to_date? }
52
52
 
@@ -141,6 +141,12 @@ module SpreeCmCommissioner
141
141
 
142
142
  ::SpreeCmCommissioner::EventLineItemsDateSyncerJob.perform_later(id)
143
143
  end
144
+
145
+ private
146
+
147
+ def normalize_custom_redirect_url
148
+ self.custom_redirect_url = nil if custom_redirect_url.blank?
149
+ end
144
150
  end
145
151
  end
146
152
 
@@ -8,12 +8,6 @@ module SpreeCmCommissioner
8
8
  Spree::Taxonomy.find_or_create_by(name: 'Businesses', kind: 'category', store: Spree::Store.default)
9
9
  end
10
10
  end
11
-
12
- def base.place
13
- ActiveRecord::Base.connected_to(role: :writing) do
14
- Spree::Taxonomy.find_or_create_by(name: 'Place', kind: 'transit', store: Spree::Store.default)
15
- end
16
- end
17
11
  end
18
12
  end
19
13
  end
@@ -1,31 +1,40 @@
1
- require_dependency 'spree_cm_commissioner'
2
1
  module SpreeCmCommissioner
3
- class Trip < SpreeCmCommissioner::Base
2
+ class Trip < Base
3
+ include SpreeCmCommissioner::RouteType
4
+
4
5
  attr_accessor :hours, :minutes, :seconds
5
6
 
6
7
  before_validation :convert_duration_to_seconds
7
8
 
9
+ belongs_to :vendor, class_name: 'Spree::Vendor', inverse_of: :trips, optional: false
8
10
  belongs_to :product, class_name: 'Spree::Product', inverse_of: :trip, optional: false
11
+
9
12
  belongs_to :vehicle, class_name: 'SpreeCmCommissioner::Vehicle', optional: false
10
- belongs_to :origin, class_name: 'SpreeCmCommissioner::Place', optional: true
11
- belongs_to :destination, class_name: 'SpreeCmCommissioner::Place', optional: true
13
+
14
+ belongs_to :origin_place, class_name: 'SpreeCmCommissioner::Place', optional: false
15
+ belongs_to :destination_place, class_name: 'SpreeCmCommissioner::Place', optional: false
12
16
 
13
17
  has_many :trip_blazer_queries, as: :queryable, class_name: 'SpreeCmCommissioner::BlazerQueryable'
14
18
  has_many :blazer_queries, through: :trip_blazer_queries, source: :blazer_query, class_name: 'Blazer::Query'
15
19
 
16
20
  has_many :trip_stops, class_name: 'SpreeCmCommissioner::TripStop', dependent: :destroy
21
+ has_many :boarding_trip_stops, -> { boarding.order('departure_time ASC NULLS LAST, id ASC') }, class_name: 'SpreeCmCommissioner::TripStop'
22
+ has_many :drop_off_trip_stops, -> { drop_off.order('arrival_time ASC NULLS LAST') }, class_name: 'SpreeCmCommissioner::TripStop'
23
+
17
24
  has_many :variants, through: :product
18
25
  has_many :inventory_items, through: :variants
19
- belongs_to :variant, class_name: 'Spree::Variant'
20
-
21
- belongs_to :route, class_name: 'Spree::Product'
22
- belongs_to :vehicle, class_name: 'SpreeCmCommissioner::Vehicle'
23
- validates :departure_time, presence: true
26
+ has_many :variant_blocks, through: :variants
27
+ has_many :blocks, through: :variant_blocks
24
28
 
25
29
  validates :departure_time, presence: true
26
30
  validates :duration, numericality: { greater_than: 0 }
27
31
  validate :origin_and_destination_cannot_be_the_same
28
32
 
33
+ accepts_nested_attributes_for :trip_stops, :product, allow_destroy: true
34
+
35
+ self.whitelisted_ransackable_associations = %w[product vehicle]
36
+ self.whitelisted_ransackable_attributes = %w[origin_place_id destination_place_id]
37
+
29
38
  def convert_duration_to_seconds
30
39
  return if hours.blank? && minutes.blank? && seconds.blank?
31
40
 
@@ -50,7 +59,7 @@ module SpreeCmCommissioner
50
59
  private
51
60
 
52
61
  def origin_and_destination_cannot_be_the_same
53
- return unless origin_id == destination_id
62
+ return unless origin_place_id == destination_place_id
54
63
 
55
64
  errors.add(:base, 'Origin and destination cannot be the same')
56
65
  end
@@ -1,7 +1,7 @@
1
1
  module SpreeCmCommissioner
2
- class TripConnection < ApplicationRecord
3
- belongs_to :from_trip, class_name: 'Spree::Variant'
4
- belongs_to :to_trip, class_name: 'Spree::Variant'
2
+ class TripConnection < Base
3
+ belongs_to :from_trip, class_name: 'SpreeCmCommissioner::Trip'
4
+ belongs_to :to_trip, class_name: 'SpreeCmCommissioner::Trip'
5
5
 
6
6
  validate :both_trip_cannot_be_the_same
7
7
  before_validation :calculate_connection_time_minutes
@@ -12,8 +12,8 @@ module SpreeCmCommissioner
12
12
  def calculate_connection_time_minutes
13
13
  return if from_trip.nil? || to_trip.nil?
14
14
 
15
- arrival_seconds = from_trip.trip.arrival_time.seconds_since_midnight
16
- departure_seconds = to_trip.trip.departure_time.seconds_since_midnight
15
+ arrival_seconds = from_trip.arrival_time.seconds_since_midnight
16
+ departure_seconds = to_trip.departure_time.seconds_since_midnight
17
17
 
18
18
  layover_seconds = departure_seconds - arrival_seconds
19
19
  layover_seconds += 86_400 if layover_seconds.negative?
@@ -1,36 +1,25 @@
1
- require_dependency 'spree_cm_commissioner'
2
1
  module SpreeCmCommissioner
3
- class TripStop < SpreeCmCommissioner::Base
2
+ class TripStop < Base
4
3
  acts_as_list column: :sequence, scope: :trip_id
5
4
  enum :stop_type, { boarding: 0, drop_off: 1 }
6
5
 
7
- belongs_to :trip, class_name: 'Spree::Variant'
8
- belongs_to :stop, class_name: 'SpreeCmCommissioner::Place'
6
+ belongs_to :trip, class_name: 'SpreeCmCommissioner::Trip', optional: false
7
+ belongs_to :stop_place, class_name: 'SpreeCmCommissioner::Place', optional: false
8
+ belongs_to :location_place, class_name: 'SpreeCmCommissioner::Place', optional: false
9
9
 
10
10
  before_validation :set_stop_name
11
- after_destroy :decrement_trip_count
12
- after_commit :create_vendor_stop
13
- validates :stop_id, uniqueness: { scope: :trip_id }
11
+ validates :stop_place_id, uniqueness: { scope: :trip_id }
14
12
 
15
13
  def set_stop_name
16
- self.stop_name = stop.name if stop.present?
14
+ self.stop_name = stop_place.name if stop_place.present?
17
15
  end
18
16
 
19
- def create_vendor_stop
20
- vendor_stop = vendor.vendor_stops.where(stop_id: stop_id, stop_type: stop_type).first_or_create
21
- vendor_stop.update(trip_count: vendor_stop.trip_count.to_i + 1)
17
+ def self.ransackable_attributes(_auth_object = nil)
18
+ %w[stop_name stop_type]
22
19
  end
23
20
 
24
- private
25
-
26
- def decrement_trip_count
27
- vendor.vendor_stops.where(stop_id: stop_id, stop_type: stop_type).find_each do |vendor_stop|
28
- vendor_stop.update(trip_count: [vendor_stop.trip_count - 1, 0].max)
29
- end
30
- end
31
-
32
- def vendor
33
- Spree::Product.find(trip&.product_id).vendor
21
+ def self.ransackable_associations(_auth_object = nil)
22
+ ['stop_place']
34
23
  end
35
24
  end
36
25
  end
@@ -0,0 +1,17 @@
1
+ module SpreeCmCommissioner
2
+ class VariantBlock < Base
3
+ belongs_to :variant, class_name: 'Spree::Variant', optional: false
4
+ belongs_to :trip, class_name: 'SpreeCmCommissioner::Trip', optional: false
5
+ belongs_to :block, class_name: 'SpreeCmCommissioner::Block', optional: false
6
+
7
+ validates :block_id, uniqueness: { scope: %i[variant_id trip_id] }
8
+
9
+ before_validation :set_trip, if: -> { trip_id.blank? }
10
+
11
+ private
12
+
13
+ def set_trip
14
+ self.trip = variant&.product&.trip
15
+ end
16
+ end
17
+ end
@@ -1,6 +1,7 @@
1
1
  module SpreeCmCommissioner
2
2
  module VariantDecorator
3
- def self.prepended(base)
3
+ def self.prepended(base) # rubocop:disable Metrics/AbcSize
4
+ base.include SpreeCmCommissioner::ProductType
4
5
  base.include SpreeCmCommissioner::ProductDelegation
5
6
  base.include SpreeCmCommissioner::VariantOptionsConcern
6
7
  base.include SpreeCmCommissioner::KycBitwise
@@ -20,24 +21,21 @@ module SpreeCmCommissioner
20
21
  base.has_many :video_on_demands, class_name: 'SpreeCmCommissioner::VideoOnDemand', dependent: :destroy
21
22
  base.has_many :complete_line_items, -> { complete }, class_name: 'Spree::LineItem'
22
23
 
24
+ base.has_many :variant_blocks, class_name: 'SpreeCmCommissioner::VariantBlock', dependent: :destroy
25
+ base.has_many :blocks, class_name: 'SpreeCmCommissioner::Block', through: :variant_blocks
26
+
23
27
  base.has_many :variant_guest_card_class, class_name: 'SpreeCmCommissioner::VariantGuestCardClass'
24
28
  base.has_many :guest_card_classes, class_name: 'SpreeCmCommissioner::GuestCardClass', through: :variant_guest_card_class
25
29
 
30
+ base.has_many :inventory_items, class_name: 'SpreeCmCommissioner::InventoryItem'
31
+
26
32
  base.scope :subscribable, -> { active.joins(:product).where(product: { subscribable: true, status: :active }) }
27
- base.has_one :trip,
28
- class_name: 'SpreeCmCommissioner::Trip'
29
- base.has_many :trip_stops, class_name: 'SpreeCmCommissioner::TripStop', dependent: :destroy, foreign_key: :trip_id
30
- base.accepts_nested_attributes_for :option_values
31
- base.after_commit :sync_trip, if: :transit?
32
- base.accepts_nested_attributes_for :trip_stops, allow_destroy: true
33
- base.after_commit :create_trip_stops, if: :transit?
34
- end
33
+ base.scope :with_permanent_stock, -> { where(product_type: base::PERMANENT_STOCK_PRODUCT_TYPES) }
34
+ base.scope :with_non_permanent_stock, -> { where.not(product_type: base::PERMANENT_STOCK_PRODUCT_TYPES) }
35
35
 
36
- def create_trip_stops
37
- return if is_master?
36
+ base.accepts_nested_attributes_for :option_values
38
37
 
39
- trip_stops.find_or_create_by(stop_type: :boarding, stop_id: options.origin)
40
- trip_stops.find_or_create_by(stop_type: :drop_off, stop_id: options.destination)
38
+ base.before_save -> { self.product_type = product.product_type }, if: -> { product_type.nil? }
41
39
  end
42
40
 
43
41
  def delivery_required?
@@ -53,8 +51,20 @@ module SpreeCmCommissioner
53
51
  super || product.discontinued?
54
52
  end
55
53
 
56
- def permanent_stock?
57
- accommodation?
54
+ def default_inventory_item_exist?
55
+ inventory_items.exists?(inventory_date: nil)
56
+ end
57
+
58
+ def create_default_non_permanent_inventory_item!(quantity_available: nil, max_capacity: nil)
59
+ return if product_type.blank? # handle in case product not exist for variant.
60
+ return unless should_track_inventory?
61
+ return if default_inventory_item_exist?
62
+
63
+ inventory_items.create!(
64
+ product_type: product_type,
65
+ quantity_available: [0, quantity_available || total_on_hand].max,
66
+ max_capacity: [0, max_capacity || total_on_hand].max
67
+ )
58
68
  end
59
69
 
60
70
  # override
@@ -72,30 +82,26 @@ module SpreeCmCommissioner
72
82
  "#{display_sku} - #{display_price}"
73
83
  end
74
84
 
75
- def transit?
76
- product.product_type == 'transit'
77
- end
78
-
79
85
  # override
80
- def in_stock?
81
- available_quantity.positive?
86
+ def in_stock?(options = {})
87
+ SpreeCmCommissioner::Stock::AvailabilityChecker.new(self, options).can_supply?
82
88
  end
83
89
 
84
- private
90
+ def price_for_date(currency:, date:)
91
+ currency = currency.upcase
85
92
 
86
- def total_purchases
87
- Spree::LineItem.complete.where(variant_id: id).sum(:quantity).to_i
93
+ prices.joins(:inventory_item)
94
+ .find_by(
95
+ currency: currency,
96
+ inventory_item: { inventory_date: date }
97
+ )
88
98
  end
89
99
 
90
- def available_quantity
91
- stock_count = stock_items.sum(&:count_on_hand)
92
- return stock_count if delivery_required?
93
-
94
- stock_count - total_purchases
95
- end
100
+ private
96
101
 
97
102
  def update_vendor_price
98
- return unless vendor.present? && product&.product_type == vendor&.primary_product_type
103
+ return unless vendor.present? && product_type == vendor&.primary_product_type
104
+ return if price.blank?
99
105
 
100
106
  vendor.update(min_price: price) if vendor.min_price.nil? || price < vendor.min_price
101
107
  vendor.update(max_price: price) if vendor.max_price.nil? || price > vendor.max_price
@@ -119,22 +125,6 @@ module SpreeCmCommissioner
119
125
  end
120
126
  end
121
127
  end
122
-
123
- def sync_trip
124
- return unless product.product_type == 'transit'
125
-
126
- trip = SpreeCmCommissioner::Trip.find_or_initialize_by(variant_id: id)
127
-
128
- trip.assign_attributes(
129
- product_id: product_id,
130
- origin_id: options.origin,
131
- destination_id: options.destination,
132
- departure_time: options.departure_time,
133
- duration: options.total_duration_in_seconds,
134
- vehicle_id: options.vehicle
135
- )
136
- trip.save
137
- end
138
128
  end
139
129
  end
140
130
 
@@ -139,32 +139,13 @@ module SpreeCmCommissioner
139
139
  @seat_number_layouts ||= option_value_name_for(option_type_name: 'seat-number-layouts')&.split(',')
140
140
  end
141
141
 
142
+ def seat_type
143
+ @seat_type ||= option_value_name_for(option_type_name: 'seat-type')
144
+ end
145
+
142
146
  # can consider as customers.
143
147
  def number_of_guests
144
148
  number_of_adults + number_of_kids
145
149
  end
146
-
147
- def origin
148
- @origin ||= option_value_name_for(option_type_name: 'origin')&.to_i
149
- end
150
-
151
- def destination
152
- @destination ||= option_value_name_for(option_type_name: 'destination')&.to_i
153
- end
154
-
155
- def vehicle
156
- @vehicle ||= option_value_name_for(option_type_name: 'vehicle')&.to_i
157
- end
158
-
159
- def allow_seat_selection
160
- @allow_seat_selection ||= option_value_name_for(option_type_name: 'allow-seat-selection')&.to_i
161
- end
162
-
163
- def departure_time
164
- @departure_time ||= begin
165
- time = option_value_name_for(option_type_name: 'departure-time')
166
- Time.zone.parse(time) if time.present?
167
- end
168
- end
169
150
  end
170
151
  end