spree_cm_commissioner 1.18.2.pre.pre1 → 2.0.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/.env.example +0 -3
- data/.github/workflows/test_and_build_gem.yml +16 -2
- data/.gitignore +2 -1
- data/Gemfile.lock +28 -1
- data/Rakefile +33 -4
- data/app/assets/javascripts/spree_cm_commissioner/backend.js +0 -1
- data/app/assets/stylesheets/spree_cm_commissioner/backend/calendar.scss +8 -11
- data/app/assets/stylesheets/spree_cm_commissioner/backend/commissioner_admin.css.scss +0 -1
- data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +1 -2
- data/app/controllers/spree/admin/inventory_items_controller.rb +83 -0
- data/app/controllers/spree/admin/stock_managements_controller.rb +63 -1
- data/app/controllers/spree/admin/tenants_controller.rb +0 -8
- 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/guests_controller.rb +5 -31
- data/app/controllers/spree/api/v2/storefront/queue_cart/line_items_controller.rb +2 -2
- data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +1 -1
- data/app/controllers/spree_cm_commissioner/well_known_controller.rb +17 -31
- data/app/finders/spree_cm_commissioner/accommodations/find.rb +37 -0
- data/app/finders/spree_cm_commissioner/accommodations/find_variant.rb +32 -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_item_resetter.rb +44 -0
- data/app/interactors/spree_cm_commissioner/stock/inventory_items_adjuster.rb +13 -0
- data/app/interactors/spree_cm_commissioner/stock/inventory_items_generator.rb +15 -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 +32 -0
- data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +1 -5
- data/app/jobs/spree_cm_commissioner/application_job.rb +20 -0
- data/app/jobs/spree_cm_commissioner/application_unique_job.rb +20 -0
- 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/inventory_items_generator_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/line_item_durationable.rb +9 -15
- data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -13
- data/app/models/concerns/spree_cm_commissioner/order_seatable.rb +44 -0
- data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +39 -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/concerns/spree_cm_commissioner/taxon_kind.rb +1 -1
- data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +0 -4
- data/app/models/spree_cm_commissioner/block.rb +23 -0
- data/app/models/spree_cm_commissioner/dynamic_field.rb +3 -15
- data/app/models/spree_cm_commissioner/dynamic_field_option.rb +1 -5
- data/app/models/spree_cm_commissioner/guest.rb +19 -1
- data/app/models/spree_cm_commissioner/guest_dynamic_field.rb +3 -21
- data/app/models/spree_cm_commissioner/inventory.rb +11 -0
- data/app/models/spree_cm_commissioner/inventory_item.rb +69 -0
- data/app/models/spree_cm_commissioner/invite_team.rb +1 -3
- data/app/models/spree_cm_commissioner/line_item_decorator.rb +46 -78
- data/app/models/spree_cm_commissioner/notification_taxon.rb +1 -1
- data/app/models/spree_cm_commissioner/option_type_decorator.rb +1 -11
- data/app/models/spree_cm_commissioner/order_decorator.rb +30 -1
- data/app/models/spree_cm_commissioner/pin_code.rb +2 -3
- data/app/models/spree_cm_commissioner/place.rb +1 -3
- data/app/models/spree_cm_commissioner/price_decorator.rb +9 -0
- data/app/models/spree_cm_commissioner/product_decorator.rb +10 -4
- data/app/models/spree_cm_commissioner/redis_stock/cached_inventory_items_builder.rb +41 -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 +25 -0
- data/app/models/spree_cm_commissioner/reserved_block.rb +30 -0
- data/app/models/spree_cm_commissioner/seat_layout.rb +20 -0
- data/app/models/spree_cm_commissioner/seat_section.rb +16 -0
- data/app/models/spree_cm_commissioner/seats/blocks_canceler.rb +30 -0
- data/app/models/spree_cm_commissioner/seats/blocks_holder.rb +53 -0
- data/app/models/spree_cm_commissioner/seats/blocks_reserver.rb +49 -0
- data/app/models/spree_cm_commissioner/seats/errors/blocks_are_on_hold_by_other_guest.rb +4 -0
- data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_other_guest.rb +4 -0
- data/app/models/spree_cm_commissioner/seats/errors/blocks_are_reserved_by_same_guest.rb +4 -0
- data/app/models/spree_cm_commissioner/seats/errors/unable_to_save_reserved_block_record.rb +4 -0
- data/app/models/spree_cm_commissioner/service_calendar.rb +0 -2
- data/app/models/spree_cm_commissioner/state_decorator.rb +0 -1
- data/app/models/spree_cm_commissioner/stock/availability_checker.rb +26 -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 +17 -0
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -2
- data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +0 -6
- data/app/models/spree_cm_commissioner/trip.rb +20 -6
- data/app/models/spree_cm_commissioner/trip_connection.rb +5 -5
- data/app/models/spree_cm_commissioner/trip_stop.rb +2 -3
- data/app/models/spree_cm_commissioner/user_taxon.rb +0 -1
- data/app/models/spree_cm_commissioner/variant_block.rb +9 -0
- data/app/models/spree_cm_commissioner/variant_decorator.rb +36 -47
- data/app/models/spree_cm_commissioner/variant_options.rb +0 -23
- data/app/models/spree_cm_commissioner/vehicle.rb +9 -14
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +7 -10
- data/app/models/spree_cm_commissioner/vendor_place.rb +6 -5
- data/app/models/spree_cm_commissioner/vendor_stop.rb +1 -2
- data/app/overrides/spree/admin/variants/_form/kyc_field.html.erb.deface +2 -2
- data/app/queries/spree_cm_commissioner/guest_searcher_query.rb +3 -45
- data/app/queries/spree_cm_commissioner/trip_query.rb +23 -26
- 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/storefront/line_item_serializer_decorator.rb +1 -0
- data/app/serializers/spree_cm_commissioner/v2/operator/dashboard_crew_event_serializer.rb +1 -4
- data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_option_serializer.rb +3 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/dynamic_field_serializer.rb +3 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/guest_dynamic_field_serializer.rb +1 -2
- data/app/services/spree_cm_commissioner/organizer/export_guest_csv_service.rb +15 -23
- data/app/views/spree/admin/inventory_items/show.html.erb +72 -0
- data/app/views/spree/admin/stock_managements/_variant_stock_items.html.erb +7 -2
- data/app/views/spree/admin/stock_managements/calendar.html.erb +56 -0
- data/app/views/spree/admin/stock_managements/index.html.erb +55 -6
- data/app/views/spree/admin/tenants/_form.html.erb +42 -109
- data/config/initializers/paper_trail.rb +1 -0
- data/config/initializers/spree_permitted_attributes.rb +5 -2
- data/config/locales/en.yml +0 -5
- data/config/routes.rb +22 -4
- data/db/migrate/20240202080634_update_counter_cache_of_vehicle_type.rb +3 -1
- data/db/migrate/20250304293518_create_cm_inventory_items.rb +21 -0
- data/db/migrate/20250429094228_add_lock_version_to_cm_inventory_items.rb +5 -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/20250603035256_add_inventory_item_to_spree_prices.rb +7 -0
- data/db/migrate/20250619073724_drop_table_cm_line_item_seats.rb +5 -0
- data/db/migrate/20250619073812_drop_table_cm_vehicle_seats.rb +5 -0
- data/db/migrate/20250619073844_drop_table_cm_vehicle_types.rb +9 -0
- data/db/migrate/20250619073957_drop_table_cm_option_value_vehicle_types.rb +5 -0
- data/db/migrate/20250619082354_remove_unnecessary_fields_from_cm_places.rb +9 -0
- data/db/migrate/20250619082736_remove_route_type_from_spree_products.rb +5 -0
- data/db/migrate/20250619083055_remove_unnecessary_fields_from_spree_taxons.rb +5 -0
- data/db/migrate/20250620083055_remove_variant_id_from_cm_trips.rb +5 -0
- data/db/migrate/20250620090000_update_cm_trip_connections_to_use_cm_trips.rb +6 -0
- data/db/migrate/20250620090001_create_cm_seat_layouts.rb +17 -0
- data/db/migrate/20250620090002_create_cm_seat_sections.rb +18 -0
- data/db/migrate/20250620090003_create_cm_blocks.rb +18 -0
- data/db/migrate/20250624091005_create_cm_reserved_blocks.rb +29 -0
- data/db/migrate/20250626083642_create_cm_variant_blocks.rb +24 -0
- data/db/migrate/20250627023314_add_block_id_to_cm_guests.rb +13 -0
- data/docker-compose.yml +1 -1
- data/lib/cm_app_logger.rb +11 -4
- data/lib/generators/spree_cm_commissioner/install/install_generator.rb +14 -11
- 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/block_factory.rb +9 -0
- data/lib/spree_cm_commissioner/test_helper/factories/guest_factory.rb +10 -0
- 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/option_type_factory.rb +6 -30
- data/lib/spree_cm_commissioner/test_helper/factories/order_factory.rb +0 -36
- data/lib/spree_cm_commissioner/test_helper/factories/product_factory.rb +18 -34
- data/lib/spree_cm_commissioner/test_helper/factories/reserved_block_factory.rb +27 -0
- data/lib/spree_cm_commissioner/test_helper/factories/seat_layout_factory.rb +8 -0
- data/lib/spree_cm_commissioner/test_helper/factories/seat_section_factory.rb +8 -0
- data/lib/spree_cm_commissioner/test_helper/factories/stock_location_factory.rb +2 -2
- data/lib/spree_cm_commissioner/test_helper/factories/trip_connection_factory.rb +6 -0
- data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +10 -3
- data/lib/spree_cm_commissioner/test_helper/factories/variant_block_factory.rb +7 -0
- data/lib/spree_cm_commissioner/test_helper/factories/variant_factory.rb +41 -19
- data/lib/spree_cm_commissioner/test_helper/factories/vehicle_factory.rb +1 -1
- 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 +35 -1
- 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/spree_cm_commissioner.gemspec +7 -0
- metadata +131 -43
- data/app/assets/images/cm-hangmeas-checkout_image.svg +0 -63
- data/app/assets/images/cm-hangmeas-failed.svg +0 -56
- data/app/assets/images/cm-hangmeas-loader.svg +0 -50
- data/app/assets/images/cm-hangmeas-success.svg +0 -51
- data/app/assets/javascripts/spree_cm_commissioner/tenant_payment_icon_fields.js +0 -65
- data/app/assets/stylesheets/spree_cm_commissioner/backend/tenant_payment_icon_fields.scss +0 -60
- data/app/controllers/concerns/spree_cm_commissioner/transit/taxon_bitwise.rb +0 -44
- data/app/finders/spree_cm_commissioner/line_items/find_by_variant_decorator.rb +0 -20
- data/app/interactors/spree_cm_commissioner/apple_app_site_association_fetcher.rb +0 -27
- data/app/interactors/spree_cm_commissioner/asset_links_fetcher.rb +0 -27
- data/app/interactors/spree_cm_commissioner/telegram_chats_auto_finder.rb +0 -144
- data/app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb +0 -30
- data/app/models/spree_cm_commissioner/branch.rb +0 -12
- data/app/models/spree_cm_commissioner/line_item_seat.rb +0 -10
- data/app/models/spree_cm_commissioner/option_value_vehicle_type.rb +0 -8
- data/app/models/spree_cm_commissioner/pin_code_telegram.rb +0 -28
- data/app/models/spree_cm_commissioner/promotion_category_decorator.rb +0 -11
- data/app/models/spree_cm_commissioner/stop.rb +0 -23
- data/app/models/spree_cm_commissioner/telegram_chat.rb +0 -6
- data/app/models/spree_cm_commissioner/vehicle_seat.rb +0 -11
- data/app/models/spree_cm_commissioner/vehicle_type.rb +0 -76
- data/app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface +0 -18
- data/app/queries/spree_cm_commissioner/trip_search_query.rb +0 -76
- 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
- data/app/services/spree_cm_commissioner/vehicle_option_value_creator.rb +0 -11
- data/db/migrate/20250616084219_add_description_to_cm_vendor_place.rb +0 -5
- data/db/migrate/20250630103536_create_cm_telegram_chats.rb +0 -13
- data/db/migrate/20250701093203_add_configurations_to_cm_dynamic_field.rb +0 -6
- data/db/migrate/20250702091305_add_dynamic_field_option_to_guest_dynamic_field.rb +0 -5
- data/db/migrate/20250702091935_add_status_to_dynamic_field_option.rb +0 -5
- data/db/migrate/20250707032008_add_vendor_id_to_spree_category.rb +0 -7
- data/lib/spree_cm_commissioner/test_helper/factories/branch_factory.rb +0 -12
- data/lib/spree_cm_commissioner/test_helper/factories/departure_time_option_type_factory.rb +0 -8
- data/lib/spree_cm_commissioner/test_helper/factories/duration_option_type_factory.rb +0 -8
- data/lib/spree_cm_commissioner/test_helper/factories/line_item_seat_factory.rb +0 -7
- data/lib/spree_cm_commissioner/test_helper/factories/stop_factory.rb +0 -14
- data/lib/spree_cm_commissioner/test_helper/factories/transit_place_factory.rb +0 -8
- data/lib/spree_cm_commissioner/test_helper/factories/vehicle_option_type_factory.rb +0 -8
- data/lib/spree_cm_commissioner/test_helper/factories/vehicle_type_factory.rb +0 -96
- data/lib/spree_cm_commissioner/trip_seat_layout_result.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c84700dfc0c91553426b4c3957ab2e2906f4327f9b968efe1d88ce590d69a63
|
4
|
+
data.tar.gz: c98479e1dd2ff5f4def2b7799ff2ffc894812dd737e52a6e2488839318ca514b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddc75d3e7e17ad18de9c620336c8233191f268bd2c18911455b6169f4a6a379b2d8d537e1a7cc6c2d8f280842772b787d19d3215263cf3a6856309f263712512
|
7
|
+
data.tar.gz: 551e01c90befa48ad8fa44adc40e9be2af4bda32319f05e562d66d099a0d729477f9ade32aee9c9256728481756e35ccec863782d033962756daba9720e868e8
|
data/.env.example
CHANGED
@@ -10,6 +10,7 @@ on:
|
|
10
10
|
- reopened
|
11
11
|
branches:
|
12
12
|
- develop
|
13
|
+
- milestone-77-scalable-design
|
13
14
|
push:
|
14
15
|
tags:
|
15
16
|
- "*"
|
@@ -37,7 +38,8 @@ jobs:
|
|
37
38
|
console.log("PR title format is correct.");
|
38
39
|
}
|
39
40
|
- name: Check commit messages format
|
40
|
-
if
|
41
|
+
# skip validation if the PR is from the milestone-77-scalable-design branch for temporary
|
42
|
+
if: github.event_name == 'pull_request' && github.head_ref != 'milestone-77-scalable-design'
|
41
43
|
uses: actions/github-script@v7
|
42
44
|
with:
|
43
45
|
script: |
|
@@ -136,6 +138,17 @@ jobs:
|
|
136
138
|
--health-timeout 5s
|
137
139
|
--health-retries 5
|
138
140
|
|
141
|
+
redis:
|
142
|
+
image: redis
|
143
|
+
# Set health checks to wait until redis has started
|
144
|
+
options: >-
|
145
|
+
--health-cmd "redis-cli ping"
|
146
|
+
--health-interval 10s
|
147
|
+
--health-timeout 5s
|
148
|
+
--health-retries 5
|
149
|
+
ports:
|
150
|
+
- 6379:6379 # Maps port 6379 on service container to the host
|
151
|
+
|
139
152
|
steps:
|
140
153
|
- uses: actions/checkout@v3
|
141
154
|
|
@@ -171,8 +184,9 @@ jobs:
|
|
171
184
|
- name: Run test
|
172
185
|
env:
|
173
186
|
DATABASE_URL: postgres://myuser:mypassword@localhost:5432/test_db
|
187
|
+
REDIS_URL: redis://localhost:6379/0
|
174
188
|
|
175
|
-
if: github.event_name == 'pull_request'
|
189
|
+
if: github.event_name == 'pull_request'
|
176
190
|
run: |
|
177
191
|
bundle exec rake
|
178
192
|
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -34,7 +34,7 @@ GIT
|
|
34
34
|
PATH
|
35
35
|
remote: .
|
36
36
|
specs:
|
37
|
-
spree_cm_commissioner (
|
37
|
+
spree_cm_commissioner (2.0.0.pre.pre)
|
38
38
|
activerecord-multi-tenant
|
39
39
|
activerecord_json_validator (~> 2.1, >= 2.1.3)
|
40
40
|
aws-sdk-cloudfront
|
@@ -42,6 +42,7 @@ PATH
|
|
42
42
|
aws-sdk-s3
|
43
43
|
blazer (~> 3.0.4)
|
44
44
|
byebug
|
45
|
+
connection_pool
|
45
46
|
counter_culture (~> 3.2)
|
46
47
|
dry-validation (~> 1.10)
|
47
48
|
elasticsearch (~> 8.5)
|
@@ -54,9 +55,12 @@ PATH
|
|
54
55
|
interactor (~> 3.1)
|
55
56
|
jwt (>= 2.5.0)
|
56
57
|
noticed (~> 1.6)
|
58
|
+
paper_trail (~> 16.0)
|
57
59
|
phonelib
|
58
60
|
premailer-rails
|
59
61
|
rails (~> 7.0.4)
|
62
|
+
redis
|
63
|
+
redis-rails
|
60
64
|
rqrcode (~> 2.0)
|
61
65
|
searchkick (~> 5.1)
|
62
66
|
simple_calendar (~> 2.4)
|
@@ -584,6 +588,9 @@ GEM
|
|
584
588
|
sawyer (~> 0.9)
|
585
589
|
orm_adapter (0.5.0)
|
586
590
|
os (1.1.4)
|
591
|
+
paper_trail (16.0.0)
|
592
|
+
activerecord (>= 6.1)
|
593
|
+
request_store (~> 1.4)
|
587
594
|
parallel (1.23.0)
|
588
595
|
paranoia (2.6.3)
|
589
596
|
activerecord (>= 5.1, < 7.2)
|
@@ -619,6 +626,8 @@ GEM
|
|
619
626
|
activesupport (>= 2.3.14)
|
620
627
|
racc (1.7.1)
|
621
628
|
rack (2.2.8)
|
629
|
+
rack-session (1.0.2)
|
630
|
+
rack (< 3)
|
622
631
|
rack-test (2.1.0)
|
623
632
|
rack (>= 1.3)
|
624
633
|
rails (7.0.8)
|
@@ -662,13 +671,31 @@ GEM
|
|
662
671
|
rbtree (0.4.6)
|
663
672
|
redis (5.0.7)
|
664
673
|
redis-client (>= 0.9.0)
|
674
|
+
redis-actionpack (5.5.0)
|
675
|
+
actionpack (>= 5)
|
676
|
+
redis-rack (>= 2.1.0, < 4)
|
677
|
+
redis-store (>= 1.1.0, < 2)
|
678
|
+
redis-activesupport (5.3.0)
|
679
|
+
activesupport (>= 3, < 8)
|
680
|
+
redis-store (>= 1.3, < 2)
|
665
681
|
redis-client (0.17.0)
|
666
682
|
connection_pool
|
683
|
+
redis-rack (3.0.0)
|
684
|
+
rack-session (>= 0.2.0)
|
685
|
+
redis-store (>= 1.2, < 2)
|
686
|
+
redis-rails (5.0.2)
|
687
|
+
redis-actionpack (>= 5.0, < 6)
|
688
|
+
redis-activesupport (>= 5.0, < 6)
|
689
|
+
redis-store (>= 1.2, < 2)
|
690
|
+
redis-store (1.11.0)
|
691
|
+
redis (>= 4, < 6)
|
667
692
|
regexp_parser (2.8.2)
|
668
693
|
representable (3.2.0)
|
669
694
|
declarative (< 0.1.0)
|
670
695
|
trailblazer-option (>= 0.1.1, < 0.2.0)
|
671
696
|
uber (< 0.2.0)
|
697
|
+
request_store (1.7.0)
|
698
|
+
rack (>= 1.4)
|
672
699
|
responders (3.1.1)
|
673
700
|
actionpack (>= 5.2)
|
674
701
|
railties (>= 5.2)
|
data/Rakefile
CHANGED
@@ -2,7 +2,7 @@ require 'bundler'
|
|
2
2
|
Bundler::GemHelper.install_tasks
|
3
3
|
|
4
4
|
require 'rspec/core/rake_task'
|
5
|
-
require 'spree/testing_support/
|
5
|
+
require 'spree/testing_support/common_rake'
|
6
6
|
|
7
7
|
RSpec::Core::RakeTask.new
|
8
8
|
|
@@ -14,8 +14,37 @@ task :default do
|
|
14
14
|
Rake::Task[:spec].invoke
|
15
15
|
end
|
16
16
|
|
17
|
+
# Copied from:
|
18
|
+
# spree_core:lib/spree/testing_support/common_rake.rb
|
19
|
+
# But refactored to skip frontend & backend setup.
|
17
20
|
desc 'Generates a dummy app for testing'
|
18
|
-
task :test_app do
|
19
|
-
|
20
|
-
|
21
|
+
task :test_app do |_t, args|
|
22
|
+
require 'spree_cm_commissioner'
|
23
|
+
require "generators/spree_cm_commissioner/install/install_generator"
|
24
|
+
|
25
|
+
Rails.env = ENV['RAILS_ENV'] = 'test'
|
26
|
+
|
27
|
+
Spree::DummyGeneratorHelper.inject_extension_requirements = true
|
28
|
+
Spree::DummyGenerator.start ["--lib_name=spree_cm_commissioner", '--quiet']
|
29
|
+
Spree::InstallGenerator.start [
|
30
|
+
"--lib_name=spree_cm_commissioner",
|
31
|
+
'--auto-accept',
|
32
|
+
'--migrate=false',
|
33
|
+
'--seed=false',
|
34
|
+
'--sample=false',
|
35
|
+
'--quiet',
|
36
|
+
'--copy_storefront=false',
|
37
|
+
"--install_storefront=false",
|
38
|
+
"--install_admin=false",
|
39
|
+
"--user_class=Spree::User"
|
40
|
+
]
|
41
|
+
|
42
|
+
puts 'Setting up dummy database...'
|
43
|
+
system('bin/rails db:environment:set RAILS_ENV=test')
|
44
|
+
system('bundle exec rake db:drop db:create')
|
45
|
+
Spree::DummyModelGenerator.start
|
46
|
+
system('bundle exec rake db:migrate')
|
47
|
+
|
48
|
+
puts 'Running extension installation generator...'
|
49
|
+
SpreeCmCommissioner::Generators::InstallGenerator.start(['--auto-run-migrations'])
|
21
50
|
end
|
@@ -55,8 +55,9 @@ $day-background: theme-color("light");
|
|
55
55
|
}
|
56
56
|
}
|
57
57
|
|
58
|
-
|
59
|
-
|
58
|
+
.wday-0 {
|
59
|
+
background-color: darken($day-background, 5%);
|
60
|
+
}
|
60
61
|
|
61
62
|
// .wday-1 {
|
62
63
|
// }
|
@@ -73,8 +74,9 @@ $day-background: theme-color("light");
|
|
73
74
|
// .wday-5 {
|
74
75
|
// }
|
75
76
|
|
76
|
-
|
77
|
-
|
77
|
+
.wday-6 {
|
78
|
+
background-color: darken($day-background, 5%);
|
79
|
+
}
|
78
80
|
|
79
81
|
// .today {
|
80
82
|
// }
|
@@ -86,9 +88,7 @@ $day-background: theme-color("light");
|
|
86
88
|
// }
|
87
89
|
|
88
90
|
// known as active-date
|
89
|
-
.start-date {
|
90
|
-
background-color: darken($day-background, 5%);
|
91
|
-
}
|
91
|
+
// .start-date {}
|
92
92
|
|
93
93
|
// .prev-month {
|
94
94
|
// }
|
@@ -159,11 +159,8 @@ $day-background: theme-color("light");
|
|
159
159
|
|
160
160
|
// .current-month {}
|
161
161
|
.has-events {
|
162
|
-
background-color: lighten(theme-color("warning"), 30%);
|
163
|
-
color: darken(theme-color("warning"), 50%);
|
164
|
-
|
165
162
|
@include hover {
|
166
|
-
background-color:
|
163
|
+
background-color: rgba($dark, 0.1);
|
167
164
|
}
|
168
165
|
}
|
169
166
|
|
@@ -6,9 +6,8 @@ module SpreeCmCommissioner
|
|
6
6
|
after_action :set_cache_control_for_cdn
|
7
7
|
end
|
8
8
|
|
9
|
-
# Override This Method based on your UseCase
|
10
9
|
def max_age
|
11
|
-
ENV.fetch('CONTENT_CACHE_MAX_AGE',
|
10
|
+
ENV.fetch('CONTENT_CACHE_MAX_AGE', '180')
|
12
11
|
end
|
13
12
|
|
14
13
|
def set_cache_control_for_cdn
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
class InventoryItemsController < StockManagementsController
|
4
|
+
before_action :load_parent
|
5
|
+
|
6
|
+
# GET /products/:slug/variants/:variant_id/inventory_items/:id
|
7
|
+
def show
|
8
|
+
@inventory_item = @product.inventory_items.find(params[:id])
|
9
|
+
@default_prices = @inventory_item.variant.prices.to_a.index_by(&:currency)
|
10
|
+
|
11
|
+
@prices = @inventory_item.prices.to_a
|
12
|
+
supported_currencies_for_all_stores.each do |currency|
|
13
|
+
@prices << @inventory_item.prices.new(currency: currency) if @prices.none? { |price| price.currency == currency }
|
14
|
+
end
|
15
|
+
|
16
|
+
@cached_inventory_item = ::SpreeCmCommissioner::RedisStock::CachedInventoryItemsBuilder.new([@inventory_item])
|
17
|
+
.call
|
18
|
+
.index_by(&:inventory_item_id)[@inventory_item.id]
|
19
|
+
end
|
20
|
+
|
21
|
+
# POST /products/:slug/variants/:variant_id/inventory_items
|
22
|
+
def create
|
23
|
+
variant = @product.variants.find(params[:variant_id])
|
24
|
+
inventory_item = variant.create_default_non_permanent_inventory_item!
|
25
|
+
|
26
|
+
if inventory_item.present?
|
27
|
+
result = SpreeCmCommissioner::Stock::InventoryItemResetter.call(inventory_item: inventory_item)
|
28
|
+
|
29
|
+
if result.success?
|
30
|
+
flash[:success] = flash_message_for(result.inventory_item, :successfully_created)
|
31
|
+
else
|
32
|
+
flash[:error] = result.message
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
redirect_back fallback_location: admin_product_stock_managements_path(@product)
|
37
|
+
end
|
38
|
+
|
39
|
+
# PATCH /products/:slug/variants/:variant_id/inventory_items/:id/reset
|
40
|
+
def reset
|
41
|
+
inventory_item = @product.inventory_items.find(params[:id])
|
42
|
+
result = SpreeCmCommissioner::Stock::InventoryItemResetter.call(inventory_item: inventory_item)
|
43
|
+
|
44
|
+
if result.success?
|
45
|
+
flash[:success] = flash_message_for(result.inventory_item, :successfully_updated)
|
46
|
+
else
|
47
|
+
flash[:error] = result.message
|
48
|
+
end
|
49
|
+
|
50
|
+
redirect_back fallback_location: admin_product_stock_managements_path(@product)
|
51
|
+
end
|
52
|
+
|
53
|
+
# PATCH /products/:slug/variants/:variant_id/inventory_items/:id/update_prices
|
54
|
+
def update_prices
|
55
|
+
inventory_item = @product.inventory_items.find(params[:id])
|
56
|
+
|
57
|
+
params[:prices]&.values&.each do |price_params|
|
58
|
+
price = inventory_item.prices.find_or_initialize_by(currency: price_params[:currency])
|
59
|
+
price.price = price_params[:price].empty? ? nil : price_params[:price]
|
60
|
+
price.compare_at_price = price_params[:compare_at_price].empty? ? nil : price_params[:compare_at_price]
|
61
|
+
price.variant_id = inventory_item.variant_id
|
62
|
+
price.save! if (price.new_record? && price.price) || (!price.new_record? && price.changed?)
|
63
|
+
end
|
64
|
+
|
65
|
+
flash[:success] = flash_message_for(inventory_item, :successfully_updated)
|
66
|
+
redirect_back fallback_location: admin_product_stock_managements_path(@product)
|
67
|
+
end
|
68
|
+
|
69
|
+
# PATCH /products/:slug/variants/:variant_id/inventory_items/:id/delete_prices
|
70
|
+
def delete_prices
|
71
|
+
inventory_item = @product.inventory_items.find(params[:id])
|
72
|
+
|
73
|
+
if inventory_item.prices.destroy_all
|
74
|
+
flash[:success] = flash_message_for(inventory_item, :successfully_removed)
|
75
|
+
else
|
76
|
+
flash[:error] = inventory_item.errors.full_messages.join(', ')
|
77
|
+
end
|
78
|
+
|
79
|
+
redirect_back fallback_location: admin_product_stock_managements_path(@product)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -5,6 +5,8 @@ module Spree
|
|
5
5
|
|
6
6
|
before_action :load_parent
|
7
7
|
|
8
|
+
helper_method :inventory_item_message
|
9
|
+
|
8
10
|
def load_parent
|
9
11
|
@product = Spree::Product.find_by(slug: params[:product_id])
|
10
12
|
end
|
@@ -12,9 +14,59 @@ module Spree
|
|
12
14
|
def index
|
13
15
|
@variants = @product.variants.includes(:images, stock_items: :stock_location, option_values: :option_type)
|
14
16
|
@variants = [@product.master] if @variants.empty?
|
15
|
-
|
16
17
|
@stock_locations = (@variants.flat_map(&:stock_locations) + @product.vendor.stock_locations).uniq
|
17
18
|
|
19
|
+
load_inventories unless @product.permanent_stock?
|
20
|
+
end
|
21
|
+
|
22
|
+
def create
|
23
|
+
result = SpreeCmCommissioner::Stock::StockMovementCreator.call(
|
24
|
+
variant_id: params[:variant_id],
|
25
|
+
stock_location_id: params[:stock_location_id],
|
26
|
+
current_store: current_store,
|
27
|
+
stock_movement_params: stock_movement_params
|
28
|
+
)
|
29
|
+
|
30
|
+
if result.success?
|
31
|
+
flash[:success] = flash_message_for(result.stock_movement, :successfully_created)
|
32
|
+
else
|
33
|
+
flash[:error] = result.message
|
34
|
+
end
|
35
|
+
|
36
|
+
redirect_back fallback_location: admin_product_stock_managements_path(@product)
|
37
|
+
end
|
38
|
+
|
39
|
+
# GET /products/:slug/stock_managements/calendar?year=
|
40
|
+
def calendar
|
41
|
+
@year = params[:year].present? ? params[:year].to_i : Time.zone.today.year
|
42
|
+
|
43
|
+
from_date = Date.new(@year, 1, 1).beginning_of_year
|
44
|
+
to_date = Date.new(@year, 1, 1).end_of_year
|
45
|
+
|
46
|
+
@inventory_items = @product.inventory_items.includes(:variant, :prices).where(inventory_date: from_date..to_date).to_a
|
47
|
+
@cached_inventory_items = ::SpreeCmCommissioner::RedisStock::CachedInventoryItemsBuilder.new(@inventory_items)
|
48
|
+
.call
|
49
|
+
.index_by(&:inventory_item_id)
|
50
|
+
@events = SpreeCmCommissioner::CalendarEvent.from_inventory_items(@inventory_items)
|
51
|
+
end
|
52
|
+
|
53
|
+
def inventory_item_message(inventory_item, cached_inventory_item)
|
54
|
+
synced = inventory_item.quantity_available == cached_inventory_item.quantity_available
|
55
|
+
|
56
|
+
if synced
|
57
|
+
"Synced: Quantity available matches in both DB and Redis (#{cached_inventory_item.quantity_available})."
|
58
|
+
else
|
59
|
+
"Out of sync: Redis shows #{cached_inventory_item.quantity_available} available, which doesn't match the database."
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def load_inventories
|
66
|
+
@inventory_items = @product.inventory_items.group_by { |item| item.variant.id }
|
67
|
+
@cached_inventory_items = ::SpreeCmCommissioner::RedisStock::CachedInventoryItemsBuilder.new(@product.inventory_items)
|
68
|
+
.call
|
69
|
+
.index_by(&:inventory_item_id)
|
18
70
|
@reserved_stocks = Spree::LineItem
|
19
71
|
.complete
|
20
72
|
.where(variant_id: @variants.pluck(:id))
|
@@ -25,6 +77,16 @@ module Spree
|
|
25
77
|
def model_class
|
26
78
|
Spree::StockItem
|
27
79
|
end
|
80
|
+
|
81
|
+
# This method processes the parameters for stock movement creation.
|
82
|
+
# Expected attributes for `stock_movement` include:
|
83
|
+
# - :quantity (Integer): The quantity of stock to move.
|
84
|
+
# - :action (String): The type of stock movement (e.g., "add" or "remove").
|
85
|
+
# - :originator_id, :originator_ty (String, optional): The ID and type of the entity creating the stock movement.
|
86
|
+
# Ensure that `permitted_stock_movement_attributes` is updated to reflect any changes.
|
87
|
+
def stock_movement_params
|
88
|
+
params.require(:stock_movement).permit(permitted_stock_movement_attributes)
|
89
|
+
end
|
28
90
|
end
|
29
91
|
end
|
30
92
|
end
|
@@ -1,8 +1,6 @@
|
|
1
1
|
module Spree
|
2
2
|
module Admin
|
3
3
|
class TenantsController < Spree::Admin::ResourceController
|
4
|
-
before_action :load_vector_icons, only: %i[new edit]
|
5
|
-
|
6
4
|
# override
|
7
5
|
def collection
|
8
6
|
params[:q] = {} if params[:q].blank?
|
@@ -33,12 +31,6 @@ module Spree
|
|
33
31
|
def collection_url(options = {})
|
34
32
|
admin_tenants_url(options)
|
35
33
|
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def load_vector_icons
|
40
|
-
@vector_icons = SpreeCmCommissioner::VectorIcon.all
|
41
|
-
end
|
42
34
|
end
|
43
35
|
end
|
44
36
|
end
|
@@ -0,0 +1,42 @@
|
|
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[:adult].to_i,
|
15
|
+
number_of_kids: params[:children].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
|
@@ -5,55 +5,38 @@ module Spree
|
|
5
5
|
class AccommodationsController < ::Spree::Api::V2::ResourceController
|
6
6
|
private
|
7
7
|
|
8
|
+
# override
|
8
9
|
def collection
|
9
|
-
@collection ||=
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
@paginated_collection = apply_service_availability(@paginated_collection)
|
10
|
+
@collection ||= SpreeCmCommissioner::Accommodations::Find.new(
|
11
|
+
from_date: params[:from_date]&.to_date,
|
12
|
+
to_date: params[:to_date]&.to_date,
|
13
|
+
state_id: params[:province_id],
|
14
|
+
number_of_adults: params[:adult].to_i,
|
15
|
+
number_of_kids: params[:children].to_i
|
16
|
+
).execute
|
17
17
|
end
|
18
18
|
|
19
|
+
# override
|
19
20
|
def resource
|
20
|
-
resource
|
21
|
-
raise ActiveRecord::RecordNotFound if resource.nil?
|
22
|
-
|
23
|
-
apply_service_availability(resource)
|
24
|
-
end
|
25
|
-
|
26
|
-
def apply_service_availability(resource)
|
27
|
-
SpreeCmCommissioner::ApplyServiceAvailability.call(calendarable: resource,
|
28
|
-
from_date: params[:from_date].to_date,
|
29
|
-
to_date: params[:to_date].to_date
|
30
|
-
).value
|
21
|
+
@resource ||= collection.find_by!(slug: params[:id])
|
31
22
|
end
|
32
23
|
|
24
|
+
# override
|
33
25
|
def allowed_sort_attributes
|
34
26
|
super << :min_price << :max_price
|
35
27
|
end
|
36
28
|
|
37
|
-
|
38
|
-
Spree::Vendor
|
39
|
-
end
|
40
|
-
|
29
|
+
# override
|
41
30
|
def resource_serializer
|
42
31
|
Spree::V2::Storefront::AccommodationSerializer
|
43
32
|
end
|
44
33
|
|
34
|
+
# override
|
45
35
|
def collection_serializer
|
46
36
|
Spree::V2::Storefront::AccommodationSerializer
|
47
37
|
end
|
48
38
|
|
49
|
-
|
50
|
-
SpreeCmCommissioner::AccommodationSearchDetail
|
51
|
-
end
|
52
|
-
|
53
|
-
def resource_finder
|
54
|
-
SpreeCmCommissioner::AccommodationSearchDetail
|
55
|
-
end
|
56
|
-
|
39
|
+
# override
|
57
40
|
def required_schema
|
58
41
|
SpreeCmCommissioner::AccommodationRequestSchema
|
59
42
|
end
|
@@ -38,25 +38,10 @@ module Spree
|
|
38
38
|
def update
|
39
39
|
spree_authorize! :update, spree_current_order, order_token
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
guest_params[:guest_dynamic_fields_attributes].each do |attr|
|
46
|
-
field = build_dynamic_field(attr)
|
47
|
-
field.save!
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
resource.assign_attributes(guest_params.except(:guest_dynamic_fields_attributes))
|
52
|
-
|
53
|
-
if resource.save
|
54
|
-
render_serialized_payload { serialize_resource(resource) }
|
55
|
-
else
|
56
|
-
render_error_payload(resource.errors, 400)
|
57
|
-
end
|
58
|
-
rescue ActiveRecord::RecordInvalid => e
|
59
|
-
render_error_payload(e.record.errors, 400)
|
41
|
+
if resource.update(guest_params)
|
42
|
+
render_serialized_payload { serialize_resource(resource) }
|
43
|
+
else
|
44
|
+
render_error_payload(resource, 400)
|
60
45
|
end
|
61
46
|
end
|
62
47
|
|
@@ -91,20 +76,9 @@ module Spree
|
|
91
76
|
:upload_later,
|
92
77
|
:country_code,
|
93
78
|
:contact,
|
94
|
-
guest_dynamic_fields_attributes: %i[id dynamic_field_id
|
79
|
+
guest_dynamic_fields_attributes: %i[id dynamic_field_id value _destroy]
|
95
80
|
)
|
96
81
|
end
|
97
|
-
|
98
|
-
def build_dynamic_field(attr)
|
99
|
-
field = resource.guest_dynamic_fields.build(attr.except(:id))
|
100
|
-
|
101
|
-
if field.dynamic_field.requires_dynamic_field_options?
|
102
|
-
option = field.dynamic_field.dynamic_field_options.find_by(id: field.value)
|
103
|
-
field.dynamic_field_option = option if option
|
104
|
-
end
|
105
|
-
|
106
|
-
field
|
107
|
-
end
|
108
82
|
end
|
109
83
|
end
|
110
84
|
end
|
@@ -12,9 +12,9 @@ module Spree
|
|
12
12
|
spree_authorize! :update, spree_current_order, order_token
|
13
13
|
spree_authorize! :show, @variant
|
14
14
|
|
15
|
-
availability_checker = SpreeCmCommissioner::Stock::AvailabilityChecker.new(@variant)
|
15
|
+
availability_checker = SpreeCmCommissioner::Stock::AvailabilityChecker.new(@variant, add_item_params[:options])
|
16
16
|
|
17
|
-
unless availability_checker.can_supply?(add_item_params[:quantity].to_i
|
17
|
+
unless availability_checker.can_supply?(add_item_params[:quantity].to_i)
|
18
18
|
return render_error_payload(availability_checker.error_message || I18n.t('variant_availability.items_out_of_stock'))
|
19
19
|
end
|
20
20
|
|
@@ -37,7 +37,7 @@ module SpreeCmCommissioner
|
|
37
37
|
bit_fields = SpreeCmCommissioner::KycBitwise::BIT_FIELDS.keys
|
38
38
|
|
39
39
|
if permitted_resource_params[:use_product_kyc] == '1'
|
40
|
-
permitted_resource_params[:kyc] =
|
40
|
+
permitted_resource_params[:kyc] = @product.kyc
|
41
41
|
else
|
42
42
|
@kyc_result = calculate_kyc_value(params[:variant])
|
43
43
|
permitted_resource_params[:kyc] = @kyc_result
|