spree_cm_commissioner 1.10.0 → 1.11.0.pre.pre2

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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_and_build_gem.yml +17 -124
  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 +62 -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/inventory_items_generator.rb +15 -0
  18. data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +75 -0
  19. data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +24 -0
  20. data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +27 -8
  21. data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +7 -0
  22. data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +7 -0
  23. data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +11 -0
  24. data/app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb +11 -0
  25. data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +9 -0
  26. data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +26 -0
  27. data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +1 -3
  28. data/app/models/concerns/spree_cm_commissioner/product_type.rb +10 -0
  29. data/app/models/spree_cm_commissioner/inventory.rb +11 -0
  30. data/app/models/spree_cm_commissioner/inventory_item.rb +56 -0
  31. data/app/models/spree_cm_commissioner/line_item_decorator.rb +16 -5
  32. data/app/models/spree_cm_commissioner/order_decorator.rb +15 -0
  33. data/app/models/spree_cm_commissioner/place.rb +11 -2
  34. data/app/models/spree_cm_commissioner/product_decorator.rb +9 -2
  35. data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +40 -0
  36. data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +126 -0
  37. data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +36 -0
  38. data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +27 -0
  39. data/app/models/spree_cm_commissioner/stock/availability_checker.rb +27 -25
  40. data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +2 -1
  41. data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
  42. data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +44 -0
  43. data/app/models/spree_cm_commissioner/stock_item_decorator.rb +14 -0
  44. data/app/models/spree_cm_commissioner/taxon_decorator.rb +11 -0
  45. data/app/models/spree_cm_commissioner/taxon_option_type.rb +8 -0
  46. data/app/models/spree_cm_commissioner/taxon_option_value.rb +8 -0
  47. data/app/models/spree_cm_commissioner/trip.rb +0 -11
  48. data/app/models/spree_cm_commissioner/trip_stop.rb +11 -4
  49. data/app/models/spree_cm_commissioner/variant_decorator.rb +39 -27
  50. data/app/models/spree_cm_commissioner/vendor_stop.rb +2 -1
  51. data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +54 -0
  52. data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +3 -0
  53. data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
  54. data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +19 -0
  55. data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +2 -0
  56. data/app/serializers/spree/v2/tenant/guest_serializer.rb +1 -0
  57. data/app/services/spree_cm_commissioner/aes_encryption_service.rb +6 -4
  58. data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +2 -0
  59. data/app/views/spree/admin/stock_managements/_events_popover.html.erb +23 -0
  60. data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +3 -1
  61. data/app/views/spree/admin/stock_managements/calendar.html.erb +35 -0
  62. data/app/views/spree/admin/stock_managements/index.html.erb +40 -5
  63. data/config/initializers/spree_permitted_attributes.rb +5 -0
  64. data/config/routes.rb +11 -2
  65. data/db/migrate/20250304293518_create_cm_inventory_items.rb +21 -0
  66. data/db/migrate/20250418072528_add_nested_set_columns_to_places.rb +10 -0
  67. data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +5 -0
  68. data/db/migrate/20250430091742_create_cm_taxon_option_types.rb +9 -0
  69. data/db/migrate/20250430092928_create_cm_taxon_option_values.rb +9 -0
  70. data/db/migrate/20250502025848_add_index_to_spree_products.rb +5 -0
  71. data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +5 -0
  72. data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +5 -0
  73. data/db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb +5 -0
  74. data/docker-compose.yml +1 -1
  75. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +11 -3
  76. data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_cm_commissioner → spree_dashboard/spree_cm_commissioner}/utilities.js +4 -0
  77. data/lib/spree_cm_commissioner/cached_inventory_item.rb +23 -0
  78. data/lib/spree_cm_commissioner/calendar_event.rb +11 -1
  79. data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
  80. data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +9 -0
  81. data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
  82. data/lib/spree_cm_commissioner/test_helper/factories/place_factory.rb +11 -1
  83. data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +18 -5
  84. data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
  85. data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +41 -6
  86. data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -1
  87. data/lib/spree_cm_commissioner/version.rb +1 -1
  88. data/lib/spree_cm_commissioner.rb +34 -0
  89. data/lib/tasks/create_default_non_permanent_inventory_items.rake +16 -0
  90. data/lib/tasks/ensure_correct_product_type.rake +7 -0
  91. data/lib/tasks/generate_inventory_items.rake +7 -0
  92. data/lib/tasks/migrate_and_rebuild_place_hierarchy.rake +9 -0
  93. data/lib/tasks/update_orphan_root_places.rake +7 -0
  94. data/spree_cm_commissioner.gemspec +5 -0
  95. metadata +90 -7
  96. data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +0 -45
  97. data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +0 -55
