spree_cm_commissioner 2.0.0 → 2.0.1.pre.pre

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 (215) 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 +32 -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/stock_managements_controller.rb +63 -1
  9. data/app/controllers/spree/api/v2/organizer/invite_guests_controller.rb +1 -1
  10. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +42 -0
  11. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +14 -31
  12. data/app/controllers/spree/api/v2/storefront/guests_controller.rb +13 -13
  13. data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
  14. data/app/factory/spree_cm_commissioner/invite_guest_claimed_telegram_message_factory.rb +81 -23
  15. data/app/finders/spree_cm_commissioner/accommodations/find.rb +37 -0
  16. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +32 -0
  17. data/app/interactors/spree_cm_commissioner/create_ticket.rb +5 -6
  18. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +40 -0
  19. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +25 -0
  20. data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +1 -0
  21. data/app/interactors/spree_cm_commissioner/sms.rb +1 -1
  22. data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +44 -0
  23. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +13 -0
  24. data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +15 -0
  25. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +75 -0
  26. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +32 -0
  27. data/app/interactors/spree_cm_commissioner/user_id_token_authenticator.rb +3 -7
  28. data/app/interactors/spree_cm_commissioner/user_id_token_checker.rb +3 -11
  29. data/app/interactors/spree_cm_commissioner/user_identity_checker.rb +6 -12
  30. data/app/interactors/spree_cm_commissioner/user_registration_with_id_token.rb +1 -7
  31. data/app/jobs/spree_cm_commissioner/application_job.rb +20 -0
  32. data/app/jobs/spree_cm_commissioner/application_unique_job.rb +20 -0
  33. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +7 -0
  34. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +7 -0
  35. data/app/jobs/spree_cm_commissioner/sms_pin_code_job.rb +1 -1
  36. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +11 -0
  37. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +11 -0
  38. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +9 -0
  39. data/app/mailers/spree/order_mailer_decorator.rb +3 -18
  40. data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +9 -15
  41. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -12
  42. data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +44 -0
  43. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +39 -0
  44. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +1 -3
  45. data/app/models/concerns/spree_cm_commissioner/product_type.rb +10 -0
  46. data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -1
  47. data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +0 -1
  48. data/app/models/spree_cm_commissioner/block.rb +23 -0
  49. data/app/models/spree_cm_commissioner/dynamic_field.rb +0 -20
  50. data/app/models/spree_cm_commissioner/guest.rb +18 -56
  51. data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +1 -41
  52. data/app/models/spree_cm_commissioner/inventory.rb +11 -0
  53. data/app/models/spree_cm_commissioner/inventory_item.rb +69 -0
  54. data/app/models/spree_cm_commissioner/line_item_decorator.rb +46 -78
  55. data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
  56. data/app/models/spree_cm_commissioner/option_type_decorator.rb +1 -11
  57. data/app/models/spree_cm_commissioner/order_decorator.rb +30 -1
  58. data/app/models/spree_cm_commissioner/place.rb +1 -4
  59. data/app/models/spree_cm_commissioner/price_decorator.rb +9 -0
  60. data/app/models/spree_cm_commissioner/product_decorator.rb +10 -28
  61. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +41 -0
  62. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +126 -0
  63. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +36 -0
  64. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +25 -0
  65. data/app/models/spree_cm_commissioner/reserved_block.rb +30 -0
  66. data/app/models/spree_cm_commissioner/seat_layout.rb +20 -0
  67. data/app/models/spree_cm_commissioner/seat_section.rb +16 -0
  68. data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +30 -0
  69. data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +53 -0
  70. data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +49 -0
  71. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +4 -0
  72. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +4 -0
  73. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +4 -0
  74. data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +4 -0
  75. data/app/models/spree_cm_commissioner/service_calendar.rb +0 -2
  76. data/app/models/spree_cm_commissioner/state_decorator.rb +0 -1
  77. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +26 -25
  78. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +2 -1
  79. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  80. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +44 -0
  81. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +17 -0
  82. data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -1
  83. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +0 -6
  84. data/app/models/spree_cm_commissioner/trip.rb +8 -10
  85. data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
  86. data/app/models/spree_cm_commissioner/trip_stop.rb +6 -25
  87. data/app/models/spree_cm_commissioner/user_identity_provider.rb +4 -26
  88. data/app/models/spree_cm_commissioner/variant_block.rb +9 -0
  89. data/app/models/spree_cm_commissioner/variant_decorator.rb +37 -47
  90. data/app/models/spree_cm_commissioner/variant_options.rb +0 -23
  91. data/app/models/spree_cm_commissioner/vehicle.rb +9 -14
  92. data/app/models/spree_cm_commissioner/vendor_decorator.rb +11 -17
  93. data/app/models/spree_cm_commissioner/vendor_place.rb +9 -3
  94. data/app/queries/spree_cm_commissioner/trip_query.rb +70 -44
  95. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +3 -0
  96. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  97. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +19 -0
  98. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +2 -0
  99. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +1 -0
  100. data/app/serializers/spree/v2/tenant/user_serializer.rb +0 -1
  101. data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +1 -1
  102. data/app/services/spree_cm_commissioner/user_authenticator.rb +1 -1
  103. data/app/views/spree/admin/inventory_items/show.html.erb +72 -0
  104. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +7 -2
  105. data/app/views/spree/admin/stock_managements/calendar.html.erb +56 -0
  106. data/app/views/spree/admin/stock_managements/index.html.erb +55 -6
  107. data/app/views/spree/admin/tenant_vendors/index.html.erb +2 -9
  108. data/app/views/spree/admin/tenants/_form.html.erb +0 -9
  109. data/app/views/spree/admin/tenants/edit.html.erb +1 -2
  110. data/app/views/spree/admin/tenants/index.html.erb +1 -7
  111. data/app/views/spree/admin/vendors/_form.html.erb +0 -14
  112. data/app/views/spree/order_mailer/confirm_email.html.erb +16 -27
  113. data/app/views/spree_cm_commissioner/layouts/order_mailer.html.erb +1 -5
  114. data/app/views/spree_cm_commissioner/order_mailer/_mailer_stylesheets.html.erb +4 -41
  115. data/config/initializers/paper_trail.rb +1 -0
  116. data/config/initializers/spree_permitted_attributes.rb +5 -0
  117. data/config/locales/en.yml +1 -5
  118. data/config/routes.rb +21 -2
  119. data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +3 -1
  120. data/db/migrate/20250304293518_create_cm_inventory_items.rb +21 -0
  121. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +5 -0
  122. data/db/migrate/20250502025848_add_index_to_spree_products.rb +5 -0
  123. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +5 -0
  124. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +5 -0
  125. data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +7 -0
  126. data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +5 -0
  127. data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +5 -0
  128. data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +9 -0
  129. data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +5 -0
  130. data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +9 -0
  131. data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +5 -0
  132. data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +5 -0
  133. data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +5 -0
  134. data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +6 -0
  135. data/db/migrate/20250620090001_create_cm_seat_layouts.rb +17 -0
  136. data/db/migrate/20250620090002_create_cm_seat_sections.rb +18 -0
  137. data/db/migrate/20250620090003_create_cm_blocks.rb +18 -0
  138. data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +29 -0
  139. data/db/migrate/20250626083642_create_cm_variant_blocks.rb +24 -0
  140. data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +13 -0
  141. data/db/migrate/20250716022821_add_location_reference_to_cm_vendor_places.rb +5 -0
  142. data/db/migrate/20250716031743_drop_table_cm_vendor_stops.rb +5 -0
  143. data/db/migrate/20250717023824_add_vendor_reference_to_cm_trips.rb +5 -0
  144. data/db/migrate/20250717041414_add_location_place_reference_to_cm_trip_stops.rb +5 -0
  145. data/db/migrate/20250717042539_rename_cm_trip_stops_stop_id_column_to_stop_place_id.rb +7 -0
  146. data/db/migrate/20250717042707_rename_cm_trips_origin_and_destination_to_origin_place_and_destination_place.rb +11 -0
  147. data/docker-compose.yml +1 -1
  148. data/lib/cm_app_logger.rb +11 -4
  149. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +14 -11
  150. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_cm_commissioner → spree_dashboard/spree_cm_commissioner}/utilities.js +4 -0
  151. data/lib/spree_cm_commissioner/cached_inventory_item.rb +23 -0
  152. data/lib/spree_cm_commissioner/calendar_event.rb +11 -1
  153. data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +15 -0
  154. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +10 -0
  155. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  156. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +9 -0
  157. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  158. data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +6 -30
  159. data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +0 -36
  160. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +18 -34
  161. data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +27 -0
  162. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +11 -0
  163. data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +16 -0
  164. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  165. data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +6 -0
  166. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +11 -3
  167. data/lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb +10 -0
  168. data/lib/spree_cm_commissioner/test_helper/factories/user_identity_provider_factory.rb +1 -1
  169. data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +7 -0
  170. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +41 -19
  171. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
  172. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +6 -1
  173. data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +13 -1
  174. data/lib/spree_cm_commissioner/trip_query_result.rb +8 -0
  175. data/lib/spree_cm_commissioner/trip_result.rb +5 -3
  176. data/lib/spree_cm_commissioner/version.rb +1 -1
  177. data/lib/spree_cm_commissioner.rb +35 -1
  178. data/lib/tasks/create_default_non_permanent_inventory_items.rake +16 -0
  179. data/lib/tasks/ensure_correct_product_type.rake +7 -0
  180. data/lib/tasks/generate_inventory_items.rake +7 -0
  181. data/spree_cm_commissioner.gemspec +7 -0
  182. metadata +141 -38
  183. data/app/assets/images/mailer/mail.png +0 -0
  184. data/app/assets/images/mailer/tenant_phone.png +0 -0
  185. data/app/assets/images/mailer/tenant_user.png +0 -0
  186. data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +0 -44
  187. data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +0 -20
  188. data/app/models/spree_cm_commissioner/branch.rb +0 -12
  189. data/app/models/spree_cm_commissioner/line_item_seat.rb +0 -10
  190. data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +0 -8
  191. data/app/models/spree_cm_commissioner/stop.rb +0 -23
  192. data/app/models/spree_cm_commissioner/vehicle_seat.rb +0 -11
  193. data/app/models/spree_cm_commissioner/vehicle_type.rb +0 -76
  194. data/app/models/spree_cm_commissioner/vendor_stop.rb +0 -10
  195. data/app/queries/spree_cm_commissioner/trip_search_query.rb +0 -76
  196. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +0 -45
  197. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +0 -55
  198. data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +0 -54
  199. data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +0 -11
  200. data/app/views/spree_cm_commissioner/order_mailer/tenant/_customer_info.html.erb +0 -42
  201. data/app/views/spree_cm_commissioner/order_mailer/tenant/_footer.html.erb +0 -25
  202. data/app/views/spree_cm_commissioner/order_mailer/tenant/_greeting.html.erb +0 -19
  203. data/app/views/spree_cm_commissioner/order_mailer/tenant/_support_contact.html.erb +0 -33
  204. data/db/migrate/20250709073455_add_email_fields_to_spree_vendors.rb +0 -6
  205. data/db/migrate/20250715103333_remove_indexes_from_cm_user_identity_providers.rb +0 -13
  206. data/db/migrate/20250718071620_add_data_fill_stage_to_dynamic_fields.rb +0 -5
  207. data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +0 -12
  208. data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +0 -8
  209. data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +0 -8
  210. data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +0 -7
  211. data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +0 -14
  212. data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +0 -8
  213. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +0 -8
  214. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +0 -96
  215. data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +0 -11
