spree_cm_commissioner 2.0.3 → 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 (263) 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 +28 -1
  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 +42 -0
  14. data/app/controllers/spree/api/v2/storefront/guests_controller.rb +28 -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/controllers/spree_cm_commissioner/admin/products_controller_decorator.rb +14 -0
  22. data/app/finders/spree_cm_commissioner/accommodations/find.rb +37 -0
  23. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +32 -0
  24. data/app/interactors/spree_cm_commissioner/billing_address_creator.rb +33 -0
  25. data/app/interactors/spree_cm_commissioner/create_vendor.rb +11 -1
  26. data/app/interactors/spree_cm_commissioner/customer_notification_sender.rb +7 -2
  27. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +40 -0
  28. data/app/interactors/spree_cm_commissioner/fetch_facebook_user_data.rb +45 -0
  29. data/app/interactors/spree_cm_commissioner/google_places_fetcher.rb +1 -0
  30. data/app/interactors/spree_cm_commissioner/intercity_taxi_order_creator.rb +106 -0
  31. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +25 -0
  32. data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +44 -0
  33. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +13 -0
  34. data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +15 -0
  35. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +75 -0
  36. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +32 -0
  37. data/app/interactors/spree_cm_commissioner/taxi_trip_creator.rb +66 -0
  38. data/app/interactors/spree_cm_commissioner/transit/draft_order_creator.rb +136 -0
  39. data/app/interactors/spree_cm_commissioner/trip_clone_creator.rb +155 -0
  40. data/app/interactors/spree_cm_commissioner/user_fb_token_authenticator.rb +37 -0
  41. data/app/interactors/spree_cm_commissioner/user_fb_token_checker.rb +20 -0
  42. data/app/interactors/spree_cm_commissioner/user_identity_checker.rb +8 -8
  43. data/app/interactors/spree_cm_commissioner/user_registration_with_fb_token.rb +62 -0
  44. data/app/interactors/spree_cm_commissioner/variant_block_updater.rb +62 -0
  45. data/app/interactors/spree_cm_commissioner/vehicle_updater.rb +41 -0
  46. data/app/jobs/spree_cm_commissioner/application_job.rb +20 -0
  47. data/app/jobs/spree_cm_commissioner/application_unique_job.rb +20 -0
  48. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +7 -0
  49. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +7 -0
  50. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +11 -0
  51. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +11 -0
  52. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +9 -0
  53. data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +18 -15
  54. data/app/models/concerns/spree_cm_commissioner/line_item_guests_concern.rb +29 -15
  55. data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +144 -0
  56. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +3 -12
  57. data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +44 -0
  58. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +39 -0
  59. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +1 -3
  60. data/app/models/concerns/spree_cm_commissioner/product_type.rb +10 -0
  61. data/app/models/concerns/spree_cm_commissioner/route_type.rb +1 -1
  62. data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -1
  63. data/app/models/concerns/spree_cm_commissioner/user_identity.rb +12 -4
  64. data/app/models/concerns/spree_cm_commissioner/variant_options_concern.rb +1 -0
  65. data/app/models/concerns/spree_cm_commissioner/vehicle_type.rb +11 -0
  66. data/app/models/spree_cm_commissioner/address_decorator.rb +36 -2
  67. data/app/models/spree_cm_commissioner/block.rb +43 -0
  68. data/app/models/spree_cm_commissioner/customer_notification.rb +6 -1
  69. data/app/models/spree_cm_commissioner/dynamic_field.rb +2 -0
  70. data/app/models/spree_cm_commissioner/guest.rb +128 -40
  71. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +41 -27
  72. data/app/models/spree_cm_commissioner/inventory.rb +11 -0
  73. data/app/models/spree_cm_commissioner/inventory_item.rb +82 -0
  74. data/app/models/spree_cm_commissioner/line_item_decorator.rb +47 -78
  75. data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
  76. data/app/models/spree_cm_commissioner/option_type_decorator.rb +1 -11
  77. data/app/models/spree_cm_commissioner/order/address_book_decorator.rb +30 -12
  78. data/app/models/spree_cm_commissioner/order_decorator.rb +38 -1
  79. data/app/models/spree_cm_commissioner/place.rb +3 -4
  80. data/app/models/spree_cm_commissioner/price_decorator.rb +9 -0
  81. data/app/models/spree_cm_commissioner/product_decorator.rb +41 -9
  82. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +41 -0
  83. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +126 -0
  84. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +36 -0
  85. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +25 -0
  86. data/app/models/spree_cm_commissioner/reserved_block.rb +31 -0
  87. data/app/models/spree_cm_commissioner/saved_guest.rb +21 -0
  88. data/app/models/spree_cm_commissioner/seat_layout.rb +20 -0
  89. data/app/models/spree_cm_commissioner/seat_section.rb +16 -0
  90. data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +30 -0
  91. data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +53 -0
  92. data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +49 -0
  93. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +4 -0
  94. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +4 -0
  95. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +4 -0
  96. data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +4 -0
  97. data/app/models/spree_cm_commissioner/service_calendar.rb +0 -2
  98. data/app/models/spree_cm_commissioner/state_decorator.rb +0 -1
  99. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +26 -25
  100. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +2 -1
  101. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  102. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +44 -0
  103. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +17 -0
  104. data/app/models/spree_cm_commissioner/taxon_decorator.rb +7 -1
  105. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +0 -6
  106. data/app/models/spree_cm_commissioner/trip.rb +19 -10
  107. data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
  108. data/app/models/spree_cm_commissioner/trip_stop.rb +10 -21
  109. data/app/models/spree_cm_commissioner/user_decorator.rb +1 -1
  110. data/app/models/spree_cm_commissioner/variant_block.rb +17 -0
  111. data/app/models/spree_cm_commissioner/variant_decorator.rb +37 -47
  112. data/app/models/spree_cm_commissioner/variant_options.rb +4 -23
  113. data/app/models/spree_cm_commissioner/vehicle.rb +12 -15
  114. data/app/models/spree_cm_commissioner/vendor_decorator.rb +14 -14
  115. data/app/models/spree_cm_commissioner/vendor_place.rb +13 -3
  116. data/app/overrides/spree/admin/products/_form/industry_taxons.html.erb.deface +26 -0
  117. data/app/overrides/spree/admin/products/_form/taxons.html.erb.deface +26 -0
  118. data/app/overrides/spree/admin/shared/sub_menu/_configuration/locations_tab.html.erb.deface +5 -0
  119. data/app/queries/spree_cm_commissioner/trip_query.rb +110 -131
  120. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +3 -0
  121. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  122. data/app/request_schemas/spree_cm_commissioner/inventory_item_schema.rb +8 -0
  123. data/app/request_schemas/spree_cm_commissioner/trip_search_request_schema.rb +20 -0
  124. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +19 -0
  125. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +2 -0
  126. data/app/serializers/spree/v2/storefront/cart_serializer_decorator.rb +1 -0
  127. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +3 -1
  128. data/app/serializers/spree/v2/storefront/product_serializer_decorator.rb +2 -0
  129. data/app/serializers/spree/v2/storefront/user_serializer_decorator.rb +1 -0
  130. data/app/serializers/spree_cm_commissioner/v2/storefront/amenity_serializer.rb +15 -0
  131. data/app/serializers/spree_cm_commissioner/v2/storefront/block_serializer.rb +11 -0
  132. data/app/serializers/spree_cm_commissioner/v2/storefront/guest_serializer.rb +3 -1
  133. data/app/serializers/spree_cm_commissioner/v2/storefront/inventory_item_serializer.rb +42 -0
  134. data/app/serializers/spree_cm_commissioner/v2/storefront/reserved_block_serializer.rb +9 -0
  135. data/app/serializers/spree_cm_commissioner/v2/storefront/saved_guest_serializer.rb +21 -0
  136. data/app/serializers/spree_cm_commissioner/v2/storefront/seat_layout_serializer.rb +12 -0
  137. data/app/serializers/spree_cm_commissioner/v2/storefront/seat_section_serializer.rb +11 -0
  138. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_place_serializer.rb +10 -0
  139. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_query_result_serializer.rb +14 -0
  140. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_result_serializer.rb +17 -0
  141. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_serializer.rb +20 -0
  142. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_stop_serializer.rb +11 -0
  143. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_variant_serializer.rb +12 -0
  144. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vehicle_serializer.rb +16 -0
  145. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vendor_serializer.rb +16 -0
  146. data/app/serializers/spree_cm_commissioner/v2/storefront/variant_block_serializer.rb +9 -0
  147. data/app/services/spree_cm_commissioner/transit/legs_builder_service.rb +46 -0
  148. data/app/services/spree_cm_commissioner/user_authenticator.rb +10 -1
  149. data/app/views/shared/_map.html.erb +5 -4
  150. data/app/views/spree/admin/customer_notifications/_form.html.erb +3 -3
  151. data/app/views/spree/admin/inventory_items/show.html.erb +72 -0
  152. data/app/views/spree/admin/locations/_form.html.erb +133 -0
  153. data/app/views/spree/admin/locations/edit.html.erb +11 -0
  154. data/app/views/spree/admin/locations/index.html.erb +67 -0
  155. data/app/views/spree/admin/locations/new.html.erb +11 -0
  156. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +7 -2
  157. data/app/views/spree/admin/stock_managements/calendar.html.erb +56 -0
  158. data/app/views/spree/admin/stock_managements/index.html.erb +55 -6
  159. data/config/initializers/paper_trail.rb +1 -0
  160. data/config/initializers/spree_permitted_attributes.rb +24 -4
  161. data/config/locales/en.yml +2 -0
  162. data/config/routes.rb +33 -2
  163. data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +3 -1
  164. data/db/migrate/20250122000000_move_route_type_from_vehicles_to_trips.rb +7 -0
  165. data/db/migrate/20250304293518_create_cm_inventory_items.rb +21 -0
  166. data/db/migrate/20250428092706_add_active_to_cm_customer_notifications.rb +7 -0
  167. data/db/migrate/20250428103550_remove_tenant_id_and_vendor_id_from_cm_customer_notifications.rb +9 -0
  168. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +5 -0
  169. data/db/migrate/20250502025848_add_index_to_spree_products.rb +5 -0
  170. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +5 -0
  171. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +5 -0
  172. data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +7 -0
  173. data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +5 -0
  174. data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +5 -0
  175. data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +9 -0
  176. data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +5 -0
  177. data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +9 -0
  178. data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +5 -0
  179. data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +5 -0
  180. data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +5 -0
  181. data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +6 -0
  182. data/db/migrate/20250620090001_create_cm_seat_layouts.rb +17 -0
  183. data/db/migrate/20250620090002_create_cm_seat_sections.rb +18 -0
  184. data/db/migrate/20250620090003_create_cm_blocks.rb +18 -0
  185. data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +29 -0
  186. data/db/migrate/20250626083642_create_cm_variant_blocks.rb +24 -0
  187. data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +13 -0
  188. data/db/migrate/20250716022821_add_location_reference_to_cm_vendor_places.rb +5 -0
  189. data/db/migrate/20250716031743_drop_table_cm_vendor_stops.rb +5 -0
  190. data/db/migrate/20250717023824_add_vendor_reference_to_cm_trips.rb +5 -0
  191. data/db/migrate/20250717041414_add_location_place_reference_to_cm_trip_stops.rb +5 -0
  192. data/db/migrate/20250717042539_rename_cm_trip_stops_stop_id_column_to_stop_place_id.rb +7 -0
  193. data/db/migrate/20250717042707_rename_cm_trips_origin_and_destination_to_origin_place_and_destination_place.rb +11 -0
  194. data/db/migrate/20250721080738_add_vehicle_type_to_cm_vehicles.rb +7 -0
  195. data/db/migrate/20250725092713_add_block_type_to_cm_blocks.rb +5 -0
  196. data/db/migrate/20250731062816_add_departure_time_and_arrival_time_to_trip_stop.rb +6 -0
  197. data/db/migrate/20250807033035_create_spree_cm_commissioner_saved_guests.rb +23 -0
  198. data/db/migrate/20250807040000_generate_pickup_time_integer_option_values.rb +71 -0
  199. data/db/migrate/20250808054835_add_saved_guest_reference_to_cm_blocks.rb +5 -0
  200. data/db/migrate/20250812015522_remove_unique_indexes_from_cm_user_identity_providers.rb +8 -0
  201. data/db/migrate/20250812121745_add_data_fill_stage_phase_to_cm_guests.rb +5 -0
  202. data/db/migrate/20250814073854_add_call_to_action_to_spree_products.rb +5 -0
  203. data/docker-compose.yml +1 -1
  204. data/lib/cm_app_logger.rb +17 -1
  205. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +14 -11
  206. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_cm_commissioner → spree_dashboard/spree_cm_commissioner}/utilities.js +4 -0
  207. data/lib/spree_cm_commissioner/cached_inventory_item.rb +23 -0
  208. data/lib/spree_cm_commissioner/calendar_event.rb +11 -1
  209. data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +16 -0
  210. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +10 -0
  211. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  212. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +20 -0
  213. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  214. data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +6 -30
  215. data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +0 -36
  216. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +18 -34
  217. data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +27 -0
  218. data/lib/spree_cm_commissioner/test_helper/factories/saved_guest_factory.rb +8 -0
  219. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +11 -0
  220. data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +16 -0
  221. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  222. data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +6 -0
  223. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +11 -3
  224. data/lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb +13 -0
  225. data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +7 -0
  226. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +41 -19
  227. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
  228. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +6 -1
  229. data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +13 -1
  230. data/lib/spree_cm_commissioner/transit/leg.rb +37 -0
  231. data/lib/spree_cm_commissioner/transit/seat_selection.rb +27 -0
  232. data/lib/spree_cm_commissioner/trip_query_result.rb +50 -0
  233. data/lib/spree_cm_commissioner/trip_result.rb +19 -10
  234. data/lib/spree_cm_commissioner/version.rb +1 -1
  235. data/lib/spree_cm_commissioner.rb +37 -1
  236. data/lib/tasks/create_default_non_permanent_inventory_items.rake +16 -0
  237. data/lib/tasks/ensure_correct_product_type.rake +7 -0
  238. data/lib/tasks/generate_inventory_items.rake +7 -0
  239. data/spree_cm_commissioner.gemspec +7 -0
  240. metadata +203 -28
  241. data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +0 -44
  242. data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +0 -20
  243. data/app/models/spree_cm_commissioner/branch.rb +0 -12
  244. data/app/models/spree_cm_commissioner/line_item_seat.rb +0 -10
  245. data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +0 -8
  246. data/app/models/spree_cm_commissioner/stop.rb +0 -23
  247. data/app/models/spree_cm_commissioner/vehicle_seat.rb +0 -11
  248. data/app/models/spree_cm_commissioner/vehicle_type.rb +0 -76
  249. data/app/models/spree_cm_commissioner/vendor_stop.rb +0 -10
  250. data/app/queries/spree_cm_commissioner/trip_search_query.rb +0 -76
  251. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +0 -45
  252. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +0 -55
  253. data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +0 -54
  254. data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +0 -11
  255. data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +0 -12
  256. data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +0 -8
  257. data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +0 -8
  258. data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +0 -7
  259. data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +0 -14
  260. data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +0 -8
  261. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +0 -8
  262. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +0 -96
  263. data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +0 -11
