spree_cm_commissioner 1.10.0.pre.pre → 1.10.0.pre.hotfix.pre.sms

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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_and_build_gem.yml +48 -26
  3. data/.gitignore +1 -2
  4. data/.vscode/settings.json +1 -1
  5. data/Gemfile.lock +1 -22
  6. data/app/controllers/spree/admin/cms_pages_controller_decorator.rb +32 -0
  7. data/app/controllers/spree/admin/stock_managements_controller.rb +1 -17
  8. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +31 -14
  9. data/app/controllers/spree/api/v2/tenant/account_checker_controller.rb +1 -1
  10. data/app/controllers/spree/api/v2/tenant/account_recovers_controller.rb +2 -2
  11. data/app/controllers/spree/api/v2/tenant/cms_pages_controller.rb +41 -0
  12. data/app/controllers/spree/api/v2/tenant/reset_passwords_controller.rb +1 -1
  13. data/app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb +18 -0
  14. data/app/interactors/spree_cm_commissioner/account_recover.rb +2 -2
  15. data/app/interactors/spree_cm_commissioner/create_event.rb +23 -0
  16. data/app/interactors/spree_cm_commissioner/existing_account_checker.rb +1 -1
  17. data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +3 -3
  18. data/app/interactors/spree_cm_commissioner/sms.rb +14 -0
  19. data/app/interactors/spree_cm_commissioner/telegram_debug_pin_code_sender.rb +2 -1
  20. data/app/interactors/spree_cm_commissioner/user_forgotten_password_updater.rb +2 -1
  21. data/app/interactors/spree_cm_commissioner/user_password_authenticator.rb +4 -2
  22. data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +2 -2
  23. data/app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb +3 -1
  24. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +3 -2
  25. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -26
  26. data/app/models/concerns/spree_cm_commissioner/product_type.rb +0 -10
  27. data/app/models/concerns/spree_cm_commissioner/user_identity.rb +7 -4
  28. data/app/models/spree_cm_commissioner/cms_page_decorator.rb +9 -0
  29. data/app/models/spree_cm_commissioner/line_item_decorator.rb +0 -1
  30. data/app/models/spree_cm_commissioner/order_decorator.rb +0 -15
  31. data/app/models/spree_cm_commissioner/place.rb +11 -2
  32. data/app/models/spree_cm_commissioner/product_decorator.rb +0 -1
  33. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +25 -27
  34. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +1 -2
  35. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  36. data/app/models/spree_cm_commissioner/taxon_decorator.rb +11 -0
  37. data/app/models/spree_cm_commissioner/taxon_option_type.rb +8 -0
  38. data/app/models/spree_cm_commissioner/taxon_option_value.rb +8 -0
  39. data/app/models/spree_cm_commissioner/trip.rb +0 -11
  40. data/app/models/spree_cm_commissioner/trip_connection.rb +1 -0
  41. data/app/models/spree_cm_commissioner/trip_stop.rb +12 -5
  42. data/app/models/spree_cm_commissioner/variant_decorator.rb +28 -25
  43. data/app/models/spree_cm_commissioner/variant_options.rb +0 -14
  44. data/app/models/spree_cm_commissioner/vehicle.rb +0 -7
  45. data/app/models/spree_cm_commissioner/vendor_decorator.rb +2 -1
  46. data/app/models/spree_cm_commissioner/vendor_stop.rb +2 -1
  47. data/app/overrides/spree/admin/cms_pages/_form/tenant_fields.html.erb.deface +7 -0
  48. data/app/overrides/spree/admin/cms_pages/index/cms_pages_tabs.html.erb.deface +21 -0
  49. data/app/overrides/spree/admin/users/index/body.html.erb.deface +3 -0
  50. data/app/overrides/spree/admin/users/index/headers.html.erb.deface +3 -0
  51. data/app/queries/spree_cm_commissioner/trip_query.rb +11 -11
  52. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +45 -0
  53. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +55 -0
  54. data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +54 -0
  55. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +0 -3
  56. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  57. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +0 -2
  58. data/app/serializers/spree/v2/tenant/guest_serializer.rb +1 -0
  59. data/app/services/spree_cm_commissioner/aes_encryption_service.rb +6 -4
  60. data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +2 -0
  61. data/app/services/spree_cm_commissioner/user_authenticator.rb +3 -1
  62. data/app/views/spree/admin/shared/_cms_pages_tabs.html.erb +20 -0
  63. data/app/views/spree/admin/stock_managements/index.html.erb +5 -31
  64. data/config/routes.rb +4 -11
  65. data/db/migrate/20250418072528_add_nested_set_columns_to_places.rb +10 -0
  66. data/db/migrate/20250430091742_create_cm_taxon_option_types.rb +9 -0
  67. data/db/migrate/20250430092928_create_cm_taxon_option_values.rb +9 -0
  68. data/db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb +5 -0
  69. data/db/migrate/20250512075319_add_tenant_id_to_spree_cms_pages.rb +6 -0
  70. data/docker-compose.yml +1 -1
  71. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +2 -2
  72. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_dashboard/spree_cm_commissioner → spree_cm_commissioner}/utilities.js +0 -4
  73. data/lib/spree_cm_commissioner/calendar_event.rb +1 -11
  74. data/lib/spree_cm_commissioner/test_helper/factories/place_factory.rb +11 -1
  75. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +6 -28
  76. data/lib/spree_cm_commissioner/version.rb +1 -1
  77. data/lib/spree_cm_commissioner.rb +0 -34
  78. data/lib/tasks/migrate_and_rebuild_place_hierarchy.rake +9 -0
  79. data/lib/tasks/update_orphan_root_places.rake +7 -0
  80. data/spree_cm_commissioner.gemspec +0 -5
  81. metadata +22 -69
  82. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +0 -42
  83. data/app/finders/spree_cm_commissioner/accommodations/find.rb +0 -40
  84. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +0 -35
  85. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +0 -25
  86. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +0 -71
  87. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +0 -7
  88. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +0 -9
  89. data/app/models/spree_cm_commissioner/inventory.rb +0 -11
  90. data/app/models/spree_cm_commissioner/inventory_item.rb +0 -37
  91. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -40
  92. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +0 -114
  93. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +0 -42
  94. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +0 -27
  95. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -44
  96. data/app/models/spree_cm_commissioner/stock_movement_decorator.rb +0 -34
  97. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +0 -19
  98. data/app/views/spree/admin/stock_managements/_events_popover.html.erb +0 -17
  99. data/app/views/spree/admin/stock_managements/calendar.html.erb +0 -32
  100. data/db/migrate/20250304293518_create_cm_inventory_items.rb +0 -21
  101. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +0 -5
  102. data/lib/spree_cm_commissioner/cached_inventory_item.rb +0 -23
  103. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +0 -9
  104. data/lib/tasks/create_default_non_permanent_inventory_items.rake +0 -16
  105. data/lib/tasks/generate_inventory_items.rake +0 -7
