spree_cm_commissioner 1.10.0 → 1.11.0.pre.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_and_build_gem.yml +131 -98
  3. data/.gitignore +2 -1
  4. data/.vscode/settings.json +1 -1
  5. data/Gemfile.lock +22 -1
  6. data/Rakefile +33 -4
  7. data/app/controllers/spree/admin/stock_managements_controller.rb +56 -1
  8. data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +42 -0
  9. data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +14 -31
  10. data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
  11. data/app/finders/spree_cm_commissioner/accommodations/find.rb +40 -0
  12. data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +35 -0
  13. data/app/interactors/spree_cm_commissioner/create_event.rb +23 -0
  14. data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +40 -0
  15. data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +25 -0
  16. data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +13 -0
  17. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +75 -0
  18. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +24 -0
  19. data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +27 -8
  20. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +7 -0
  21. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +7 -0
  22. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +11 -0
  23. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +9 -0
  24. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +26 -0
  25. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +1 -3
  26. data/app/models/concerns/spree_cm_commissioner/product_type.rb +10 -0
  27. data/app/models/spree_cm_commissioner/inventory.rb +11 -0
  28. data/app/models/spree_cm_commissioner/inventory_item.rb +55 -0
  29. data/app/models/spree_cm_commissioner/line_item_decorator.rb +16 -5
  30. data/app/models/spree_cm_commissioner/order_decorator.rb +15 -0
  31. data/app/models/spree_cm_commissioner/place.rb +11 -2
  32. data/app/models/spree_cm_commissioner/product_decorator.rb +9 -2
  33. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +40 -0
  34. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +126 -0
  35. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +36 -0
  36. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +27 -0
  37. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +27 -25
  38. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +2 -1
  39. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  40. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +44 -0
  41. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +18 -0
  42. data/app/models/spree_cm_commissioner/taxon_decorator.rb +11 -0
  43. data/app/models/spree_cm_commissioner/taxon_option_type.rb +8 -0
  44. data/app/models/spree_cm_commissioner/taxon_option_value.rb +8 -0
  45. data/app/models/spree_cm_commissioner/trip.rb +0 -11
  46. data/app/models/spree_cm_commissioner/trip_stop.rb +11 -4
  47. data/app/models/spree_cm_commissioner/variant_decorator.rb +39 -27
  48. data/app/models/spree_cm_commissioner/vendor_stop.rb +2 -1
  49. data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +54 -0
  50. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +3 -0
  51. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  52. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +19 -0
  53. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +2 -0
  54. data/app/serializers/spree/v2/tenant/guest_serializer.rb +1 -0
  55. data/app/services/spree_cm_commissioner/aes_encryption_service.rb +6 -4
  56. data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +2 -0
  57. data/app/views/spree/admin/stock_managements/_events_popover.html.erb +23 -0
  58. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +3 -1
  59. data/app/views/spree/admin/stock_managements/calendar.html.erb +35 -0
  60. data/app/views/spree/admin/stock_managements/index.html.erb +40 -5
  61. data/config/initializers/spree_permitted_attributes.rb +5 -0
  62. data/config/routes.rb +11 -2
  63. data/db/migrate/20250304293518_create_cm_inventory_items.rb +21 -0
  64. data/db/migrate/20250418072528_add_nested_set_columns_to_places.rb +10 -0
  65. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +5 -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/20250502025848_add_index_to_spree_products.rb +5 -0
  69. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +5 -0
  70. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +5 -0
  71. data/db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb +5 -0
  72. data/docker-compose.yml +1 -1
  73. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +11 -3
  74. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_cm_commissioner → spree_dashboard/spree_cm_commissioner}/utilities.js +4 -0
  75. data/lib/spree_cm_commissioner/cached_inventory_item.rb +23 -0
  76. data/lib/spree_cm_commissioner/calendar_event.rb +11 -1
  77. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  78. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +9 -0
  79. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  80. data/lib/spree_cm_commissioner/test_helper/factories/place_factory.rb +11 -1
  81. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +18 -5
  82. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  83. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +39 -6
  84. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -1
  85. data/lib/spree_cm_commissioner/version.rb +1 -1
  86. data/lib/spree_cm_commissioner.rb +34 -0
  87. data/lib/tasks/create_default_non_permanent_inventory_items.rake +16 -0
  88. data/lib/tasks/ensure_correct_product_type.rake +7 -0
  89. data/lib/tasks/generate_inventory_items.rake +7 -0
  90. data/lib/tasks/migrate_and_rebuild_place_hierarchy.rake +9 -0
  91. data/lib/tasks/update_orphan_root_places.rake +7 -0
  92. data/spree_cm_commissioner.gemspec +5 -0
  93. metadata +88 -7
  94. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +0 -45
  95. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +0 -55
