spree_cm_commissioner 2.8.3.pre.pre4 → 2.8.3
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 +1 -0
- data/.gitignore +0 -4
- data/Gemfile.lock +1 -1
- data/app/controllers/concerns/spree_cm_commissioner/content_cachable.rb +0 -2
- data/app/controllers/spree/admin/homepage_section_controller.rb +1 -4
- data/app/controllers/spree/admin/taxons_controller_decorator.rb +0 -19
- data/app/controllers/spree/api/v2/storefront/homepage_sections_controller.rb +0 -1
- data/app/controllers/spree/api/v2/storefront/trip_search_controller.rb +6 -4
- data/app/controllers/spree/api/v2/tenant/base_controller.rb +0 -4
- data/app/controllers/spree/api/v2/tenant/homepage_sections_controller.rb +0 -1
- data/app/controllers/spree/api/v2/tenant/products_controller.rb +1 -1
- data/app/controllers/spree/api/v2/tenant/taxons_controller.rb +1 -1
- data/app/controllers/spree_cm_commissioner/admin/products_controller_decorator.rb +0 -19
- data/app/factory/spree_cm_commissioner/event_telegram_message_factory.rb +68 -0
- data/app/factory/spree_cm_commissioner/order_telegram_message_factory.rb +31 -17
- data/app/factory/spree_cm_commissioner/telegram_message_factory.rb +6 -0
- data/app/finders/spree_cm_commissioner/events/find_matches.rb +0 -1
- data/app/helpers/spree_cm_commissioner/admin/homepage_segment_helper.rb +0 -2
- data/app/interactors/spree_cm_commissioner/invalidate_cache_request.rb +5 -1
- data/app/jobs/spree_cm_commissioner/event_creation_telegram_alert_sender_job.rb +10 -0
- data/app/jobs/spree_cm_commissioner/invalidate_cache_request_job.rb +4 -1
- data/app/jobs/spree_cm_commissioner/inventory_items/bulk_adjust_quantities_job.rb +4 -2
- data/app/jobs/spree_cm_commissioner/inventory_items/bulk_adjust_quantities_on_hold_job.rb +4 -2
- data/app/jobs/spree_cm_commissioner/oauth_access_tokens/cleanup_expired_job.rb +11 -0
- data/app/jobs/spree_cm_commissioner/route_metrics/decrease_trip_count_job.rb +8 -2
- data/app/jobs/spree_cm_commissioner/route_metrics/increase_trip_count_job.rb +5 -2
- data/app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb +1 -2
- data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +8 -0
- data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +1 -2
- data/app/models/concerns/spree_cm_commissioner/order_state_machine.rb +0 -10
- data/app/models/concerns/spree_cm_commissioner/product_type.rb +1 -1
- data/app/models/concerns/spree_cm_commissioner/service_origin.rb +22 -0
- data/app/models/concerns/spree_cm_commissioner/store_preference.rb +1 -0
- data/app/models/concerns/spree_cm_commissioner/taxon_kind.rb +1 -3
- data/app/models/spree_cm_commissioner/import.rb +1 -1
- data/app/models/spree_cm_commissioner/inventory_item.rb +17 -2
- data/app/models/spree_cm_commissioner/maintenance_tasks/cache_invalidation.rb +2 -0
- data/app/models/spree_cm_commissioner/order_decorator.rb +1 -0
- data/app/models/spree_cm_commissioner/product_decorator.rb +0 -50
- data/app/models/spree_cm_commissioner/role_decorator.rb +1 -4
- data/app/models/spree_cm_commissioner/route.rb +6 -1
- data/app/models/spree_cm_commissioner/stock_item_decorator.rb +0 -3
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +7 -18
- data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +1 -19
- data/app/models/spree_cm_commissioner/tenant.rb +0 -9
- data/app/models/spree_cm_commissioner/trip.rb +15 -2
- data/app/models/spree_cm_commissioner/user_decorator.rb +0 -5
- data/app/models/spree_cm_commissioner/variant_options.rb +0 -4
- data/app/models/spree_cm_commissioner/vendor_decorator.rb +0 -4
- data/app/overrides/spree/admin/stores/_form/store_preferences.html.erb.deface +9 -0
- data/app/queries/spree_cm_commissioner/multi_leg_trips_query.rb +48 -44
- data/app/queries/spree_cm_commissioner/single_leg_trips_query.rb +36 -31
- data/app/queries/spree_cm_commissioner/trip_query.rb +2 -4
- data/app/serializers/spree/v2/storefront/homepage_section_serializer.rb +1 -1
- data/app/serializers/spree/v2/storefront/product_serializer_decorator.rb +1 -1
- data/app/serializers/spree/v2/storefront/role_serializer.rb +1 -1
- data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +1 -2
- data/app/serializers/spree/v2/tenant/homepage_section_serializer.rb +1 -1
- data/app/serializers/spree/v2/tenant/role_serializer.rb +1 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/amenity_serializer.rb +3 -0
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_query_result_serializer.rb +1 -1
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_result_serializer.rb +8 -3
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vehicle_type_serializer.rb +6 -3
- data/app/serializers/spree_cm_commissioner/v2/storefront/trip_vendor_serializer.rb +6 -2
- data/app/services/spree_cm_commissioner/api_caches/invalidate.rb +0 -12
- data/app/services/spree_cm_commissioner/inventory_holds/acquire.rb +3 -0
- data/app/services/spree_cm_commissioner/inventory_holds/convert.rb +7 -2
- data/app/services/spree_cm_commissioner/inventory_holds/release.rb +7 -2
- data/app/services/spree_cm_commissioner/inventory_items/bulk_adjust_quantities.rb +36 -4
- data/app/services/spree_cm_commissioner/inventory_items/bulk_adjust_quantities_on_hold.rb +39 -4
- data/app/services/spree_cm_commissioner/inventory_items/bulk_generate_permanent_items.rb +4 -6
- data/app/services/spree_cm_commissioner/oauth_access_tokens/cleanup_expired.rb +59 -0
- data/app/services/spree_cm_commissioner/pricing_models/preview.rb +15 -6
- data/app/services/spree_cm_commissioner/redis_stock/base.rb +2 -1
- data/app/services/spree_cm_commissioner/route_metrics/decrease_trip_count.rb +3 -15
- data/app/services/spree_cm_commissioner/route_metrics/increase_trip_count.rb +7 -15
- data/app/services/spree_cm_commissioner/routes/create.rb +0 -5
- data/app/services/spree_cm_commissioner/telegram_alerts/event_creation.rb +35 -0
- data/app/services/spree_cm_commissioner/transit_order/create.rb +8 -2
- data/app/services/spree_cm_commissioner/trips/create_multi_leg.rb +5 -16
- data/app/services/spree_cm_commissioner/trips/create_single_leg.rb +0 -1
- data/app/views/spree/admin/homepage_section/_form.html.erb +0 -5
- data/app/views/spree/admin/line_items/_form.html.erb +2 -3
- data/config/initializers/spree_permitted_attributes.rb +1 -8
- data/config/locales/en.yml +0 -36
- data/config/locales/km.yml +0 -18
- data/config/routes.rb +0 -27
- data/lib/spree_cm_commissioner/trip_query_result.rb +25 -1
- data/lib/spree_cm_commissioner/trip_result.rb +48 -21
- data/lib/spree_cm_commissioner/version.rb +1 -1
- data/lib/spree_cm_commissioner.rb +1 -7
- data/spree_cm_commissioner.gemspec +1 -1
- metadata +10 -130
- data/app/controllers/spree/api/v2/storefront/preview_products_controller.rb +0 -48
- data/app/controllers/spree/api/v2/storefront/preview_sections_controller.rb +0 -27
- data/app/controllers/spree/api/v2/storefront/preview_taxons_controller.rb +0 -18
- data/app/controllers/spree/api/v2/storefront/products_controller_decorator.rb +0 -15
- data/app/controllers/spree/api/v2/storefront/taxons_controller_decorator.rb +0 -15
- data/app/controllers/spree/api/v2/tenant/advertisements_controller.rb +0 -24
- data/app/controllers/spree/api/v2/tenant/free_vote_claims_controller.rb +0 -37
- data/app/controllers/spree/api/v2/tenant/preview_products_controller.rb +0 -47
- data/app/controllers/spree/api/v2/tenant/preview_sections_controller.rb +0 -26
- data/app/controllers/spree/api/v2/tenant/preview_shows_controller.rb +0 -19
- data/app/controllers/spree/api/v2/tenant/preview_taxons_controller.rb +0 -19
- data/app/controllers/spree/api/v2/tenant/show_contestants_controller.rb +0 -52
- data/app/controllers/spree/api/v2/tenant/show_elimination_sessions_controller.rb +0 -57
- data/app/controllers/spree/api/v2/tenant/show_people_controller.rb +0 -49
- data/app/controllers/spree/api/v2/tenant/show_person_assignments_controller.rb +0 -36
- data/app/controllers/spree/api/v2/tenant/shows_controller.rb +0 -34
- data/app/controllers/spree/api/v2/tenant/votes_controller.rb +0 -94
- data/app/controllers/spree/api/v2/tenant/voting_contestants_controller.rb +0 -40
- data/app/controllers/spree/api/v2/tenant/voting_credit_transactions_controller.rb +0 -41
- data/app/controllers/spree/api/v2/tenant/voting_credits_controller.rb +0 -31
- data/app/jobs/spree_cm_commissioner/cleanup_expired_access_tokens_job.rb +0 -9
- data/app/jobs/spree_cm_commissioner/show_contestants/import_job.rb +0 -9
- data/app/jobs/spree_cm_commissioner/vote_fraud_event_job.rb +0 -9
- data/app/jobs/spree_cm_commissioner/voting_credit_allocation_job.rb +0 -10
- data/app/jobs/spree_cm_commissioner/voting_credit_de_allocation_job.rb +0 -10
- data/app/models/concerns/spree_cm_commissioner/voting_session_live_stream_concern.rb +0 -41
- data/app/models/spree_cm_commissioner/imports/import_contestant.rb +0 -7
- data/app/models/spree_cm_commissioner/maintenance_tasks/voting_session.rb +0 -36
- data/app/models/spree_cm_commissioner/preview_role.rb +0 -8
- data/app/models/spree_cm_commissioner/role_user_decorator.rb +0 -8
- data/app/models/spree_cm_commissioner/show.rb +0 -163
- data/app/models/spree_cm_commissioner/show_contestant.rb +0 -39
- data/app/models/spree_cm_commissioner/show_contestant_image.rb +0 -11
- data/app/models/spree_cm_commissioner/show_contestant_video.rb +0 -15
- data/app/models/spree_cm_commissioner/show_episode.rb +0 -110
- data/app/models/spree_cm_commissioner/show_person.rb +0 -15
- data/app/models/spree_cm_commissioner/show_person_assignment.rb +0 -20
- data/app/models/spree_cm_commissioner/show_person_image.rb +0 -11
- data/app/models/spree_cm_commissioner/vote.rb +0 -16
- data/app/models/spree_cm_commissioner/vote_fraud_event.rb +0 -20
- data/app/models/spree_cm_commissioner/voting_contestant.rb +0 -61
- data/app/models/spree_cm_commissioner/voting_credit.rb +0 -72
- data/app/models/spree_cm_commissioner/voting_credit_transaction.rb +0 -55
- data/app/models/spree_cm_commissioner/voting_session.rb +0 -215
- data/app/models/spree_cm_commissioner/voting_session_stat.rb +0 -8
- data/app/overrides/spree/admin/products/_form/preview_checkbox.html.erb.deface +0 -9
- data/app/overrides/spree/admin/taxons/_form/preview_checkbox.html.erb.deface +0 -7
- data/app/overrides/spree/layouts/admin/map_head.html.erb.deface +0 -2
- data/app/serializers/spree/v2/tenant/advertisement_serializer.rb +0 -11
- data/app/serializers/spree/v2/tenant/campaign_serializer.rb +0 -13
- data/app/serializers/spree/v2/tenant/show_contestant_serializer.rb +0 -21
- data/app/serializers/spree/v2/tenant/show_episode_serializer.rb +0 -17
- data/app/serializers/spree/v2/tenant/show_person_assignment_serializer.rb +0 -16
- data/app/serializers/spree/v2/tenant/show_person_serializer.rb +0 -13
- data/app/serializers/spree/v2/tenant/show_serializer.rb +0 -19
- data/app/serializers/spree/v2/tenant/video_serializer.rb +0 -9
- data/app/serializers/spree/v2/tenant/vote_serializer.rb +0 -14
- data/app/serializers/spree/v2/tenant/voting_contestant_serializer.rb +0 -22
- data/app/serializers/spree/v2/tenant/voting_credit_serializer.rb +0 -10
- data/app/serializers/spree/v2/tenant/voting_credit_transaction_serializer.rb +0 -14
- data/app/serializers/spree/v2/tenant/voting_session_serializer.rb +0 -19
- data/app/services/spree_cm_commissioner/advertisements/weight_validator.rb +0 -43
- data/app/services/spree_cm_commissioner/cleanup_expired_access_tokens.rb +0 -52
- data/app/services/spree_cm_commissioner/fraud_check.rb +0 -299
- data/app/services/spree_cm_commissioner/imports/contestants/create.rb +0 -153
- data/app/services/spree_cm_commissioner/show_contestants/normalize_video_highlights.rb +0 -57
- data/app/services/spree_cm_commissioner/url_embed/youtube_embed.rb +0 -44
- data/app/services/spree_cm_commissioner/vote_counters/audit_counters.rb +0 -43
- data/app/services/spree_cm_commissioner/vote_counters/base.rb +0 -31
- data/app/services/spree_cm_commissioner/vote_counters/increment.rb +0 -44
- data/app/services/spree_cm_commissioner/vote_counters/per_contestant_counter.rb +0 -68
- data/app/services/spree_cm_commissioner/vote_counters/rebuild_from_db.rb +0 -70
- data/app/services/spree_cm_commissioner/vote_counters/snapshot_to_db.rb +0 -113
- data/app/services/spree_cm_commissioner/vote_credit_deductor.rb +0 -68
- data/app/services/spree_cm_commissioner/vote_package/create.rb +0 -145
- data/app/services/spree_cm_commissioner/vote_package/update.rb +0 -91
- data/app/services/spree_cm_commissioner/vote_processor.rb +0 -144
- data/app/services/spree_cm_commissioner/voting_contestants/advancer.rb +0 -334
- data/app/services/spree_cm_commissioner/voting_contestants/assigner.rb +0 -32
- data/app/services/spree_cm_commissioner/voting_contestants/bulk_updater.rb +0 -106
- data/app/services/spree_cm_commissioner/voting_credits/allocate.rb +0 -77
- data/app/services/spree_cm_commissioner/voting_credits/claim_free_votes.rb +0 -119
- data/app/services/spree_cm_commissioner/voting_credits/credit_calculator.rb +0 -35
- data/app/services/spree_cm_commissioner/voting_credits/de_allocate.rb +0 -87
- data/app/services/spree_cm_commissioner/voting_leaderboards/calculate_score.rb +0 -67
- data/app/services/spree_cm_commissioner/voting_leaderboards/combined_result.rb +0 -183
- data/app/services/spree_cm_commissioner/voting_sessions/finalize.rb +0 -66
- data/db/migrate/20260309230148_create_cm_show_people.rb +0 -14
- data/db/migrate/20260309230149_create_cm_show_people_assignments.rb +0 -16
- data/db/migrate/20260310082711_create_cm_show_contestants.rb +0 -28
- data/db/migrate/20260310082720_create_cm_voting_sessions.rb +0 -21
- data/db/migrate/20260310082721_create_cm_voting_contestants.rb +0 -23
- data/db/migrate/20260310082734_add_voting_fields_to_spree_taxons.rb +0 -9
- data/db/migrate/20260310082735_add_type_to_spree_products.rb +0 -6
- data/db/migrate/20260310082749_create_cm_voting_credits.rb +0 -27
- data/db/migrate/20260326080200_create_cm_voting_credit_transactions.rb +0 -27
- data/db/migrate/20260330160000_create_cm_votes.rb +0 -25
- data/db/migrate/20260401072500_add_advanced_from_to_cm_voting_contestants.rb +0 -7
- data/db/migrate/20260402000001_add_voting_credit_scope_to_spree_taxons.rb +0 -6
- data/db/migrate/20260402000002_rename_scopeable_to_votable_in_cm_voting_credits.rb +0 -12
- data/db/migrate/20260403070000_add_name_to_cm_voting_sessions.rb +0 -5
- data/db/migrate/20260406000001_add_vendor_id_to_voting_tables.rb +0 -6
- data/db/migrate/20260406000001_rename_votes_remaining_to_amount_in_cm_voting_credits.rb +0 -11
- data/db/migrate/20260408085255_add_show_id_and_vendor_id_to_cm_voting_sessions.rb +0 -9
- data/db/migrate/20260420000001_rename_type_to_credit_type_in_cm_voting_credits.rb +0 -25
- data/db/migrate/20260422000001_create_cm_vote_fraud_events.rb +0 -23
- data/db/migrate/20260423000001_add_preview_to_taxons_products_and_sections.rb +0 -11
- data/db/migrate/20260423000002_create_preview_roles.rb +0 -24
- data/db/migrate/20260515120000_add_public_metadata_to_cm_voting_sessions.rb +0 -5
- data/db/migrate/20260518090920_add_unique_voter_count_to_voting_contestants.rb +0 -5
- data/db/migrate/20260518094322_create_cm_voting_session_stats.rb +0 -17
- data/db/migrate/20260520000001_add_scoring_model_to_cm_voting_sessions.rb +0 -5
- data/db/migrate/20260520000001_optimize_cm_votes_indexes.rb +0 -22
- data/db/migrate/20260525042257_add_vote_number_to_cm_voting_contestants.rb +0 -18
- data/db/migrate/20260527035430_add_confirmed_rank_to_cm_voting_contestants.rb +0 -5
- data/db/migrate/20260527062005_add_eliminated_at_to_cm_show_contestants.rb +0 -5
- data/db/migrate/20260603063652_add_parent_to_voting_sessions.rb +0 -9
- data/db/migrate/20260603090000_add_session_type_to_cm_voting_sessions.rb +0 -6
- data/docs/sql/jsonb_query_guide.md +0 -57
- data/lib/spree_cm_commissioner/test_helper/factories/show_episode_factory.rb +0 -12
- data/lib/spree_cm_commissioner/test_helper/factories/show_factory.rb +0 -120
- data/lib/spree_cm_commissioner/test_helper/factories/vote_credit_factory.rb +0 -37
- data/lib/spree_cm_commissioner/test_helper/factories/vote_factory.rb +0 -28
- data/lib/spree_cm_commissioner/test_helper/factories/voting_credit_transaction_factory.rb +0 -11
- data/lib/spree_cm_commissioner/test_helper/factories/voting_session_factory.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: 0774f6d0c4fad7ae396f14326fd6d0965164b74d89f355c3966bc8d1fd9563f9
|
|
4
|
+
data.tar.gz: 002d84c9f1273b54f01d5a25bdecc5f3b475a12e07b32d8e1846c19107fe776f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 260d54db1f9dd63dbfef02edf2944d02e2c582972b8903815462e438be9cbfb6f5561a7b4a4b64c2cda4af18908c8c7a91958213c06764d1f7ee4d8e2c16dec3
|
|
7
|
+
data.tar.gz: 003d6ecd547b0215851266f06e823f2f7c5e7a8da35f5b4a8051784855a4d095d088b79f700dcadca8820d561d7a9989a3ee0d9eb7940943c3c5777cc7a4742c
|
data/.env.example
CHANGED
|
@@ -34,6 +34,7 @@ DISTANCE_SIGNING_KEY=hei********************VY
|
|
|
34
34
|
|
|
35
35
|
# Cache durations (in seconds) for different content types
|
|
36
36
|
# See: app/controllers/concerns/spree_cm_commissioner/content_cachable.rb
|
|
37
|
+
CACHE_AUTO_INVALIDATION_DISABLED="" # Set to yes to disable CDN cache invalidation entirely (kill switch)
|
|
37
38
|
CACHE_CDN_MAX_AGE=86400 # CDN/server-side cache duration for all responses
|
|
38
39
|
CACHE_STATIC_MAX_AGE=86400 # Static content (countries, provinces, seat layouts, CMS pages) - 1 day
|
|
39
40
|
CACHE_SEMI_STATIC_MAX_AGE=3600 # Semi-static content (menus, homepage backgrounds, routes) - 1 hour
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -16,7 +16,6 @@ module SpreeCmCommissioner
|
|
|
16
16
|
GuestCardClassesController
|
|
17
17
|
SeatLayoutController
|
|
18
18
|
CmsPagesController
|
|
19
|
-
AdvertisementsController
|
|
20
19
|
].freeze
|
|
21
20
|
|
|
22
21
|
# Priority 2: Semi-Static (1 hour)
|
|
@@ -26,7 +25,6 @@ module SpreeCmCommissioner
|
|
|
26
25
|
HomepageDataController
|
|
27
26
|
PopularRoutesController
|
|
28
27
|
RoutePlacesController
|
|
29
|
-
ShowsController
|
|
30
28
|
].freeze
|
|
31
29
|
|
|
32
30
|
# Priority 3: Moderate Freshness (30 minutes)
|
|
@@ -51,10 +51,7 @@ module Spree
|
|
|
51
51
|
def permitted_resource_params
|
|
52
52
|
segment_value = helpers.calculate_segment_value(params[:spree_cm_commissioner_homepage_section])
|
|
53
53
|
|
|
54
|
-
params
|
|
55
|
-
.require(:spree_cm_commissioner_homepage_section)
|
|
56
|
-
.permit(:title, :description, :active, :tenant_id, :preview)
|
|
57
|
-
.merge(segment: segment_value)
|
|
54
|
+
params.require(:spree_cm_commissioner_homepage_section).permit(:title, :description, :active, :tenant_id).merge(segment: segment_value)
|
|
58
55
|
end
|
|
59
56
|
|
|
60
57
|
def load_tenants
|
|
@@ -3,7 +3,6 @@ module Spree
|
|
|
3
3
|
module TaxonsControllerDecorator
|
|
4
4
|
def self.prepended(base)
|
|
5
5
|
base.before_action :build_assets, only: %i[create update]
|
|
6
|
-
base.before_action :normalize_sti_taxon_params, only: %i[create update]
|
|
7
6
|
end
|
|
8
7
|
|
|
9
8
|
# override
|
|
@@ -51,24 +50,6 @@ module Spree
|
|
|
51
50
|
@taxon.build_home_banner(attachment: permitted_resource_params.delete(:home_banner)) if permitted_resource_params[:home_banner]
|
|
52
51
|
@taxon.build_video_banner(attachment: permitted_resource_params.delete(:video_banner)) if permitted_resource_params[:video_banner]
|
|
53
52
|
end
|
|
54
|
-
|
|
55
|
-
# Some admin forms submit STI records under their class key
|
|
56
|
-
# (e.g. :spree_cm_commissioner_show) while Spree update reads :taxon.
|
|
57
|
-
# Merge both into :taxon so all edited fields are persisted.
|
|
58
|
-
def normalize_sti_taxon_params
|
|
59
|
-
return unless @taxon
|
|
60
|
-
|
|
61
|
-
sti_key = @taxon.class.model_name.param_key.to_sym
|
|
62
|
-
sti_params = params[sti_key]
|
|
63
|
-
return unless sti_params.is_a?(::ActionController::Parameters)
|
|
64
|
-
|
|
65
|
-
base_params = params[:taxon]
|
|
66
|
-
base_hash = base_params.is_a?(::ActionController::Parameters) ? base_params.to_unsafe_h : {}
|
|
67
|
-
sti_hash = sti_params.to_unsafe_h
|
|
68
|
-
merged_params = ::ActionController::Parameters.new(base_hash.merge(sti_hash))
|
|
69
|
-
|
|
70
|
-
params[:taxon] = merged_params
|
|
71
|
-
end
|
|
72
53
|
end
|
|
73
54
|
end
|
|
74
55
|
end
|
|
@@ -39,7 +39,6 @@ module Spree
|
|
|
39
39
|
params[:date],
|
|
40
40
|
params[:route_type],
|
|
41
41
|
params[:vendor_id],
|
|
42
|
-
params[:featured],
|
|
43
42
|
params[:number_of_guests],
|
|
44
43
|
resource_includes&.sort&.join(','),
|
|
45
44
|
sparse_fields&.sort&.join(','),
|
|
@@ -65,8 +64,7 @@ module Spree
|
|
|
65
64
|
'trips.vendor',
|
|
66
65
|
'trips.vendor.logo',
|
|
67
66
|
'trips.vehicle_type',
|
|
68
|
-
'trips.vehicle_type.vehicle_photos'
|
|
69
|
-
'trips.amenities'
|
|
67
|
+
'trips.vehicle_type.vehicle_photos'
|
|
70
68
|
]
|
|
71
69
|
end
|
|
72
70
|
|
|
@@ -100,7 +98,11 @@ module Spree
|
|
|
100
98
|
|
|
101
99
|
# override
|
|
102
100
|
def serializer_params
|
|
103
|
-
|
|
101
|
+
super.merge(
|
|
102
|
+
exclude_vendor_kind_option_types: true,
|
|
103
|
+
exclude_vendor_kind_option_values: true,
|
|
104
|
+
exclude_vehicle_type_amenities: true
|
|
105
|
+
)
|
|
104
106
|
end
|
|
105
107
|
|
|
106
108
|
# override
|
|
@@ -6,7 +6,6 @@ module SpreeCmCommissioner
|
|
|
6
6
|
base.around_action :set_writing_role, only: %i[index]
|
|
7
7
|
base.after_action :set_tenant_after_update, only: %i[update]
|
|
8
8
|
base.before_action :merge_industry_taxons_into_taxons, only: [:update]
|
|
9
|
-
base.before_action :normalize_sti_product_params, only: %i[create update]
|
|
10
9
|
end
|
|
11
10
|
|
|
12
11
|
# Override
|
|
@@ -52,24 +51,6 @@ module SpreeCmCommissioner
|
|
|
52
51
|
|
|
53
52
|
protected
|
|
54
53
|
|
|
55
|
-
# Some admin forms submit STI records under their class key while
|
|
56
|
-
# Spree update reads :product. Merge both into :product so all edited
|
|
57
|
-
# fields are persisted for STI product subclasses.
|
|
58
|
-
def normalize_sti_product_params
|
|
59
|
-
return unless @product
|
|
60
|
-
|
|
61
|
-
sti_key = @product.class.model_name.param_key.to_sym
|
|
62
|
-
sti_params = params[sti_key]
|
|
63
|
-
return unless sti_params.is_a?(::ActionController::Parameters)
|
|
64
|
-
|
|
65
|
-
base_params = params[:product]
|
|
66
|
-
base_hash = base_params.is_a?(::ActionController::Parameters) ? base_params.to_unsafe_h : {}
|
|
67
|
-
sti_hash = sti_params.to_unsafe_h
|
|
68
|
-
merged_params = ::ActionController::Parameters.new(base_hash.merge(sti_hash))
|
|
69
|
-
|
|
70
|
-
params[:product] = merged_params
|
|
71
|
-
end
|
|
72
|
-
|
|
73
54
|
def merge_industry_taxons_into_taxons
|
|
74
55
|
return if params[:product].blank?
|
|
75
56
|
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# 🎉 ---[Event]---
|
|
2
|
+
#
|
|
3
|
+
# 📋 Event: {{event.name}}
|
|
4
|
+
#
|
|
5
|
+
# 👤 Organizer: {{vendor.name}}
|
|
6
|
+
#
|
|
7
|
+
# 🗓️ Start Date: {{from_date}}
|
|
8
|
+
# 🗓️ End Date: {{to_date}}
|
|
9
|
+
# 🔗 URL: ......
|
|
10
|
+
#
|
|
11
|
+
module SpreeCmCommissioner
|
|
12
|
+
class EventTelegramMessageFactory < TelegramMessageFactory
|
|
13
|
+
attr_reader :event
|
|
14
|
+
|
|
15
|
+
def initialize(event:)
|
|
16
|
+
@event = event
|
|
17
|
+
|
|
18
|
+
title = "✨ #{event.name} ✨"
|
|
19
|
+
|
|
20
|
+
super(title: title)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def body
|
|
24
|
+
[
|
|
25
|
+
event_name_line,
|
|
26
|
+
organizer_line,
|
|
27
|
+
[start_date_line, end_date_line].compact.join("\n"),
|
|
28
|
+
event_url_line
|
|
29
|
+
].compact_blank.join("\n\n")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def event_name_line
|
|
35
|
+
"📋 Event: #{event.name}" if event.name.present?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def organizer_line
|
|
39
|
+
return if event.vendor&.name.blank?
|
|
40
|
+
|
|
41
|
+
"👤 Organizer: #{bold(event.vendor.name)}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def start_date_line
|
|
45
|
+
return if event.from_date.blank?
|
|
46
|
+
|
|
47
|
+
"🗓️ Start Date: #{pretty_datetime(event.from_date)}"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def end_date_line
|
|
51
|
+
return if event.to_date.blank?
|
|
52
|
+
|
|
53
|
+
"🗓️ End Date: #{pretty_datetime(event.to_date)}"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def pretty_datetime(date)
|
|
57
|
+
return '' if date.blank?
|
|
58
|
+
|
|
59
|
+
date.strftime('%b %d, %Y · %H:%M')
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def event_url_line
|
|
63
|
+
return if event.event_url.blank?
|
|
64
|
+
|
|
65
|
+
"🔗 URL: #{event.event_url}"
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -48,7 +48,7 @@ module SpreeCmCommissioner
|
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
def line_item_content(line_item)
|
|
51
|
-
return
|
|
51
|
+
return transit_line_item_content(line_item) if line_item.transit?
|
|
52
52
|
|
|
53
53
|
text = []
|
|
54
54
|
|
|
@@ -64,8 +64,8 @@ module SpreeCmCommissioner
|
|
|
64
64
|
def pretty_date_for(line_item)
|
|
65
65
|
return nil unless line_item.date_present?
|
|
66
66
|
|
|
67
|
-
from_date =
|
|
68
|
-
to_date =
|
|
67
|
+
from_date = pretty_datetime(line_item.from_date)
|
|
68
|
+
to_date = pretty_datetime(line_item.to_date)
|
|
69
69
|
|
|
70
70
|
if from_date == to_date
|
|
71
71
|
"🗓️ #{from_date}"
|
|
@@ -84,7 +84,7 @@ module SpreeCmCommissioner
|
|
|
84
84
|
text << "Email: #{inline_code(order.email)}" if order.email.present?
|
|
85
85
|
text << "Delivery Address: #{formatted_shipping_address.presence || 'N/A'}" if order.delivery_required?
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
append_transit_footer(text) if transit_order?
|
|
88
88
|
|
|
89
89
|
if show_details_link && order.guests.any?
|
|
90
90
|
text << ''
|
|
@@ -132,12 +132,12 @@ module SpreeCmCommissioner
|
|
|
132
132
|
|
|
133
133
|
private
|
|
134
134
|
|
|
135
|
-
def
|
|
136
|
-
|
|
135
|
+
def transit_order?
|
|
136
|
+
selected_line_items.any?(&:transit?)
|
|
137
137
|
end
|
|
138
138
|
|
|
139
139
|
def intercity_taxi_order?
|
|
140
|
-
selected_line_items.any? { |li|
|
|
140
|
+
selected_line_items.any? { |li| trip_for(li)&.intercity_taxi? }
|
|
141
141
|
end
|
|
142
142
|
|
|
143
143
|
def trip_for(line_item)
|
|
@@ -147,10 +147,10 @@ module SpreeCmCommissioner
|
|
|
147
147
|
@trip_cache[line_item.trip_id] ||= SpreeCmCommissioner::Trip.find_by(id: line_item.trip_id)
|
|
148
148
|
end
|
|
149
149
|
|
|
150
|
-
def
|
|
150
|
+
def transit_line_item_content(line_item)
|
|
151
151
|
text = []
|
|
152
|
-
route_text =
|
|
153
|
-
departure_text =
|
|
152
|
+
route_text = transit_route_text(line_item)
|
|
153
|
+
departure_text = transit_departure_text(line_item)
|
|
154
154
|
text << bold('🚗 Trip Details')
|
|
155
155
|
text << "Route: #{route_text}" if route_text.present?
|
|
156
156
|
text << "Passengers: #{line_item.passenger_count || line_item.quantity}"
|
|
@@ -159,7 +159,7 @@ module SpreeCmCommissioner
|
|
|
159
159
|
text.compact.join("\n")
|
|
160
160
|
end
|
|
161
161
|
|
|
162
|
-
def
|
|
162
|
+
def transit_route_text(line_item)
|
|
163
163
|
trip = trip_for(line_item)
|
|
164
164
|
return line_item.product.name if trip.blank?
|
|
165
165
|
|
|
@@ -171,21 +171,35 @@ module SpreeCmCommissioner
|
|
|
171
171
|
vehicle.present? ? "#{parts} (#{vehicle})" : parts
|
|
172
172
|
end
|
|
173
173
|
|
|
174
|
-
def
|
|
174
|
+
def transit_departure_text(line_item)
|
|
175
175
|
return nil unless line_item.date_present?
|
|
176
176
|
|
|
177
177
|
line_item.from_date.strftime('%b %d, %Y · %H:%M')
|
|
178
178
|
end
|
|
179
179
|
|
|
180
180
|
def nationality_text
|
|
181
|
-
|
|
182
|
-
|
|
181
|
+
grouped = order.saved_guests.group_by { |sg| sg.nationality_group&.humanize }
|
|
182
|
+
grouped.delete(nil)
|
|
183
|
+
return nil if grouped.empty?
|
|
183
184
|
|
|
184
|
-
|
|
185
|
+
grouped.map { |nationality_group, guests| customer_type_summary(nationality_group, guests) }.join(', ')
|
|
185
186
|
end
|
|
186
187
|
|
|
187
|
-
|
|
188
|
-
|
|
188
|
+
# e.g. "Local (Adult x1, Child x1)". age_group is NOT NULL, so it is always present.
|
|
189
|
+
def customer_type_summary(nationality_group, guests)
|
|
190
|
+
age_breakdown = guests
|
|
191
|
+
.group_by { |sg| sg.age_group.humanize }
|
|
192
|
+
.map { |age_group, age_guests| "#{age_group} x#{age_guests.count}" }
|
|
193
|
+
.join(', ')
|
|
194
|
+
|
|
195
|
+
"#{nationality_group} (#{age_breakdown})"
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def append_transit_footer(text)
|
|
199
|
+
nationality = nationality_text
|
|
200
|
+
text << "Nationality: #{nationality}" if nationality.present?
|
|
201
|
+
|
|
202
|
+
return unless intercity_taxi_order?
|
|
189
203
|
|
|
190
204
|
pickup = selected_line_items.filter_map(&:pickup_map_place).first
|
|
191
205
|
dropoff = selected_line_items.filter_map(&:dropoff_map_place).first
|
|
@@ -19,13 +19,17 @@ module SpreeCmCommissioner
|
|
|
19
19
|
context.response = client.create_invalidation(
|
|
20
20
|
distribution_id: ENV.fetch('ASSETS_SYNC_CF_DIST_ID'),
|
|
21
21
|
invalidation_batch: {
|
|
22
|
-
|
|
22
|
+
# Must be globally unique per distribution,
|
|
23
|
+
# Time.now.to_i collides when multiple jobs fire in the same second.
|
|
24
|
+
caller_reference: SecureRandom.uuid,
|
|
23
25
|
paths: {
|
|
24
26
|
quantity: patterns.size,
|
|
25
27
|
items: patterns
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
30
|
)
|
|
31
|
+
rescue Aws::CloudFront::Errors::TooManyInvalidationsInProgress => e
|
|
32
|
+
context.fail!(message: "Too many invalidations in progress: #{e}")
|
|
29
33
|
end
|
|
30
34
|
end
|
|
31
35
|
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
class EventCreationTelegramAlertSenderJob < ApplicationUniqueJob
|
|
3
|
+
queue_as :telegram_bot
|
|
4
|
+
|
|
5
|
+
def perform(options = {})
|
|
6
|
+
event = Spree::Taxon.find(options[:event_id])
|
|
7
|
+
SpreeCmCommissioner::TelegramAlerts::EventCreation.call(event: event)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
module SpreeCmCommissioner
|
|
2
2
|
class InvalidateCacheRequestJob < ApplicationUniqueJob
|
|
3
|
+
queue_as :cache_invalidation
|
|
4
|
+
|
|
3
5
|
def perform(options = {})
|
|
4
|
-
SpreeCmCommissioner::InvalidateCacheRequest.call(patterns: options[:patterns])
|
|
6
|
+
result = SpreeCmCommissioner::InvalidateCacheRequest.call(patterns: options[:patterns])
|
|
7
|
+
raise result.error if result.failure?
|
|
5
8
|
end
|
|
6
9
|
end
|
|
7
10
|
end
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
module SpreeCmCommissioner
|
|
2
2
|
module InventoryItems
|
|
3
3
|
class BulkAdjustQuantitiesJob < ApplicationUniqueJob
|
|
4
|
-
# :line_item_ids, :inventory_id_and_quantities
|
|
4
|
+
# :line_item_ids, :inventory_id_and_quantities, :caller_source
|
|
5
5
|
#
|
|
6
6
|
# :line_item_ids is included for unique job key generation to prevent duplicate jobs,
|
|
7
7
|
# though it's not used in the perform method implementation.
|
|
8
|
+
# :caller_source is a string like "ClassName#method" identifying who enqueued the job.
|
|
8
9
|
def perform(options = {})
|
|
9
10
|
SpreeCmCommissioner::InventoryItems::BulkAdjustQuantities.call!(
|
|
10
|
-
inventory_id_and_quantities: options[:inventory_id_and_quantities]
|
|
11
|
+
inventory_id_and_quantities: options[:inventory_id_and_quantities],
|
|
12
|
+
caller_source: options[:caller_source]
|
|
11
13
|
)
|
|
12
14
|
end
|
|
13
15
|
end
|
|
@@ -3,16 +3,18 @@ module SpreeCmCommissioner
|
|
|
3
3
|
class BulkAdjustQuantitiesOnHoldJob < ApplicationUniqueJob
|
|
4
4
|
queue_as :default
|
|
5
5
|
|
|
6
|
-
# :order_id, :inventory_id_and_quantities
|
|
6
|
+
# :order_id, :inventory_id_and_quantities, :caller_source
|
|
7
7
|
#
|
|
8
8
|
# :order_id is included for unique job key generation to prevent duplicate jobs,
|
|
9
9
|
# though it's not used in the perform method implementation.
|
|
10
|
+
# :caller_source is a string like "ClassName#method" identifying who enqueued the job.
|
|
10
11
|
def perform(options = {})
|
|
11
12
|
raise ArgumentError, 'order_id is required' if options[:order_id].blank?
|
|
12
13
|
raise ArgumentError, 'inventory_id_and_quantities is required' if options[:inventory_id_and_quantities].blank?
|
|
13
14
|
|
|
14
15
|
SpreeCmCommissioner::InventoryItems::BulkAdjustQuantitiesOnHold.call(
|
|
15
|
-
inventory_id_and_quantities: options[:inventory_id_and_quantities]
|
|
16
|
+
inventory_id_and_quantities: options[:inventory_id_and_quantities],
|
|
17
|
+
caller_source: options[:caller_source]
|
|
16
18
|
)
|
|
17
19
|
end
|
|
18
20
|
end
|
|
@@ -2,8 +2,14 @@ module SpreeCmCommissioner
|
|
|
2
2
|
module RouteMetrics
|
|
3
3
|
class DecreaseTripCountJob < ApplicationUniqueJob
|
|
4
4
|
def perform(options = {})
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
route_metric = SpreeCmCommissioner::RouteMetric.find_by(
|
|
6
|
+
origin_place_id: options[:origin_place_id],
|
|
7
|
+
destination_place_id: options[:destination_place_id],
|
|
8
|
+
route_type: options[:route_type]
|
|
9
|
+
)
|
|
10
|
+
return if route_metric.nil?
|
|
11
|
+
|
|
12
|
+
SpreeCmCommissioner::RouteMetrics::DecreaseTripCount.call(route_metric: route_metric)
|
|
7
13
|
end
|
|
8
14
|
end
|
|
9
15
|
end
|
|
@@ -2,8 +2,11 @@ module SpreeCmCommissioner
|
|
|
2
2
|
module RouteMetrics
|
|
3
3
|
class IncreaseTripCountJob < ApplicationUniqueJob
|
|
4
4
|
def perform(options = {})
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
SpreeCmCommissioner::RouteMetrics::IncreaseTripCount.call(
|
|
6
|
+
origin_place_id: options[:origin_place_id],
|
|
7
|
+
destination_place_id: options[:destination_place_id],
|
|
8
|
+
route_type: options[:route_type]
|
|
9
|
+
)
|
|
7
10
|
end
|
|
8
11
|
end
|
|
9
12
|
end
|
|
@@ -23,6 +23,8 @@ module SpreeCmCommissioner
|
|
|
23
23
|
TripKey = Struct.new(:trip_id, :direction, :boarding_trip_stop_id, :drop_off_trip_stop_id)
|
|
24
24
|
|
|
25
25
|
included do
|
|
26
|
+
include SpreeCmCommissioner::ServiceOrigin
|
|
27
|
+
|
|
26
28
|
validates :direction, inclusion: { in: DIRECTION }, allow_nil: true
|
|
27
29
|
validates :trip_id, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
|
|
28
30
|
validates :service_origin_id, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
|
|
@@ -125,6 +127,12 @@ module SpreeCmCommissioner
|
|
|
125
127
|
|
|
126
128
|
private
|
|
127
129
|
|
|
130
|
+
def resolve_service_origin_id
|
|
131
|
+
return nil if trip_id.blank?
|
|
132
|
+
|
|
133
|
+
SpreeCmCommissioner::Trip.find_by(id: trip_id)&.service_origin_id
|
|
134
|
+
end
|
|
135
|
+
|
|
128
136
|
def validate_trip_stops_for_scheduled_trips
|
|
129
137
|
return if trip_id.blank? || trip_id.zero?
|
|
130
138
|
|
|
@@ -26,10 +26,8 @@ module SpreeCmCommissioner
|
|
|
26
26
|
|
|
27
27
|
state_machine.after_transition to: :canceled, do: :precalculate_conversion
|
|
28
28
|
state_machine.after_transition to: :canceled, do: :restock_inventory!
|
|
29
|
-
state_machine.after_transition to: :canceled, do: :de_allocate_resources
|
|
30
29
|
|
|
31
30
|
state_machine.after_transition to: :complete, do: :increment_route_fulfilled_order_count
|
|
32
|
-
state_machine.after_transition to: :complete, do: :allocate_resources
|
|
33
31
|
|
|
34
32
|
scope :accepted, -> { where(request_state: 'accepted') }
|
|
35
33
|
|
|
@@ -330,13 +328,5 @@ module SpreeCmCommissioner
|
|
|
330
328
|
factory = OrderTelegramMessageFactory.new(title: title, order: self)
|
|
331
329
|
TelegramNotificationSenderJob.perform_later(chat_id: chat_id, message: factory.message, parse_mode: factory.parse_mode)
|
|
332
330
|
end
|
|
333
|
-
|
|
334
|
-
def allocate_resources
|
|
335
|
-
SpreeCmCommissioner::VotingCreditAllocationJob.perform_later(order_id: id)
|
|
336
|
-
end
|
|
337
|
-
|
|
338
|
-
def de_allocate_resources
|
|
339
|
-
SpreeCmCommissioner::VotingCreditDeAllocationJob.perform_later(order_id: id)
|
|
340
|
-
end
|
|
341
331
|
end
|
|
342
332
|
end
|
|
@@ -5,7 +5,7 @@ module SpreeCmCommissioner
|
|
|
5
5
|
module ProductType
|
|
6
6
|
extend ActiveSupport::Concern
|
|
7
7
|
|
|
8
|
-
PRODUCT_TYPES = %i[accommodation service ecommerce transit
|
|
8
|
+
PRODUCT_TYPES = %i[accommodation service ecommerce transit].freeze
|
|
9
9
|
PERMANENT_STOCK_PRODUCT_TYPES = %w[accommodation service transit].freeze
|
|
10
10
|
PRE_INVENTORY_DAYS = { 'transit' => 90, 'accommodation' => 365, 'service' => 30 }.freeze
|
|
11
11
|
|