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
@@ -1,38 +1,60 @@
1
1
  FactoryBot.define do
2
2
  factory :cm_base_variant, parent: :base_variant do
3
+ is_master { false }
4
+ product { create(:cm_product) }
5
+
3
6
  transient do
4
7
  total_inventory { 10 }
8
+ backorderable { false }
9
+ pregenerate_inventory_items { true }
10
+ pre_inventory_days { nil } # optional for permanent only
5
11
  end
6
12
 
7
13
  after :create do |variant, evaluator|
8
14
  variant.stock_items.first.adjust_count_on_hand(evaluator.total_inventory)
9
- end
10
- end
15
+ variant.stock_items.update_all(backorderable: evaluator.backorderable)
11
16
 
12
- factory :cm_variant, parent: :variant do
13
- product do
14
- stock_locations = [create(:stock_location)]
15
- product = create(:product, vendor: create(:active_vendor, stock_locations: stock_locations))
16
- product
17
+ # stock_items is created then enqueue create inventory items job
18
+ # but we want to create inventory items directly in this factory without waiting for job
19
+ if evaluator.pregenerate_inventory_items
20
+ if variant.permanent_stock?
21
+ SpreeCmCommissioner::Stock::PermanentInventoryItemsGenerator.call(variant_ids: [variant.id], pre_inventory_days: evaluator.pre_inventory_days || 3)
22
+ else
23
+ variant.create_default_non_permanent_inventory_item! unless variant.default_inventory_item_exist?
24
+ end
25
+ end
17
26
  end
18
27
  end
19
28
 
20
- factory :trip, class: Spree::Variant do
21
- permanent_stock { 5 }
29
+ factory :cm_variant, parent: :cm_base_variant do
30
+ product { create(:cm_product) }
31
+
22
32
  transient do
23
- departure_time { "10:00" }
24
- duration { "1" }
25
- route { }
33
+ number_of_adults { nil }
34
+ number_of_kids { nil }
35
+ delivery_required { nil }
26
36
  end
27
- before(:create) do |trip, evaluator|
28
- trip.product = evaluator.route
29
37
 
30
- trip.option_values = [evaluator.departure_time, evaluator.duration]
38
+ after(:create) do |variant, evaluator|
39
+ if evaluator.number_of_adults.present?
40
+ number_of_adults = create(:cm_option_type, :number_of_adults)
41
+ variant.product.option_types << number_of_adults
42
+ variant.option_values << create(:cm_option_value, presentation: evaluator.number_of_adults, name: evaluator.number_of_adults, option_type: number_of_adults)
43
+ end
31
44
 
32
- end
33
- after(:create) do |trip, evaluator|
34
- trip.stock_items = [create(:stock_item, variant: trip, stock_location: evaluator.product.vendor.stock_locations.first)]
35
- trip.stock_items.first.adjust_count_on_hand(10)
45
+ if evaluator.number_of_kids.present?
46
+ number_of_kids = create(:cm_option_type, :number_of_kids)
47
+ variant.product.option_types << number_of_kids
48
+ variant.option_values << create(:cm_option_value, presentation: evaluator.number_of_kids, name: evaluator.number_of_kids, option_type: number_of_kids)
49
+ end
50
+
51
+ if evaluator.delivery_required == true
52
+ delivery_option = create(:cm_option_type, :delivery_option)
53
+ variant.product.option_types << delivery_option
54
+ variant.option_values << create(:cm_option_value, presentation: 'Delivery', name: 'delivery', option_type: delivery_option)
55
+ end
56
+
57
+ variant.save!
36
58
  end
37
59
  end
38
60
  end
@@ -1,5 +1,5 @@
1
1
  FactoryBot.define do
2
- factory :vehicle, class: SpreeCmCommissioner::Vehicle do
2
+ factory :cm_vehicle, class: SpreeCmCommissioner::Vehicle do
3
3
  sequence(:code) { |n| "vehicle_#{n}" }
4
4
  sequence(:license_plate) { |n| "2KH-#{'%04d' % (n % 10000)}" }
5
5
  end
@@ -1,4 +1,9 @@
1
1
  FactoryBot.define do