@@ -1,19 +1,51 @@
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)
15
+ variant.stock_items.update_all(backorderable: evaluator.backorderable)
16
+
17
+ if evaluator.pregenerate_inventory_items
18
+ variant.inventory_items.each { |item| item.adjust_quantity!(evaluator.total_inventory) }
19
+ SpreeCmCommissioner::Stock::PermanentInventoryItemsGenerator.call(pre_inventory_days: evaluator.pre_inventory_days || 3) if variant.permanent_stock?
20
+ else
21
+ # make sure all inventory items are remove if exist.
22
+ variant.inventory_items.destroy_all
23
+ end
9
24
  end
10
25
  end
11
26
 
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
27
+ factory :cm_variant, parent: :cm_base_variant do
28
+ product { create(:cm_product) }
29
+
30
+ transient do
31
+ number_of_adults { nil }
32
+ number_of_kids { nil }
33
+ end
34
+
35
+ after(:create) do |variant, evaluator|
36
+ if evaluator.number_of_adults.present?
37
+ number_of_adults = create(:cm_option_type, :number_of_adults)
38
+ variant.product.option_types << number_of_adults
39
+ variant.option_values << create(:cm_option_value, presentation: evaluator.number_of_adults, name: evaluator.number_of_adults, option_type: number_of_adults)
40
+ end
41
+
42
+ if evaluator.number_of_kids.present?
43
+ number_of_kids = create(:cm_option_type, :number_of_kids)
44
+ variant.product.option_types << number_of_kids
45
+ variant.option_values << create(:cm_option_value, presentation: evaluator.number_of_kids, name: evaluator.number_of_kids, option_type: number_of_kids)
46
+ end
47
+
48
+ variant.save!
17
49
  end
18
50
  end
19
51
 
@@ -24,12 +56,13 @@ FactoryBot.define do
24
56
  duration { "1" }
25
57
  route { }
26
58
  end
59
+
27
60
  before(:create) do |trip, evaluator|
28
61
  trip.product = evaluator.route
29
62
 
30
63
  trip.option_values = [evaluator.departure_time, evaluator.duration]
31
-
32
64
  end
65
+
33
66
  after(:create) do |trip, evaluator|
34
67
  trip.stock_items = [create(:stock_item, variant: trip, stock_location: evaluator.product.vendor.stock_locations.first)]
35
68
  trip.stock_items.first.adjust_count_on_hand(10)
@@ -30,7 +30,7 @@ FactoryBot.define do
30
30
  if vendor.primary_product_type == :accommodation
31
31
  product = create(:cm_accommodation_product, vendor: vendor, total_inventory: evaluator.total_inventory)
32
32
  else
33
- product = create(:product, vendor: vendor, product_type: vendor.primary_product_type)
33
+ product = create(:cm_product, vendor: vendor, product_type: vendor.primary_product_type)
34
34
  product.master.stock_items.first.adjust_count_on_hand(evaluator.total_inventory)
35
35
  end
36
36
 
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '1.10.0'.freeze
2
+ VERSION = '1.11.0-pre'.freeze
3
3
 
4
4
  module_function
