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.
- checksums.yaml +4 -4
- data/.github/workflows/test_and_build_gem.yml +131 -98
- data/.gitignore +2 -1
- data/.vscode/settings.json +1 -1
- data/Gemfile.lock +22 -1
- data/Rakefile +33 -4
- data/app/controllers/spree/admin/stock_managements_controller.rb +56 -1
- data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +42 -0
- data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +14 -31
- data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
- data/app/finders/spree_cm_commissioner/accommodations/find.rb +40 -0
- data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +35 -0
- data/app/interactors/spree_cm_commissioner/create_event.rb +23 -0
- data/app/interactors/spree_cm_commissioner/ensure_correct_product_type.rb +40 -0
- data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +25 -0
- data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +13 -0
- data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +75 -0
- data/app/interactors/spree_cm_commissioner/stock/stock_movement_creator.rb +24 -0
- data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +27 -8
- data/app/jobs/spree_cm_commissioner/ensure_correct_product_type_job.rb +7 -0
- data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +7 -0
- data/app/jobs/spree_cm_commissioner/stock/inventory_items_adjuster_job.rb +11 -0
- data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +9 -0
- data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +26 -0
- data/app/models/concerns/spree_cm_commissioner/product_delegation.rb +1 -3
- data/app/models/concerns/spree_cm_commissioner/product_type.rb +10 -0
- data/app/models/spree_cm_commissioner/inventory.rb +11 -0
- data/app/models/spree_cm_commissioner/inventory_item.rb +55 -0
- data/app/models/spree_cm_commissioner/line_item_decorator.rb +16 -5
- data/app/models/spree_cm_commissioner/order_decorator.rb +15 -0
- data/app/models/spree_cm_commissioner/place.rb +11 -2
- data/app/models/spree_cm_commissioner/product_decorator.rb +9 -2
- data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +40 -0
- data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +126 -0
- data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +36 -0
- data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +27 -0
- data/app/models/spree_cm_commissioner/stock/availability_checker.rb +27 -25
- data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +2 -1
- data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
- data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +44 -0
- data/app/models/spree_cm_commissioner/stock_item_decorator.rb +18 -0
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +11 -0
- data/app/models/spree_cm_commissioner/taxon_option_type.rb +8 -0
- data/app/models/spree_cm_commissioner/taxon_option_value.rb +8 -0
- data/app/models/spree_cm_commissioner/trip.rb +0 -11
- data/app/models/spree_cm_commissioner/trip_stop.rb +11 -4
- data/app/models/spree_cm_commissioner/variant_decorator.rb +39 -27
- data/app/models/spree_cm_commissioner/vendor_stop.rb +2 -1
- data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +54 -0
- data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +3 -0
- data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
- data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +19 -0
- data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +2 -0
- data/app/serializers/spree/v2/tenant/guest_serializer.rb +1 -0
- data/app/services/spree_cm_commissioner/aes_encryption_service.rb +6 -4
- data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +2 -0
- data/app/views/spree/admin/stock_managements/_events_popover.html.erb +23 -0
- data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +3 -1
- data/app/views/spree/admin/stock_managements/calendar.html.erb +35 -0
- data/app/views/spree/admin/stock_managements/index.html.erb +40 -5
- data/config/initializers/spree_permitted_attributes.rb +5 -0
- data/config/routes.rb +11 -2
- data/db/migrate/20250304293518_create_cm_inventory_items.rb +21 -0
- data/db/migrate/20250418072528_add_nested_set_columns_to_places.rb +10 -0
- data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +5 -0
- data/db/migrate/20250430091742_create_cm_taxon_option_types.rb +9 -0
- data/db/migrate/20250430092928_create_cm_taxon_option_values.rb +9 -0
- data/db/migrate/20250502025848_add_index_to_spree_products.rb +5 -0
- data/db/migrate/20250502030001_add_product_type_to_spree_variants.rb +5 -0
- data/db/migrate/20250502030002_add_product_type_to_spree_line_items.rb +5 -0
- data/db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb +5 -0
- data/docker-compose.yml +1 -1
- data/lib/generators/spree_cm_commissioner/install/install_generator.rb +11 -3
- data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_cm_commissioner → spree_dashboard/spree_cm_commissioner}/utilities.js +4 -0
- data/lib/spree_cm_commissioner/cached_inventory_item.rb +23 -0
- data/lib/spree_cm_commissioner/calendar_event.rb +11 -1
- data/lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +9 -0
- data/lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb +1 -1
- data/lib/spree_cm_commissioner/test_helper/factories/place_factory.rb +11 -1
- data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +18 -5
- data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
- data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +39 -6
- data/lib/spree_cm_commissioner/test_helper/factories/vendor_factory.rb +1 -1
- data/lib/spree_cm_commissioner/version.rb +1 -1
- data/lib/spree_cm_commissioner.rb +34 -0
- data/lib/tasks/create_default_non_permanent_inventory_items.rake +16 -0
- data/lib/tasks/ensure_correct_product_type.rake +7 -0
- data/lib/tasks/generate_inventory_items.rake +7 -0
- data/lib/tasks/migrate_and_rebuild_place_hierarchy.rake +9 -0
- data/lib/tasks/update_orphan_root_places.rake +7 -0
- data/spree_cm_commissioner.gemspec +5 -0
- metadata +88 -7
- data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +0 -45
- 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: :
|
13
|
-
product
|
14
|
-
|
15
|
-
|
16
|
-
|
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(:
|
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
|
|
@@ -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.
|
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-
|
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/
|
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:
|
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
|