@@ -34,11 +34,11 @@ module SpreeCmCommissioner
34
34
  trips.vehicle_id AS vehicle_id'
35
35
  )
36
36
  .joins('INNER JOIN cm_trips AS trips ON trips.variant_id = spree_variants.id')
37
- .joins('INNER JOIN cm_trip_stops AS boarding ON boarding.trip_id = trips.id AND boarding.stop_type = 0')
38
- .joins('INNER JOIN cm_trip_stops AS drop_off ON drop_off.trip_id = trips.id AND drop_off.stop_type = 1')
37
+ .joins('INNER JOIN cm_trip_stops AS boarding ON boarding.trip_id = spree_variants.id AND boarding.stop_type = 0')
38
+ .joins('INNER JOIN cm_trip_stops AS drop_off ON drop_off.trip_id = spree_variants.id AND drop_off.stop_type = 1')
39
39
  .joins('INNER JOIN spree_vendors AS vendors ON vendors.id = spree_variants.vendor_id')
40
40
  .joins('INNER JOIN spree_products AS routes ON routes.id = spree_variants.product_id')
41
- .where('trips.origin_id = ? AND trips.destination_id = ?', origin_id, destination_id)
41
+ .where('boarding.stop_id = ? AND drop_off.stop_id = ?', origin_id, destination_id)
42
42
 
43
43
  result.map do |trip|
