spree_cm_commissioner 2.0.3.pre.pre4 → 2.0.3.pre.pre5

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 (202) 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/stock_managements_controller.rb +63 -1
  9. data/app/controllers/spree/api/v2/operator/event_charts_controller.rb +8 -2
  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/queue_cart/line_items_controller.rb +2 -2
  13. data/app/controllers/spree/api/v2/storefront/trip_search_controller.rb +60 -0
  14. data/app/finders/spree_cm_commissioner/accommodations/find.rb +37 -0
  15. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +32 -0
  16. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +40 -0
  17. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +25 -0
  18. data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +44 -0
  19. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +13 -0
  20. data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +15 -0
  21. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +75 -0
  22. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +32 -0
  23. data/app/interactors/spree_cm_commissioner/taxi_trip_creator.rb +66 -0
  24. data/app/interactors/spree_cm_commissioner/transit/draft_order_creator.rb +119 -0
  25. data/app/interactors/spree_cm_commissioner/variant_block_updater.rb +62 -0
  26. data/app/interactors/spree_cm_commissioner/vehicle_updater.rb +41 -0
  27. data/app/jobs/spree_cm_commissioner/application_job.rb +20 -0
  28. data/app/jobs/spree_cm_commissioner/application_unique_job.rb +20 -0
  29. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +7 -0
  30. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +7 -0
  31. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +11 -0
  32. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +11 -0
  33. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +9 -0
  34. data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +18 -15
  35. data/app/models/concerns/spree_cm_commissioner/line_item_guests_concern.rb +29 -15
  36. data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +89 -0
  37. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +2 -12
  38. data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +44 -0
  39. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +39 -0
  40. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +1 -3
  41. data/app/models/concerns/spree_cm_commissioner/product_type.rb +10 -0
  42. data/app/models/concerns/spree_cm_commissioner/route_type.rb +1 -1
  43. data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -1
  44. data/app/models/concerns/spree_cm_commissioner/vehicle_type.rb +11 -0
  45. data/app/models/spree_cm_commissioner/address_decorator.rb +22 -2
  46. data/app/models/spree_cm_commissioner/block.rb +43 -0
  47. data/app/models/spree_cm_commissioner/guest.rb +35 -0
  48. data/app/models/spree_cm_commissioner/inventory.rb +11 -0
  49. data/app/models/spree_cm_commissioner/inventory_item.rb +69 -0
  50. data/app/models/spree_cm_commissioner/line_item_decorator.rb +47 -78
  51. data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
  52. data/app/models/spree_cm_commissioner/option_type_decorator.rb +1 -11
  53. data/app/models/spree_cm_commissioner/order_decorator.rb +31 -1
  54. data/app/models/spree_cm_commissioner/place.rb +1 -4
  55. data/app/models/spree_cm_commissioner/price_decorator.rb +9 -0
  56. data/app/models/spree_cm_commissioner/product_decorator.rb +10 -6
  57. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +41 -0
  58. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +126 -0
  59. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +36 -0
  60. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +25 -0
  61. data/app/models/spree_cm_commissioner/reserved_block.rb +30 -0
  62. data/app/models/spree_cm_commissioner/saved_guest.rb +13 -0
  63. data/app/models/spree_cm_commissioner/seat_layout.rb +20 -0
  64. data/app/models/spree_cm_commissioner/seat_section.rb +16 -0
  65. data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +30 -0
  66. data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +53 -0
  67. data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +49 -0
  68. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +4 -0
  69. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +4 -0
  70. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +4 -0
  71. data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +4 -0
  72. data/app/models/spree_cm_commissioner/service_calendar.rb +0 -2
  73. data/app/models/spree_cm_commissioner/state_decorator.rb +0 -1
  74. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +26 -25
  75. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +2 -1
  76. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  77. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +44 -0
  78. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +17 -0
  79. data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -1
  80. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +0 -6
  81. data/app/models/spree_cm_commissioner/trip.rb +17 -10
  82. data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
  83. data/app/models/spree_cm_commissioner/trip_stop.rb +10 -21
  84. data/app/models/spree_cm_commissioner/variant_block.rb +17 -0
  85. data/app/models/spree_cm_commissioner/variant_decorator.rb +37 -47
  86. data/app/models/spree_cm_commissioner/variant_options.rb +0 -23
  87. data/app/models/spree_cm_commissioner/vehicle.rb +11 -16
  88. data/app/models/spree_cm_commissioner/vendor_decorator.rb +11 -14
  89. data/app/models/spree_cm_commissioner/vendor_place.rb +13 -3
  90. data/app/queries/spree_cm_commissioner/trip_query.rb +110 -131
  91. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +3 -0
  92. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  93. data/app/request_schemas/spree_cm_commissioner/trip_search_request_schema.rb +20 -0
  94. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +19 -0
  95. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +2 -0
  96. data/app/serializers/spree/v2/storefront/amenity_serializer.rb +15 -0
  97. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +1 -0
  98. data/app/serializers/spree/v2/storefront/trip_query_result_serializer.rb +14 -0
  99. data/app/serializers/spree/v2/storefront/trip_result_serializer.rb +16 -0
  100. data/app/serializers/spree/v2/storefront/trip_vehicle_serializer.rb +11 -0
  101. data/app/serializers/spree/v2/storefront/trip_vendor_serializer.rb +13 -0
  102. data/app/views/spree/admin/inventory_items/show.html.erb +72 -0
  103. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +7 -2
  104. data/app/views/spree/admin/stock_managements/calendar.html.erb +56 -0
  105. data/app/views/spree/admin/stock_managements/index.html.erb +55 -6
  106. data/config/initializers/paper_trail.rb +1 -0
  107. data/config/initializers/spree_permitted_attributes.rb +5 -0
  108. data/config/routes.rb +24 -2
  109. data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +3 -1
  110. data/db/migrate/20250122000000_move_route_type_from_vehicles_to_trips.rb +7 -0
  111. data/db/migrate/20250304293518_create_cm_inventory_items.rb +21 -0
  112. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +5 -0
  113. data/db/migrate/20250502025848_add_index_to_spree_products.rb +5 -0
  114. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +5 -0
  115. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +5 -0
  116. data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +7 -0
  117. data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +5 -0
  118. data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +5 -0
  119. data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +9 -0
  120. data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +5 -0
  121. data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +9 -0
  122. data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +5 -0
  123. data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +5 -0
  124. data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +5 -0
  125. data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +6 -0
  126. data/db/migrate/20250620090001_create_cm_seat_layouts.rb +17 -0
  127. data/db/migrate/20250620090002_create_cm_seat_sections.rb +18 -0
  128. data/db/migrate/20250620090003_create_cm_blocks.rb +18 -0
  129. data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +29 -0
  130. data/db/migrate/20250626083642_create_cm_variant_blocks.rb +24 -0
  131. data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +13 -0
  132. data/db/migrate/20250716022821_add_location_reference_to_cm_vendor_places.rb +5 -0
  133. data/db/migrate/20250716031743_drop_table_cm_vendor_stops.rb +5 -0
  134. data/db/migrate/20250717023824_add_vendor_reference_to_cm_trips.rb +5 -0
  135. data/db/migrate/20250717041414_add_location_place_reference_to_cm_trip_stops.rb +5 -0
  136. data/db/migrate/20250717042539_rename_cm_trip_stops_stop_id_column_to_stop_place_id.rb +7 -0
  137. data/db/migrate/20250717042707_rename_cm_trips_origin_and_destination_to_origin_place_and_destination_place.rb +11 -0
  138. data/db/migrate/20250721080738_add_vehicle_type_to_cm_vehicles.rb +7 -0
  139. data/db/migrate/20250725092713_add_block_type_to_cm_blocks.rb +5 -0
  140. data/db/migrate/20250731062816_add_departure_time_and_arrival_time_to_trip_stop.rb +6 -0
  141. data/db/migrate/20250807033035_create_spree_cm_commissioner_saved_guests.rb +23 -0
  142. data/db/migrate/20250808054835_add_saved_guest_reference_to_cm_blocks.rb +5 -0
  143. data/docker-compose.yml +1 -1
  144. data/lib/cm_app_logger.rb +11 -4
  145. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +14 -11
  146. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_cm_commissioner → spree_dashboard/spree_cm_commissioner}/utilities.js +4 -0
  147. data/lib/spree_cm_commissioner/cached_inventory_item.rb +23 -0
  148. data/lib/spree_cm_commissioner/calendar_event.rb +11 -1
  149. data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +16 -0
  150. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +10 -0
  151. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  152. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +9 -0
  153. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  154. data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +6 -30
  155. data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +0 -36
  156. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +18 -34
  157. data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +27 -0
  158. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +11 -0
  159. data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +16 -0
  160. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  161. data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +6 -0
  162. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +11 -3
  163. data/lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb +13 -0
  164. data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +7 -0
  165. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +41 -19
  166. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
  167. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +6 -1
  168. data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +13 -1
  169. data/lib/spree_cm_commissioner/transit/leg.rb +23 -0
  170. data/lib/spree_cm_commissioner/transit/seat_selection.rb +19 -0
  171. data/lib/spree_cm_commissioner/trip_query_result.rb +16 -0
  172. data/lib/spree_cm_commissioner/trip_result.rb +12 -10
  173. data/lib/spree_cm_commissioner/version.rb +1 -1
  174. data/lib/spree_cm_commissioner.rb +37 -1
  175. data/lib/tasks/create_default_non_permanent_inventory_items.rake +16 -0
  176. data/lib/tasks/ensure_correct_product_type.rake +7 -0
  177. data/lib/tasks/generate_inventory_items.rake +7 -0
  178. data/spree_cm_commissioner.gemspec +7 -0
  179. metadata +161 -26
  180. data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +0 -44
  181. data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +0 -20
  182. data/app/models/spree_cm_commissioner/branch.rb +0 -12
  183. data/app/models/spree_cm_commissioner/line_item_seat.rb +0 -10
  184. data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +0 -8
  185. data/app/models/spree_cm_commissioner/stop.rb +0 -23
  186. data/app/models/spree_cm_commissioner/vehicle_seat.rb +0 -11
  187. data/app/models/spree_cm_commissioner/vehicle_type.rb +0 -76
  188. data/app/models/spree_cm_commissioner/vendor_stop.rb +0 -10
  189. data/app/queries/spree_cm_commissioner/trip_search_query.rb +0 -76
  190. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +0 -45
  191. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +0 -55
  192. data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +0 -54
  193. data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +0 -11
  194. data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +0 -12
  195. data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +0 -8
  196. data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +0 -8
  197. data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +0 -7
  198. data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +0 -14
  199. data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +0 -8
  200. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +0 -8
  201. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +0 -96
  202. 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,23 @@
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
+ end
23
+ end
@@ -0,0 +1,19 @@
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]
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
+ end
19
+ end
@@ -7,8 +7,24 @@ 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
13
29
  end
14
30
  end
@@ -1,9 +1,9 @@
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, :departure_time, :duration,
4
+ :vehicle_id, :vehicle, :vendor_id, :vendor,
5
+ :quantity_available, :max_capacity, :boarding, :drop_off,
6
+ :product_id, :amenities, :price, :compare_at_amount, :currency
7
7
 
8
8
  def initialize(options = {})
9
9
  options.each do |key, value|
@@ -11,21 +11,23 @@ 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
- def arrival_time
19
- (departure_time.to_time + duration.to_i.seconds).strftime('%H:%M')
20
+ def amenity_ids
21
+ amenities&.map(&:id) || []
20
22
  end
21
23
 
22
24
  def duration_in_hms
23
- return 0 if duration.nil?
25
+ return { hours: 0, minutes: 0, seconds: 0 } if duration.nil?
24
26
 
25
27
  hours = duration / 3600
26
28
  minutes = (duration % 3600) / 60
27
29
  seconds = duration % 60
28
- "#{hours}h #{minutes}m #{seconds}s"
30
+ { hours: hours, minutes: minutes, seconds: seconds }
29
31
  end
30
32
  end
31
33
  end
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '2.0.3-pre4'.freeze
2
+ VERSION = '2.0.3-pre5'.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'