spree_cm_commissioner 2.0.3.pre.pre3 → 2.0.3

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 (193) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_and_build_gem.yml +2 -16
  3. data/.gitignore +1 -2
  4. data/Gemfile.lock +1 -28
  5. data/Rakefile +4 -33
  6. data/app/assets/stylesheets/spree_cm_commissioner/backend/calendar.scss +11 -8
  7. data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +44 -0
  8. data/app/controllers/spree/admin/stock_managements_controller.rb +1 -63
  9. data/app/controllers/spree/api/v2/operator/event_charts_controller.rb +2 -8
  10. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +31 -14
  11. data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
  12. data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +20 -0
  13. data/app/jobs/spree_cm_commissioner/application_job.rb +0 -20
  14. data/app/jobs/spree_cm_commissioner/application_unique_job.rb +0 -20
  15. data/app/models/concerns/spree_cm_commissioner/line_item_durationable.rb +15 -9
  16. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +12 -2
  17. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -39
  18. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +3 -1
  19. data/app/models/concerns/spree_cm_commissioner/product_type.rb +0 -10
  20. data/app/models/concerns/spree_cm_commissioner/route_type.rb +1 -1
  21. data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -1
  22. data/app/models/spree_cm_commissioner/branch.rb +12 -0
  23. data/app/models/spree_cm_commissioner/guest.rb +0 -18
  24. data/app/models/spree_cm_commissioner/line_item_decorator.rb +78 -46
  25. data/app/models/spree_cm_commissioner/line_item_seat.rb +10 -0
  26. data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
  27. data/app/models/spree_cm_commissioner/option_type_decorator.rb +11 -1
  28. data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +8 -0
  29. data/app/models/spree_cm_commissioner/order_decorator.rb +1 -30
  30. data/app/models/spree_cm_commissioner/place.rb +4 -1
  31. data/app/models/spree_cm_commissioner/product_decorator.rb +6 -10
  32. data/app/models/spree_cm_commissioner/service_calendar.rb +2 -0
  33. data/app/models/spree_cm_commissioner/state_decorator.rb +1 -0
  34. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +25 -26
  35. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +1 -2
  36. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  37. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +0 -17
  38. data/app/models/spree_cm_commissioner/stop.rb +23 -0
  39. data/app/models/spree_cm_commissioner/taxon_decorator.rb +1 -0
  40. data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +6 -0
  41. data/app/models/spree_cm_commissioner/trip.rb +10 -12
  42. data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
  43. data/app/models/spree_cm_commissioner/trip_stop.rb +21 -10
  44. data/app/models/spree_cm_commissioner/variant_decorator.rb +47 -37
  45. data/app/models/spree_cm_commissioner/variant_options.rb +23 -0
  46. data/app/models/spree_cm_commissioner/vehicle.rb +16 -11
  47. data/app/models/spree_cm_commissioner/vehicle_seat.rb +11 -0
  48. data/app/models/spree_cm_commissioner/vehicle_type.rb +76 -0
  49. data/app/models/spree_cm_commissioner/vendor_decorator.rb +14 -11
  50. data/app/models/spree_cm_commissioner/vendor_place.rb +3 -13
  51. data/app/models/spree_cm_commissioner/vendor_stop.rb +10 -0
  52. data/app/queries/spree_cm_commissioner/trip_query.rb +131 -110
  53. data/app/queries/spree_cm_commissioner/trip_search_query.rb +76 -0
  54. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +45 -0
  55. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +55 -0
  56. data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +54 -0
  57. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +0 -3
  58. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  59. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +0 -2
  60. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +0 -1
  61. data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +11 -0
  62. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +2 -7
  63. data/app/views/spree/admin/stock_managements/index.html.erb +6 -55
  64. data/config/initializers/spree_permitted_attributes.rb +0 -5
  65. data/config/routes.rb +2 -24
  66. data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +1 -3
  67. data/docker-compose.yml +1 -1
  68. data/lib/cm_app_logger.rb +4 -11
  69. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +11 -14
  70. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_dashboard/spree_cm_commissioner → spree_cm_commissioner}/utilities.js +0 -4
  71. data/lib/spree_cm_commissioner/calendar_event.rb +1 -11
  72. data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +12 -0
  73. data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +8 -0
  74. data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +8 -0
  75. data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +0 -10
  76. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  77. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  78. data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +7 -0
  79. data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +30 -6
  80. data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +36 -0
  81. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +34 -18
  82. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  83. data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +14 -0
  84. data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +8 -0
  85. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +3 -11
  86. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +19 -41
  87. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
  88. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +8 -0
  89. data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +96 -0
  90. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -6
  91. data/lib/spree_cm_commissioner/test_helper/factories/vendor_place_factory.rb +1 -13
  92. data/lib/spree_cm_commissioner/trip_query_result.rb +0 -16
  93. data/lib/spree_cm_commissioner/trip_result.rb +10 -12
  94. data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +11 -0
  95. data/lib/spree_cm_commissioner/version.rb +1 -1
  96. data/lib/spree_cm_commissioner.rb +1 -35
  97. data/spree_cm_commissioner.gemspec +0 -7
  98. metadata +28 -156
  99. data/app/controllers/spree/admin/inventory_items_controller.rb +0 -83
  100. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +0 -42
  101. data/app/controllers/spree/api/v2/storefront/trip_search_controller.rb +0 -60
  102. data/app/finders/spree_cm_commissioner/accommodations/find.rb +0 -37
  103. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +0 -32
  104. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +0 -40
  105. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +0 -25
  106. data/app/interactors/spree_cm_commissioner/stock/inventory_item_resetter.rb +0 -44
  107. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +0 -13
  108. data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +0 -15
  109. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +0 -75
  110. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +0 -32
  111. data/app/interactors/spree_cm_commissioner/taxi_trip_creator.rb +0 -66
  112. data/app/interactors/spree_cm_commissioner/variant_block_updater.rb +0 -62
  113. data/app/interactors/spree_cm_commissioner/vehicle_updater.rb +0 -41
  114. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +0 -7
  115. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +0 -7
  116. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +0 -11
  117. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +0 -11
  118. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +0 -9
  119. data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +0 -44
  120. data/app/models/concerns/spree_cm_commissioner/vehicle_type.rb +0 -11
  121. data/app/models/spree_cm_commissioner/block.rb +0 -43
  122. data/app/models/spree_cm_commissioner/inventory.rb +0 -11
  123. data/app/models/spree_cm_commissioner/inventory_item.rb +0 -69
  124. data/app/models/spree_cm_commissioner/price_decorator.rb +0 -9
  125. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -41
  126. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +0 -126
  127. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +0 -36
  128. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +0 -25
  129. data/app/models/spree_cm_commissioner/reserved_block.rb +0 -30
  130. data/app/models/spree_cm_commissioner/seat_layout.rb +0 -20
  131. data/app/models/spree_cm_commissioner/seat_section.rb +0 -16
  132. data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +0 -30
  133. data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +0 -53
  134. data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +0 -49
  135. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +0 -4
  136. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +0 -4
  137. data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +0 -4
  138. data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +0 -4
  139. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -44
  140. data/app/models/spree_cm_commissioner/variant_block.rb +0 -9
  141. data/app/request_schemas/spree_cm_commissioner/trip_search_request_schema.rb +0 -20
  142. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +0 -19
  143. data/app/serializers/spree/v2/storefront/amenity_serializer.rb +0 -15
  144. data/app/serializers/spree/v2/storefront/trip_query_result_serializer.rb +0 -14
  145. data/app/serializers/spree/v2/storefront/trip_result_serializer.rb +0 -16
  146. data/app/serializers/spree/v2/storefront/trip_vehicle_serializer.rb +0 -11
  147. data/app/serializers/spree/v2/storefront/trip_vendor_serializer.rb +0 -13
  148. data/app/views/spree/admin/inventory_items/show.html.erb +0 -72
  149. data/app/views/spree/admin/stock_managements/calendar.html.erb +0 -56
  150. data/config/initializers/paper_trail.rb +0 -1
  151. data/db/migrate/20250122000000_move_route_type_from_vehicles_to_trips.rb +0 -7
  152. data/db/migrate/20250304293518_create_cm_inventory_items.rb +0 -21
  153. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +0 -5
  154. data/db/migrate/20250502025848_add_index_to_spree_products.rb +0 -5
  155. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +0 -5
  156. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +0 -5
  157. data/db/migrate/20250603035256_add_inventory_item_to_spree_prices.rb +0 -7
  158. data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +0 -5
  159. data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +0 -5
  160. data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +0 -9
  161. data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +0 -5
  162. data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +0 -9
  163. data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +0 -5
  164. data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +0 -5
  165. data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +0 -5
  166. data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +0 -6
  167. data/db/migrate/20250620090001_create_cm_seat_layouts.rb +0 -17
  168. data/db/migrate/20250620090002_create_cm_seat_sections.rb +0 -18
  169. data/db/migrate/20250620090003_create_cm_blocks.rb +0 -18
  170. data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +0 -29
  171. data/db/migrate/20250626083642_create_cm_variant_blocks.rb +0 -24
  172. data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +0 -13
  173. data/db/migrate/20250716022821_add_location_reference_to_cm_vendor_places.rb +0 -5
  174. data/db/migrate/20250716031743_drop_table_cm_vendor_stops.rb +0 -5
  175. data/db/migrate/20250717023824_add_vendor_reference_to_cm_trips.rb +0 -5
  176. data/db/migrate/20250717041414_add_location_place_reference_to_cm_trip_stops.rb +0 -5
  177. data/db/migrate/20250717042539_rename_cm_trip_stops_stop_id_column_to_stop_place_id.rb +0 -7
  178. data/db/migrate/20250717042707_rename_cm_trips_origin_and_destination_to_origin_place_and_destination_place.rb +0 -11
  179. data/db/migrate/20250721080738_add_vehicle_type_to_cm_vehicles.rb +0 -7
  180. data/db/migrate/20250725092713_add_block_type_to_cm_blocks.rb +0 -5
  181. data/db/migrate/20250731062816_add_departure_time_and_arrival_time_to_trip_stop.rb +0 -6
  182. data/lib/spree_cm_commissioner/cached_inventory_item.rb +0 -23
  183. data/lib/spree_cm_commissioner/test_helper/factories/block_factory.rb +0 -16
  184. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +0 -9
  185. data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +0 -27
  186. data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +0 -11
  187. data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +0 -16
  188. data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +0 -6
  189. data/lib/spree_cm_commissioner/test_helper/factories/trip_stop_factory.rb +0 -10
  190. data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +0 -7
  191. data/lib/tasks/create_default_non_permanent_inventory_items.rake +0 -16
  192. data/lib/tasks/ensure_correct_product_type.rake +0 -7
  193. data/lib/tasks/generate_inventory_items.rake +0 -7