5
5
 
@@ -19,6 +19,7 @@ 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'
22
23
 
23
24
  require 'activerecord_multi_tenant'
24
25
  require 'google/cloud/recaptcha_enterprise'
@@ -44,3 +45,36 @@ require 'cm_app_logger'
44
45
  require 'counter_culture'
45
46
 
46
47
  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
@@ -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
@@ -0,0 +1,9 @@
1
+ namespace :spree_cm_commissioner do
2
+ desc 'Migrate and Rebuild place hierarchy..'
3
+ task migrate_and_rebuild_place_hierarchy: :environment do
4
+ puts 'Resetting column information :lft and :rgt columns...'
5
+ SpreeCmCommissioner::Place.reset_column_information
6
+ SpreeCmCommissioner::Place.rebuild!
7
+ puts 'Place hierarchy rebuild completed successfully!'
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ namespace :spree_cm_commissioner do
2
+ desc 'Update orphan root places...'
3
+ task update_orphan_root_places: :environment do
4
+ count = SpreeCmCommissioner::Place.where(parent_id: 0).update_all(parent_id: nil) # rubocop:disable Rails/SkipsModelValidations
5
+ puts "#{count} orphan root places updated."
6
+ end
7
+ end
@@ -54,6 +54,11 @@ 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
+ # Redis
58
+ s.add_dependency 'redis'
59
+ s.add_dependency 'redis-rails'
60
+ s.add_dependency 'connection_pool'
61
+
57
62
  s.add_development_dependency 'pg'
58
63
  s.add_development_dependency 'spree_dev_tools'
59
64
  s.add_dependency 'blazer', '~> 3.0.4'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_cm_commissioner
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.0
4
+ version: 1.11.0.pre.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-05-02 00:00:00.000000000 Z
11
+ date: 2025-05-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree
@@ -464,6 +464,48 @@ dependencies:
464
464
  - - "~>"
465
465
  - !ruby/object:Gem::Version
466
466
  version: '3.2'
467
+ - !ruby/object:Gem::Dependency
468
+ name: redis
469
+ requirement: !ruby/object:Gem::Requirement
470
+ requirements:
471
+ - - ">="
472
+ - !ruby/object:Gem::Version
473
+ version: '0'
474
+ type: :runtime
475
+ prerelease: false
476
+ version_requirements: !ruby/object:Gem::Requirement
477
+ requirements:
478
+ - - ">="
479
+ - !ruby/object:Gem::Version
480
+ version: '0'
481
+ - !ruby/object:Gem::Dependency
482
+ name: redis-rails
483
+ requirement: !ruby/object:Gem::Requirement
484
+ requirements:
485
+ - - ">="
486
+ - !ruby/object:Gem::Version
487
+ version: '0'
488
+ type: :runtime
489
+ prerelease: false
490
+ version_requirements: !ruby/object:Gem::Requirement
491
+ requirements:
492
+ - - ">="
493
+ - !ruby/object:Gem::Version
494
+ version: '0'
495
+ - !ruby/object:Gem::Dependency
496
+ name: connection_pool
497
+ requirement: !ruby/object:Gem::Requirement
498
+ requirements:
499
+ - - ">="
500
+ - !ruby/object:Gem::Version
501
+ version: '0'
502
+ type: :runtime
503
+ prerelease: false
504
+ version_requirements: !ruby/object:Gem::Requirement
505
+ requirements:
506
+ - - ">="
507
+ - !ruby/object:Gem::Version
508
+ version: '0'
467
509
  - !ruby/object:Gem::Dependency
468
510
  name: pg
469
511
  requirement: !ruby/object:Gem::Requirement
@@ -788,6 +830,7 @@ files:
788
830
  - app/controllers/spree/api/v2/platform/seat_number_layouts_controller.rb
789
831
  - app/controllers/spree/api/v2/platform/taxons_controller_decorator.rb
790
832
  - app/controllers/spree/api/v2/resource_controller_decorator.rb