44
44
  trip_result_options = {
@@ -69,9 +69,9 @@ module SpreeCmCommissioner
69
69
  INNER JOIN spree_products AS routes2 ON routes2.id = variant2.product_id
70
70
  INNER JOIN cm_trips AS trip1 ON trip1.variant_id = cm_trip_connections.from_trip_id
71
71
  INNER JOIN cm_trips AS trip2 ON trip2.variant_id = cm_trip_connections.to_trip_id
72
- INNER JOIN cm_places trip1_origin ON trip1_origin.id = trip1.origin_id
73
- INNER JOIN cm_places trip2_origin ON trip2_origin.id = trip2.origin_id
74
- INNER JOIN cm_places trip2_destination ON trip2_destination.id = trip2.destination_id
72
+ INNER JOIN cm_trip_stops trip1_origin ON trip1_origin.trip_id = variant1.id AND trip1_origin.stop_type = 0
73
+ INNER JOIN cm_trip_stops trip2_origin ON trip2_origin.trip_id = variant2.id AND trip2_origin.stop_type = 0
74
+ INNER JOIN cm_trip_stops trip2_destination ON trip2_destination.trip_id = variant2.id AND trip2_destination.stop_type = 1
75
75
  INNER JOIN spree_vendors AS vendor1 ON vendor1.id = variant1.vendor_id
76
76
  INNER JOIN spree_vendors AS vendor2 ON vendor2.id = variant2.vendor_id'
77
77
  )
@@ -93,12 +93,12 @@ module SpreeCmCommissioner
93
93
  trip2.vehicle_id AS trip2_vehicle,
94
94
  routes2.short_name AS route2_short_name,
95
95
  routes2.name AS route2_name,
96
- trip1_origin.name AS trip1_origin,
97
- trip2_origin.name AS trip2_origin,
98
- trip2_destination.name AS trip2_destination,
96
+ trip1_origin.stop_name AS trip1_origin,
97
+ trip2_origin.stop_name AS trip2_origin,
98
+ trip2_destination.stop_name AS trip2_destination,
99
99
  vendor2.name AS trip2_vendor_name'
100
- )
101
- .where('trip1_origin.id = ? AND trip2_destination.id = ?', origin_id, destination_id)
100
+ ).where('trip1_origin.stop_id = ? AND trip2_destination.stop_id = ?', origin_id, destination_id
101
+ ).uniq
102
102
 
103
103
  return [] if result.blank?
104
104
 