@@ -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-pre2'.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.pre2
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,10 @@ 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/inventory_items_generator.rb
1096
+ - app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb
1097
+ - app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb
1047
1098
  - app/interactors/spree_cm_commissioner/subscriptions_order_creator.rb
1048
1099
  - app/interactors/spree_cm_commissioner/subscriptions_order_cron_executor.rb
1049
1100
  - app/interactors/spree_cm_commissioner/subscriptions_prepaid_order_creator.rb
@@ -1091,11 +1142,13 @@ files:
1091
1142
  - app/jobs/spree_cm_commissioner/customer_notification_cron_job.rb
1092
1143
  - app/jobs/spree_cm_commissioner/customer_notification_sender_job.rb
1093
1144
  - app/jobs/spree_cm_commissioner/enqueue_cart/add_item_job.rb
1145
+ - app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb
1094
1146
  - app/jobs/spree_cm_commissioner/ensure_event_id_for_guests_job.rb
1095
1147
  - app/jobs/spree_cm_commissioner/export_csv_job.rb
1096
1148
  - app/jobs/spree_cm_commissioner/firebase_email_fetcher_job.rb
1097
1149
  - app/jobs/spree_cm_commissioner/import_order_job.rb
1098
1150
  - app/jobs/spree_cm_commissioner/invalidate_cache_request_job.rb
1151
+ - app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb
1099
1152
  - app/jobs/spree_cm_commissioner/option_type_variants_public_metadata_updater_job.rb
1100
1153
  - app/jobs/spree_cm_commissioner/option_value_variants_public_metadata_updater_job.rb
1101
1154
  - app/jobs/spree_cm_commissioner/order_complete_telegram_sender_job.rb
@@ -1103,6 +1156,9 @@ files:
1103
1156
  - app/jobs/spree_cm_commissioner/sms_job.rb
1104
1157
  - app/jobs/spree_cm_commissioner/sms_pin_code_job.rb
1105
1158
  - app/jobs/spree_cm_commissioner/state_job.rb
1159
+ - app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb
1160
+ - app/jobs/spree_cm_commissioner/stock/inventory_items_generator_job.rb
1161
+ - app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb
1106
1162
  - app/jobs/spree_cm_commissioner/subscription_order_executor_job.rb
1107
1163
  - app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb
1108
1164
  - app/jobs/spree_cm_commissioner/telegram_notification_sender_job.rb
@@ -1195,6 +1251,8 @@ files:
1195
1251
  - app/models/spree_cm_commissioner/image_methods_decorator.rb
1196
1252
  - app/models/spree_cm_commissioner/import.rb
1197
1253
  - app/models/spree_cm_commissioner/imports/import_order.rb
1254
+ - app/models/spree_cm_commissioner/inventory.rb
1255
+ - app/models/spree_cm_commissioner/inventory_item.rb
1198
1256
  - app/models/spree_cm_commissioner/invite.rb
1199
1257
  - app/models/spree_cm_commissioner/invite_user_event.rb
1200
1258
  - app/models/spree_cm_commissioner/invite_user_taxon.rb
@@ -1244,6 +1302,10 @@ files:
1244
1302
  - app/models/spree_cm_commissioner/promotion_decorator.rb
1245
1303
  - app/models/spree_cm_commissioner/property_decorator.rb
1246
1304
  - app/models/spree_cm_commissioner/prototype_decorator.rb
1305
+ - app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb
1306
+ - app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb
1307
+ - app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb
1308
+ - app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb
1247
1309
  - app/models/spree_cm_commissioner/role_decorator.rb
1248
1310
  - app/models/spree_cm_commissioner/role_permission.rb
1249
1311
  - app/models/spree_cm_commissioner/s3_presigned_url.rb
@@ -1256,6 +1318,7 @@ files:
1256
1318
  - app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb
1257
1319
  - app/models/spree_cm_commissioner/stock/inventory_unit_builder_decorator.rb
1258
1320
  - app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb
1321
+ - app/models/spree_cm_commissioner/stock/order_availability_checker.rb
1259
1322
  - app/models/spree_cm_commissioner/stock_item_decorator.rb