833
+ - app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb
791
834
  - app/controllers/spree/api/v2/storefront/accommodations_controller.rb
792
835
  - app/controllers/spree/api/v2/storefront/account/orders_controller_decorator.rb
793
836
  - app/controllers/spree/api/v2/storefront/account/preferred_payment_method_controller.rb
@@ -958,6 +1001,8 @@ files:
958
1001
  - app/exception_notifier/spree_cm_commissioner/telegram_notifier.rb
959
1002
  - app/factory/spree_cm_commissioner/order_telegram_message_factory.rb
960
1003
  - app/factory/spree_cm_commissioner/telegram_message_factory.rb
1004
+ - app/finders/spree_cm_commissioner/accommodations/find.rb
1005
+ - app/finders/spree_cm_commissioner/accommodations/find_variant.rb
961
1006
  - app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb
962
1007
  - app/finders/spree_cm_commissioner/orders/find.rb
963
1008
  - app/finders/spree_cm_commissioner/orders/find_by_state.rb
@@ -1002,6 +1047,7 @@ files:
1002
1047
  - app/interactors/spree_cm_commissioner/customer_promotion_creator.rb
1003
1048
  - app/interactors/spree_cm_commissioner/enqueue_cart/add_item.rb
1004
1049
  - app/interactors/spree_cm_commissioner/enqueue_cart/add_item_status_marker.rb
1050
+ - app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb
1005
1051
  - app/interactors/spree_cm_commissioner/event_qr_generator.rb
1006
1052
  - app/interactors/spree_cm_commissioner/existing_account_checker.rb
1007
1053
  - app/interactors/spree_cm_commissioner/firebase_email_fetcher.rb
@@ -1015,6 +1061,7 @@ files:
1015
1061
  - app/interactors/spree_cm_commissioner/imported_csv_downloader.rb
1016
1062
  - app/interactors/spree_cm_commissioner/international_mobile_formatter.rb
1017
1063
  - app/interactors/spree_cm_commissioner/invalidate_cache_request.rb
1064
+ - app/interactors/spree_cm_commissioner/inventory_item_syncer.rb
1018
1065
  - app/interactors/spree_cm_commissioner/invoice_creator.rb
1019
1066
  - app/interactors/spree_cm_commissioner/media/signed_cookie_generator.rb
1020
1067
  - app/interactors/spree_cm_commissioner/media/signed_path_generator.rb
@@ -1044,6 +1091,9 @@ files:
1044
1091
  - app/interactors/spree_cm_commissioner/sms.rb
1045
1092
  - app/interactors/spree_cm_commissioner/sqs/media_convert_job_status.rb
1046
1093
  - app/interactors/spree_cm_commissioner/state_updater.rb
1094
+ - app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb
1095
+ - app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb
1096
+ - app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb
1047
1097
  - app/interactors/spree_cm_commissioner/subscriptions_order_creator.rb
1048
1098
  - app/interactors/spree_cm_commissioner/subscriptions_order_cron_executor.rb
1049
1099
  - app/interactors/spree_cm_commissioner/subscriptions_prepaid_order_creator.rb
@@ -1091,11 +1141,13 @@ files:
1091
1141
  - app/jobs/spree_cm_commissioner/customer_notification_cron_job.rb
1092
1142
  - app/jobs/spree_cm_commissioner/customer_notification_sender_job.rb
1093
1143
  - app/jobs/spree_cm_commissioner/enqueue_cart/add_item_job.rb
1144
+ - app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb
1094
1145
  - app/jobs/spree_cm_commissioner/ensure_event_id_for_guests_job.rb
1095
1146
  - app/jobs/spree_cm_commissioner/export_csv_job.rb
1096
1147
  - app/jobs/spree_cm_commissioner/firebase_email_fetcher_job.rb
1097
1148
  - app/jobs/spree_cm_commissioner/import_order_job.rb