@@ -0,0 +1,45 @@
1
+ module SpreeCmCommissioner
2
+ module VariantAvailability
3
+ class NonPermanentStockQuery
4
+ attr_reader :variant, :except_line_item_id, :error_message
5
+
6
+ def initialize(variant:, except_line_item_id: nil)
7
+ @variant = variant
8
+ @except_line_item_id = except_line_item_id
9
+ @error_message = nil
10
+ end
11
+
12
+ def available?(quantity)
13
+ reserve_variants =
14
+ Spree::LineItem
15
+ .complete
16
+ .select('(SUM(DISTINCT spree_stock_items.count_on_hand) - SUM(spree_line_items.quantity)) AS available_quantity')
17
+ .joins(variant: :stock_items)
18
+ .where(variant_id: variant.id)
19
+ .where.not(id: except_line_item_id)
20
+ .group(:variant_id)
21
+
22
+ # there is a case when variant does not have any purchaces yet, it will return empty & always available true.
23
+ # in this case, we check with stock items directly.
24
+
25
+ available_quantity = if reserve_variants.any?
26
+ reserve_variants.sum(&:available_quantity)
27
+ else
28
+ variant.stock_items.sum(:count_on_hand)
29
+ end
30
+ if available_quantity >= quantity
31
+ true
32
+ elsif available_quantity == 1
33
+ @error_message = I18n.t('variant_availability.item_available_instock')
34
+ false
35
+ elsif available_quantity <= 0
36
+ @error_message = I18n.t('variant_availability.items_out_of_stock')
37
+ false
38
+ else
39
+ @error_message = I18n.t('variant_availability.items_available_instock', available_quantity: available_quantity)
40
+ false
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,55 @@
1
+ module SpreeCmCommissioner
2
+ module VariantAvailability
3
+ class PermanentStockQuery
4
+ attr_reader :variant, :from_date, :to_date, :except_line_item_id
5
+
6
+ def initialize(variant:, from_date:, to_date:, except_line_item_id: nil)
7
+ @variant = variant
8
+ @from_date = from_date
9
+ @to_date = to_date
10
+ @except_line_item_id = except_line_item_id
11
+ end
12
+
13
+ def available?(quantity)
14
+ (from_date..from_date).all? do |booking_date|
15
+ booked_date_quantity[booking_date].nil? ||
16
+ (booked_date_quantity[booking_date] - quantity) >= 0
17
+ end
18
+ end
19
+
20
+ def booked_date_quantity
21
+ dates_sql = ApplicationRecord.sanitize_sql_array(
22
+ [
23
+ 'SELECT date FROM generate_series(?::date, ?::date, ?) AS date',
24
+ from_date,
25
+ to_date,
26
+ date_interval
27
+ ]
28
+ )
29
+
30
+ @booked_variants ||=
31
+ Spree::LineItem
32
+ .complete
33
+ .select(
34
+ '(SUM(DISTINCT spree_stock_items.count_on_hand) - SUM(spree_line_items.quantity)) AS available_quantity',
35
+ 'dates.date AS reservation_date'
36
+ )
37
+ .joins(variant: :stock_items)
38
+ .where(variant_id: variant.id)
39
+ .where.not(id: except_line_item_id)
40
+ .joins("INNER JOIN (#{dates_sql}) dates ON dates.date >= spree_line_items.from_date AND dates.date < spree_line_items.to_date")
41
+ .group(:variant_id, :reservation_date)
42
+ .order(:reservation_date)
43
+ .each_with_object({}) do |record, hash|
44
+ hash[record.reservation_date.to_date] = record.available_quantity
45
+ end
46
+ end
47
+
48
+ # override this for product that have
49
+ # different date time interval than 1 day.
50
+ def date_interval
51
+ '1 day'
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,54 @@
1
+ module SpreeCmCommissioner
2
+ class VendorStopPlaceQuery
3
+ attr_reader :query, :vendor_id, :stop_type, :reference_stop_id
4
+
5
+ def initialize(query:, vendor_id:, stop_type: :boarding, reference_stop_id: nil)
6
+ @query = query.to_s.strip
7
+ @vendor_id = vendor_id
8
+ @stop_type = stop_type
9
+ @reference_stop_id = reference_stop_id
10
+ end
11
+
12
+ def call
13
+ results = vendor_stops
14
+ return [] if results.empty?
15
+
16
+ places = results.includes(:stop).map(&:stop).compact.uniq
17
+
18
+ format_places(places)
19
+ end
20
+
21
+ private
22
+
23
+ def vendor_stops
24
+ scope = base_scope
25
+ return scope if query.blank?
26
+
27
+ scope = scope.where.not(stop_id: reference_stop_id) if reference_stop_id.present?
28
+ scope.where('cm_places.name ILIKE ?', "%#{query}%")
29
+ end
30
+
31
+ def base_scope
32
+ SpreeCmCommissioner::VendorStop
33
+ .joins(:stop)
34
+ .where(vendor_id: vendor_id)
35
+ .where(stop_type: stop_type)
36
+ .order(trip_count: :desc)
37
+ .where.not(trip_count: 0)
38
+ end
39
+
40
+ def format_places(places)
41
+ places
42
+ .sort_by { |p| [-p.depth, -p.lft] }
43
+ .filter_map do |place|
44
+ next if place.depth.zero?
45
+
46
+ {
47
+ id: place.id,
48
+ parent_id: place.parent_id,
49
+ name: place.self_and_ancestors.map(&:name).reverse.join(', ')
50
+ }
51
+ end
52
+ end
53
+ end
54
+ end
@@ -3,9 +3,6 @@ module SpreeCmCommissioner
3
3
  params do
4
4
  required(:from_date).value(:date)
5
5
  required(:to_date).value(:date)
6
- required(:state_id).value(:integer)
7
- required(:number_of_adults).value(:integer)
8
- required(:number_of_kids).value(:integer)
9
6
  end
10
7
 
11
8
  rule(:from_date, :to_date) do
@@ -11,7 +11,7 @@ module SpreeCmCommissioner
11
11
  end
12
12
 
13
13
  def error_message
14
- errors.map { |error| "#{error.path.join(', ')}: #{error.text}" }.to_sentence
14
+ errors.map(&:text).join(', ')
15
15
  end
16
16
 
17
17
  private
@@ -9,12 +9,10 @@ module Spree
9
9
 
10
10
  attributes :total_inventory, :service_availabilities
11
11
 
12
- # Deprecated
13
12
  attribute :total_booking do |vendor|
14
13
  vendor.respond_to?(:total_booking) ? vendor.total_booking : 0
15
14
  end
16
15
 
17
- # Deprecated
18
16
  attribute :remaining do |vendor|