@@ -0,0 +1,16 @@
1
+ FactoryBot.define do
2
+ factory :cm_seat_section, class: SpreeCmCommissioner::SeatSection do
3
+ name { "Section #{rand(1.0..50.0)}" }
4
+
5
+ association :seat_layout, factory: :cm_seat_layout
6
+
7
+ width { rand(50.0..500.0) }
8
+ height { rand(50.0..500.0) }
9
+
10
+ x { rand(0.0..500.0) }
11
+ y { rand(0.0..500.0) }
12
+
13
+ rotation { rand(-180.0..180.0) }
14
+ shape_path { "M0,0 L10,0 L10,10 L0,10 Z" }
15
+ end
16
+ end
@@ -24,8 +24,8 @@ FactoryBot.define do
24
24
  # variant will add itself to all stock_locations in an after_create
25
25
  # creating a product will automatically create a master variant
26
26
  store = Spree::Store.first || create(:store)
27
- product_1 = create(:product, stores: [store])
28
- product_2 = create(:product, stores: [store])
27
+ product_1 = create(:cm_product, stores: [store])
28
+ product_2 = create(:cm_product, stores: [store])
29
29
 
30
30
  stock_location.stock_items.where(variant_id: product_1.master.id).first.adjust_count_on_hand(10)
31
31
  stock_location.stock_items.where(variant_id: product_2.master.id).first.adjust_count_on_hand(20)
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :cm_trip_connection, class: SpreeCmCommissioner::TripConnection do
3
+ from_trip_id { create(:cm_trip) }
4
+ to_trip_id { create(:cm_trip) }
5
+ end
6
+ end
@@ -1,6 +1,14 @@
1
1
  FactoryBot.define do