1260
1323
  - app/models/spree_cm_commissioner/stock_location_decorator.rb
1261
1324
  - app/models/spree_cm_commissioner/stop.rb
@@ -1267,6 +1330,8 @@ files:
1267
1330
  - app/models/spree_cm_commissioner/taxon_category_icon.rb
1268
1331
  - app/models/spree_cm_commissioner/taxon_decorator.rb
1269
1332
  - app/models/spree_cm_commissioner/taxon_home_banner.rb
1333
+ - app/models/spree_cm_commissioner/taxon_option_type.rb
1334
+ - app/models/spree_cm_commissioner/taxon_option_value.rb
1270
1335
  - app/models/spree_cm_commissioner/taxon_vendor.rb
1271
1336
  - app/models/spree_cm_commissioner/taxon_video_banner.rb
1272
1337
  - app/models/spree_cm_commissioner/taxon_web_banner.rb
@@ -1460,13 +1525,13 @@ files:
1460
1525
  - app/queries/spree_cm_commissioner/trip_search_query.rb
1461
1526
  - app/queries/spree_cm_commissioner/trip_seat_layout_query.rb
1462
1527
  - 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
1528
+ - app/queries/spree_cm_commissioner/vendor_stop_place_query.rb
1465
1529
  - app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb
1466
1530
  - app/request_schemas/spree_cm_commissioner/application_request_schema.rb
1467
1531
  - app/request_schemas/spree_cm_commissioner/profile_image_request_schema.rb
1468
1532
  - app/request_schemas/spree_cm_commissioner/user_account_linkage_request_schema.rb
1469
1533
  - app/request_schemas/spree_cm_commissioner/user_profile_request_schema.rb
1534
+ - app/request_schemas/spree_cm_commissioner/variant_request_schema.rb
1470
1535
  - app/serializables/spree_cm_commissioner/event_ticket_aggregator.rb
1471
1536
  - app/serializables/spree_cm_commissioner/pie_chart_event_aggregator.rb
1472
1537
  - app/serializables/spree_cm_commissioner/queue_item.rb
@@ -1791,7 +1856,9 @@ files:
1791
1856
  - app/views/spree/admin/shared/_video_on_demand_helper_script.html.erb
1792
1857
  - app/views/spree/admin/shared/sub_menu/_calendar.html.erb
1793
1858
  - app/views/spree/admin/shared/sub_menu/_homepage.html.erb
1859
+ - app/views/spree/admin/stock_managements/_events_popover.html.erb
1794
1860
  - app/views/spree/admin/stock_managements/_variant_stock_items.html.erb
1861
+ - app/views/spree/admin/stock_managements/calendar.html.erb
1795
1862
  - app/views/spree/admin/stock_managements/index.html.erb
1796
1863
  - app/views/spree/admin/system/show.html.erb
1797
1864
  - app/views/spree/admin/taxon_childrens/index.html.erb
@@ -2357,6 +2424,7 @@ files:
2357
2424
  - db/migrate/20250304101907_create_spree_cm_commissioner_invite.rb
2358
2425
  - db/migrate/20250304101946_create_spree_cm_commissioner_invite_user_taxon.rb
2359
2426
  - db/migrate/20250304155234_add_meta_data_to_spree_vendors.rb
2427
+ - db/migrate/20250304293518_create_cm_inventory_items.rb
2360
2428
  - db/migrate/20250307013422_add_parent_id_to_cm_place.rb
2361
2429
  - db/migrate/20250307073003_add_tenant_id_to_cm_customer_notifications.rb
2362
2430
  - db/migrate/20250307083809_remove_tenant_id_from_cm_notifications.rb
@@ -2372,9 +2440,17 @@ files:
2372
2440
  - db/migrate/20250403083001_create_spree_cm_commissioner_taxon_blazer_query.rb
2373
2441
  - db/migrate/20250404050117_add_archived_at_to_spree_orders.rb
2374
2442
  - db/migrate/20250407092556_add_variant_id_to_cm_trips.rb
2443
+ - db/migrate/20250418072528_add_nested_set_columns_to_places.rb
2375
2444
  - db/migrate/20250425084929_add_description_to_spree_prototypes.rb
2376
2445
  - db/migrate/20250425085938_add_preferences_to_spree_prototypes.rb
2377
2446
  - db/migrate/20250428025645_add_slug_to_spree_prototypes.rb