19
17
  vendor.respond_to?(:remaining) ? vendor.remaining : vendor.total_inventory
20
18
  end
@@ -13,6 +13,7 @@ module Spree
13
13
 
14
14
  belongs_to :occupation, serializer: Spree::V2::Tenant::TaxonSerializer
15
15
  belongs_to :nationality, serializer: Spree::V2::Tenant::TaxonSerializer
16
+ has_one :id_card, serializer: Spree::V2::Tenant::IdCardSerializer
16
17
 
17
18
  # allowed_checkout updates frequently
18
19
  cache_options store: nil
@@ -8,12 +8,13 @@ module SpreeCmCommissioner
8
8
  IV_LENGTH = 12
9
9
  TAG_LENGTH = 16
10
10
 
11
- def self.encrypt(plaintext, key)
11
+ def self.encrypt(plaintext, base64_key)
12
+ key = Base64.decode64(base64_key)
12
13
  validate_key!(key)
13
14
 
14
15
  cipher = OpenSSL::Cipher.new(ALGORITHM)
15
16
  cipher.encrypt
16
- cipher.key = key.b[0, KEY_LENGTH]
17
+ cipher.key = key[0, KEY_LENGTH]
17
18
  iv = cipher.random_iv
18
19
  cipher.iv = iv
19
20
 
@@ -24,7 +25,8 @@ module SpreeCmCommissioner
24
25
  Base64.strict_encode64(combined)
25
26
  end
26
27
 
27
- def self.decrypt(encrypted_text, key)
28
+ def self.decrypt(encrypted_text, base64_key)
29
+ key = Base64.decode64(base64_key)
28
30
  validate_key!(key)
29
31
 
30
32
  combined = Base64.decode64(encrypted_text)
@@ -34,7 +36,7 @@ module SpreeCmCommissioner
34
36
 
35
37
  cipher = OpenSSL::Cipher.new(ALGORITHM)
36
38
  cipher.decrypt
37
- cipher.key = key.b[0, KEY_LENGTH]
39
+ cipher.key = key[0, KEY_LENGTH]
38
40
  cipher.iv = iv
39
41
  cipher.auth_tag = tag
40
42
 
@@ -48,6 +48,8 @@ module SpreeCmCommissioner
48
48
  end
49
49
 
50
50
  def fetch_option_value(guest, option_type_name)
51
+ return guest.formatted_bib_number if option_type_name == 'bib-prefix'
52
+
51
53
  guest.line_item&.variant&.find_option_value_name_for(option_type_name: option_type_name)
52
54
  end
53
55
 
@@ -25,9 +25,11 @@ module SpreeCmCommissioner
25
25
  end
26
26
 
27
27
  def self.auth_context(params)
28
+ tenant_id = find_oauth_application(params)&.tenant_id
29
+
28
30
  case flow_type(params)
29
31
  when 'login_auth'
30
- options = { login: params[:username], password: params[:password] }
32
+ options = { login: params[:username], password: params[:password], tenant_id: tenant_id }
31
33
  SpreeCmCommissioner::UserPasswordAuthenticator.call(options)
32
34
  when 'social_auth'
33
35
  options = { id_token: params[:id_token] }
@@ -0,0 +1,20 @@
1
+ <% content_for(:page_tabs) do %>
2
+ <% if can?(:admin, Spree::CmsPage) %>
3
+ <%= content_tag :li, class: 'nav-item' do %>
4
+ <%= link_to_with_icon 'building.svg',
5
+ Spree::Store.default&.name || Spree.t(:store),
6
+ admin_cms_pages_url(tab: :default),
7
+ class: "nav-link #{'active' if params[:tab].blank? || params[:tab] == 'default'}" %>
8
+ <% end %>
9
+
10
+ <!-- Tenant Tabs -->
11
+ <% SpreeCmCommissioner::Tenant.all.each do |tenant| %>
12
+ <%= content_tag :li, class: 'nav-item' do %>
13
+ <%= link_to_with_icon 'building.svg',
14
+ tenant.name,
15
+ admin_cms_pages_url(tab: :tenants, tenant_id: tenant.id),
16
+ class: "nav-link #{'active' if params[:tenant_id].to_s == tenant.id.to_s}" %>
17
+ <% end %>
18
+ <% end %>
19
+ <% end %>
20
+ <% end %>
@@ -19,7 +19,10 @@
19
19
  <% @variants.each do |variant| %>