@@ -1,44 +0,0 @@
1
- # On top of SpreeCmCommissioner::Stock::AvailabilityChecker, this class does the same thing but in bulk check with redis.
2
- # Which mean, it check basic condition with db first, once pass, it check with redis.
3
- module SpreeCmCommissioner
4
- module Stock
5
- class OrderAvailabilityChecker
6
- attr_reader :order
7
-
8
- def initialize(order)
9
- @order = order
10
- end
11
-
12
- def can_supply_all?
13
- insufficient_stock_lines.empty?
14
- end
15
-
16
- def insufficient_stock_lines
17
- cached_inventory_items_group_by_line_item_id.map do |line_item_id, cached_inventory_items|
18
- line_item = order.line_items.find { |item| item.id == line_item_id }
19
- line_item unless sufficient_stock_for?(line_item, cached_inventory_items)
20
- end.compact
21
- end
22
-
23
- # {
24
- # 1: [ {inventory_key: "inventory:1", active: true, quantity_available: 5, inventory_item_id: 1, variant_id: 1}],
25
- # 2: [ {inventory_key: "inventory:2", active: true, quantity_available: 5, inventory_item_id: 2, variant_id: 2}],
26
- # }
27
- def cached_inventory_items_group_by_line_item_id
28
- @cached_inventory_items_group_by_line_item_id ||=
29
- ::SpreeCmCommissioner::RedisStock::LineItemsCachedInventoryItemsBuilder.new(
30
- line_item_ids: order.line_items.pluck(:id)
31
- ).call
32
- end
33
-
34
- def sufficient_stock_for?(line_item, cached_inventory_items)
35
- return false unless line_item.variant.available?
36
- return true unless line_item.variant.should_track_inventory?
37
- return true if line_item.variant.backorderable?
38
- return true if line_item.variant.need_confirmation?
39
-
40
- cached_inventory_items.all? { |item| item.active? && item.quantity_available >= line_item.quantity }
41
- end
42
- end
43
- end
44
- end
@@ -1,9 +0,0 @@
1
- module SpreeCmCommissioner
2
- class VariantBlock < Base
3
- belongs_to :variant, class_name: 'Spree::Variant', optional: false
4
- belongs_to :trip, class_name: 'SpreeCmCommissioner::Trip', optional: false
5
- belongs_to :block, class_name: 'SpreeCmCommissioner::Block', optional: false
6
-
7
- validates :block_id, uniqueness: { scope: %i[variant_id trip_id] }
8
- end
9
- end
@@ -1,20 +0,0 @@
1
- module SpreeCmCommissioner
2
- class TripSearchRequestSchema < ApplicationRequestSchema
3
- params do
4
- required(:origin_id).value(:integer)
5
- required(:destination_id).value(:integer)
6
- required(:date).value(:date)
7
- end
8
-
9
- rule(:date) do
10
- key.failure(:must_be_in_future) if value < Time.zone.today
11
- end
12
-
13
- rule(:origin_id, :destination_id) do
14
- origin_id = values[:origin_id]
15
- destination_id = values[:destination_id]
16
-
17
- key.failure(:must_be_different) if origin_id == destination_id
18
- end
19
- end
20
- end
@@ -1,19 +0,0 @@
1
- module SpreeCmCommissioner
2
- class VariantRequestSchema < ApplicationRequestSchema
3
- params do
4
- required(:from_date).value(:date)
5
- required(:to_date).value(:date)
6
- required(:adult).value(:integer)
7
- required(:children).value(:integer)
8
- end
9
-
10
- rule(:from_date, :to_date) do
11
- from_date = values[:from_date]
12
- to_date = values[:to_date]
13
-
14
- key.failure(:must_be_in_future) if from_date < Time.zone.today
15
- key.failure(:must_be_later_than_start_date) if from_date > to_date
16
- key.failure(:stay_is_too_long) if (to_date - from_date).to_i > ENV.fetch('ACCOMMODATION_MAX_STAY_DAYS', 10).to_i
17
- end
18
- end
19
- end
@@ -1,15 +0,0 @@
1
- module Spree
2
- module V2
3
- module Storefront
4
- class AmenitySerializer < BaseSerializer
5
- set_type :amenity
6
- attributes :name, :presentation
7
- attribute :display_icon do |option_value|
8
- ActionController::Base.helpers.image_url(option_value.display_icon)
9
- rescue StandardError
10
- nil
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,14 +0,0 @@
1
- module Spree
2
- module V2
3
- module Storefront
4
- class TripQueryResultSerializer < BaseSerializer
5
- set_type :trip_query_result
6
-
7
- attributes :quantity_available, :max_capacity
8
-
9
- attribute :direct, &:direct?
10
- has_many :trips, serializer: Spree::V2::Storefront::TripResultSerializer
11
- end
12
- end
13
- end
14
- end
@@ -1,16 +0,0 @@
1
- module Spree
2
- module V2
3
- module Storefront
4
- class TripResultSerializer < BaseSerializer
5
- set_type :trip_result
6
-
7
- attributes :origin_place, :destination_place, :boarding, :drop_off, :price, :compare_at_amount, :currency, :quantity_available, :max_capacity,
8
- :allow_seat_selection, :departure_time
9
- attribute :duration_in_hms, &:duration_in_hms
10
- belongs_to :vendor, serializer: Spree::V2::Storefront::TripVendorSerializer
11
- belongs_to :vehicle, serializer: Spree::V2::Storefront::TripVehicleSerializer
12
- has_many :amenities, serializer: Spree::V2::Storefront::AmenitySerializer
13
- end
14
- end
15
- end
16
- end
@@ -1,11 +0,0 @@
1
- module Spree
2
- module V2
3
- module Storefront
4
- class TripVehicleSerializer < BaseSerializer
5
- set_type :vehicle
6
-
7
- attributes :id, :code
8
- end
9
- end
10
- end
11
- end
@@ -1,13 +0,0 @@
1
- module Spree
2
- module V2
3
- module Storefront
4
- class TripVendorSerializer < BaseSerializer
5
- set_type :vendor
6
-
7
- attributes :name, :star_rating
8
-
9
- has_one :logo, serializer: ::SpreeCmCommissioner::V2::Storefront::AssetSerializer
10
- end
11
- end
12
- end
13
- end
@@ -1,72 +0,0 @@
1
- <%= turbo_frame_tag "inventory_item" do %>
2
- <div>
3
- <h5 class="modal-title">Inventory</h5>
4
- <p>
5
- <% if @inventory_item.inventory_date.present? %>
6
- <span><%= @inventory_item.inventory_date %></span><br>
7
- <% end %>
8
- <%= @inventory_item.variant.options_text %>
9
- </p>
10
-
11
- <ul class="list-group mb-1">
12
- <li class="list-group-item d-flex justify-content-between align-items-center">
13
- Max capacity
14
- <span class="badge badge-primary badge-pill"><%= @inventory_item.max_capacity %></span>
15
- </li>
16
- <li class="list-group-item d-flex justify-content-between align-items-center">
17
- Quantity available
18
- <span class="badge badge-primary badge-pill"><%= @inventory_item.quantity_available %></span>
19
- </li>
20
- </ul>
21
-
22
- <small class="text-muted">
23
- <%= inventory_item_message(@inventory_item, @cached_inventory_item) %>
24
- </small>
25
-
26
- <%= link_to_with_icon('arrow-counterclockwise.svg', "Reset Inventory Item", reset_admin_product_variant_inventory_item_path(@product, @inventory_item.variant_id, @inventory_item.id),
27
- method: :patch,
28
- remote: false,
29
- class: 'icon_link btn btn-sm outline text-dark',
30
- data: { confirm: "Only reset if stock is incorrect. Are you sure?" }, no_text: true
31
- ) %>
32
- </div>
33
-
34
- <hr />
35
-
36
- <div class="mt-2">
37
- <h6 class="modal-title mb-1 d-flex flex-row justify-content-between">
38
- Custom Prices
39
- <%= link_to_with_icon('delete.svg', Spree.t(:remove),
40
- delete_prices_admin_product_variant_inventory_item_path(@product, @inventory_item.variant_id, @inventory_item.id),
41
- method: :delete, remote: false, class: 'icon_link btn btn-sm text-danger', data: { action: :remove, confirm: "Are you sure to remove these prices & use base price?" }, no_text: true
42
- ) if @prices.any?(&:persisted?) %>
43
- </h6>
44
-
45
- <%= form_with url: update_prices_admin_product_variant_inventory_item_path(@product, @inventory_item.variant_id, @inventory_item.id), method: :patch, local: true, html: { class: 'inventory-item-prices-form' } do |form| %>
46
- <table class="table">
47
- <tbody>
48
- <% @prices.each do |price| %>
49
- <% currency = price.currency %>
50
- <% default_price = @default_prices[currency] || Spree::Price.new %>
51
- <tr id="inventory-item_prices_row_<%= currency %>" data-hook="inventory-item_prices_row">
52
- <td><%= form.label "price_#{currency}", currency, class: 'form-label' %></td>
53
- <td>
54
- <%= form.hidden_field "prices[#{currency}][currency]", value: currency %>
55
- <%= form.text_field "prices[#{currency}][price]", value: price.amount, placeholder: "Default: #{default_price.amount || 'N/A'}", class: 'form-control' %>
56
- </td>
57
- <td>
58
- <%= form.text_field "prices[#{currency}][compare_at_price]", value: price.compare_at_price, placeholder: "Default: #{default_price.compare_at_price || 'N/A'}", class: 'form-control' %>
59
- </td>
60
- </tr>
61
- <% end %>
62
- </tbody>
63
- </table>
64
-
65
- <div class="d-flex flex-row justify-content-end mt-2">
66
- <div class="form-actions" data-hook="buttons">
67
- <%= button Spree.t('actions.save'), 'save.svg', 'submit', { class: 'btn-outline-success', data: { disable_with: "#{ Spree.t(:saving) }...", turbo_frame: "_top" } } %>
68
- </div>
69
- </div>
70
- <% end %>
71
- </div>
72
- <% end %>
@@ -1,56 +0,0 @@
1
- <%= turbo_frame_tag "calendar" do %>
2
- <%= form_with url: admin_product_stock_managements_path, method: :get, class: "mt-4" do %>
3
- <%= select_year(params[:year]&.to_i || @year, { start_year: 2025, end_year: @year + 3 }, { name: "year", onchange: "this.form.submit()" }) %>
4
- <% end %>
5
-
6
- <div class="c-annual-calendar-container mt-2">
7
- <div class="c-annual-calendar">
8
- <% (1..12).each do |month| %>
9
- <%= month_calendar(start_date: Date.new(@year, month, 1), attribute: :from_date, end_attribute: :to_date, events: @events) do |date, events| %>
10
- <div class="c-annual-day" data-date="<%= date.strftime '%Y-%m-%d' %>">
11
- <%= date.day %>
12
- <ul class="p-0 m-0 list-unstyled">
13
- <% events = events.sort_by { |e| e.options[:inventory_item]&.variant_id.to_i } %>
14
- <% events.each do |event| %>
15
- <% inventory_item = event.options[:inventory_item] %>
16
- <% synced = inventory_item.quantity_available == @cached_inventory_items[inventory_item.id].quantity_available %>
17
-
18
- <% classes = 'badge ' %>
19
- <% classes += synced ? 'badge-primary ' : 'badge-danger ' %>
20
- <% classes += 'badge-success ' if inventory_item.prices.any? %>
21
-
22
- <li class="<%= classes %>"
23
- data-toggle="modal"
24
- data-target="#inventoryItemModal"
25
- role="button"
26
- onclick="updateModalTurboFrameSrc('<%= admin_product_variant_inventory_item_path(@product, inventory_item.variant_id, inventory_item.id) %>')">
27
- <%= inventory_item.quantity_available %>
28
- <%= inventory_item.prices.first.display_amount if inventory_item.prices.any? %>
29
- </li>
30
- <% end %>
31
- </ul>
32
- </div>
33
- <% end %>
34
- <% end %>
35
- </div>
36
- </div>
37
-
38
- <div class="modal fade" id="inventoryItemModal" tabindex="-1" role="dialog">
39
- <div class="modal-dialog" role="document">
40
- <div class="modal-content">
41
- <div class="modal-body">
42
- <%= turbo_frame_tag "inventory_item" %>
43
- </div>
44
- </div>
45
- </div>
46
- </div>
47
-
48
- <script>
49
- function updateModalTurboFrameSrc(url) {
50
- let frame = document.getElementById('inventory_item');
51
- frame.src = null;
52
- frame.innerHTML = `<div class="spinner-border mt-2" role="status"></div>`;
53
- frame.src = url
54
- }
55
- </script>
56
- <% end %>
@@ -1 +0,0 @@
1
- PaperTrail.enabled = true
@@ -1,7 +0,0 @@
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
@@ -1,21 +0,0 @@
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
@@ -1,5 +0,0 @@
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
@@ -1,5 +0,0 @@
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
@@ -1,5 +0,0 @@
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
@@ -1,5 +0,0 @@
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
@@ -1,7 +0,0 @@
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
@@ -1,5 +0,0 @@
1
- class DropTableCmLineItemSeats < ActiveRecord::Migration[7.0]
2
- def change
3
- drop_table :cm_line_item_seats, if_exists: true
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class DropTableCmVehicleSeats < ActiveRecord::Migration[7.0]
2
- def change
3
- drop_table :cm_vehicle_seats, if_exists: true
4
- end
5
- end
@@ -1,9 +0,0 @@
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
@@ -1,5 +0,0 @@
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
@@ -1,9 +0,0 @@
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
@@ -1,5 +0,0 @@
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
@@ -1,5 +0,0 @@
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
@@ -1,5 +0,0 @@
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
@@ -1,6 +0,0 @@
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
@@ -1,17 +0,0 @@
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
@@ -1,18 +0,0 @@
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
@@ -1,18 +0,0 @@
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
@@ -1,29 +0,0 @@
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
@@ -1,24 +0,0 @@
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
@@ -1,13 +0,0 @@
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
@@ -1,5 +0,0 @@
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
@@ -1,5 +0,0 @@
1
- class DropTableCmVendorStops < ActiveRecord::Migration[7.0]
2
- def change
3
- drop_table :cm_vendor_stops, if_exists: true
4
- end
5
- end
@@ -1,5 +0,0 @@
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
@@ -1,5 +0,0 @@
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
@@ -1,7 +0,0 @@
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
@@ -1,11 +0,0 @@
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
@@ -1,7 +0,0 @@
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
@@ -1,5 +0,0 @@
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
@@ -1,6 +0,0 @@
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