1098
1149
  - app/jobs/spree_cm_commissioner/invalidate_cache_request_job.rb
1150
+ - app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb
1099
1151
  - app/jobs/spree_cm_commissioner/option_type_variants_public_metadata_updater_job.rb
1100
1152
  - app/jobs/spree_cm_commissioner/option_value_variants_public_metadata_updater_job.rb
1101
1153
  - app/jobs/spree_cm_commissioner/order_complete_telegram_sender_job.rb
@@ -1103,6 +1155,8 @@ files:
1103
1155
  - app/jobs/spree_cm_commissioner/sms_job.rb
1104
1156
  - app/jobs/spree_cm_commissioner/sms_pin_code_job.rb
1105
1157
  - app/jobs/spree_cm_commissioner/state_job.rb
1158
+ - app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb
1159
+ - app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb
1106
1160
  - app/jobs/spree_cm_commissioner/subscription_order_executor_job.rb
1107
1161
  - app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb
1108
1162
  - app/jobs/spree_cm_commissioner/telegram_notification_sender_job.rb
@@ -1195,6 +1249,8 @@ files:
1195
1249
  - app/models/spree_cm_commissioner/image_methods_decorator.rb
1196
1250
  - app/models/spree_cm_commissioner/import.rb
1197
1251
  - app/models/spree_cm_commissioner/imports/import_order.rb
1252
+ - app/models/spree_cm_commissioner/inventory.rb
1253
+ - app/models/spree_cm_commissioner/inventory_item.rb
1198
1254
  - app/models/spree_cm_commissioner/invite.rb
1199
1255
  - app/models/spree_cm_commissioner/invite_user_event.rb
1200
1256
  - app/models/spree_cm_commissioner/invite_user_taxon.rb
@@ -1244,6 +1300,10 @@ files:
1244
1300
  - app/models/spree_cm_commissioner/promotion_decorator.rb
1245
1301
  - app/models/spree_cm_commissioner/property_decorator.rb
1246
1302
  - app/models/spree_cm_commissioner/prototype_decorator.rb
1303
+ - app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb
1304
+ - app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb
1305
+ - app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb
1306
+ - app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb
1247
1307
  - app/models/spree_cm_commissioner/role_decorator.rb
1248
1308
  - app/models/spree_cm_commissioner/role_permission.rb
1249
1309
  - app/models/spree_cm_commissioner/s3_presigned_url.rb
@@ -1256,6 +1316,7 @@ files:
1256
1316
  - app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb
1257
1317
  - app/models/spree_cm_commissioner/stock/inventory_unit_builder_decorator.rb
1258
1318
  - app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb
1319
+ - app/models/spree_cm_commissioner/stock/order_availability_checker.rb
1259
1320
  - app/models/spree_cm_commissioner/stock_item_decorator.rb
1260
1321
  - app/models/spree_cm_commissioner/stock_location_decorator.rb
1261
1322
  - app/models/spree_cm_commissioner/stop.rb
@@ -1267,6 +1328,8 @@ files:
1267
1328
  - app/models/spree_cm_commissioner/taxon_category_icon.rb
1268
1329
  - app/models/spree_cm_commissioner/taxon_decorator.rb
1269
1330
  - app/models/spree_cm_commissioner/taxon_home_banner.rb
1331
+ - app/models/spree_cm_commissioner/taxon_option_type.rb
1332
+ - app/models/spree_cm_commissioner/taxon_option_value.rb
1270
1333
  - app/models/spree_cm_commissioner/taxon_vendor.rb
1271
1334
  - app/models/spree_cm_commissioner/taxon_video_banner.rb
1272
1335
  - app/models/spree_cm_commissioner/taxon_web_banner.rb
@@ -1460,13 +1523,13 @@ files:
1460
1523
  - app/queries/spree_cm_commissioner/trip_search_query.rb
1461
1524
  - app/queries/spree_cm_commissioner/trip_seat_layout_query.rb