20
20
  <tr id="<%= spree_dom_id variant %>" data-hook="admin_product_stock_management_index_rows">
21
21
  <td class="image text-center">
22
- <%= small_image(variant) %>
22
+ <%= small_image(variant) %>
23
+ <div class="mt-4">
24
+ Reserved Stock: <%= @reserved_stocks[variant.id] || 0 %></strong>
25
+ </div>
23
26
  </td>
24
27
  <td>
25
28
  <%= variant.sku_and_options_text %>
@@ -32,37 +35,14 @@
32
35
  <% end %>
33
36
  </div>
34
37
  <% end if can?(:update, @product) && can?(:update, variant) %>
35
-
36
- <% if defined?(@reserved_stocks) %>
37
- <div>
38
- <span type="button" data-toggle="popover" data-trigger="hover" data-placement="right" data-content="This product stock will renew every day">
39
- <%= svg_icon name: "cart-check.svg", width: '14', height: '14' %>
40
- </span>
41
- <%= label_tag "reserved_stock#{variant.id}", "Reserved Stock: #{@reserved_stocks[variant.id] || 0}", class: "m-0" %>
42
- </div>
43
- <% end %>
44
-
45
38
  <% if variant.permanent_stock? %>
46
39
  <div>
47
40
  <span type="button" data-toggle="popover" data-trigger="hover" data-placement="right" data-content="This product stock will renew every day">
48
41
  <%= svg_icon name: "info-circle-fill.svg", width: '14', height: '14' %>
49
42
  </span>
50
- <%= label_tag "permanent_stock_#{ variant.id }", Spree.t(:permanent_stock), class: "m-0" %>
43
+ <%= label_tag "permanent_stock_#{ variant.id }", Spree.t(:permanent_stock) %>
51
44
  </div>
52
45
  <% end %>
53
-
54
- <% if defined?(@inventory_items) %>
55
- <% @inventory_items[variant.id]&.each do |inventory_item| %>
56
- <div>
57
- <%= svg_icon name: "handbag.svg", width: '14', height: '14' %>
58
- <%= label_tag "max_capacity_#{ inventory_item.id }", "Max capacity: #{inventory_item.max_capacity}", class: "m-0" %>
59
- </div>
60
- <div>
61
- <%= svg_icon name: "approve.svg", width: '14', height: '14' %>
62
- <%= label_tag "quantity_available_#{ inventory_item.id }", "Quantity available: #{inventory_item.quantity_available}", class: "m-0" %>
63
- </div>
64
- <% end %>
65
- <% end %>
66
46
  </td>
67
47
 
68
48
  <td colspan="3" class="stock_location_info">
@@ -73,9 +53,3 @@
73
53
  </tbody>
74
54
  </table>
75
55
  </div>
76
-
77
- <%= turbo_frame_tag "calendar", src: calendar_admin_product_stock_managements_path(year: params[:year]) do %>
78
- <div class="spinner-border mt-2" role="status">
79
- <span class="sr-only">Loading...</span>
80
- </div>
81
- <% end if @product.permanent_stock? %>
data/config/routes.rb CHANGED
@@ -138,11 +138,7 @@ Spree::Core::Engine.add_routes do
138
138
  end
139
139
  end
140
140
 
141
- resources :stock_managements do
142
- collection do
143
- get :calendar
144
- end
145
- end
141
+ resources :stock_managements
146
142
 
147
143
  resources :product_completion_steps do
148
144
  collection do
@@ -520,11 +516,11 @@ Spree::Core::Engine.add_routes do
520
516
  resource :reset_passwords, only: [:update]
521
517
  resource :change_passwords, only: [:update]
522
518
  resource :user_contacts, only: [:update]
519
+
520
+ resources :cms_pages, only: %i[index show]
523
521
  end
524
522
 
525
523
  namespace :storefront do
526
- resources :inventory_item
527
-
528
524
  resources :waiting_room_sessions, only: :create
529
525
  resources :vattanac_banks, only: %i[create]
530
526
  resource :cart, controller: :cart, only: %i[show create destroy] do
@@ -550,10 +546,7 @@ Spree::Core::Engine.add_routes do
550
546
  resource :cart_guests, only: %i[create destroy]
551
547
  resources :cart_payment_method_groups, only: %i[index]
552
548
 
