spree_cm_commissioner 2.8.1.pre.pre.4 → 2.8.2
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/.gitignore +0 -4
- data/Gemfile.lock +1 -1
- 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/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/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/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/spree_cm_commissioner/product_decorator.rb +0 -39
- 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/taxon_decorator.rb +0 -15
- data/app/models/spree_cm_commissioner/taxonomy_decorator.rb +1 -10
- data/app/models/spree_cm_commissioner/tenant.rb +0 -9
- data/app/models/spree_cm_commissioner/trip.rb +5 -0
- 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/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/services/spree_cm_commissioner/pricing_models/preview.rb +15 -6
- data/app/services/spree_cm_commissioner/routes/create.rb +0 -5
- 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/config/initializers/spree_permitted_attributes.rb +0 -8
- data/config/locales/en.yml +0 -12
- data/config/locales/km.yml +0 -6
- data/config/routes.rb +0 -26
- 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 +5 -114
- 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/eliminated_contestants_controller.rb +0 -19
- 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_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/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/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 -159
- data/app/models/spree_cm_commissioner/show_contestant.rb +0 -46
- 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 -135
- 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 -19
- data/app/models/spree_cm_commissioner/voting_contestant.rb +0 -46
- 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 -220
- 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/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 -26
- 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 -18
- 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 -15
- data/app/services/spree_cm_commissioner/fraud_check.rb +0 -279
- 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 -66
- 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 -105
- 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 -74
- 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/20260527062005_add_eliminated_at_to_cm_show_contestants.rb +0 -5
- 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 -104
- 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: cc101fbc1fb46a184c311e3cdf1827cd6515ae3b0399d77ca67c48560b3417bc
|
|
4
|
+
data.tar.gz: 5437f4e82b8c48ce55753432d2ce529935b0c63d472946f03153e817ba3c3038
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 74c7a8c0fbb21ae704c905b4f14b8d878b701adf82fc569a0db9d3bb780cae702eb93303c29db6bd08f602e9270fb89caed7bf5ebdb3a21d474057cef17d2157
|
|
7
|
+
data.tar.gz: 981dc574b4b68c1fec6ed7a665ec47ef52bfb60ef89476ab119e72da1311c9e2ae01e78a69436a8663ba185b460df46c6fd5836ccc52531c5e4a13eeaa5c3209
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -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
|
|
@@ -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
|
|
|
@@ -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
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module SpreeCmCommissioner
|
|
2
|
+
# Defaults service_origin (nationality) from parent associations during validation (on create).
|
|
3
|
+
# Vendor → Route → Trip → LineItem.
|
|
4
|
+
# Pricing rules use this to determine local vs foreigner rates.
|
|
5
|
+
module ServiceOrigin
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
before_validation :assign_service_origin_id, on: :create
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def assign_service_origin_id
|
|
15
|
+
self.service_origin_id ||= resolve_service_origin_id
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def resolve_service_origin_id
|
|
19
|
+
nil
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -14,8 +14,6 @@ module SpreeCmCommissioner
|
|
|
14
14
|
|
|
15
15
|
base.delegate :is_open_dated, :is_open_dated?, to: :trip, allow_nil: true
|
|
16
16
|
|
|
17
|
-
base.has_many :voting_sessions, class_name: 'SpreeCmCommissioner::VotingSession', foreign_key: :episode_id, dependent: :destroy
|
|
18
|
-
|
|
19
17
|
base.has_many :variant_kind_option_types, -> { where(kind: :variant).order(:position) },
|
|
20
18
|
through: :product_option_types, source: :option_type
|
|
21
19
|
|
|
@@ -57,45 +55,8 @@ module SpreeCmCommissioner
|
|
|
57
55
|
|
|
58
56
|
base.belongs_to :event, class_name: 'Spree::Taxon', optional: true
|
|
59
57
|
|
|
60
|
-
base.has_many :preview_roles, class_name: 'SpreeCmCommissioner::PreviewRole', as: :previewable
|
|
61
58
|
base.has_many :industry_classifications, -> { joins(:taxon).where(spree_taxons: { kind: :industry }) }, class_name: 'Spree::Classification'
|
|
62
59
|
base.has_many :industry_taxons, through: :industry_classifications, source: :taxon
|
|
63
|
-
base.scope :visible_to, lambda { |user|
|
|
64
|
-
publicly_available = where(status: :active, preview: false)
|
|
65
|
-
|
|
66
|
-
if user
|
|
67
|
-
# Resolved through associations — avoids hardcoding class names.
|
|
68
|
-
taxon_type = reflect_on_association(:taxons).klass.polymorphic_name
|
|
69
|
-
|
|
70
|
-
# IDs of products that have been explicitly assigned their own PreviewRole.
|
|
71
|
-
products_with_own_roles = SpreeCmCommissioner::PreviewRole
|
|
72
|
-
.where(previewable_type: polymorphic_name)
|
|
73
|
-
.select(:previewable_id)
|
|
74
|
-
|
|
75
|
-
# Path A: product has its own PreviewRole → user must hold that role directly.
|
|
76
|
-
# Taxon membership is irrelevant for these products.
|
|
77
|
-
via_product_role = where(status: :active, preview: true)
|
|
78
|
-
.where(id: products_with_own_roles)
|
|
79
|
-
.where(id: user.preview_roles.where(previewable_type: polymorphic_name).select(:previewable_id))
|
|
80
|
-
|
|
81
|
-
# Path B: product has no own PreviewRole → inherit access from its event or taxons.
|
|
82
|
-
# Accessible if the user holds a preview role for the product's event_id or any
|
|
83
|
-
# taxon the product belongs to via the classifications join table.
|
|
84
|
-
allowed_taxon_ids = user.preview_roles.where(previewable_type: taxon_type).select(:previewable_id)
|
|
85
|
-
preview_no_own = where(status: :active, preview: true).where.not(id: products_with_own_roles)
|
|
86
|
-
|
|
87
|
-
via_event_id = preview_no_own.where(event_id: allowed_taxon_ids)
|
|
88
|
-
via_taxon_join = preview_no_own.joins(:taxons).where(spree_taxons: { id: allowed_taxon_ids })
|
|
89
|
-
|
|
90
|
-
publicly_available
|
|
91
|
-
.or(via_product_role)
|
|
92
|
-
.or(where(id: via_event_id.select(:id)))
|
|
93
|
-
.or(where(id: via_taxon_join.select(:id)))
|
|
94
|
-
else
|
|
95
|
-
publicly_available
|
|
96
|
-
end
|
|
97
|
-
}
|
|
98
|
-
|
|
99
60
|
base.scope :min_price, lambda { |vendor|
|
|
100
61
|
joins(:prices_including_master)
|
|
101
62
|
.where(vendor_id: vendor.id, product_type: vendor.primary_product_type)
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
module SpreeCmCommissioner
|
|
2
2
|
module RoleDecorator
|
|
3
3
|
def self.prepended(base)
|
|
4
|
-
base.enum role_type: { internal: 0, external: 1
|
|
4
|
+
base.enum role_type: { internal: 0, external: 1 }
|
|
5
5
|
|
|
6
6
|
base.has_many :role_permissions, class_name: 'SpreeCmCommissioner::RolePermission'
|
|
7
7
|
base.has_many :permissions, through: :role_permissions, class_name: 'SpreeCmCommissioner::Permission'
|
|
8
|
-
base.has_many :preview_roles, class_name: 'SpreeCmCommissioner::PreviewRole'
|
|
9
8
|
|
|
10
9
|
base.belongs_to :vendor, optional: true
|
|
11
10
|
|
|
@@ -14,8 +13,6 @@ module SpreeCmCommissioner
|
|
|
14
13
|
where(vendor_id: vendor)
|
|
15
14
|
}
|
|
16
15
|
base.scope :filter_external, -> { where(role_type: :external) }
|
|
17
|
-
base.scope :filter_internal, -> { where(role_type: :internal) }
|
|
18
|
-
base.scope :filter_preview, -> { where(role_type: :preview) }
|
|
19
16
|
|
|
20
17
|
base.accepts_nested_attributes_for :role_permissions, allow_destroy: true
|
|
21
18
|
|
|
@@ -2,8 +2,9 @@ module SpreeCmCommissioner
|
|
|
2
2
|
class Route < Base
|
|
3
3
|
include SpreeCmCommissioner::RouteType
|
|
4
4
|
include SpreeCmCommissioner::StoreMetadata
|
|
5
|
+
include SpreeCmCommissioner::ServiceOrigin
|
|
5
6
|
|
|
6
|
-
belongs_to :vendor, class_name: 'Spree::Vendor', optional: false
|
|
7
|
+
belongs_to :vendor, class_name: 'Spree::Vendor', inverse_of: :routes, optional: false
|
|
7
8
|
belongs_to :tenant, class_name: 'SpreeCmCommissioner::Tenant', optional: true
|
|
8
9
|
|
|
9
10
|
belongs_to :service_origin, class_name: 'Spree::Taxon', optional: true
|
|
@@ -66,6 +67,10 @@ module SpreeCmCommissioner
|
|
|
66
67
|
|
|
67
68
|
private
|
|
68
69
|
|
|
70
|
+
def resolve_service_origin_id
|
|
71
|
+
vendor&.service_origin_id
|
|
72
|
+
end
|
|
73
|
+
|
|
69
74
|
def validate_route_stops
|
|
70
75
|
return if route_stops.valid?
|
|
71
76
|
|
|
@@ -83,21 +83,7 @@ module SpreeCmCommissioner
|
|
|
83
83
|
|
|
84
84
|
base.has_many :import_orders, as: :importable, class_name: 'SpreeCmCommissioner::Imports::ImportOrder', dependent: :destroy
|
|
85
85
|
|
|
86
|
-
base.scope :shows, -> { where(taxonomy_id: Spree::Taxonomy.shows.id, depth: 1) }
|
|
87
|
-
base.scope :events, -> { where(taxonomy_id: Spree::Taxonomy.events.id, depth: 1) }
|
|
88
86
|
base.has_many :agencies, class_name: 'SpreeCmCommissioner::Agency', foreign_key: :agency_category_id
|
|
89
|
-
base.has_many :preview_roles, class_name: 'SpreeCmCommissioner::PreviewRole', as: :previewable
|
|
90
|
-
|
|
91
|
-
base.scope :visible_to, lambda { |user|
|
|
92
|
-
publicly_available = where(preview: false)
|
|
93
|
-
|
|
94
|
-
if user
|
|
95
|
-
allowed_ids = user.preview_roles.where(previewable_type: polymorphic_name).select(:previewable_id)
|
|
96
|
-
publicly_available.or(where(preview: true, id: allowed_ids))
|
|
97
|
-
else
|
|
98
|
-
publicly_available
|
|
99
|
-
end
|
|
100
|
-
}
|
|
101
87
|
|
|
102
88
|
# Create maintaining task to purge taxon related caches
|
|
103
89
|
base.after_save { SpreeCmCommissioner::MaintenanceTasks::CacheInvalidation.pending.create_or_find_by(maintainable: self) }
|
|
@@ -110,7 +96,6 @@ module SpreeCmCommissioner
|
|
|
110
96
|
.joins('INNER JOIN cm_homepage_sections ON cm_homepage_section_relatables.homepage_section_id = cm_homepage_sections.id')
|
|
111
97
|
.where(cm_homepage_sections: { tenant_id: nil, active: true })
|
|
112
98
|
.where(kind: :event)
|
|
113
|
-
.where(preview: false)
|
|
114
99
|
end
|
|
115
100
|
|
|
116
101
|
def base.find_event(id)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module SpreeCmCommissioner
|
|
2
2
|
module TaxonomyDecorator
|
|
3
|
-
def self.prepended(base)
|
|
3
|
+
def self.prepended(base)
|
|
4
4
|
base.include SpreeCmCommissioner::TaxonKind
|
|
5
5
|
|
|
6
6
|
base.belongs_to :vendor, class_name: 'Spree::Vendor', optional: true
|
|
@@ -15,15 +15,6 @@ module SpreeCmCommissioner
|
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
def base.shows
|
|
19
|
-
ActiveRecord::Base.connected_to(role: :writing) do
|
|
20
|
-
shows = Spree::Taxonomy.find_or_create_by(name: 'Shows', store: Spree::Store.default)
|
|
21
|
-
shows.kind = :event
|
|
22
|
-
shows.save if shows.changed?
|
|
23
|
-
shows
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
18
|
def base.businesses
|
|
28
19
|
ActiveRecord::Base.connected_to(role: :writing) do
|
|
29
20
|
businesses = Spree::Taxonomy.find_or_create_by(name: 'Businesses', store: Spree::Store.default)
|
|
@@ -24,8 +24,6 @@ module SpreeCmCommissioner
|
|
|
24
24
|
|
|
25
25
|
before_validation :generate_slug, if: -> { slug.blank? && name.present? }
|
|
26
26
|
|
|
27
|
-
validate :single_active_vendor
|
|
28
|
-
|
|
29
27
|
def active_vendor
|
|
30
28
|
vendors.where(state: :active).first
|
|
31
29
|
end
|
|
@@ -45,12 +43,5 @@ module SpreeCmCommissioner
|
|
|
45
43
|
def generate_slug
|
|
46
44
|
self.slug = name.parameterize if slug.blank?
|
|
47
45
|
end
|
|
48
|
-
|
|
49
|
-
# Add Guardrails to ensure data integrity and make system predictable.
|
|
50
|
-
def single_active_vendor
|
|
51
|
-
return unless vendors.where(state: :active).count > 1
|
|
52
|
-
|
|
53
|
-
errors.add(:base, 'must have at most one active vendor')
|
|
54
|
-
end
|
|
55
46
|
end
|
|
56
47
|
end
|
|
@@ -2,6 +2,7 @@ module SpreeCmCommissioner
|
|
|
2
2
|
class Trip < Base
|
|
3
3
|
include SpreeCmCommissioner::StoreMetadata
|
|
4
4
|
include SpreeCmCommissioner::RouteType
|
|
5
|
+
include SpreeCmCommissioner::ServiceOrigin
|
|
5
6
|
|
|
6
7
|
attr_accessor :hours, :minutes, :seconds
|
|
7
8
|
|
|
@@ -133,6 +134,10 @@ module SpreeCmCommissioner
|
|
|
133
134
|
|
|
134
135
|
private
|
|
135
136
|
|
|
137
|
+
def resolve_service_origin_id
|
|
138
|
+
route&.service_origin_id || vendor&.service_origin_id
|
|
139
|
+
end
|
|
140
|
+
|
|
136
141
|
def duplicate_seat_layout_from_vehicle
|
|
137
142
|
# Duplicate the vehicle's seat layout into this trip. Copies nested
|
|
138
143
|
# seat sections and blocks while excluding identifying columns and
|
|
@@ -19,8 +19,6 @@ module SpreeCmCommissioner
|
|
|
19
19
|
base.has_many :payments, as: :payable, class_name: 'Spree::Payment', dependent: :nullify
|
|
20
20
|
base.has_many :role_permissions, through: :spree_roles, class_name: 'SpreeCmCommissioner::RolePermission'
|
|
21
21
|
base.has_many :permissions, through: :role_permissions, class_name: 'SpreeCmCommissioner::Permission'
|
|
22
|
-
base.has_many :preview_spree_roles, -> { where(role_type: :preview) }, through: :role_users, source: :role, class_name: 'Spree::Role'
|
|
23
|
-
base.has_many :preview_roles, through: :preview_spree_roles, class_name: 'SpreeCmCommissioner::PreviewRole'
|
|
24
22
|
base.has_many :line_items, through: :orders, source: :line_items
|
|
25
23
|
base.has_many :check_ins, foreign_key: 'check_in_by_id', class_name: 'SpreeCmCommissioner::CheckIn'
|
|
26
24
|
base.has_many :user_events, class_name: 'SpreeCmCommissioner::UserEvent'
|
|
@@ -37,9 +35,6 @@ module SpreeCmCommissioner
|
|
|
37
35
|
base.has_many :user_agencies, class_name: 'SpreeCmCommissioner::UserAgency'
|
|
38
36
|
base.has_many :user_places, class_name: 'SpreeCmCommissioner::UserPlace'
|
|
39
37
|
base.has_many :places, through: :user_places, class_name: 'SpreeCmCommissioner::Place'
|
|
40
|
-
base.has_many :voting_credits, class_name: 'SpreeCmCommissioner::VotingCredit', dependent: :destroy
|
|
41
|
-
base.has_many :votes, class_name: 'SpreeCmCommissioner::Vote', dependent: :destroy
|
|
42
|
-
base.has_many :voting_credit_transactions, through: :voting_credits, class_name: 'SpreeCmCommissioner::VotingCreditTransaction'
|
|
43
38
|
|
|
44
39
|
base.has_one :profile, as: :viewable, dependent: :destroy, class_name: 'SpreeCmCommissioner::UserProfile'
|
|
45
40
|
base.has_one :customer, class_name: 'SpreeCmCommissioner::Customer'
|
|
@@ -146,10 +146,6 @@ module SpreeCmCommissioner
|
|
|
146
146
|
@seat_type ||= option_value_name_for(option_type_name: 'seat-type')
|
|
147
147
|
end
|
|
148
148
|
|
|
149
|
-
def vote_package_amount
|
|
150
|
-
@vote_package_amount ||= option_value_name_for(option_type_name: 'vote-package')&.to_i
|
|
151
|
-
end
|
|
152
|
-
|
|
153
149
|
# can consider as customers.
|
|
154
150
|
def number_of_guests
|
|
155
151
|
number_of_adults + number_of_kids
|
|
@@ -33,10 +33,6 @@ module SpreeCmCommissioner
|
|
|
33
33
|
|
|
34
34
|
base.has_many :taxon_vendors, class_name: 'SpreeCmCommissioner::TaxonVendor'
|
|
35
35
|
base.has_many :taxons, through: :taxon_vendors
|
|
36
|
-
base.has_many :shows, -> { where(spree_taxons: { type: 'SpreeCmCommissioner::Show' }) },
|
|
37
|
-
through: :taxon_vendors, source: :taxon, class_name: 'SpreeCmCommissioner::Show'
|
|
38
|
-
|
|
39
|
-
base.has_many :voting_sessions, class_name: 'SpreeCmCommissioner::VotingSession', dependent: :destroy
|
|
40
36
|
|
|
41
37
|
base.has_many :promoted_option_types, -> { where(promoted: true).order(:position) },
|
|
42
38
|
through: :vendor_option_types, source: :option_type
|
|
@@ -2,7 +2,7 @@ module Spree
|
|
|
2
2
|
module V2
|
|
3
3
|
module Storefront
|
|
4
4
|
class HomepageSectionSerializer < BaseSerializer
|
|
5
|
-
attributes :id, :title, :segments, :description, :active, :position, :
|
|
5
|
+
attributes :id, :title, :segments, :description, :active, :position, :created_at, :updated_at
|
|
6
6
|
has_many :homepage_section_relatables
|
|
7
7
|
end
|
|
8
8
|
end
|
|
@@ -13,7 +13,7 @@ module Spree
|
|
|
13
13
|
base.has_one :venue, serializer: ::SpreeCmCommissioner::V2::Storefront::ProductPlaceSerializer
|
|
14
14
|
|
|
15
15
|
base.attributes :need_confirmation, :product_type, :kyc, :kyc_fields, :allowed_upload_later, :allow_anonymous_booking, :use_video_as_default
|
|
16
|
-
base.attributes :reveal_description, :discontinue_on, :public_metadata, :purchasable_on
|
|
16
|
+
base.attributes :reveal_description, :discontinue_on, :public_metadata, :purchasable_on
|
|
17
17
|
|
|
18
18
|
# Expose only the `event_id` here instead of the full event object.
|
|
19
19
|
# This lets the client fetch event details separately (usually already cached),
|
|
@@ -15,8 +15,7 @@ module Spree
|
|
|
15
15
|
|
|
16
16
|
base.attributes :custom_redirect_url, :kind, :subtitle, :from_date, :to_date,
|
|
17
17
|
:background_color, :foreground_color, :show_badge_status,
|
|
18
|
-
:purchasable_on, :vendor_id, :available_on, :hide_video_banner
|
|
19
|
-
:preview
|
|
18
|
+
:purchasable_on, :vendor_id, :available_on, :hide_video_banner
|
|
20
19
|
|
|
21
20
|
# To get full seat layout details, call the seat_layouts API with this ID.
|
|
22
21
|
base.attribute :seat_layout_ids, &:preload_seat_layout_ids
|
|
@@ -3,7 +3,7 @@ module Spree
|
|
|
3
3
|
module Tenant
|
|
4
4
|
class HomepageSectionSerializer < BaseSerializer
|
|
5
5
|
attributes :id, :title, :segments, :description,
|
|
6
|
-
:active, :position, :
|
|
6
|
+
:active, :position, :created_at, :updated_at
|
|
7
7
|
|
|
8
8
|
has_many :homepage_section_relatables, serializer: ::Spree::V2::Tenant::HomepageSectionRelatableSerializer
|
|
9
9
|
end
|
|
@@ -52,12 +52,16 @@ module SpreeCmCommissioner
|
|
|
52
52
|
vendor_ids = transit_contexts.map { |ctx| variant_vendor_id(ctx.variant_id) }.compact.uniq
|
|
53
53
|
return [] if vendor_ids.blank?
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
55
|
+
route_ids = trip_route_ids(transit_contexts)
|
|
56
|
+
|
|
57
|
+
scope = SpreeCmCommissioner::PricingModelRoute
|
|
58
|
+
.active
|
|
59
|
+
.for_origin_destination(origin_place_id, destination_place_id)
|
|
60
|
+
.includes(:pricing_model)
|
|
61
|
+
|
|
62
|
+
scope = scope.where(route_id: route_ids) if route_ids.any?
|
|
63
|
+
|
|
64
|
+
scope.map(&:pricing_model).select { |pm| vendor_ids.include?(pm.vendor_id) }
|
|
61
65
|
end
|
|
62
66
|
|
|
63
67
|
def variant_pricing_models(group_contexts)
|
|
@@ -83,6 +87,11 @@ module SpreeCmCommissioner
|
|
|
83
87
|
end
|
|
84
88
|
end
|
|
85
89
|
|
|
90
|
+
def trip_route_ids(transit_contexts)
|
|
91
|
+
trip_ids = transit_contexts.map(&:trip_id).compact.uniq
|
|
92
|
+
SpreeCmCommissioner::Trip.where(id: trip_ids).where.not(route_id: nil).distinct.pluck(:route_id)
|
|
93
|
+
end
|
|
94
|
+
|
|
86
95
|
def variant_vendor_id(variant_id)
|
|
87
96
|
return nil if variant_id.blank?
|
|
88
97
|
|
|
@@ -19,15 +19,10 @@ module SpreeCmCommissioner
|
|
|
19
19
|
destination_place = find_place_for(route_stops, route_stops.last)
|
|
20
20
|
|
|
21
21
|
return failure(nil, 'Origin or destination place could not be determined') if origin_place.nil? || destination_place.nil?
|
|
22
|
-
return failure(nil, 'Route with origin & destination already exists') if vendor.routes.exists?(
|
|
23
|
-
origin_place_id: origin_place.id,
|
|
24
|
-
destination_place_id: destination_place.id
|
|
25
|
-
)
|
|
26
22
|
|
|
27
23
|
attrs = attrs.merge(
|
|
28
24
|
tenant_id: vendor.tenant_id,
|
|
29
25
|
route_name: attrs[:route_name] || "#{origin_place.name} -> #{destination_place.name}",
|
|
30
|
-
service_origin_id: vendor.service_origin_id,
|
|
31
26
|
origin_place_id: origin_place.id,
|
|
32
27
|
destination_place_id: destination_place.id,
|
|
33
28
|
route_stops: route_stops
|