2
+ factory :cm_transit_vendor, parent: :vendor do
3
+ state { :active }
4
+ primary_product_type { :transit }
5
+ end
6
+
2
7
  factory :cm_vendor, parent: :vendor do
3
8
  state { :active }
4
9
  default_state_id { Spree::State.first&.id }
@@ -30,7 +35,7 @@ FactoryBot.define do
30
35
  if vendor.primary_product_type == :accommodation
31
36
  product = create(:cm_accommodation_product, vendor: vendor, total_inventory: evaluator.total_inventory)
32
37
  else
33
- product = create(:product, vendor: vendor, product_type: vendor.primary_product_type)
38
+ product = create(:cm_product, vendor: vendor, product_type: vendor.primary_product_type)
34
39
  product.master.stock_items.first.adjust_count_on_hand(evaluator.total_inventory)
35
40
  end
36
41
 
@@ -1,7 +1,19 @@
1
1
  FactoryBot.define do
2
- factory :vendor_place, class: SpreeCmCommissioner::VendorPlace do
2
+ factory :cm_location_vendor_place, class: SpreeCmCommissioner::VendorPlace do
3
3
  association :vendor, factory: :vendor
4
4
  association :place, factory: :cm_place
5
+
6
+ distance { FFaker::Number.decimal }
7
+ position { FFaker::Number.number }
8
+
9
+ place_type { :location }
10
+ end
11
+
12
+ factory :cm_vendor_place, class: SpreeCmCommissioner::VendorPlace do
13
+ association :vendor, factory: :vendor
14
+ association :place, factory: :cm_place
15
+ association :location, factory: :cm_location_vendor_place
16
+
5
17
  distance { FFaker::Number.decimal }
6
18
  position { FFaker::Number.number }
7
19
  place_type { :branch }
@@ -0,0 +1,37 @@
1
+ module SpreeCmCommissioner::Transit
2
+ class Leg
3
+ attr_accessor :direction, :trip_id, :boarding_trip_stop_id, :drop_off_trip_stop_id, :seat_selections
4
+
5
+ def initialize(options = {})
6
+ @direction = options[:direction]
7
+ @trip_id = options[:trip_id]
8
+ @boarding_trip_stop_id = options[:boarding_trip_stop_id]
9
+ @drop_off_trip_stop_id = options[:drop_off_trip_stop_id]
10
+ @seat_selections = options[:seat_selections] || []
11
+ end
12
+
13
+ def self.from_hash(hash)
14
+ new(
15
+ direction: hash[:direction], # outbound / inbound
16
+ trip_id: hash[:trip_id],
17
+ boarding_trip_stop_id: hash[:boarding_trip_stop_id],
18
+ drop_off_trip_stop_id: hash[:drop_off_trip_stop_id],
19
+ seat_selections: (hash[:seat_selections] || []).map { |seat_selection| SeatSelection.from_hash(seat_selection) }
20
+ )
21
+ end
22
+
23
+ def quantity
24
+ @seat_selections.sum(&:quantity).to_i
25
+ end
26
+
27
+ def to_h
28
+ {
29
+ direction: @direction,
30
+ trip_id: @trip_id,
31
+ boarding_trip_stop_id: @boarding_trip_stop_id,
32
+ drop_off_trip_stop_id: @drop_off_trip_stop_id,
33
+ seat_selections: @seat_selections.map(&:to_h)
34
+ }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,27 @@
1
+ module SpreeCmCommissioner::Transit
2
+ class SeatSelection
3
+ attr_accessor :variant_id, :quantity, :block_ids
4
+
5
+ def initialize(options = {})
6
+ @variant_id = options[:variant_id]
7
+ @quantity = options[:quantity]&.to_i
8
+ @block_ids = options[:block_ids] || []
9
+ end
10
+
11
+ def self.from_hash(hash)
12
+ new(
13
+ variant_id: hash[:variant_id],
14
+ quantity: hash[:quantity],
15
+ block_ids: hash[:block_ids] || [] # empty when no seat selection.
16
+ )
17
+ end
18
+
19
+ def to_h
20
+ {
21
+ variant_id: @variant_id,
22
+ quantity: @quantity,
23
+ block_ids: @block_ids
24
+ }
25
+ end
26
+ end
27
+ end
@@ -7,8 +7,58 @@ module SpreeCmCommissioner
7
7
  @connection_id = connection_id