1462
1525
  - app/queries/spree_cm_commissioner/users_by_event_fetcher_query.rb
1463
- - app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb
1464
- - app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb
1526
+ - app/queries/spree_cm_commissioner/vendor_stop_place_query.rb
1465
1527
  - app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb
1466
1528
  - app/request_schemas/spree_cm_commissioner/application_request_schema.rb
1467
1529
  - app/request_schemas/spree_cm_commissioner/profile_image_request_schema.rb
1468
1530
  - app/request_schemas/spree_cm_commissioner/user_account_linkage_request_schema.rb
1469
1531
  - app/request_schemas/spree_cm_commissioner/user_profile_request_schema.rb
1532
+ - app/request_schemas/spree_cm_commissioner/variant_request_schema.rb
1470
1533
  - app/serializables/spree_cm_commissioner/event_ticket_aggregator.rb
1471
1534
  - app/serializables/spree_cm_commissioner/pie_chart_event_aggregator.rb
1472
1535
  - app/serializables/spree_cm_commissioner/queue_item.rb
@@ -1791,7 +1854,9 @@ files:
1791
1854
  - app/views/spree/admin/shared/_video_on_demand_helper_script.html.erb
1792
1855
  - app/views/spree/admin/shared/sub_menu/_calendar.html.erb
1793
1856
  - app/views/spree/admin/shared/sub_menu/_homepage.html.erb
1857
+ - app/views/spree/admin/stock_managements/_events_popover.html.erb
1794
1858
  - app/views/spree/admin/stock_managements/_variant_stock_items.html.erb
1859
+ - app/views/spree/admin/stock_managements/calendar.html.erb
1795
1860
  - app/views/spree/admin/stock_managements/index.html.erb
1796
1861
  - app/views/spree/admin/system/show.html.erb
1797
1862
  - app/views/spree/admin/taxon_childrens/index.html.erb
@@ -2357,6 +2422,7 @@ files:
2357
2422
  - db/migrate/20250304101907_create_spree_cm_commissioner_invite.rb
2358
2423
  - db/migrate/20250304101946_create_spree_cm_commissioner_invite_user_taxon.rb
2359
2424
  - db/migrate/20250304155234_add_meta_data_to_spree_vendors.rb
2425
+ - db/migrate/20250304293518_create_cm_inventory_items.rb
2360
2426
  - db/migrate/20250307013422_add_parent_id_to_cm_place.rb
2361
2427
  - db/migrate/20250307073003_add_tenant_id_to_cm_customer_notifications.rb
2362
2428
  - db/migrate/20250307083809_remove_tenant_id_from_cm_notifications.rb
@@ -2372,9 +2438,17 @@ files:
2372
2438
  - db/migrate/20250403083001_create_spree_cm_commissioner_taxon_blazer_query.rb
2373
2439
  - db/migrate/20250404050117_add_archived_at_to_spree_orders.rb
2374
2440
  - db/migrate/20250407092556_add_variant_id_to_cm_trips.rb
2441
+ - db/migrate/20250418072528_add_nested_set_columns_to_places.rb
2375
2442
  - db/migrate/20250425084929_add_description_to_spree_prototypes.rb
2376
2443
  - db/migrate/20250425085938_add_preferences_to_spree_prototypes.rb
2377
2444
  - db/migrate/20250428025645_add_slug_to_spree_prototypes.rb
2445
+ - db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb
2446
+ - db/migrate/20250430091742_create_cm_taxon_option_types.rb
2447
+ - db/migrate/20250430092928_create_cm_taxon_option_values.rb
2448
+ - db/migrate/20250502025848_add_index_to_spree_products.rb
2449
+ - db/migrate/20250502030001_add_product_type_to_spree_variants.rb
2450
+ - db/migrate/20250502030002_add_product_type_to_spree_line_items.rb
2451
+ - db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb
2378
2452
  - docker-compose.yml
2379
2453
  - docs/option_types/attr_types.md
2380
2454
  - docs/private_key.pem