2
- factory :trip_connection, class: 'SpreeCmCommissioner::TripConnection' do
3
- association :from_trip, factory: :variant
4
- association :to_trip, factory: :variant
2
+ factory :cm_trip, class: SpreeCmCommissioner::Trip do
3
+ departure_time { Time.zone.now.change(hour: 8, min: 0) } # example 8:00 AM
4
+ duration { 3600 } # 1 hour in seconds
5
+ allow_seat_selection { true }
6
+
7
+ product { create(:cm_product, product_type: :transit) }
8
+
9
+ association :vendor, factory: :cm_transit_vendor
10
+ association :vehicle, factory: :cm_vehicle
11
+ association :origin_place, factory: :cm_place
12
+ association :destination_place, factory: :cm_place
5
13
  end
6
14
  end
@@ -0,0 +1,10 @@
1
+ FactoryBot.define do
2
+ factory :cm_trip_stop, class: SpreeCmCommissioner::TripStop do
3
+ association :trip, factory: :cm_trip
4
+ association :stop_place, factory: :cm_place
5
+ association :location_place, factory: :cm_place
6
+
7
+ stop_type { :boarding }
8
+ stop_name { stop_place.name }
9
+ end
10
+ end
@@ -1,5 +1,5 @@
1
1
  FactoryBot.define do