2447
+ - db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb
2448
+ - db/migrate/20250430091742_create_cm_taxon_option_types.rb
2449
+ - db/migrate/20250430092928_create_cm_taxon_option_values.rb
2450
+ - db/migrate/20250502025848_add_index_to_spree_products.rb
2451
+ - db/migrate/20250502030001_add_product_type_to_spree_variants.rb
2452
+ - db/migrate/20250502030002_add_product_type_to_spree_line_items.rb
2453
+ - db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb
2378
2454
  - docker-compose.yml
2379
2455
  - docs/option_types/attr_types.md
2380
2456
  - docs/private_key.pem
@@ -2389,11 +2465,12 @@ files:
2389
2465
  - docs/webhook/sqs/params_job_submitted.json
2390
2466
  - lib/cm_app_logger.rb
2391
2467
  - lib/generators/spree_cm_commissioner/install/install_generator.rb
2392
- - lib/generators/spree_cm_commissioner/install/templates/app/javascript/spree_cm_commissioner/utilities.js
2468
+ - lib/generators/spree_cm_commissioner/install/templates/app/javascript/spree_dashboard/spree_cm_commissioner/utilities.js
2393
2469
  - lib/generators/spree_cm_commissioner/install/templates/config/data/nationalities.yml
2394
2470
  - lib/generators/spree_cm_commissioner/install/templates/vendor/assets/javascript/spree_cm_commissioner/telegram/all.js
2395
2471
  - lib/generators/spree_cm_commissioner/install/templates/vendor/assets/stylesheets/spree_cm_commissioner/telegram/all.css
2396
2472
  - lib/spree_cm_commissioner.rb
2473
+ - lib/spree_cm_commissioner/cached_inventory_item.rb
2397
2474
  - lib/spree_cm_commissioner/calendar_event.rb
2398
2475
  - lib/spree_cm_commissioner/engine.rb
2399
2476
  - lib/spree_cm_commissioner/factories.rb
@@ -2428,6 +2505,7 @@ files:
2428
2505
  - lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb
2429
2506
  - lib/spree_cm_commissioner/test_helper/factories/id_card_factory.rb
2430
2507
  - lib/spree_cm_commissioner/test_helper/factories/image_factory.rb
2508
+ - lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb
2431
2509
  - lib/spree_cm_commissioner/test_helper/factories/invite_factory.rb
2432
2510
  - lib/spree_cm_commissioner/test_helper/factories/invite_user_event_factory.rb
2433
2511
  - lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb
@@ -2482,15 +2560,20 @@ files:
2482
2560
  - lib/spree_cm_commissioner/trip_seat_layout_result.rb
2483
2561
  - lib/spree_cm_commissioner/user_session_jwt_token.rb
2484
2562
  - lib/spree_cm_commissioner/version.rb
2563
+ - lib/tasks/create_default_non_permanent_inventory_items.rake
2485
2564
  - lib/tasks/customer_notification_cron_scheduler.rake
2565
+ - lib/tasks/ensure_correct_product_type.rake
2486
2566
  - lib/tasks/ensure_event_for_guests.rake
2487
2567
  - lib/tasks/ensure_number_for_line_items.rake
2488
2568
  - lib/tasks/fetch_email.rake
2569
+ - lib/tasks/generate_inventory_items.rake
2489
2570
  - lib/tasks/kh_location_option_values.rake
2490
2571
  - lib/tasks/kh_provinces.rake
2572
+ - lib/tasks/migrate_and_rebuild_place_hierarchy.rake
2491
2573
  - lib/tasks/remove_duplicate_device_tokens.rake
2492
2574
  - lib/tasks/subscriptions_order_creator.rake
2493
2575
  - lib/tasks/update_gateway_status.rake
2576
+ - lib/tasks/update_orphan_root_places.rake
2494
2577
  - lib/tasks/update_taxons.rake
2495
2578
  - lib/tasks/variants_public_metadata_updater.rake
2496
2579
  - lib/tasks/vendor_updater.rake
@@ -2518,9 +2601,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
2518
2601
  version: '2.7'
2519
2602
  required_rubygems_version: !ruby/object:Gem::Requirement
2520
2603
  requirements:
2521
- - - ">="
2604
+ - - ">"
2522
2605
  - !ruby/object:Gem::Version
2523
- version: '0'
2606
+ version: 1.3.1
2524
2607
  requirements:
2525
2608
  - none
2526
2609
  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