spree_cm_commissioner 1.10.0.pre.pre → 1.10.0.pre.hotfix.pre.sms
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/test_and_build_gem.yml +48 -26
- data/.gitignore +1 -2
- data/.vscode/settings.json +1 -1
- data/Gemfile.lock +1 -22
- data/app/controllers/spree/admin/cms_pages_controller_decorator.rb +32 -0
- data/app/controllers/spree/admin/stock_managements_controller.rb +1 -17
- data/app/controllers/spree/api/v2/storefront/accommodations_controller.rb +31 -14
- data/app/controllers/spree/api/v2/tenant/account_checker_controller.rb +1 -1
- data/app/controllers/spree/api/v2/tenant/account_recovers_controller.rb +2 -2
- data/app/controllers/spree/api/v2/tenant/cms_pages_controller.rb +41 -0
- data/app/controllers/spree/api/v2/tenant/reset_passwords_controller.rb +1 -1
- data/app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb +18 -0
- data/app/interactors/spree_cm_commissioner/account_recover.rb +2 -2
- data/app/interactors/spree_cm_commissioner/create_event.rb +23 -0
- data/app/interactors/spree_cm_commissioner/existing_account_checker.rb +1 -1
- data/app/interactors/spree_cm_commissioner/pin_code_sender.rb +3 -3
- data/app/interactors/spree_cm_commissioner/sms.rb +14 -0
- data/app/interactors/spree_cm_commissioner/telegram_debug_pin_code_sender.rb +2 -1
- data/app/interactors/spree_cm_commissioner/user_forgotten_password_updater.rb +2 -1
- data/app/interactors/spree_cm_commissioner/user_password_authenticator.rb +4 -2
- data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +2 -2
- data/app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb +3 -1
- data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +3 -2
- data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -26
- data/app/models/concerns/spree_cm_commissioner/product_type.rb +0 -10
- data/app/models/concerns/spree_cm_commissioner/user_identity.rb +7 -4
- data/app/models/spree_cm_commissioner/cms_page_decorator.rb +9 -0
- data/app/models/spree_cm_commissioner/line_item_decorator.rb +0 -1
- data/app/models/spree_cm_commissioner/order_decorator.rb +0 -15
- data/app/models/spree_cm_commissioner/place.rb +11 -2
- data/app/models/spree_cm_commissioner/product_decorator.rb +0 -1
- data/app/models/spree_cm_commissioner/stock/availability_checker.rb +25 -27
- data/app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb +1 -2
- data/app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb +3 -3
- 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_connection.rb +1 -0
- data/app/models/spree_cm_commissioner/trip_stop.rb +12 -5
- data/app/models/spree_cm_commissioner/variant_decorator.rb +28 -25
- data/app/models/spree_cm_commissioner/variant_options.rb +0 -14
- data/app/models/spree_cm_commissioner/vehicle.rb +0 -7
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +2 -1
- data/app/models/spree_cm_commissioner/vendor_stop.rb +2 -1
- data/app/overrides/spree/admin/cms_pages/_form/tenant_fields.html.erb.deface +7 -0
- data/app/overrides/spree/admin/cms_pages/index/cms_pages_tabs.html.erb.deface +21 -0
- data/app/overrides/spree/admin/users/index/body.html.erb.deface +3 -0
- data/app/overrides/spree/admin/users/index/headers.html.erb.deface +3 -0
- data/app/queries/spree_cm_commissioner/trip_query.rb +11 -11
- data/app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb +45 -0
- data/app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb +55 -0
- data/app/queries/spree_cm_commissioner/vendor_stop_place_query.rb +54 -0
- data/app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb +0 -3
- data/app/request_schemas/spree_cm_commissioner/application_request_schema.rb +1 -1
- data/app/serializers/spree/v2/storefront/accommodation_serializer.rb +0 -2
- 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/services/spree_cm_commissioner/user_authenticator.rb +3 -1
- data/app/views/spree/admin/shared/_cms_pages_tabs.html.erb +20 -0
- data/app/views/spree/admin/stock_managements/index.html.erb +5 -31
- data/config/routes.rb +4 -11
- data/db/migrate/20250418072528_add_nested_set_columns_to_places.rb +10 -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/20250506092929_add_trip_count_to_cm_vendor_stops.rb +5 -0
- data/db/migrate/20250512075319_add_tenant_id_to_spree_cms_pages.rb +6 -0
- data/docker-compose.yml +1 -1
- data/lib/generators/spree_cm_commissioner/install/install_generator.rb +2 -2
- data/lib/generators/spree_cm_commissioner/install/templates/app/javascript/{spree_dashboard/spree_cm_commissioner → spree_cm_commissioner}/utilities.js +0 -4
- data/lib/spree_cm_commissioner/calendar_event.rb +1 -11
- data/lib/spree_cm_commissioner/test_helper/factories/place_factory.rb +11 -1
- data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +6 -28
- data/lib/spree_cm_commissioner/version.rb +1 -1
- data/lib/spree_cm_commissioner.rb +0 -34
- 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 +0 -5
- metadata +22 -69
- data/app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb +0 -42
- data/app/finders/spree_cm_commissioner/accommodations/find.rb +0 -40
- data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +0 -35
- data/app/interactors/spree_cm_commissioner/inventory_item_syncer.rb +0 -25
- data/app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb +0 -71
- data/app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb +0 -7
- data/app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb +0 -9
- data/app/models/spree_cm_commissioner/inventory.rb +0 -11
- data/app/models/spree_cm_commissioner/inventory_item.rb +0 -37
- data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +0 -40
- data/app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb +0 -114
- data/app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb +0 -42
- data/app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb +0 -27
- data/app/models/spree_cm_commissioner/stock/order_availability_checker.rb +0 -44
- data/app/models/spree_cm_commissioner/stock_movement_decorator.rb +0 -34
- data/app/request_schemas/spree_cm_commissioner/variant_request_schema.rb +0 -19
- data/app/views/spree/admin/stock_managements/_events_popover.html.erb +0 -17
- data/app/views/spree/admin/stock_managements/calendar.html.erb +0 -32
- data/db/migrate/20250304293518_create_cm_inventory_items.rb +0 -21
- data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +0 -5
- data/lib/spree_cm_commissioner/cached_inventory_item.rb +0 -23
- data/lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb +0 -9
- data/lib/tasks/create_default_non_permanent_inventory_items.rake +0 -16
- data/lib/tasks/generate_inventory_items.rake +0 -7
@@ -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,11 +54,6 @@ 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
|
-
|
62
57
|
s.add_development_dependency 'pg'
|
63
58
|
s.add_development_dependency 'spree_dev_tools'
|
64
59
|
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.pre.pre
|
4
|
+
version: 1.10.0.pre.hotfix.pre.sms
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- You
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: spree
|
@@ -464,48 +464,6 @@ 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'
|
509
467
|
- !ruby/object:Gem::Dependency
|
510
468
|
name: pg
|
511
469
|
requirement: !ruby/object:Gem::Requirement
|
@@ -744,6 +702,7 @@ files:
|
|
744
702
|
- app/controllers/spree/admin/calendars/base_controller.rb
|
745
703
|
- app/controllers/spree/admin/calendars/orders_controller.rb
|
746
704
|
- app/controllers/spree/admin/classifications_controller.rb
|
705
|
+
- app/controllers/spree/admin/cms_pages_controller_decorator.rb
|
747
706
|
- app/controllers/spree/admin/customer_notifications_controller.rb
|
748
707
|
- app/controllers/spree/admin/device_tokens_controller.rb
|
749
708
|
- app/controllers/spree/admin/event_blazer_queries_controller.rb
|
@@ -830,7 +789,6 @@ files:
|
|
830
789
|
- app/controllers/spree/api/v2/platform/seat_number_layouts_controller.rb
|
831
790
|
- app/controllers/spree/api/v2/platform/taxons_controller_decorator.rb
|
832
791
|
- app/controllers/spree/api/v2/resource_controller_decorator.rb
|
833
|
-
- app/controllers/spree/api/v2/storefront/accommodations/variants_controller.rb
|
834
792
|
- app/controllers/spree/api/v2/storefront/accommodations_controller.rb
|
835
793
|
- app/controllers/spree/api/v2/storefront/account/orders_controller_decorator.rb
|
836
794
|
- app/controllers/spree/api/v2/storefront/account/preferred_payment_method_controller.rb
|
@@ -902,6 +860,7 @@ files:
|
|
902
860
|
- app/controllers/spree/api/v2/tenant/cart_payment_method_groups_controller.rb
|
903
861
|
- app/controllers/spree/api/v2/tenant/change_passwords_controller.rb
|
904
862
|
- app/controllers/spree/api/v2/tenant/checkout_controller.rb
|
863
|
+
- app/controllers/spree/api/v2/tenant/cms_pages_controller.rb
|
905
864
|
- app/controllers/spree/api/v2/tenant/customer_notifications_controller.rb
|
906
865
|
- app/controllers/spree/api/v2/tenant/guests_controller.rb
|
907
866
|
- app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb
|
@@ -985,6 +944,7 @@ files:
|
|
985
944
|
- app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb
|
986
945
|
- app/controllers/spree_cm_commissioner/api/v2/storefront/cart_controller_decorator.rb
|
987
946
|
- app/controllers/spree_cm_commissioner/api/v2/storefront/checkout_controller_decorator.rb
|
947
|
+
- app/controllers/spree_cm_commissioner/api/v2/storefront/cms_pages_controller_decorator.rb
|
988
948
|
- app/controllers/spree_cm_commissioner/application_controller_decorator.rb
|
989
949
|
- app/controllers/spree_cm_commissioner/guest_cards_controller.rb
|
990
950
|
- app/controllers/spree_cm_commissioner/line_item_qr_images_controller.rb
|
@@ -1001,8 +961,6 @@ files:
|
|
1001
961
|
- app/exception_notifier/spree_cm_commissioner/telegram_notifier.rb
|
1002
962
|
- app/factory/spree_cm_commissioner/order_telegram_message_factory.rb
|
1003
963
|
- 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
|
1006
964
|
- app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb
|
1007
965
|
- app/finders/spree_cm_commissioner/orders/find.rb
|
1008
966
|
- app/finders/spree_cm_commissioner/orders/find_by_state.rb
|
@@ -1060,7 +1018,6 @@ files:
|
|
1060
1018
|
- app/interactors/spree_cm_commissioner/imported_csv_downloader.rb
|
1061
1019
|
- app/interactors/spree_cm_commissioner/international_mobile_formatter.rb
|
1062
1020
|
- app/interactors/spree_cm_commissioner/invalidate_cache_request.rb
|
1063
|
-
- app/interactors/spree_cm_commissioner/inventory_item_syncer.rb
|
1064
1021
|
- app/interactors/spree_cm_commissioner/invoice_creator.rb
|
1065
1022
|
- app/interactors/spree_cm_commissioner/media/signed_cookie_generator.rb
|
1066
1023
|
- app/interactors/spree_cm_commissioner/media/signed_path_generator.rb
|
@@ -1090,7 +1047,6 @@ files:
|
|
1090
1047
|
- app/interactors/spree_cm_commissioner/sms.rb
|
1091
1048
|
- app/interactors/spree_cm_commissioner/sqs/media_convert_job_status.rb
|
1092
1049
|
- app/interactors/spree_cm_commissioner/state_updater.rb
|
1093
|
-
- app/interactors/spree_cm_commissioner/stock/permanent_inventory_items_generator.rb
|
1094
1050
|
- app/interactors/spree_cm_commissioner/subscriptions_order_creator.rb
|
1095
1051
|
- app/interactors/spree_cm_commissioner/subscriptions_order_cron_executor.rb
|
1096
1052
|
- app/interactors/spree_cm_commissioner/subscriptions_prepaid_order_creator.rb
|
@@ -1143,7 +1099,6 @@ files:
|
|
1143
1099
|
- app/jobs/spree_cm_commissioner/firebase_email_fetcher_job.rb
|
1144
1100
|
- app/jobs/spree_cm_commissioner/import_order_job.rb
|
1145
1101
|
- app/jobs/spree_cm_commissioner/invalidate_cache_request_job.rb
|
1146
|
-
- app/jobs/spree_cm_commissioner/inventory_item_syncer_job.rb
|
1147
1102
|
- app/jobs/spree_cm_commissioner/option_type_variants_public_metadata_updater_job.rb
|
1148
1103
|
- app/jobs/spree_cm_commissioner/option_value_variants_public_metadata_updater_job.rb
|
1149
1104
|
- app/jobs/spree_cm_commissioner/order_complete_telegram_sender_job.rb
|
@@ -1151,7 +1106,6 @@ files:
|
|
1151
1106
|
- app/jobs/spree_cm_commissioner/sms_job.rb
|
1152
1107
|
- app/jobs/spree_cm_commissioner/sms_pin_code_job.rb
|
1153
1108
|
- app/jobs/spree_cm_commissioner/state_job.rb
|
1154
|
-
- app/jobs/spree_cm_commissioner/stock/permanent_inventory_items_generator_job.rb
|
1155
1109
|
- app/jobs/spree_cm_commissioner/subscription_order_executor_job.rb
|
1156
1110
|
- app/jobs/spree_cm_commissioner/telegram_debug_pin_code_sender_job.rb
|
1157
1111
|
- app/jobs/spree_cm_commissioner/telegram_notification_sender_job.rb
|
@@ -1205,6 +1159,7 @@ files:
|
|
1205
1159
|
- app/models/spree_cm_commissioner/check_in_ability.rb
|
1206
1160
|
- app/models/spree_cm_commissioner/check_in_record.rb
|
1207
1161
|
- app/models/spree_cm_commissioner/classification_decorator.rb
|
1162
|
+
- app/models/spree_cm_commissioner/cms_page_decorator.rb
|
1208
1163
|
- app/models/spree_cm_commissioner/configuration.rb
|
1209
1164
|
- app/models/spree_cm_commissioner/crew_invite.rb
|
1210
1165
|
- app/models/spree_cm_commissioner/customer.rb
|
@@ -1244,8 +1199,6 @@ files:
|
|
1244
1199
|
- app/models/spree_cm_commissioner/image_methods_decorator.rb
|
1245
1200
|
- app/models/spree_cm_commissioner/import.rb
|
1246
1201
|
- app/models/spree_cm_commissioner/imports/import_order.rb
|
1247
|
-
- app/models/spree_cm_commissioner/inventory.rb
|
1248
|
-
- app/models/spree_cm_commissioner/inventory_item.rb
|
1249
1202
|
- app/models/spree_cm_commissioner/invite.rb
|
1250
1203
|
- app/models/spree_cm_commissioner/invite_user_event.rb
|
1251
1204
|
- app/models/spree_cm_commissioner/invite_user_taxon.rb
|
@@ -1295,10 +1248,6 @@ files:
|
|
1295
1248
|
- app/models/spree_cm_commissioner/promotion_decorator.rb
|
1296
1249
|
- app/models/spree_cm_commissioner/property_decorator.rb
|
1297
1250
|
- app/models/spree_cm_commissioner/prototype_decorator.rb
|
1298
|
-
- app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb
|
1299
|
-
- app/models/spree_cm_commissioner/redis_stock/inventory_updater.rb
|
1300
|
-
- app/models/spree_cm_commissioner/redis_stock/line_items_cached_inventory_items_builder.rb
|
1301
|
-
- app/models/spree_cm_commissioner/redis_stock/variant_cached_inventory_items_builder.rb
|
1302
1251
|
- app/models/spree_cm_commissioner/role_decorator.rb
|
1303
1252
|
- app/models/spree_cm_commissioner/role_permission.rb
|
1304
1253
|
- app/models/spree_cm_commissioner/s3_presigned_url.rb
|
@@ -1311,10 +1260,8 @@ files:
|
|
1311
1260
|
- app/models/spree_cm_commissioner/stock/availability_validator_decorator.rb
|
1312
1261
|
- app/models/spree_cm_commissioner/stock/inventory_unit_builder_decorator.rb
|
1313
1262
|
- app/models/spree_cm_commissioner/stock/line_item_availability_checker.rb
|
1314
|
-
- app/models/spree_cm_commissioner/stock/order_availability_checker.rb
|
1315
1263
|
- app/models/spree_cm_commissioner/stock_item_decorator.rb
|
1316
1264
|
- app/models/spree_cm_commissioner/stock_location_decorator.rb
|
1317
|
-
- app/models/spree_cm_commissioner/stock_movement_decorator.rb
|
1318
1265
|
- app/models/spree_cm_commissioner/stop.rb
|
1319
1266
|
- app/models/spree_cm_commissioner/store_decorator.rb
|
1320
1267
|
- app/models/spree_cm_commissioner/subscription.rb
|
@@ -1324,6 +1271,8 @@ files:
|
|
1324
1271
|
- app/models/spree_cm_commissioner/taxon_category_icon.rb
|
1325
1272
|
- app/models/spree_cm_commissioner/taxon_decorator.rb
|
1326
1273
|
- app/models/spree_cm_commissioner/taxon_home_banner.rb
|
1274
|
+
- app/models/spree_cm_commissioner/taxon_option_type.rb
|
1275
|
+
- app/models/spree_cm_commissioner/taxon_option_value.rb
|
1327
1276
|
- app/models/spree_cm_commissioner/taxon_vendor.rb
|
1328
1277
|
- app/models/spree_cm_commissioner/taxon_video_banner.rb
|
1329
1278
|
- app/models/spree_cm_commissioner/taxon_web_banner.rb
|
@@ -1377,6 +1326,8 @@ files:
|
|
1377
1326
|
- app/notifications/spree_cm_commissioner/order_requested_notification.rb
|
1378
1327
|
- app/overrides/spree/admin/adjustments/_adjustment/payable_table_body.html.erb.deface
|
1379
1328
|
- app/overrides/spree/admin/adjustments/_adjustments_table/payable_table_header.html.erb.deface
|
1329
|
+
- app/overrides/spree/admin/cms_pages/_form/tenant_fields.html.erb.deface
|
1330
|
+
- app/overrides/spree/admin/cms_pages/index/cms_pages_tabs.html.erb.deface
|
1380
1331
|
- app/overrides/spree/admin/menu_items/_form/badge_field.html.erb.deface
|
1381
1332
|
- app/overrides/spree/admin/oauth_applications/_form/tenant_fields.html.erb.deface
|
1382
1333
|
- app/overrides/spree/admin/option_types/_form/attr_type.html.erb.deface
|
@@ -1517,12 +1468,14 @@ files:
|
|
1517
1468
|
- app/queries/spree_cm_commissioner/trip_search_query.rb
|
1518
1469
|
- app/queries/spree_cm_commissioner/trip_seat_layout_query.rb
|
1519
1470
|
- app/queries/spree_cm_commissioner/users_by_event_fetcher_query.rb
|
1471
|
+
- app/queries/spree_cm_commissioner/variant_availability/non_permanent_stock_query.rb
|
1472
|
+
- app/queries/spree_cm_commissioner/variant_availability/permanent_stock_query.rb
|
1473
|
+
- app/queries/spree_cm_commissioner/vendor_stop_place_query.rb
|
1520
1474
|
- app/request_schemas/spree_cm_commissioner/accommodation_request_schema.rb
|
1521
1475
|
- app/request_schemas/spree_cm_commissioner/application_request_schema.rb
|
1522
1476
|
- app/request_schemas/spree_cm_commissioner/profile_image_request_schema.rb
|
1523
1477
|
- app/request_schemas/spree_cm_commissioner/user_account_linkage_request_schema.rb
|
1524
1478
|
- app/request_schemas/spree_cm_commissioner/user_profile_request_schema.rb
|
1525
|
-
- app/request_schemas/spree_cm_commissioner/variant_request_schema.rb
|
1526
1479
|
- app/serializables/spree_cm_commissioner/event_ticket_aggregator.rb
|
1527
1480
|
- app/serializables/spree_cm_commissioner/pie_chart_event_aggregator.rb
|
1528
1481
|
- app/serializables/spree_cm_commissioner/queue_item.rb
|
@@ -1832,6 +1785,7 @@ files:
|
|
1832
1785
|
- app/views/spree/admin/promotions/rules/_guest_occupations.html.erb
|
1833
1786
|
- app/views/spree/admin/promotions/rules/_vendors.html.erb
|
1834
1787
|
- app/views/spree/admin/promotions/rules/_weekend.html.erb
|
1788
|
+
- app/views/spree/admin/shared/_cms_pages_tabs.html.erb
|
1835
1789
|
- app/views/spree/admin/shared/_customer_notification_tabs.html.erb
|
1836
1790
|
- app/views/spree/admin/shared/_direct_upload.html.erb
|
1837
1791
|
- app/views/spree/admin/shared/_import_order_tabs.html.erb
|
@@ -1847,9 +1801,7 @@ files:
|
|
1847
1801
|
- app/views/spree/admin/shared/_video_on_demand_helper_script.html.erb
|
1848
1802
|
- app/views/spree/admin/shared/sub_menu/_calendar.html.erb
|
1849
1803
|
- app/views/spree/admin/shared/sub_menu/_homepage.html.erb
|
1850
|
-
- app/views/spree/admin/stock_managements/_events_popover.html.erb
|
1851
1804
|
- app/views/spree/admin/stock_managements/_variant_stock_items.html.erb
|
1852
|
-
- app/views/spree/admin/stock_managements/calendar.html.erb
|
1853
1805
|
- app/views/spree/admin/stock_managements/index.html.erb
|
1854
1806
|
- app/views/spree/admin/system/show.html.erb
|
1855
1807
|
- app/views/spree/admin/taxon_childrens/index.html.erb
|
@@ -2415,7 +2367,6 @@ files:
|
|
2415
2367
|
- db/migrate/20250304101907_create_spree_cm_commissioner_invite.rb
|
2416
2368
|
- db/migrate/20250304101946_create_spree_cm_commissioner_invite_user_taxon.rb
|
2417
2369
|
- db/migrate/20250304155234_add_meta_data_to_spree_vendors.rb
|
2418
|
-
- db/migrate/20250304293518_create_cm_inventory_items.rb
|
2419
2370
|
- db/migrate/20250307013422_add_parent_id_to_cm_place.rb
|
2420
2371
|
- db/migrate/20250307073003_add_tenant_id_to_cm_customer_notifications.rb
|
2421
2372
|
- db/migrate/20250307083809_remove_tenant_id_from_cm_notifications.rb
|
@@ -2431,10 +2382,14 @@ files:
|
|
2431
2382
|
- db/migrate/20250403083001_create_spree_cm_commissioner_taxon_blazer_query.rb
|
2432
2383
|
- db/migrate/20250404050117_add_archived_at_to_spree_orders.rb
|
2433
2384
|
- db/migrate/20250407092556_add_variant_id_to_cm_trips.rb
|
2385
|
+
- db/migrate/20250418072528_add_nested_set_columns_to_places.rb
|
2434
2386
|
- db/migrate/20250425084929_add_description_to_spree_prototypes.rb
|
2435
2387
|
- db/migrate/20250425085938_add_preferences_to_spree_prototypes.rb
|
2436
2388
|
- db/migrate/20250428025645_add_slug_to_spree_prototypes.rb
|
2437
|
-
- db/migrate/
|
2389
|
+
- db/migrate/20250430091742_create_cm_taxon_option_types.rb
|
2390
|
+
- db/migrate/20250430092928_create_cm_taxon_option_values.rb
|
2391
|
+
- db/migrate/20250506092929_add_trip_count_to_cm_vendor_stops.rb
|
2392
|
+
- db/migrate/20250512075319_add_tenant_id_to_spree_cms_pages.rb
|
2438
2393
|
- docker-compose.yml
|
2439
2394
|
- docs/option_types/attr_types.md
|
2440
2395
|
- docs/private_key.pem
|
@@ -2449,12 +2404,11 @@ files:
|
|
2449
2404
|
- docs/webhook/sqs/params_job_submitted.json
|
2450
2405
|
- lib/cm_app_logger.rb
|
2451
2406
|
- lib/generators/spree_cm_commissioner/install/install_generator.rb
|
2452
|
-
- lib/generators/spree_cm_commissioner/install/templates/app/javascript/
|
2407
|
+
- lib/generators/spree_cm_commissioner/install/templates/app/javascript/spree_cm_commissioner/utilities.js
|
2453
2408
|
- lib/generators/spree_cm_commissioner/install/templates/config/data/nationalities.yml
|
2454
2409
|
- lib/generators/spree_cm_commissioner/install/templates/vendor/assets/javascript/spree_cm_commissioner/telegram/all.js
|
2455
2410
|
- lib/generators/spree_cm_commissioner/install/templates/vendor/assets/stylesheets/spree_cm_commissioner/telegram/all.css
|
2456
2411
|
- lib/spree_cm_commissioner.rb
|
2457
|
-
- lib/spree_cm_commissioner/cached_inventory_item.rb
|
2458
2412
|
- lib/spree_cm_commissioner/calendar_event.rb
|
2459
2413
|
- lib/spree_cm_commissioner/engine.rb
|
2460
2414
|
- lib/spree_cm_commissioner/factories.rb
|
@@ -2489,7 +2443,6 @@ files:
|
|
2489
2443
|
- lib/spree_cm_commissioner/test_helper/factories/homepage_section_relatable_factory.rb
|
2490
2444
|
- lib/spree_cm_commissioner/test_helper/factories/id_card_factory.rb
|
2491
2445
|
- lib/spree_cm_commissioner/test_helper/factories/image_factory.rb
|
2492
|
-
- lib/spree_cm_commissioner/test_helper/factories/inventory_item_factory.rb
|
2493
2446
|
- lib/spree_cm_commissioner/test_helper/factories/invite_factory.rb
|
2494
2447
|
- lib/spree_cm_commissioner/test_helper/factories/invite_user_event_factory.rb
|
2495
2448
|
- lib/spree_cm_commissioner/test_helper/factories/line_item_factory.rb
|
@@ -2544,17 +2497,17 @@ files:
|
|
2544
2497
|
- lib/spree_cm_commissioner/trip_seat_layout_result.rb
|
2545
2498
|
- lib/spree_cm_commissioner/user_session_jwt_token.rb
|
2546
2499
|
- lib/spree_cm_commissioner/version.rb
|
2547
|
-
- lib/tasks/create_default_non_permanent_inventory_items.rake
|
2548
2500
|
- lib/tasks/customer_notification_cron_scheduler.rake
|
2549
2501
|
- lib/tasks/ensure_event_for_guests.rake
|
2550
2502
|
- lib/tasks/ensure_number_for_line_items.rake
|
2551
2503
|
- lib/tasks/fetch_email.rake
|
2552
|
-
- lib/tasks/generate_inventory_items.rake
|
2553
2504
|
- lib/tasks/kh_location_option_values.rake
|
2554
2505
|
- lib/tasks/kh_provinces.rake
|
2506
|
+
- lib/tasks/migrate_and_rebuild_place_hierarchy.rake
|
2555
2507
|
- lib/tasks/remove_duplicate_device_tokens.rake
|
2556
2508
|
- lib/tasks/subscriptions_order_creator.rake
|
2557
2509
|
- lib/tasks/update_gateway_status.rake
|
2510
|
+
- lib/tasks/update_orphan_root_places.rake
|
2558
2511
|
- lib/tasks/update_taxons.rake
|
2559
2512
|
- lib/tasks/variants_public_metadata_updater.rake
|
2560
2513
|
- lib/tasks/vendor_updater.rake
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module Spree
|
2
|
-
module Api
|
3
|
-
module V2
|
4
|
-
module Storefront
|
5
|
-
class Accommodations::VariantsController < ::Spree::Api::V2::ResourceController
|
6
|
-
private
|
7
|
-
|
8
|
-
# override
|
9
|
-
def collection
|
10
|
-
@collection ||= SpreeCmCommissioner::Accommodations::FindVariant.new(
|
11
|
-
from_date: params[:from_date]&.to_date,
|
12
|
-
to_date: params[:to_date]&.to_date,
|
13
|
-
vendor_id: params[:accommodation_id],
|
14
|
-
number_of_adults: params[:number_of_adults].to_i,
|
15
|
-
number_of_kids: params[:number_of_kids].to_i
|
16
|
-
).execute
|
17
|
-
end
|
18
|
-
|
19
|
-
# override
|
20
|
-
def resource
|
21
|
-
@resource ||= collection.find(params[:id])
|
22
|
-
end
|
23
|
-
|
24
|
-
# override
|
25
|
-
def resource_serializer
|
26
|
-
Spree::V2::Storefront::VariantSerializer
|
27
|
-
end
|
28
|
-
|
29
|
-
# override
|
30
|
-
def collection_serializer
|
31
|
-
Spree::V2::Storefront::VariantSerializer
|
32
|
-
end
|
33
|
-
|
34
|
-
# override
|
35
|
-
def required_schema
|
36
|
-
SpreeCmCommissioner::VariantRequestSchema
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module SpreeCmCommissioner
|
2
|
-
module Accommodations
|
3
|
-
class Find
|
4
|
-
attr_reader :from_date, :to_date, :state_id, :number_of_guests
|
5
|
-
|
6
|
-
def initialize(from_date:, to_date:, state_id:, number_of_adults:, number_of_kids:)
|
7
|
-
@from_date = from_date
|
8
|
-
@to_date = to_date
|
9
|
-
@state_id = state_id
|
10
|
-
@number_of_guests = number_of_adults.to_i + number_of_kids.to_i
|
11
|
-
end
|
12
|
-
|
13
|
-
def execute
|
14
|
-
scope
|
15
|
-
.where(default_state_id: state_id)
|
16
|
-
.where(inventory_items: { inventory_date: date_range_excluding_checkout })
|
17
|
-
.where('CAST(spree_variants.public_metadata->\'cm_options\'->>\'number-of-adults\' AS INTEGER) +
|
18
|
-
CAST(spree_variants.public_metadata->\'cm_options\'->>\'number-of-kids\' AS INTEGER) >= ?', number_of_guests
|
19
|
-
)
|
20
|
-
.where('inventory_items.quantity_available > 0')
|
21
|
-
.distinct
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def scope
|
27
|
-
Spree::Vendor
|
28
|
-
.joins(variants: :inventory_items)
|
29
|
-
.where(primary_product_type: :accommodation, state: :active)
|
30
|
-
end
|
31
|
-
|
32
|
-
# Why? check_out date is not considered to be charged
|
33
|
-
# For example, if you check in on 2023-10-01 and check out on 2023-10-02,
|
34
|
-
# you will be charged for one night (2023-10-01).
|
35
|
-
def date_range_excluding_checkout
|
36
|
-
from_date..to_date.prev_day
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module SpreeCmCommissioner
|
2
|
-
module Accommodations
|
3
|
-
class FindVariant
|
4
|
-
attr_reader :vendor_id, :from_date, :to_date, :number_of_guests
|
5
|
-
|
6
|
-
def initialize(vendor_id:, from_date:, to_date:, number_of_adults:, number_of_kids:)
|
7
|
-
@vendor_id = vendor_id
|
8
|
-
@from_date = from_date
|
9
|
-
@to_date = to_date
|
10
|
-
@number_of_guests = number_of_adults.to_i + number_of_kids.to_i
|
11
|
-
end
|
12
|
-
|
13
|
-
def execute
|
14
|
-
Spree::Variant
|
15
|
-
.joins(:inventory_items)
|
16
|
-
.where(vendor_id: vendor_id)
|
17
|
-
.where(inventory_items: { inventory_date: date_range_excluding_checkout })
|
18
|
-
.where('CAST(public_metadata->\'cm_options\'->>\'number-of-adults\' AS INTEGER) +
|
19
|
-
CAST(public_metadata->\'cm_options\'->>\'number-of-kids\' AS INTEGER) >= ?', number_of_guests
|
20
|
-
)
|
21
|
-
.where('inventory_items.quantity_available > 0')
|
22
|
-
.distinct
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
# Why? check_out date is not considered to be charged
|
28
|
-
# For example, if you check in on 2023-10-01 and check out on 2023-10-02,
|
29
|
-
# you will be charged for one night (2023-10-01).
|
30
|
-
def date_range_excluding_checkout
|
31
|
-
from_date..to_date.prev_day
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module SpreeCmCommissioner
|
2
|
-
class InventoryItemSyncer < BaseInteractor
|
3
|
-
# inventory_id_and_quantities = [{ inventory_id: inventory_item1.id, quantity: 5 } ]
|
4
|
-
delegate :inventory_id_and_quantities, to: :context
|
5
|
-
|
6
|
-
def call
|
7
|
-
ActiveRecord::Base.transaction do
|
8
|
-
inventory_items.each do |inventory_item|
|
9
|
-
quantity = inventory_id_and_quantities.find { |item| item[:inventory_id] == inventory_item.id }&.dig(:quantity) || 0
|
10
|
-
adjust_quantity_available(inventory_item, quantity)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
def adjust_quantity_available(inventory_item, quantity)
|
18
|
-
inventory_item.update!(quantity_available: inventory_item.quantity_available + quantity)
|
19
|
-
end
|
20
|
-
|
21
|
-
def inventory_items
|
22
|
-
@inventory_items ||= InventoryItem.where(id: inventory_id_and_quantities.pluck(:inventory_id))
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
module SpreeCmCommissioner
|
2
|
-
module Stock
|
3
|
-
class PermanentInventoryItemsGenerator < BaseInteractor
|
4
|
-
delegate :variant_ids, to: :context
|
5
|
-
|
6
|
-
def variants_per_batch = 1000
|
7
|
-
|
8
|
-
def call
|
9
|
-
variants.in_batches(of: variants_per_batch) do |batch|
|
10
|
-
generate_inventory_items_for_batch(batch)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def generate_inventory_items_for_batch(batch)
|
17
|
-
total_on_hand_by_variant = total_on_hand_for(batch)
|
18
|
-
batch.each do |variant|
|
19
|
-
count_on_hand = total_on_hand_by_variant[variant.id] || 0
|
20
|
-
generate_inventory_items_for_variant(variant, count_on_hand)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def generate_inventory_items_for_variant(variant, count_on_hand)
|
25
|
-
inventory_dates_for(variant).each do |inventory_date|
|
26
|
-
next if inventory_exist?(variant, inventory_date)
|
27
|
-
|
28
|
-
create_inventory_item(variant, inventory_date, count_on_hand)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def inventory_dates_for(variant)
|
33
|
-
start_date = Time.zone.tomorrow
|
34
|
-
end_date = Time.zone.today + variant.pre_inventory_days
|
35
|
-
|
36
|
-
(start_date..end_date)
|
37
|
-
end
|
38
|
-
|
39
|
-
def inventory_exist?(variant, inventory_date)
|
40
|
-
variant.inventory_items.exists?(inventory_date: inventory_date)
|
41
|
-
end
|
42
|
-
|
43
|
-
def create_inventory_item(variant, inventory_date, count_on_hand)
|
44
|
-
variant.inventory_items.create!(
|
45
|
-
inventory_date: inventory_date,
|
46
|
-
quantity_available: count_on_hand,
|
47
|
-
max_capacity: count_on_hand,
|
48
|
-
product_type: variant.product_type
|
49
|
-
)
|
50
|
-
end
|
51
|
-
|
52
|
-
# Returns a hash: { variant_id => total_on_hand, ... }
|
53
|
-
def total_on_hand_for(variants)
|
54
|
-
variant_ids = variants.pluck(:id)
|
55
|
-
|
56
|
-
Spree::StockItem
|
57
|
-
.joins(:stock_location)
|
58
|
-
.where(deleted_at: nil, variant_id: variant_ids)
|
59
|
-
.where(spree_stock_locations: { active: true })
|
60
|
-
.group(:variant_id)
|
61
|
-
.sum(:count_on_hand)
|
62
|
-
end
|
63
|
-
|
64
|
-
def variants
|
65
|
-
scope = Spree::Variant.active.with_permanent_stock.where(is_master: false).includes(:product)
|
66
|
-
scope = scope.where(id: variant_ids) if variant_ids.present?
|
67
|
-
scope
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
module SpreeCmCommissioner
|
2
|
-
class Inventory
|
3
|
-
include ActiveModel::Model
|
4
|
-
|
5
|
-
attr_accessor :variant_id, :inventory_date, :quantity_available, :max_capacity, :product_type
|
6
|
-
|
7
|
-
validates :variant_id, presence: true
|
8
|
-
validates :quantity_available, numericality: { only_integer: true, greater_than_or_equal_to: 0 }, allow_nil: true
|
9
|
-
validates :max_capacity, numericality: { only_integer: true, greater_than_or_equal_to: 0 }, allow_nil: true
|
10
|
-
end
|
11
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module SpreeCmCommissioner
|
2
|
-
class InventoryItem < ApplicationRecord
|
3
|
-
include SpreeCmCommissioner::ProductType
|
4
|
-
|
5
|
-
# Association
|
6
|
-
belongs_to :variant, class_name: 'Spree::Variant'
|
7
|
-
|
8
|
-
# Validation
|
9
|
-
validates :quantity_available, numericality: { greater_than_or_equal_to: 0 }
|
10
|
-
validates :max_capacity, numericality: { greater_than_or_equal_to: 0 } # Originally inventory of each variant.
|
11
|
-
validates :inventory_date, presence: true, if: -> { permanent_stock? }
|
12
|
-
validates :variant_id, uniqueness: { scope: :inventory_date, message: -> (object, _data) { "The variant is taken on #{object.inventory_date}" } }
|
13
|
-
|
14
|
-
# Scope
|
15
|
-
scope :for_product, -> (type) { where(product_type: type) }
|
16
|
-
scope :active, -> { where(inventory_date: nil).or(where('inventory_date >= ?', Time.zone.today)) }
|
17
|
-
|
18
|
-
def adjust_quantity!(quantity)
|
19
|
-
with_lock do
|
20
|
-
self.max_capacity = max_capacity + quantity
|
21
|
-
self.quantity_available = quantity_available + quantity
|
22
|
-
|
23
|
-
save!
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def active?
|
28
|
-
inventory_date.nil? || inventory_date >= Time.zone.today
|
29
|
-
end
|
30
|
-
|
31
|
-
def redis_expired_in
|
32
|
-
expired_in = 31_536_000 # 1 year for normal stock
|
33
|
-
expired_in = Time.parse(inventory_date.to_s).end_of_day.to_i - Time.zone.now.to_i if inventory_date.present?
|
34
|
-
[expired_in, 0].max
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module SpreeCmCommissioner
|
2
|
-
module RedisStock
|
3
|
-
class CachedInventoryItemsBuilder
|
4
|
-
attr_reader :inventory_items
|
5
|
-
|
6
|
-
def initialize(inventory_items)
|
7
|
-
@inventory_items = inventory_items
|
8
|
-
end
|
9
|
-
|
10
|
-
# output: [ CachedInventoryItem(...), CachedInventoryItem(...) ]
|
11
|
-
def call
|
12
|
-
keys = inventory_items.map { |item| "inventory:#{item.id}" }
|
13
|
-
return [] unless keys.any?
|
14
|
-
|
15
|
-
counts = SpreeCmCommissioner.redis_pool.with { |redis| redis.mget(*keys) }
|
16
|
-
inventory_items.map.with_index do |inventory_item, i|
|
17
|
-
::SpreeCmCommissioner::CachedInventoryItem.new(
|
18
|
-
inventory_key: keys[i],
|
19
|
-
active: inventory_item.active?,
|
20
|
-
quantity_available: cache_inventory(keys[i], inventory_item, counts[i]),
|
21
|
-
inventory_item_id: inventory_item.id,
|
22
|
-
variant_id: inventory_item.variant_id
|
23
|
-
)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def cache_inventory(key, inventory_item, count_in_redis)
|
30
|
-
return count_in_redis.to_i if count_in_redis.present?
|
31
|
-
|
32
|
-
SpreeCmCommissioner.redis_pool.with do |redis|
|
33
|
-
redis.set(key, inventory_item.quantity_available, ex: inventory_item.redis_expired_in)
|
34
|
-
end
|
35
|
-
|
36
|
-
inventory_item.quantity_available
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|