8
8
  end
9
9
 
10
+ def id
11
+ @trips.map(&:id).join('-')
12
+ end
13
+
14
+ def trip_ids
15
+ @trips.map(&:id)
16
+ end
17
+
10
18
  def direct?
11
19
  @trips.size == 1
12
20
  end
21
+
22
+ def quantity_available
23
+ @trips.map(&:quantity_available).compact.min
24
+ end
25
+
26
+ def max_capacity
27
+ @trips.map(&:max_capacity).compact.min
28
+ end
29
+
30
+ def total_price
31
+ @trips.map(&:price).compact.sum
32
+ end
33
+
34
+ def total_duration
35
+ @trips.map(&:duration).compact.sum
36
+ end
37
+
38
+ def total_duration_in_hms
39
+ total_seconds = total_duration || 0
40
+ return { hours: 0, minutes: 0, seconds: 0 } if total_seconds.nil? || total_seconds <= 0
41
+
42
+ hours = total_seconds / 3600
43
+ minutes = (total_seconds % 3600) / 60
44
+ seconds = total_seconds % 60
45
+ { hours: hours, minutes: minutes, seconds: seconds }
46
+ end
47
+
48
+ def departure_time
49
+ @trips.first.departure_time
50
+ end
51
+
52
+ def arrival_time
53
+ @trips.last.arrival_time
54
+ end
55
+
56
+ def vendors
57
+ @trips.map(&:vendor).uniq
58
+ end
59
+
60
+ def vehicle_types
61
+ @trips.map(&:vehicle).map(&:vehicle_type).uniq
62
+ end
13
63
  end
14
64
  end
@@ -1,9 +1,10 @@
1
1
  module SpreeCmCommissioner
2
2
  class TripResult
3
- attr_accessor :trip_id, :vendor_id, :vendor_name, :short_name, :route_name,
4
- :origin_id, :origin, :destination_id, :destination,
5
- :total_sold, :total_seats,
6
- :duration, :vehicle_id, :departure_time
3
+ attr_accessor :id, :origin_place, :destination_place, :allow_seat_selection,
4
+ :departure_time, :duration, :route_type,
5
+ :vehicle_id, :vehicle, :vendor_id, :vendor,
6
+ :quantity_available, :max_capacity, :boarding, :drop_off,
7
+ :product_id, :amenities, :price, :compare_at_amount, :currency
7
8
 
8
9
  def initialize(options = {})
9
10
  options.each do |key, value|
@@ -11,21 +12,29 @@ module SpreeCmCommissioner
11
12
  end
12
13
  end
13
14
 
14
- def remaining_seats
15
- total_seats - total_sold
15
+ def total_sold
16
+ return if max_capacity.nil? || quantity_available.nil?
17
+
18
+ max_capacity - quantity_available
16
19
  end
17
20
 
18
- def arrival_time
19
- (departure_time.to_time + duration.to_i.seconds).strftime('%H:%M')
21
+ def amenity_ids
22
+ amenities&.map(&:id) || []
20
23
  end
21
24
 
22
25
  def duration_in_hms
23
- return 0 if duration.nil?
26
+ return { hours: 0, minutes: 0, seconds: 0 } if duration.nil?
24
27
 
25
28
  hours = duration / 3600
26
29
  minutes = (duration % 3600) / 60
27
30
  seconds = duration % 60
28
- "#{hours}h #{minutes}m #{seconds}s"
31
+ { hours: hours, minutes: minutes, seconds: seconds }
32
+ end
33
+
34
+ def arrival_time
35
+ return nil if departure_time.nil? || duration.nil?
36
+
37
+ departure_time + duration.seconds
29
38
  end
30
39
  end
31
40
  end
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '2.0.3.pre-pre7'.freeze
2
+ VERSION = '2.1.0-pre1'.freeze
3
3
 
4
4
  module_function
5
5
 
@@ -19,7 +19,9 @@ require 'spree_cm_commissioner/order_jwt_token'
19
19
  require 'spree_cm_commissioner/user_session_jwt_token'
20
20
  require 'spree_cm_commissioner/trip_result'