@@ -50,15 +50,35 @@ module Spree
50
50
  :term_and_condition_promotion
51
51
  ]
52
52
 
53
- @@checkout_attributes += %i[
54
- channel
55
- phone_number
56
- country_code
53
+ @@checkout_attributes += [
54
+ :channel,
55
+ :phone_number,
56
+ :country_code,
57
+ {
58
+ saved_guests_attributes: %i[
59
+ id
60
+ first_name
61
+ last_name
62
+ dob
63
+ age
64
+ gender
65
+ email
66
+ country_code
67
+ phone_number
68
+ nationality_id
69
+ occupation_id
70
+ ]
71
+ }
57
72
  ]
58
73
 
59
74
  @@address_attributes += %i[
60
75
  age
61
76
  gender
62
77
  ]
78
+
79
+ @@stock_movement_attributes += %i[
80
+ originator_type
81
+ originator_id
82
+ ]
63
83
  end
64
84
  end
@@ -117,6 +117,8 @@ en:
117
117
  empty_info: "No <b>Photos</b> found."
118
118
  nearby_place:
119
119
  empty_info: "No <b>Nearby places</b> found."
120
+ location:
121
+ already_exist: "Location already exist"
120
122
 
121
123
  product_place:
122
124
  empty_info: "No <b>Places</b> found."
data/config/routes.rb CHANGED
@@ -138,7 +138,21 @@ Spree::Core::Engine.add_routes do
138
138
  end
139
139
  end
140
140
 
141
- resources :stock_managements
141
+ resources :stock_managements do
142
+ collection do
143
+ get :calendar
144
+ end
145
+ end
146
+
147
+ resources :variants do
148
+ resources :inventory_items, only: %i[show create] do
149
+ member do
150
+ patch :reset
151
+ patch :update_prices
152
+ delete :delete_prices
153
+ end
154
+ end
155
+ end
142
156
 
143
157
  resources :product_completion_steps do
144
158
  collection do
@@ -270,6 +284,8 @@ Spree::Core::Engine.add_routes do
270
284
  end
271
285
  end
272
286
 
287
+ resources :locations
288
+
273
289
  resources :tenants do
274
290
  resources :vendors, controller: :tenant_vendors
275
291
  end
@@ -531,12 +547,18 @@ Spree::Core::Engine.add_routes do
531
547
  end
532
548
 
533
549
  namespace :storefront do
550
+ resources :inventory_item
551
+
534
552
  resources :waiting_room_sessions, only: :create
535
553
  resources :vattanac_banks, only: %i[create]
536
554
  resource :cart, controller: :cart, only: %i[show create destroy] do
537
555
  patch :restart_checkout_flow
538
556
  end
539
557
 
558
+ resources :trip_places
559
+ resources :trip_search, only: [:index]
560
+ resources :trips, only: %i[show]
561
+
540
562
  namespace :queue_cart do
541
563
  resources :line_items, only: [:create]
542
564
  end
@@ -556,7 +578,10 @@ Spree::Core::Engine.add_routes do
556
578
  resource :cart_guests, only: %i[create destroy]
557
579
  resources :cart_payment_method_groups, only: %i[index]
558
580
 
559
- resources :accommodations, only: %i[index show]
581
+ resources :accommodations, only: %i[index show] do
582
+ resources :variants, only: %i[index show], module: :accommodations
583
+ end
584
+
560
585
  resources :line_items, only: %i[index show]
561
586
  resources :account_checker
562
587
  resource :account_recovers, only: [:update]
@@ -622,6 +647,7 @@ Spree::Core::Engine.add_routes do
622
647
  resources :id_cards
623
648
  end
624
649
  resources :dynamic_field_options
650
+ resources :dynamic_fields
625
651
  resources :user_guests do
626
652
  resources :id_cards
627
653
  end
@@ -631,6 +657,11 @@ Spree::Core::Engine.add_routes do
631
657
  post :user_order_transfer, to: 'user_order_transfer#create'
632
658
  resources :anonymous_line_items, path: 'a', only: %i[show]
633
659
  resources :anonymous_orders, path: 'o', only: %i[show]
660
+
661
+ resources :inventory_items, only: %i[index]
662
+ namespace :transit do
663
+ resources :draft_orders, only: %i[create]
664
+ end
634
665
  end
635
666
 
636
667
  namespace :operator do
@@ -1,5 +1,7 @@
1
1
  class UpdateCounterCacheOfVehicleType < ActiveRecord::Migration[7.0]
2
- def up
2
+ def up
3
+ if defined?(SpreeCmCommissioner::VehicleSeat) && SpreeCmCommissioner::VehicleSeat.respond_to?(:counter_culture_fix_counts)
3
4
  SpreeCmCommissioner::VehicleSeat.counter_culture_fix_counts
4
5
  end
6
+ end
5
7
  end
@@ -0,0 +1,7 @@
1
+ class MoveRouteTypeFromVehiclesToTrips < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_trips, :route_type, :integer, if_not_exists: true
4
+ add_column :cm_trips, :distance, :decimal, precision: 10, scale: 2, if_not_exists: true
5
+ remove_column :cm_vehicles, :route_type, :integer, if_exists: true
6
+ end
7
+ end
@@ -0,0 +1,21 @@
1
+ class CreateCmInventoryItems < ActiveRecord::Migration[7.0]
2
+ def up
3
+ create_table :cm_inventory_items, if_not_exists: true do |t|
4
+ t.integer :variant_id
5
+ t.date :inventory_date
6
+ t.integer :max_capacity, default: 0, null: false
7
+ t.integer :quantity_available, default: 0, null: false
8
+ t.integer :product_type, default: 0, null: false
9
+
10
+ t.timestamps
11
+ end
12
+
13
+ add_index :cm_inventory_items, :variant_id, if_not_exists: true
14
+ add_index :cm_inventory_items, :inventory_date, if_not_exists: true
15
+ add_index :cm_inventory_items, [:variant_id, :inventory_date], unique: true, if_not_exists: true
16
+ end
17
+
18
+ def down
19
+ drop_table :cm_inventory_items
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ class AddActiveToCmCustomerNotifications < ActiveRecord::Migration[7.0]
2
+ def change
3
+ unless column_exists?(:cm_customer_notifications, :active)
4
+ add_column :cm_customer_notifications, :active, :boolean, default: true
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ class RemoveTenantIdAndVendorIdFromCmCustomerNotifications < ActiveRecord::Migration[7.0]
2
+ def change
3
+ remove_column :cm_customer_notifications, :tenant_id, :integer if column_exists?(:cm_customer_notifications, :tenant_id)
4
+
5
+ unless column_exists?(:cm_customer_notifications, :vendor_id)
6
+ add_column :cm_customer_notifications, :vendor_id, :integer
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class AddLockVersionToCmInventoryItems < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_inventory_items, :lock_version, :integer, default: 0, null: false, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddIndexToSpreeProducts < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_index :spree_products, :product_type unless index_exists?(:spree_products, :product_type)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddProductTypeToSpreeVariants < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_variants, :product_type, :integer, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddProductTypeToSpreeLineItems < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_line_items, :product_type, :integer, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class AddInventoryItemToSpreePrices < ActiveRecord::Migration[7.0]
2
+ def change
3
+ unless column_exists?(:spree_prices, :inventory_item_id)
4
+ add_reference :spree_prices, :inventory_item, foreign_key: { to_table: :cm_inventory_items }
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class DropTableCmLineItemSeats < ActiveRecord::Migration[7.0]
2
+ def change
3
+ drop_table :cm_line_item_seats, if_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class DropTableCmVehicleSeats < ActiveRecord::Migration[7.0]
2
+ def change
3
+ drop_table :cm_vehicle_seats, if_exists: true
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class DropTableCmVehicleTypes < ActiveRecord::Migration[7.0]
2
+ def change
3
+ if column_exists?(:cm_vehicles, :vehicle_type_id)
4
+ remove_reference :cm_vehicles, :vehicle_type, foreign_key: { to_table: :cm_vehicle_types }
5
+ end
6
+
7
+ drop_table :cm_vehicle_types, if_exists: true
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class DropTableCmOptionValueVehicleTypes < ActiveRecord::Migration[7.0]
2
+ def change
3
+ drop_table :cm_option_value_vehicle_types, if_exists: true
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class RemoveUnnecessaryFieldsFromCmPlaces < ActiveRecord::Migration[7.0]
2
+ def change
3
+ # It is for single table inheritance (branch, stop)
4
+ # Remove it as we no longer need.
5
+ remove_column :cm_places, :type if column_exists?(:cm_places, :type)
6
+ remove_column :cm_places, :vendor_id if column_exists?(:cm_places, :vendor_id)
7
+ remove_column :cm_places, :branch_id if column_exists?(:cm_places, :branch_id)
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveRouteTypeFromSpreeProducts < ActiveRecord::Migration[7.0]
2
+ def change
3
+ remove_column :spree_products, :route_type if column_exists?(:spree_products, :route_type)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveUnnecessaryFieldsFromSpreeTaxons < ActiveRecord::Migration[7.0]
2
+ def change
3
+ remove_column :spree_taxons, :data_type if column_exists?(:spree_taxons, :data_type)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveVariantIdFromCmTrips < ActiveRecord::Migration[7.0]
2
+ def change
3
+ remove_column :cm_trips, :variant_id if column_exists?(:cm_trips, :variant_id)
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class UpdateCmTripConnectionsToUseCmTrips < ActiveRecord::Migration[7.0]
2
+ def change
3
+ remove_foreign_key :cm_trip_connections, column: :from_trip_id if foreign_key_exists?(:cm_trip_connections, column: :from_trip_id)
4
+ remove_foreign_key :cm_trip_connections, column: :to_trip_id if foreign_key_exists?(:cm_trip_connections, column: :to_trip_id)
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ class CreateCmSeatLayouts < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_seat_layouts, if_not_exists: true do |t|
4
+ t.string :name
5
+ t.integer :total_seats
6
+ t.integer :total_sections
7
+ t.integer :status, default: 0
8
+
9
+ t.float :width
10
+ t.float :height
11
+
12
+ t.references :layoutable, polymorphic: true, index: true
13
+
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ class CreateCmSeatSections < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_seat_sections, if_not_exists: true do |t|
4
+ t.string :name
5
+ t.references :seat_layout, foreign_key: { to_table: :cm_seat_layouts }, null: false
6
+ t.integer :total_seats
7
+
8
+ t.float :width
9
+ t.float :height
10
+ t.float :x
11
+ t.float :y
12
+ t.float :rotation
13
+ t.string :shape_path
14
+
15
+ t.timestamps
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ class CreateCmBlocks < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_blocks, if_not_exists: true do |t|
4
+ t.string :label
5
+
6
+ t.references :seat_layout, foreign_key: { to_table: :cm_seat_layouts }, null: false
7
+ t.references :seat_section, foreign_key: { to_table: :cm_seat_sections }, null: true
8
+
9
+ t.float :width
10
+ t.float :height
11
+ t.float :x
12
+ t.float :y
13
+ t.float :rotation
14
+
15
+ t.timestamps
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ class CreateCmReservedBlocks < ActiveRecord::Migration[7.0]
2
+ def up
3
+ create_table :cm_reserved_blocks, if_not_exists: true do |t|
4
+ t.references :updated_by, foreign_key: { to_table: :spree_users }, null: true
5
+ t.references :guest, foreign_key: { to_table: :cm_guests }, null: true
6
+ t.references :inventory_item, foreign_key: { to_table: :cm_inventory_items }, null: false
7
+ t.references :block, null: false, foreign_key: { to_table: :cm_blocks }
8
+
9
+ t.integer :status, null: false
10
+
11
+ t.datetime :inventory_date
12
+ t.datetime :expired_at
13
+
14
+ t.timestamps
15
+ end
16
+
17
+ unless index_exists?(:cm_reserved_blocks, [:block_id, :inventory_item_id], unique: true)
18
+ add_index :cm_reserved_blocks, [:block_id, :inventory_item_id], unique: true, name: 'index_reserved_blocks_on_block_and_inventory_item'
19
+ end
20
+ end
21
+
22
+ def down
23
+ if index_exists?(:cm_reserved_blocks, [:block_id, :inventory_item_id], name: 'index_reserved_blocks_on_block_and_inventory_item')
24
+ remove_index :cm_reserved_blocks, name: 'index_reserved_blocks_on_block_and_inventory_item'
25
+ end
26
+
27
+ drop_table :cm_reserved_blocks, if_exists: true
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+
2
+ class CreateCmVariantBlocks < ActiveRecord::Migration[7.0]
3
+ def up
4
+ create_table :cm_variant_blocks, if_not_exists: true do |t|
5
+ t.references :variant, null: false, foreign_key: { to_table: :spree_variants }
6
+ t.references :trip, null: false, foreign_key: { to_table: :cm_trips }
7
+ t.references :block, null: false, foreign_key: { to_table: :cm_blocks }
8
+
9
+ t.timestamps
10
+ end
11
+
12
+ unless index_exists?(:cm_variant_blocks, [:variant_id, :trip_id, :block_id], unique: true, name: 'index_variant_blocks_on_variant_trip_block')
13
+ add_index :cm_variant_blocks, [:variant_id, :trip_id, :block_id], unique: true, name: 'index_variant_blocks_on_variant_trip_block'
14
+ end
15
+ end
16
+
17
+ def down
18
+ if index_exists?(:cm_variant_blocks, [:variant_id, :trip_id, :block_id], name: 'index_variant_blocks_on_variant_trip_block')
19
+ remove_index :cm_variant_blocks, name: 'index_variant_blocks_on_variant_trip_block'
20
+ end
21
+
22
+ drop_table :cm_variant_blocks, if_exists: true
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ class AddBlockIdToCmGuests < ActiveRecord::Migration[7.0]
2
+ def up
3
+ unless column_exists?(:cm_guests, :block_id)
4
+ add_reference :cm_guests, :block, foreign_key: { to_table: :cm_blocks }
5
+ end
6
+ end
7
+
8
+ def down
9
+ if column_exists?(:cm_guests, :block_id)
10
+ remove_column :cm_guests, :block_id
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ class AddLocationReferenceToCmVendorPlaces < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_reference :cm_vendor_places, :location, foreign_key: { to_table: :cm_vendor_places }, index: true, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class DropTableCmVendorStops < ActiveRecord::Migration[7.0]
2
+ def change
3
+ drop_table :cm_vendor_stops, if_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddVendorReferenceToCmTrips < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_reference :cm_trips, :vendor, foreign_key: { to_table: :spree_vendors }, index: true, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddLocationPlaceReferenceToCmTripStops < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_reference :cm_trip_stops, :location_place, foreign_key: { to_table: :cm_places }, index: true, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class RenameCmTripStopsStopIdColumnToStopPlaceId < ActiveRecord::Migration[7.0]
2
+ def change
3
+ if column_exists?(:cm_trip_stops, :stop_id)
4
+ rename_column :cm_trip_stops, :stop_id, :stop_place_id
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ class RenameCmTripsOriginAndDestinationToOriginPlaceAndDestinationPlace < ActiveRecord::Migration[7.0]
2
+ def change
3
+ if column_exists?(:cm_trips, :origin_id)
4
+ rename_column :cm_trips, :origin_id, :origin_place_id
5
+ end
6
+
7
+ if column_exists?(:cm_trips, :destination_id)
8
+ rename_column :cm_trips, :destination_id, :destination_place_id
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ class AddVehicleTypeToCmVehicles < ActiveRecord::Migration[7.0]
2
+ def change
3
+ unless column_exists?(:cm_vehicles, :vehicle_type)
4
+ add_column :cm_vehicles, :vehicle_type, :integer
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class AddBlockTypeToCmBlocks < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_blocks, :block_type, :integer, null: false, default: 1, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class AddDepartureTimeAndArrivalTimeToTripStop < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_trip_stops, :departure_time, :datetime, if_not_exists: true
4
+ add_column :cm_trip_stops, :arrival_time, :datetime, if_not_exists: true
5
+ end
6
+ end
@@ -0,0 +1,23 @@
1
+ class CreateSpreeCmCommissionerSavedGuests < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_saved_guests, if_not_exists: true do |t|
4
+ t.string :first_name
5
+ t.string :last_name
6
+
7
+ t.date :dob
8
+ t.integer :age
9
+ t.integer :gender
10
+
11
+ t.string :email
12
+ t.string :country_code, limit: 5
13
+ t.string :phone_number, limit: 50
14
+ t.string :intel_phone_number
15
+
16
+ t.references :user, foreign_key: { to_table: :spree_users }, null: true
17
+ t.references :nationality, foreign_key: { to_table: :spree_taxons }, null: true
18
+ t.references :occupation, foreign_key: { to_table: :spree_taxons }, null: true
19
+
20
+ t.timestamps
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,71 @@
1
+ class GeneratePickupTimeIntegerOptionValues < ActiveRecord::Migration[7.0]
2
+ def up
3
+ generate_time_option_values(
4
+ option_type_name: 'pickup-time',
5
+ option_type_presentation: 'Pickup Time',
6
+ start_time: '00:00',
7
+ end_time: '23:45',
8
+ interval_minutes: 15
9
+ )
10
+ end
11
+
12
+ def down
13
+ remove_time_option_values('pickup-time')
14
+ end
15
+
16
+ private
17
+
18
+ def generate_time_option_values(option_type_name:, option_type_presentation:, start_time:, end_time:, interval_minutes:)
19
+ option_type = Spree::OptionType.find_by(name: option_type_name)
20
+ unless option_type
21
+ option_type = Spree::OptionType.new(name: option_type_name, presentation: option_type_presentation)
22
+ option_type.save(validate: false)
23
+ end
24
+
25
+ # Ensure correct attributes and scope
26
+ option_type.update_columns(attr_type: 'integer', kind: 'variant')
27
+
28
+ Spree::OptionValue.where(option_type_id: option_type.id).delete_all
29
+
30
+ time_slots = []
31
+ current_time = parse_time(start_time)
32
+ end_time_parsed = parse_time(end_time)
33
+
34
+ while current_time <= end_time_parsed
35
+ time_slots << current_time
36
+ current_time += interval_minutes.minutes
37
+ end
38
+
39
+ rows = []
40
+ time_slots.each_with_index do |time, index|
41
+ minutes_since_midnight = (time.hour * 60) + time.min
42
+ rows << {
43
+ name: minutes_since_midnight.to_s,
44
+ presentation: minutes_since_midnight.to_s,
45
+ position: index,
46
+ option_type_id: option_type.id,
47
+ created_at: Time.current,
48
+ updated_at: Time.current
49
+ }
50
+ end
51
+
52
+ Spree::OptionValue.insert_all(rows) if rows.any?
53
+ puts "Created #{rows.size} #{option_type_name} option values as integer minutes since midnight"
54
+ end
55
+
56
+ def remove_time_option_values(option_type_name)
57
+ option_type = Spree::OptionType.find_by(name: option_type_name)
58
+ return unless option_type
59
+
60
+ count = Spree::OptionValue.where(option_type_id: option_type.id).count
61
+ Spree::OptionValue.where(option_type_id: option_type.id).delete_all
62
+ option_type.delete
63
+ puts "Removed #{option_type_name} option type and #{count} option values"
64
+ end
65
+
66
+ def parse_time(time_string)
67
+ Time.zone.parse("2000-01-01 #{time_string}")
68
+ end
69
+ end
70
+
71
+
@@ -0,0 +1,5 @@
1
+ class AddSavedGuestReferenceToCmBlocks < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_reference :cm_guests, :saved_guest, foreign_key: { to_table: :cm_saved_guests }, null: true, index: true, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ class RemoveUniqueIndexesFromCmUserIdentityProviders < ActiveRecord::Migration[7.0]
2
+ def change
3
+ if index_exists?(:cm_user_identity_providers, [:identity_type, :sub], name: "index_cm_user_identity_providers_on_identity_type_and_sub")
4
+ remove_index :cm_user_identity_providers,
5
+ name: "index_cm_user_identity_providers_on_identity_type_and_sub"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ class AddDataFillStagePhaseToCmGuests < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_guests, :data_fill_stage_phase, :string, default: 'pre_registration', null: false, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddCallToActionToSpreeProducts < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_products, :call_to_action, :integer, null: true, if_not_exists: true
4
+ end
5
+ end
data/docker-compose.yml CHANGED
@@ -20,7 +20,7 @@ services:
20
20
 
21
21
  volumes:
22
22
  - .:/gem
23
- - /gem/vendor/bundle
23
+ - ./vendor/bundle:/gem/vendor/bundle
24
24
 
25
25
  # depends_on:
26
26
  # - db