553
- resources :accommodations, only: %i[index show] do
554
- resources :variants, only: %i[index show], module: :accommodations
555
- end
556
-
549
+ resources :accommodations, only: %i[index show]
557
550
  resources :line_items, only: %i[index show]
558
551
  resources :account_checker
559
552
  resource :account_recovers, only: [:update]
@@ -0,0 +1,10 @@
1
+ class AddNestedSetColumnsToPlaces < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_places, :parent_id, :integer if !column_exists?(:cm_places, :parent_id)
4
+ add_column :cm_places, :lft, :integer if !column_exists?(:cm_places, :lft)
5
+ add_column :cm_places, :rgt, :integer if !column_exists?(:cm_places, :rgt)
6
+
7
+ add_column :cm_places, :depth, :integer if !column_exists?(:cm_places, :depth)
8
+ add_column :cm_places, :children_count, :integer if !column_exists?(:cm_places, :children_count)
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ class CreateCmTaxonOptionTypes < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_taxon_option_types do |t|
4
+ t.references :taxon, null: false, if_not_exists: true
5
+ t.references :option_type, null: false, if_not_exists: true
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class CreateCmTaxonOptionValues < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_taxon_option_values do |t|
4
+ t.references :taxon, null: false, if_not_exists: true
5
+ t.references :option_value, null: false, if_not_exists: true
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class AddTripCountToCmVendorStops < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_vendor_stops, :trip_count, :integer, default: 0, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class AddTenantIdToSpreeCmsPages < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_cms_pages, :tenant_id, :integer, if_not_exists: true
4
+ add_index :spree_cms_pages, :tenant_id, if_not_exists: true
5
+ end
6
+ end
data/docker-compose.yml CHANGED
@@ -20,7 +20,7 @@ services:
20
20
 
21
21
  volumes:
22
22
  - .:/gem
23
- - ./vendor/bundle:/gem/vendor/bundle
23
+ - /gem/vendor/bundle
24
24
 
25
25
  # depends_on:
26
26
  # - db
@@ -40,8 +40,8 @@ module SpreeCmCommissioner
40
40
  after: %r{//= require spree/backend}, verbose: true
41
41
 
42
42
  # For NPM support
43
- template 'app/javascript/spree_dashboard/spree_cm_commissioner/utilities.js'
44
- inject_into_file 'app/javascript/spree_dashboard/spree-dashboard.js', "\nimport \"./spree_cm_commissioner/utilities.js\"",
43
+ template 'app/javascript/spree_cm_commissioner/utilities.js'
44
+ inject_into_file 'app/javascript/spree-dashboard.js', "\nimport \"./spree_cm_commissioner/utilities.js\"",
45
45
  after: %r{import "@spree/dashboard"}, verbose: true
46
46
  end
47
47
 
@@ -6,7 +6,3 @@ const $ = jquery;
6
6
  document.addEventListener("spree:load", function () {
7
7
  $('[data-toggle="popover"]').popover();
8
8
  });
9
-
10
- document.documentElement.addEventListener("turbo:frame-load", (event) => {
11
- $('[data-toggle="popover"]').popover();
12
- });
@@ -2,7 +2,7 @@ module SpreeCmCommissioner
2
2
  class CalendarEvent
3
3
  attr_reader :from_date, :to_date, :title, :options
4
4
 
5
- def initialize(from_date:, to_date:, title: nil, options: nil)
5
+ def initialize(from_date:, to_date:, title:, options:)
6
6
  @from_date = from_date
7
7
  @to_date = to_date
8
8
  @title = title
@@ -23,15 +23,5 @@ module SpreeCmCommissioner
23
23
  )
24
24
  end
25
25
  end
26
-
27
- def self.from_inventory_items(inventory_items)
28
- inventory_items.map do |item|
29
- CalendarEvent.new(
30
- from_date: item.inventory_date,
31
- to_date: item.inventory_date,
32
- options: { inventory_item: item }
33
- )
34
- end
35
- end
36
26
  end
37
27
  end
@@ -10,5 +10,15 @@ FactoryBot.define do
10
10
  address_components { FFaker::Address.street_address }
11
11
  lat { FFaker::Geolocation.lat }
12
12
  lon { FFaker::Geolocation.lng }
13
+ trait :with_parent do
14
+ association :parent, factory: :cm_place
15
+ end
16
+ transient do
17
+ children_count { 0 }
18
+ end
19
+
20
+ after(:create) do |place, evaluator|
21
+ create_list(:cm_place, evaluator.children_count, parent: place)
22
+ end
13
23
  end