21
21
  require 'spree_cm_commissioner/trip_query_result'
22
- require 'spree_cm_commissioner/trip_seat_layout_result'
22
+ require 'spree_cm_commissioner/cached_inventory_item'
23
+ require 'spree_cm_commissioner/transit/leg'
24
+ require 'spree_cm_commissioner/transit/seat_selection'
23
25
 
24
26
  require 'activerecord_multi_tenant'
25
27
  require 'google/cloud/recaptcha_enterprise'
@@ -43,5 +45,39 @@ require 'rqrcode'
43
45
  require 'premailer/rails'
44
46
  require 'cm_app_logger'
45
47
  require 'counter_culture'
48
+ require 'paper_trail'
46
49
 
47
50
  require 'byebug' if Rails.env.development? || Rails.env.test?
51
+
52
+ module SpreeCmCommissioner
53
+ class << self
54
+ # Allows overriding the default Redis connection pool with a custom one
55
+ attr_writer :redis_pool
56
+
57
+ def redis_pool
58
+ @redis_pool ||= default_redis_pool
59
+ end
60
+
61
+ # Resets the Redis pool, useful for testing or reinitialization
62
+ def reset_redis_pool
63
+ @redis_pool = nil
64
+ end
65
+
66
+ private
67
+
68
+ def default_redis_pool
69
+ pool_size = ENV.fetch('REDIS_POOL_SIZE', '5').to_i
70
+ timeout = ENV.fetch('REDIS_TIMEOUT', '5').to_i
71
+ redis_url = ENV.fetch('REDIS_URL', 'redis://localhost:6379/12')
72
+
73
+ ConnectionPool.new(size: pool_size, timeout: timeout) do
74
+ Redis.new(url: redis_url, timeout: timeout)
75
+ end
76
+ end
77
+ end
78
+
79
+ # Provides a configuration block for customizing SpreeCmCommissioner settings
80
+ def self.configure
81
+ yield self
82
+ end
83
+ end
@@ -0,0 +1,16 @@
1
+ # recommend to be used in schedule.yml & manually access in /sidekiq/cron
2
+ namespace :spree_cm_commissioner do
3
+ desc 'Create default inventory items for non-permanent stock products'
4
+ task create_default_non_permanent_inventory_items: :environment do
5
+ Spree::Variant.active.with_non_permanent_stock.find_each do |variant|
6
+ total_purchases = variant.complete_line_items.sum(:quantity).to_i || 0
7
+ max_capacity = variant.total_on_hand || 0
8
+ quantity_available = [max_capacity - total_purchases, 0].max
9
+
10
+ variant.create_default_non_permanent_inventory_item!(
11
+ max_capacity: max_capacity,
12
+ quantity_available: quantity_available
13
+ )
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,7 @@
1
+ # recommend to be used in schedule.yml & manually access in /sidekiq/cron
2
+ namespace :spree_cm_commissioner do
3
+ desc 'Ensure product_type in variants, line_items, inventory_items are correct with product'
4
+ task ensure_correct_product_type: :environment do
5
+ SpreeCmCommissioner::EnsureCorrectProductTypeJob.perform_now
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # recommend to be used in schedule.yml & schedule run it everyday
2
+ namespace :spree_cm_commissioner do
3
+ desc 'Generate inventory items for permanent_stock variants.'
4
+ task generate_inventory_items: :environment do
5
+ SpreeCmCommissioner::Stock::PermanentInventoryItemsGeneratorJob.perform_now
6
+ end
7
+ end
@@ -54,6 +54,13 @@ Gem::Specification.new do |s|
54
54
  s.add_dependency "rqrcode", "~> 2.0"
55
55
  s.add_dependency "premailer-rails"
56
56
  s.add_dependency 'counter_culture', '~> 3.2'
57
+ s.add_dependency 'paper_trail', '~> 16.0'
58
+
59
+ # Redis
60
+ s.add_dependency 'redis'
61
+ s.add_dependency 'redis-rails'
62
+ s.add_dependency 'connection_pool'
63
+
57
64
  s.add_development_dependency 'pg'
58
65
  s.add_development_dependency 'spree_dev_tools'
59
66
  s.add_dependency 'blazer', '~> 3.0.4'