2
- factory :cm_user_identity_provider, class: SpreeCmCommissioner::UserIdentityProvider do
2
+ factory :user_identity_provider, class: SpreeCmCommissioner::UserIdentityProvider do
3
3
  sequence(:sub) { |n| "sub-#{n}" }
4
4
  identity_type { SpreeCmCommissioner::UserIdentityProvider.identity_types[:google] }
5
5
  email { 'fake@example.com' }
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :cm_variant_block, class: SpreeCmCommissioner::VariantBlock do
3
+ association :variant, factory: :cm_variant
4
+ association :trip, factory: :cm_trip
5
+ association :block, factory: :cm_block
6
+ end
7
+ end
@@ -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 }
@@ -10,5 +10,13 @@ module SpreeCmCommissioner
10
10
  def direct?
11
11
  @trips.size == 1
12
12
  end
13
+
14
+ def quantity_available
15
+ @trips.map(&:quantity_available).compact.min
16
+ end
17
+
18
+ def max_capacity
19
+ @trips.map(&:max_capacity).compact.min
20
+ end
13
21
  end
14
22
  end
@@ -2,7 +2,7 @@ module SpreeCmCommissioner
2
2
  class TripResult
3
3
  attr_accessor :trip_id, :vendor_id, :vendor_name, :short_name, :route_name,
4
4
  :origin_id, :origin, :destination_id, :destination,
5
- :total_sold, :total_seats,
5
+ :quantity_available, :max_capacity,
6
6
  :duration, :vehicle_id, :departure_time
7
7
 
8
8
  def initialize(options = {})
@@ -11,8 +11,10 @@ module SpreeCmCommissioner
11
11
  end
12
12
  end
13
13
 
14
- def remaining_seats
15
- total_seats - total_sold
14
+ def total_sold
15
+ return if max_capacity.nil? || quantity_available.nil?
16
+
17
+ max_capacity - quantity_available
16
18
  end
17
19
 
18
20
  def arrival_time
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '2.0.0'.freeze
2
+ VERSION = '2.0.1-pre'.freeze
3
3
 
4
4
  module_function
5
5
 
@@ -19,7 +19,7 @@ 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
23
 
24
24
  require 'activerecord_multi_tenant'
25
25
  require 'google/cloud/recaptcha_enterprise'
@@ -43,5 +43,39 @@ require 'rqrcode'
43
43
  require 'premailer/rails'
44
44
  require 'cm_app_logger'
45
45
  require 'counter_culture'
46
+ require 'paper_trail'
46
47
 
47
48
  require 'byebug' if Rails.env.development? || Rails.env.test?
49
+
50
+ module SpreeCmCommissioner
51
+ class << self
52
+ # Allows overriding the default Redis connection pool with a custom one
53
+ attr_writer :redis_pool
54
+
55
+ def redis_pool
56
+ @redis_pool ||= default_redis_pool
57
+ end
58
+
59
+ # Resets the Redis pool, useful for testing or reinitialization
60
+ def reset_redis_pool
61
+ @redis_pool = nil
62
+ end
63
+
64
+ private
65
+
66
+ def default_redis_pool
67
+ pool_size = ENV.fetch('REDIS_POOL_SIZE', '5').to_i
68
+ timeout = ENV.fetch('REDIS_TIMEOUT', '5').to_i
69
+ redis_url = ENV.fetch('REDIS_URL', 'redis://localhost:6379/12')
70
+
71
+ ConnectionPool.new(size: pool_size, timeout: timeout) do
72
+ Redis.new(url: redis_url, timeout: timeout)
73
+ end
74
+ end
75
+ end
76
+
77
+ # Provides a configuration block for customizing SpreeCmCommissioner settings
78
+ def self.configure
79
+ yield self
80
+ end
81
+ 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'