@@ -2389,11 +2463,12 @@ files:
2389
2463
  - docs/webhook/sqs/params_job_submitted.json
2390
2464
  - lib/cm_app_logger.rb
2391
2465
  - lib/generators/spree_cm_commissioner/install/install_generator.rb
2392
- - lib/generators/spree_cm_commissioner/install/templates/app/javascript/spree_cm_commissioner/utilities.js
2466
+ - lib/generators/spree_cm_commissioner/install/templates/app/javascript/spree_dashboard/spree_cm_commissioner/utilities.js
2393
2467
  - lib/generators/spree_cm_commissioner/install/templates/config/data/nationalities.yml
2394
2468
  - lib/generators/spree_cm_commissioner/install/templates/vendor/assets/javascript/spree_cm_commissioner/telegram/all.js
2395
2469
  - lib/generators/spree_cm_commissioner/install/templates/vendor/assets/stylesheets/spree_cm_commissioner/telegram/all.css
2396
2470
  - lib/spree_cm_commissioner.rb
2471
+ - lib/spree_cm_commissioner/cached_inventory_item.rb
2397
2472
  - lib/spree_cm_commissioner/calendar_event.rb
2398
2473
  - lib/spree_cm_commissioner/engine.rb
2399
2474
  - lib/spree_cm_commissioner/factories.rb
@@ -2428,6 +2503,7 @@ files:
2428
2503
  - lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb
2429
2504
  - lib/spree_cm_commissioner/test_helper/factories/id_card_factory.rb
2430
2505
  - lib/spree_cm_commissioner/test_helper/factories/image_factory.rb
2506
+ - lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb
2431
2507
  - lib/spree_cm_commissioner/test_helper/factories/invite_factory.rb
2432
2508
  - lib/spree_cm_commissioner/test_helper/factories/invite_user_event_factory.rb
2433
2509
  - lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb
@@ -2482,15 +2558,20 @@ files:
2482
2558
  - lib/spree_cm_commissioner/trip_seat_layout_result.rb
2483
2559
  - lib/spree_cm_commissioner/user_session_jwt_token.rb
2484
2560
  - lib/spree_cm_commissioner/version.rb
2561
+ - lib/tasks/create_default_non_permanent_inventory_items.rake
2485
2562
  - lib/tasks/customer_notification_cron_scheduler.rake
2563
+ - lib/tasks/ensure_correct_product_type.rake
2486
2564
  - lib/tasks/ensure_event_for_guests.rake
2487
2565
  - lib/tasks/ensure_number_for_line_items.rake
2488
2566
  - lib/tasks/fetch_email.rake
2567
+ - lib/tasks/generate_inventory_items.rake
2489
2568
  - lib/tasks/kh_location_option_values.rake
2490
2569
  - lib/tasks/kh_provinces.rake
2570
+ - lib/tasks/migrate_and_rebuild_place_hierarchy.rake
2491
2571
  - lib/tasks/remove_duplicate_device_tokens.rake
2492
2572
  - lib/tasks/subscriptions_order_creator.rake
2493
2573
  - lib/tasks/update_gateway_status.rake
2574
+ - lib/tasks/update_orphan_root_places.rake
2494
2575
  - lib/tasks/update_taxons.rake
2495
2576
  - lib/tasks/variants_public_metadata_updater.rake
2496
2577
  - lib/tasks/vendor_updater.rake
@@ -2518,9 +2599,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
2518
2599
  version: '2.7'
2519
2600
  required_rubygems_version: !ruby/object:Gem::Requirement
2520
2601
  requirements:
2521
- - - ">="
2602
+ - - ">"
2522
2603
  - !ruby/object:Gem::Version
2523
- version: '0'
2604
+ version: 1.3.1
2524
2605
  requirements:
2525
2606
  - none
2526
2607
  rubygems_version: 3.4.1
@@ -1,45 +0,0 @@
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
@@ -1,55 +0,0 @@
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