14
- end
24
+ end
@@ -1,40 +1,19 @@
1
1
  FactoryBot.define do
2
2
  factory :cm_base_variant, parent: :base_variant do
3
- is_master { false }
4
-
5
3
  transient do
6
4
  total_inventory { 10 }
7
- backorderable { false }
8
5
  end
9
6
 
10
7
  after :create do |variant, evaluator|
11
8
  variant.stock_items.first.adjust_count_on_hand(evaluator.total_inventory)
12
- variant.stock_items.update_all(backorderable: evaluator.backorderable)
13
9
  end
14
10
  end
15
11
 
16
- factory :cm_variant, parent: :cm_base_variant do
17
- product { create(:product) }
18
-
19
- transient do
20
- number_of_adults { nil }
21
- number_of_kids { nil }
22
- end
23
-
24
- after(:create) do |variant, evaluator|
25
- if evaluator.number_of_adults.present?
26
- number_of_adults = create(:cm_option_type, :number_of_adults)
27
- variant.product.option_types << number_of_adults
28
- variant.option_values << create(:cm_option_value, presentation: evaluator.number_of_adults, name: evaluator.number_of_adults, option_type: number_of_adults)
29
- end
30
-
31
- if evaluator.number_of_kids.present?
32
- number_of_kids = create(:cm_option_type, :number_of_kids)
33
- variant.product.option_types << number_of_kids
34
- variant.option_values << create(:cm_option_value, presentation: evaluator.number_of_kids, name: evaluator.number_of_kids, option_type: number_of_kids)
35
- end
36
-
37
- variant.save!
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
38
17
  end
39
18
  end
40
19
 
@@ -45,13 +24,12 @@ FactoryBot.define do
45
24
  duration { "1" }
46
25
  route { }
47
26
  end
48
-
49
27
  before(:create) do |trip, evaluator|
50
28
  trip.product = evaluator.route
51
29
 
52
30
  trip.option_values = [evaluator.departure_time, evaluator.duration]
53
- end
54
31
 
32
+ end
55
33
  after(:create) do |trip, evaluator|
56
34
  trip.stock_items = [create(:stock_item, variant: trip, stock_location: evaluator.product.vendor.stock_locations.first)]
57
35
  trip.stock_items.first.adjust_count_on_hand(10)
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '1.10.0-pre'.freeze
2
+ VERSION = '1.10.0-hotfix-sms'.freeze
3
3
 
4
4
  module_function
5
5
 
@@ -19,7 +19,6 @@ require 'spree_cm_commissioner/user_session_jwt_token'
19
19
  require 'spree_cm_commissioner/trip_result'
20
20
  require 'spree_cm_commissioner/trip_query_result'
21
21
  require 'spree_cm_commissioner/trip_seat_layout_result'
22
- require 'spree_cm_commissioner/cached_inventory_item'
23
22
 
24
23
  require 'activerecord_multi_tenant'
25
24
  require 'google/cloud/recaptcha_enterprise'
@@ -45,36 +44,3 @@ require 'cm_app_logger'
45
44
  require 'counter_culture'
46
45
 
47
46
  require 'byebug' if Rails.env.development? || Rails.env.test?
48
-
49
- module SpreeCmCommissioner
50
- class << self
51
- # Allows overriding the default Redis connection pool with a custom one
52
- attr_writer :redis_pool
53
-
54
- def redis_pool
55
- @redis_pool ||= default_redis_pool
56
- end
57
-
58
- # Resets the Redis pool, useful for testing or reinitialization
59
- def reset_redis_pool
60
- @redis_pool = nil
61
- end
62
-
63
- private
64
-
65
- def default_redis_pool
66
- pool_size = ENV.fetch('REDIS_POOL_SIZE', '5').to_i
67
- timeout = ENV.fetch('REDIS_TIMEOUT', '5').to_i
68
- redis_url = ENV.fetch('REDIS_URL', 'redis://localhost:6379/12')
69
-
70
- ConnectionPool.new(size: pool_size, timeout: timeout) do
71
- Redis.new(url: redis_url, timeout: timeout)
72
- end
73
- end
74
- end
75
-
76
- # Provides a configuration block for customizing SpreeCmCommissioner settings
77
- def self.configure
78
- yield self
79
- end
80
- end