spree_cm_commissioner 1.8.4 → 1.8.6.pre.beta1

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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +11 -1
  3. data/app/controllers/blazer/base_controller_decorator.rb +23 -0
  4. data/app/controllers/spree/admin/event_blazer_queries_controller.rb +23 -0
  5. data/app/controllers/spree/api/v2/storefront/active_homepage_events_controller.rb +23 -0
  6. data/app/controllers/spree/api/v2/tenant/account/orders_controller.rb +48 -0
  7. data/app/controllers/spree/api/v2/tenant/cart_controller.rb +15 -0
  8. data/app/controllers/spree/api/v2/tenant/cart_payment_method_groups_controller.rb +33 -0
  9. data/app/controllers/spree/api/v2/tenant/checkout_controller.rb +14 -0
  10. data/app/models/spree_cm_commissioner/ability_decorator.rb +1 -1
  11. data/app/models/spree_cm_commissioner/order_decorator.rb +2 -1
  12. data/app/models/spree_cm_commissioner/role_decorator.rb +9 -0
  13. data/app/models/spree_cm_commissioner/taxon_blazer_query.rb +8 -0
  14. data/app/models/spree_cm_commissioner/taxon_decorator.rb +14 -1
  15. data/app/models/spree_cm_commissioner/tenant.rb +5 -1
  16. data/app/models/spree_cm_commissioner/trip_connection.rb +30 -0
  17. data/app/models/spree_cm_commissioner/user_decorator.rb +9 -0
  18. data/app/overrides/spree/admin/taxons/_form/hide_video_banner.html.erb.deface +7 -0
  19. data/app/serializers/spree/v2/storefront/active_homepage_event_serializer.rb +18 -0
  20. data/app/serializers/spree/v2/storefront/taxon_serializer_decorator.rb +1 -1
  21. data/app/serializers/spree/v2/tenant/booking_card_class_serializer.rb +10 -0
  22. data/app/serializers/spree/v2/tenant/guest_card_class_serializer.rb +11 -0
  23. data/app/serializers/spree/v2/tenant/order_serializer.rb +1 -0
  24. data/app/serializers/spree/v2/tenant/payment_method_group_serializer.rb +11 -0
  25. data/app/serializers/spree/v2/tenant/payment_method_serializer.rb +13 -0
  26. data/app/views/blazer/queries/_content.html.erb +85 -0
  27. data/app/views/blazer/queries/embed/_content.html.erb +85 -0
  28. data/app/views/blazer/queries/embed/_download_button.html.erb +7 -0
  29. data/app/views/blazer/queries/show.html.erb +12 -0
  30. data/app/views/layouts/blazer/application.html.erb +35 -0
  31. data/config/initializers/spree_permitted_attributes.rb +1 -0
  32. data/config/locales/en.yml +3 -0
  33. data/config/locales/km.yml +5 -1
  34. data/config/routes.rb +14 -0
  35. data/db/migrate/20250321041406_create_trip_connections.rb +12 -0
  36. data/db/migrate/20250327074327_add_hide_video_banner_to_spree_taxon.rb +5 -0
  37. data/db/migrate/20250328072717_add_description_to_spree_roles.rb +5 -0
  38. data/db/migrate/20250328072841_add_vendor_id_to_spree_roles.rb +6 -0
  39. data/db/migrate/20250328072947_remove_unique_constraint_from_name_in_spree_roles.rb +7 -0
  40. data/db/migrate/20250403040036_install_blazer.rb +47 -0
  41. data/db/migrate/20250403083001_create_spree_cm_commissioner_taxon_blazer_query.rb +9 -0
  42. data/docs/sql/events/active_homepage_events.sql +14 -0
  43. data/lib/generators/spree_cm_commissioner/install/install_generator.rb +1 -1
  44. data/lib/spree_cm_commissioner/version.rb +1 -1
  45. data/lib/spree_cm_commissioner.rb +1 -0
  46. data/spree_cm_commissioner.gemspec +1 -1
  47. metadata +44 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23dc6ecf893ca834e63e31cfe256b1303e12449683612adcabad907e90ff1470
4
- data.tar.gz: 7bfe596bd800a4c86efd8bfd08b32822aa2ec4b1b8a692e6cd7ce11f4126c442
3
+ metadata.gz: b0b65120bd40e618788bb86e33eee9c8a8e153d94009f1d75d0ba14aa4a53892
4
+ data.tar.gz: 8051369cfb6c2d1629c572092b6ddc25c4ebea0141260342e27d23c87fa4b260
5
5
  SHA512:
6
- metadata.gz: 399cc8af5b317b52c29bfe9e5dc8466c44b6397af50184d645120929ac1d5fab30b0cc099b243bbbe2393d6e18dccef4f5fcb32477f9ffa8c24335a8b18f46fc
7
- data.tar.gz: b61c2a45b6631a45535163f3fb82cc4201a3fce10b3bfb4fcc49fb981b79fc3d3042ee98dad896c5934c540e61525e301fd7f56ec479640c08897064d7bab82c
6
+ metadata.gz: 529acfe1be953123a8566c8b947e3f9672b1685e9f26de383c1f862c7efd16e64bafb69922a92b4b1c160181d759e019876357acd8ef6c8eb591192b86081cc2
7
+ data.tar.gz: 5e30758a1ed19f5197120ad204bc619a9c8e798bcae5c1670c9ac0d884872fb033e495f45cc454363c703670eae87ffb9ce4ab6b6cbb7372951175ea733b0b71
data/Gemfile.lock CHANGED
@@ -34,12 +34,13 @@ GIT
34
34
  PATH
35
35
  remote: .
36
36
  specs:
37
- spree_cm_commissioner (1.8.4)
37
+ spree_cm_commissioner (1.8.6.pre.beta1)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
41
41
  aws-sdk-ecs
42
42
  aws-sdk-s3
43
+ blazer (~> 3.0.0)
43
44
  byebug
44
45
  counter_culture (~> 3.2)
45
46
  dry-validation (~> 1.10)
@@ -215,6 +216,12 @@ GEM
215
216
  base64 (0.1.1)
216
217
  bcrypt (3.1.19)
217
218
  bigdecimal (3.1.8)
219
+ blazer (3.0.4)
220
+ activerecord (>= 6.1)
221
+ chartkick (>= 5)
222
+ csv
223
+ railties (>= 6.1)
224
+ safely_block (>= 0.4)
218
225
  bootstrap (4.6.2)
219
226
  autoprefixer-rails (>= 9.1.0)
220
227
  popper_js (>= 1.16.1, < 2)
@@ -238,6 +245,7 @@ GEM
238
245
  capybara-select-2 (0.5.1)
239
246
  carmen (1.1.3)
240
247
  activesupport (>= 3.0.0)
248
+ chartkick (5.1.4)
241
249
  chunky_png (1.4.0)
242
250
  coderay (1.1.3)
243
251
  concurrent-ruby (1.2.2)
@@ -253,6 +261,7 @@ GEM
253
261
  crass (1.0.6)
254
262
  css_parser (1.16.0)
255
263
  addressable
264
+ csv (3.3.3)
256
265
  database_cleaner (2.0.2)
257
266
  database_cleaner-active_record (>= 2, < 3)
258
267
  database_cleaner-active_record (2.1.0)
@@ -698,6 +707,7 @@ GEM
698
707
  ffi (~> 1.12)
699
708
  ruby2_keywords (0.0.5)
700
709
  rubyzip (2.3.2)
710
+ safely_block (0.4.1)
701
711
  sass-rails (6.0.0)
702
712
  sassc-rails (~> 2.1, >= 2.1.1)
703
713
  sassc (2.4.0)
@@ -0,0 +1,23 @@
1
+ # https://stackoverflow.com/questions/77318060/blazer-raised-activerecordconnectionnotestablished
2
+ module Blazer
3
+ module BaseControllerDecorator
4
+ def self.prepended(base)
5
+ base.around_action :set_writing_role
6
+ base.before_action :restrict_organizer_access
7
+ end
8
+
9
+ # Annonymous block: https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Naming/BlockForwarding
10
+ def set_writing_role(&block)
11
+ ActiveRecord::Base.connected_to(role: :writing, &block)
12
+ end
13
+
14
+ def restrict_organizer_access
15
+ return unless spree_current_user.organizer? && !spree_current_user.admin?
16
+ return if controller_name == 'queries' && %w[show run].include?(action_name)
17
+
18
+ raise ActionController::RoutingError, 'Unauthorized'
19
+ end
20
+ end
21
+ end
22
+
23
+ Blazer::BaseController.prepend(Blazer::BaseControllerDecorator) unless Blazer::BaseController.ancestors.include?(Blazer::BaseControllerDecorator)
@@ -0,0 +1,23 @@
1
+ module Spree
2
+ module Admin
3
+ class EventBlazerQueriesController < Spree::Admin::ResourceController
4
+ def model_class
5
+ SpreeCmCommissioner::TaxonBlazerQuery
6
+ end
7
+
8
+ def object_name
9
+ 'spree_cm_commissioner_taxon_blazer_query'
10
+ end
11
+
12
+ def create
13
+ event_blazer = SpreeCmCommissioner::TaxonBlazerQuery.new(taxon_id: params[:event_id], blazer_query_id: params[:blazer_query_id])
14
+ if event_blazer.save
15
+ flash[:success] = I18n.t('event_blazer_queries.success')
16
+ else
17
+ flash[:alert] = event_blazer.errors.full_messages.join(', ')
18
+ end
19
+ redirect_to blazer.query_path(id: event_blazer.blazer_query_id, event_id: event_blazer.taxon_id)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ class ActiveHomepageEventsController < Spree::Api::V2::ResourceController
6
+ private
7
+
8
+ def collection
9
+ @collection ||= model_class.active_homepage_events
10
+ end
11
+
12
+ def model_class
13
+ Spree::Taxon
14
+ end
15
+
16
+ def collection_serializer
17
+ Spree::V2::Storefront::ActiveHomepageEventSerializer
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,48 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Tenant
5
+ module Account
6
+ class OrdersController < BaseController
7
+ around_action :wrap_with_multitenant_without
8
+ before_action :require_spree_current_user
9
+
10
+ def collection
11
+ scope
12
+ end
13
+
14
+ def resource
15
+ @resource ||= scope.find_by!(number: params[:id])
16
+ end
17
+
18
+ private
19
+
20
+ def wrap_with_multitenant_without(&block)
21
+ MultiTenant.without(&block)
22
+ end
23
+
24
+ def allowed_sort_attributes
25
+ super << :completed_at
26
+ end
27
+
28
+ def scope
29
+ spree_current_user.orders.complete
30
+ end
31
+
32
+ def collection_serializer
33
+ Spree::V2::Tenant::OrderSerializer
34
+ end
35
+
36
+ def resource_serializer
37
+ Spree::V2::Tenant::OrderSerializer
38
+ end
39
+
40
+ def model_class
41
+ Spree::Order
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -53,6 +53,17 @@ module Spree
53
53
  render_order(result)
54
54
  end
55
55
 
56
+ def remove_line_item
57
+ spree_authorize! :update, spree_current_order, order_token
58
+
59
+ remove_line_item_service.call(
60
+ order: spree_current_order,
61
+ line_item: line_item
62
+ )
63
+
64
+ render_serialized_payload { serialized_current_order }
65
+ end
66
+
56
67
  def destroy
57
68
  spree_authorize! :update, spree_current_order, order_token
58
69
 
@@ -145,6 +156,10 @@ module Spree
145
156
  Spree::Api::Dependencies.storefront_cart_add_item_service.constantize
146
157
  end
147
158
 
159
+ def remove_line_item_service
160
+ Spree::Api::Dependencies.storefront_cart_remove_line_item_service.constantize
161
+ end
162
+
148
163
  def destroy_cart_service
149
164
  Spree::Api::Dependencies.storefront_cart_destroy_service.constantize
150
165
  end
@@ -0,0 +1,33 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Tenant
5
+ class CartPaymentMethodGroupsController < BaseController
6
+ include Spree::Api::V2::Storefront::OrderConcern
7
+
8
+ before_action :ensure_order
9
+
10
+ # override
11
+ def index
12
+ render_serialized_payload do
13
+ collection_serializer.new(collection, { include: resource_includes }).serializable_hash
14
+ end
15
+ end
16
+
17
+ # override
18
+ def collection
19
+ @collection ||= SpreeCmCommissioner::PaymentMethods::GroupByBank.new.execute(
20
+ payment_methods: spree_current_order.available_payment_methods,
21
+ preferred_payment_method_id: spree_current_user&.preferred_payment_method_id
22
+ )
23
+ end
24
+
25
+ # override
26
+ def collection_serializer
27
+ Spree::V2::Tenant::PaymentMethodGroupSerializer
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -47,6 +47,16 @@ module Spree
47
47
  render_order(result)
48
48
  end
49
49
 
50
+ def create_payment
51
+ result = create_payment_service.call(order: spree_current_order, params: params)
52
+
53
+ if result.success?
54
+ render_serialized_payload(201) { serialize_resource(spree_current_order.reload) }
55
+ else
56
+ render_error_payload(result.error)
57
+ end
58
+ end
59
+
50
60
  private
51
61
 
52
62
  def wrap_with_multitenant_without(&block)
@@ -72,6 +82,10 @@ module Spree
72
82
  def update_service
73
83
  Spree::Api::Dependencies.storefront_checkout_update_service.constantize
74
84
  end
85
+
86
+ def create_payment_service
87
+ Vpago::Payments::FindOrCreate
88
+ end
75
89
  end
76
90
  end
77
91
  end
@@ -3,7 +3,7 @@ module SpreeCmCommissioner
3
3
  private
4
4
 
5
5
  def abilities_to_register
6
- super << SpreeCmCommissioner::CheckInAbility
6
+ super.reject { |ability| ability == Spree::VendorAbility } << SpreeCmCommissioner::CheckInAbility
7
7
  end
8
8
 
9
9
  def current_ability
@@ -31,13 +31,14 @@ module SpreeCmCommissioner
31
31
  base.has_one :invoice, dependent: :destroy, class_name: 'SpreeCmCommissioner::Invoice'
32
32
  base.has_one :customer, class_name: 'SpreeCmCommissioner::Customer', through: :subscription
33
33
 
34
- base.belongs_to :tenant, class_name: 'SpreeCmCommissioner::Tenant'
34
+ base.belongs_to :tenant, class_name: 'SpreeCmCommissioner::Tenant', optional: true
35
35
  base.belongs_to :subscription, class_name: 'SpreeCmCommissioner::Subscription', optional: true
36
36
 
37
37
  base.has_many :taxons, class_name: 'Spree::Taxon', through: :customer
38
38
  base.has_many :vendors, through: :products, class_name: 'Spree::Vendor'
39
39
  base.has_many :taxons, through: :products, class_name: 'Spree::Taxon'
40
40
  base.has_many :guests, through: :line_items, class_name: 'SpreeCmCommissioner::Guest'
41
+ base.has_many :guest_card_classes, class_name: 'SpreeCmCommissioner::GuestCardClass', through: :variants
41
42
 
42
43
  base.delegate :customer, to: :user, allow_nil: true
43
44
 
@@ -4,7 +4,16 @@ module SpreeCmCommissioner
4
4
  base.has_many :role_permissions, class_name: 'SpreeCmCommissioner::RolePermission'
5
5
  base.has_many :permissions, through: :role_permissions, class_name: 'SpreeCmCommissioner::Permission'
6
6
 
7
+ base.belongs_to :vendor, optional: true
8
+
9
+ base.scope :non_vendor, -> { where(vendor_id: nil) }
10
+
7
11
  base.accepts_nested_attributes_for :role_permissions, allow_destroy: true
12
+
13
+ base._validators.reject! { |key, _| key == :name }
14
+ base._validate_callbacks.each { |c| c.filter.attributes.delete(:name) if c.filter.respond_to?(:attributes) }
15
+
16
+ base.validates :name, uniqueness: { scope: :vendor_id, allow_blank: true }
8
17
  end
9
18
  end
10
19
  end
@@ -0,0 +1,8 @@
1
+ module SpreeCmCommissioner
2
+ class TaxonBlazerQuery < SpreeCmCommissioner::Base
3
+ belongs_to :taxon, class_name: 'Spree::Taxon'
4
+ belongs_to :blazer_query, class_name: 'Blazer::Query'
5
+
6
+ validates :taxon_id, uniqueness: { scope: :blazer_query_id, message: I18n.t('event_blazer_queries.fail') }
7
+ end
8
+ end
@@ -1,12 +1,13 @@
1
1
  module SpreeCmCommissioner
2
2
  module TaxonDecorator
3
3
  # rubocop:disable Metrics/MethodLength
4
- def self.prepended(base)
4
+ def self.prepended(base) # rubocop:disable Metrics/AbcSize
5
5
  base.include SpreeCmCommissioner::TaxonKind
6
6
  base.include SpreeCmCommissioner::Transit::TaxonBitwise
7
7
 
8
8
  base.preference :background_color, :string
9
9
  base.preference :foreground_color, :string
10
+ base.preference :reports, :array, default: []
10
11
 
11
12
  base.has_many :taxon_vendors, class_name: 'SpreeCmCommissioner::TaxonVendor'
12
13
  base.has_many :vendors, through: :taxon_vendors
@@ -53,6 +54,18 @@ module SpreeCmCommissioner
53
54
  base.has_many :invite_user_events, through: :user_events, class_name: 'SpreeCmCommissioner::InviteUserEvent'
54
55
 
55
56
  base.has_many :line_items, through: :products
57
+ base.has_many :event_blazer_queries, class_name: 'SpreeCmCommissioner::TaxonBlazerQuery'
58
+ base.has_many :blazer_queries, through: :event_blazer_queries, class_name: 'Blazer::Query'
59
+
60
+ def base.active_homepage_events
61
+ joins(:homepage_section_relatables)
62
+ .joins("INNER JOIN spree_taxons taxon ON taxon.id = cm_homepage_section_relatables.relatable_id
63
+ AND cm_homepage_section_relatables.relatable_type = 'Spree::Taxon'"
64
+ )
65
+ .joins('INNER JOIN cm_homepage_sections ON cm_homepage_section_relatables.homepage_section_id = cm_homepage_sections.id')
66
+ .where(cm_homepage_sections: { tenant_id: nil, active: true })
67
+ .where(kind: :event)
68
+ end
56
69
  end
57
70
  # rubocop:enable Metrics/MethodLength
58
71
 
@@ -3,7 +3,11 @@ module SpreeCmCommissioner
3
3
  extend FriendlyId
4
4
  friendly_id :name, use: :history
5
5
 
6
- has_many :vendors, class_name: 'Spree::Vendor'
6
+ has_many :vendors, class_name: 'Spree::Vendor', inverse_of: :tenant
7
+ has_many :orders, class_name: 'Spree::Order', inverse_of: :tenant
8
+ has_many :tenant_payment_methods, class_name: 'Spree::PaymentMethod',
9
+ through: :vendors,
10
+ source: :payment_methods
7
11
 
8
12
  enum state: { enabled: 0, disabled: 1 }
9
13
 
@@ -0,0 +1,30 @@
1
+ module SpreeCmCommissioner
2
+ class TripConnection < ApplicationRecord
3
+ attr_accessor :hours, :minutes
4
+
5
+ belongs_to :from_trip, class_name: 'Spree::Variant'
6
+ belongs_to :to_trip, class_name: 'Spree::Variant'
7
+
8
+ validate :both_trip_cannot_be_the_same
9
+ before_validation :calculate_connection_time_minutes
10
+
11
+ private
12
+
13
+ def calculate_connection_time_minutes
14
+ return if from_trip.nil? || to_trip.nil?
15
+
16
+ connection_time_in_minutes = (to_trip.options.departure_time - from_trip.options.arrival_time) / 60
17
+ if connection_time_in_minutes.between?(0, 180)
18
+ self.connection_time_minutes = connection_time_in_minutes
19
+ else
20
+ errors.add(:base, 'Connection time should be between 0 and 180 minutes')
21
+ end
22
+ end
23
+
24
+ def both_trip_cannot_be_the_same
25
+ return unless from_trip.id == to_trip.id
26
+
27
+ errors.add(:base, 'Both trip cannot be the same')
28
+ end
29
+ end
30
+ end
@@ -55,6 +55,15 @@ module SpreeCmCommissioner
55
55
  base.has_many :places, through: :user_places, class_name: 'SpreeCmCommissioner::Place'
56
56
  end
57
57
 
58
+ def permissions_for_vendor(vendor_id)
59
+ permissions.joins(role_permissions: :role).where(spree_roles: { vendor_id: vendor_id })
60
+ end
61
+
62
+ # override
63
+ def has_spree_role?(role_name) # rubocop:disable Naming/PredicateName
64
+ spree_roles.non_vendor.exists?(name: role_name)
65
+ end
66
+
58
67
  def super_admin?
59
68
  has_spree_role?('super_admin')
60
69
  end
@@ -0,0 +1,7 @@
1
+ <!-- insert_before "erb[loud]:contains('field_container :hide_from_nav')" -->
2
+
3
+ <%= f.field_container :hide_video_banner, class: ['custom-control', 'custom-checkbox', 'my-4'] do %>
4
+ <%= f.check_box :hide_video_banner, class: 'custom-control-input' %>
5
+ <%= f.label :hide_video_banner, Spree.t(:hide_video_banner), class: 'custom-control-label' %>
6
+ <%= f.error_message_on :hide_video_banner %>
7
+ <% end %>
@@ -0,0 +1,18 @@
1
+ module Spree
2
+ module V2
3
+ module Storefront
4
+ class ActiveHomepageEventSerializer < BaseSerializer
5
+ attributes :name, :pretty_name, :permalink, :seo_title,
6
+ :description, :meta_title, :meta_description, :meta_keywords,
7
+ :depth, :updated_at, :custom_redirect_url, :kind,
8
+ :subtitle, :from_date, :to_date
9
+
10
+ attribute :is_root, &:root?
11
+ attribute :is_child, &:child?
12
+ attribute :is_leaf, &:leaf?
13
+
14
+ has_one :category_icon, serializer: ::SpreeCmCommissioner::V2::Storefront::AssetSerializer
15
+ end
16
+ end
17
+ end
18
+ end
@@ -14,7 +14,7 @@ module Spree
14
14
 
15
15
  base.attributes :custom_redirect_url, :kind, :subtitle, :from_date, :to_date,
16
16
  :background_color, :foreground_color, :show_badge_status,
17
- :purchasable_on, :vendor_id, :available_on
17
+ :purchasable_on, :vendor_id, :available_on, :hide_video_banner
18
18
 
19
19
  base.attribute :purchasable_on_app do |taxon|
20
20
  taxon.purchasable_on == 'app' || taxon.purchasable_on == 'both'
@@ -0,0 +1,10 @@
1
+ module Spree
2
+ module V2
3
+ module Tenant
4
+ class BookingCardClassSerializer < GuestCardClassSerializer
5
+ attributes :name, :class_type
6
+ has_one :background_image, serializer: SpreeCmCommissioner::V2::Storefront::AssetSerializer
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module V2
3
+ module Tenant
4
+ class GuestCardClassSerializer < BaseSerializer
5
+ attributes :id, :name
6
+
7
+ belongs_to :taxon, serializer: Spree::V2::Storefront::TaxonSerializer
8
+ end
9
+ end
10
+ end
11
+ end
@@ -2,6 +2,7 @@ module Spree
2
2
  module V2
3
3
  module Tenant
4
4
  class OrderSerializer < Spree::V2::Storefront::CartSerializer
5
+ has_many :guest_card_classes, serializer: Spree::V2::Tenant::BookingCardClassSerializer
5
6
  end
6
7
  end
7
8
  end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module V2
3
+ module Tenant
4
+ class PaymentMethodGroupSerializer < BaseSerializer
5
+ attributes :name
6
+
7
+ has_many :payment_methods, serializer: Spree::V2::Tenant::PaymentMethodSerializer
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ module V2
3
+ module Tenant
4
+ class PaymentMethodSerializer < BaseSerializer
5
+ attributes :type, :name, :description, :public_metadata
6
+
7
+ attribute :preferences do |object|
8
+ object.public_preferences.as_json
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,85 @@
1
+ <% blazer_title @query.name %>
2
+
3
+ <div class="topbar">
4
+ <div class="container">
5
+ <div class="row" style="padding-top: 13px;">
6
+ <div class="col-sm-9">
7
+ <%= render partial: "blazer/nav" %>
8
+ <h3 style="line-height: 34px; display: inline; margin-left: 5px;">
9
+ <%= @query.name %>
10
+ </h3>
11
+ </div>
12
+ <div class="col-sm-3 text-right">
13
+ <%= link_to "Edit", edit_query_path(@query, params: variable_params(@query)), class: "btn btn-default", disabled: !@query.editable?(blazer_user) %>
14
+ <%= link_to "Fork", new_query_path(params: {variables: variable_params(@query), fork_query_id: @query.id, data_source: @query.data_source, name: @query.name}), class: "btn btn-info" %>
15
+
16
+ <% if !@error && @success %>
17
+ <%= button_to "Download", run_queries_path(format: "csv"), params: @run_data, class: "btn btn-primary" %>
18
+ <% end %>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </div>
23
+
24
+ <div style="margin-bottom: 60px;"></div>
25
+
26
+ <% if @sql_errors.any? %>
27
+ <div class="alert alert-danger">
28
+ <ul>
29
+ <% @sql_errors.each do |message| %>
30
+ <li><%= message %></li>
31
+ <% end %>
32
+ </ul>
33
+ </div>
34
+ <% end %>
35
+
36
+ <% if @query.description.present? %>
37
+ <p style="white-space: pre-line;"><%= @query.description %></p>
38
+ <% end %>
39
+
40
+ <div style="display: flex;">
41
+ <%= render partial: "blazer/variables", locals: { action: query_path(@query) } %>
42
+ <% if !@error && @success && params[:event_id].present? %>
43
+ <div>
44
+ <%= link_to 'Save Event',
45
+ spree.admin_event_blazer_queries_path(event_id: params[:event_id], blazer_query_id: params[:id].split('-').first),
46
+ method: :post,
47
+ class: "btn btn-primary",
48
+ style: "margin-left: 10px;" %>
49
+ </div>
50
+ <% end %>
51
+ </div>
52
+
53
+ <% if flash[:success] %>
54
+ <div class="alert alert-success">
55
+ <%= flash[:success] %>
56
+ </div>
57
+ <% elsif flash[:alert] %>
58
+ <div class="alert alert-danger">
59
+ <%= flash[:alert] %>
60
+ </div>
61
+ <% end %>
62
+
63
+
64
+ <pre id="code"><code><%= @statement.display_statement %></code></pre>
65
+
66
+ <% if @success %>
67
+ <div id="results">
68
+ <p class="text-muted">Loading...</p>
69
+ </div>
70
+
71
+ <script>
72
+ function showRun(data) {
73
+ $("#results").html(data)
74
+ $("#results table").stupidtable(stupidtableCustomSettings).stickyTableHeaders({fixedOffset: 60})
75
+ }
76
+
77
+ function showError(message) {
78
+ $("#results").addClass("query-error").html(message)
79
+ }
80
+
81
+ <%= blazer_js_var "data", @run_data %>
82
+
83
+ runQuery(data, showRun, showError)
84
+ </script>
85
+ <% end %>
@@ -0,0 +1,85 @@
1
+ <div class="topbar">
2
+ <div class="row" style="padding-top: 13px; margin: 0;">
3
+ <div class="col-sm-9"></div>
4
+ <div class="col-sm-3 text-right">
5
+ <%= render partial: 'blazer/queries/embed/download_button' %>
6
+ </div>
7
+ </div>
8
+ </div>
9
+ <div style="margin-bottom: 10px;"></div>
10
+
11
+ <% if @success %>
12
+ <div id="results" style="font-family: 'Poppins', sans-serif;"></div>
13
+ <p class="text-muted">Loading...</p>
14
+ </div>
15
+
16
+ <script>
17
+ function showRun(data) {
18
+ $("#results").html(data)
19
+ $("#results table").stupidtable(stupidtableCustomSettings).stickyTableHeaders({fixedOffset: 60})
20
+ }
21
+
22
+ function showError(message) {
23
+ $("#results").addClass("query-error").html(message)
24
+ }
25
+
26
+ <%= blazer_js_var "data", @run_data %>
27
+
28
+ runQuery(data, showRun, showError)
29
+ </script>
30
+ <% end %>
31
+
32
+
33
+ <% theme = cookies[:theme] %>
34
+ <%
35
+ colors = {
36
+ 'dark' => { background: '#1a1f26', text: '#fff', table_background: 'oklch(25.33% 0.016 252.42)', border: '#2f353d' },
37
+ 'light' => { background: '#f7f9fa', text: '#000', table_background: '#fff', border: '#E5E7EB' }
38
+ }
39
+ theme_colors = colors[theme] || colors['light']
40
+ %>
41
+
42
+ <style>
43
+ .topbar {
44
+ background-color: <%= theme_colors[:background] %>;
45
+ }
46
+
47
+ #results table {
48
+ background-color: <%= theme_colors[:table_background] %>;
49
+ color: <%= theme_colors[:text] %>;
50
+ border: none;
51
+ }
52
+
53
+ #results table th,
54
+ #results table td {
55
+ font-size: 16px;
56
+ padding: 15px;
57
+ border-bottom: 1px solid <%= theme_colors[:border] %>;
58
+ }
59
+
60
+ #results table th {
61
+ font-weight: 700;
62
+ background-color: <%= theme_colors[:table_background] %>;
63
+ }
64
+
65
+ #results table td {
66
+ font-size: 14px;
67
+ }
68
+
69
+ .download-btn {
70
+ background-color: <%= theme_colors[:table_background] %>;
71
+ border: 1px solid <%= theme_colors[:border] %>;
72
+ border-radius: 50%;
73
+ width: 40px;
74
+ height: 40px;
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ }
79
+
80
+ .download-btn svg {
81
+ width: 15px;
82
+ height: 15px;
83
+ fill: <%= theme_colors[:text] %>;
84
+ }
85
+ </style>
@@ -0,0 +1,7 @@
1
+ <% if !@error && @success %>
2
+ <%= button_to run_queries_path(format: "csv"), params: @run_data, class: "download-btn" do %>
3
+ <svg width="18" height="19" viewBox="0 0 18 19" fill="none" xmlns="http://www.w3.org/2000/svg">
4
+ <path d="M0 17H18V19H0V17ZM10 11.1716L16.0711 5.1005L17.4853 6.51472L9 15L0.51472 6.51472L1.92893 5.1005L8 11.1716V0H10V11.1716Z" />
5
+ </svg>
6
+ <% end %>
7
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <% if params[:embed].present? %>
2
+ <%= render partial: "blazer/queries/embed/content" %>
3
+ <% else %>
4
+ <%= render partial: "content" %>
5
+ <% end %>
6
+
7
+ <script>
8
+ var code = $("#code code");
9
+ if (code.text().length < 10000) {
10
+ hljs.highlightElement(code.get(0));
11
+ }
12
+ </script>
@@ -0,0 +1,35 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= blazer_title ? blazer_title : "Blazer" %></title>
5
+
6
+ <link rel="preconnect" href="https://fonts.googleapis.com">
7
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
8
+ <link href="https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" rel="stylesheet">
9
+
10
+ <meta charset="utf-8" />
11
+ <%= favicon_link_tag "blazer/favicon.png" %>
12
+ <% if defined?(Propshaft::Railtie) %>
13
+ <%= stylesheet_link_tag "blazer/bootstrap-propshaft", "blazer/bootstrap", "blazer/selectize", "blazer/github", "blazer/daterangepicker", "blazer/application" %>
14
+ <%= javascript_include_tag "blazer/jquery", "blazer/rails-ujs", "blazer/stupidtable", "blazer/stupidtable-custom-settings", "blazer/jquery.stickytableheaders", "blazer/selectize", "blazer/highlight.min", "blazer/moment", "blazer/moment-timezone-with-data", "blazer/daterangepicker", "blazer/chart.umd", "blazer/chartjs-adapter-date-fns.bundle", "blazer/chartkick", "blazer/mapkick.bundle", "blazer/ace/ace", "blazer/ace/ext-language_tools", "blazer/ace/theme-twilight", "blazer/ace/mode-sql", "blazer/ace/snippets/text", "blazer/ace/snippets/sql", "blazer/Sortable", "blazer/bootstrap", "blazer/vue.global.prod", "blazer/routes", "blazer/queries", "blazer/fuzzysearch", "blazer/application" %>
15
+ <% else %>
16
+ <%= stylesheet_link_tag "blazer/application" %>
17
+ <%= javascript_include_tag "blazer/application" %>
18
+ <% end %>
19
+ <script>
20
+ <%= blazer_js_var "rootPath", root_path %>
21
+ </script>
22
+ <%= csrf_meta_tags %>
23
+ </head>
24
+ <body>
25
+ <% if params[:embed].present? %>
26
+ <div>
27
+ <%= yield %>
28
+ </div>
29
+ <% else %>
30
+ <div class="container">
31
+ <%= yield %>
32
+ </div>
33
+ <% end %>
34
+ </body>
35
+ </html>
@@ -34,6 +34,7 @@ module Spree
34
34
  show_badge_status
35
35
  purchasable_on
36
36
  available_on
37
+ hide_video_banner
37
38
  vendor_id
38
39
  ]
39
40
 
@@ -573,4 +573,7 @@ en:
573
573
  url_expired: 'Invitation link is expired'
574
574
  already_invited: 'Failed: User already invited to event'
575
575
  update_fail: 'Failed: to Update invite user'
576
+ event_blazer_queries:
577
+ success: 'Event saved Successfully'
578
+ fail: 'Event already saved'
576
579
 
@@ -417,4 +417,8 @@ km:
417
417
  accept_fail: 'បរាជ័យក្នុងការទទួលយកការអញ្ជើញ'
418
418
  url_expired: 'តំណ​អញ្ជើញ​បាន​ផុត​កំណត់'
419
419
  already_invited: 'បរាជ័យ៖ អ្នកប្រើប្រាស់បានអញ្ជើញចូលរួមព្រឹត្តិការណ៍រួចហើយ'
420
- update_fail: 'បរាជ័យ៖ ធ្វើបច្ចុប្បន្នភាពអ្នកប្រើប្រាស់អញ្ជើញ'
420
+ update_fail: 'បរាជ័យ៖ ធ្វើបច្ចុប្បន្នភាពអ្នកប្រើប្រាស់អញ្ជើញ'
421
+
422
+ event_blazer_queries:
423
+ success: 'បានរក្សាទុកព្រឹត្តិការណ៍ដោយជោគជ័យ'
424
+ fail: 'បានរក្សាទុកព្រឹត្តិការណ៍រួចហើយs'
data/config/routes.rb CHANGED
@@ -1,5 +1,10 @@
1
1
  Spree::Core::Engine.add_routes do
2
2
  # Add your extension routes here
3
+
4
+ authenticate :spree_user, -> (user) { user.admin? || user.organizer? } do
5
+ mount Blazer::Engine, at: 'admin/bi_reports'
6
+ end
7
+
3
8
  namespace :admin do
4
9
  post '/invalidate_api_caches', to: 'base#invalidate_api_caches'
5
10
 
@@ -267,6 +272,7 @@ Spree::Core::Engine.add_routes do
267
272
  resources :tenants do
268
273
  resources :vendors, controller: :tenant_vendors
269
274
  end
275
+ resources :event_blazer_queries
270
276
  end
271
277
 
272
278
  resources :events, controller: 'events/base' do
@@ -463,9 +469,13 @@ Spree::Core::Engine.add_routes do
463
469
  resource :account, controller: :account, only: %i[show update]
464
470
  resource :account_deletions, only: %i[destroy]
465
471
  resource :account_recovers, only: [:update]
472
+ namespace :account do
473
+ resources :orders, controller: :orders, only: %i[index show]
474
+ end
466
475
 
467
476
  resource :cart, controller: :cart, only: %i[show create destroy] do
468
477
  post :add_item
478
+ delete 'remove_line_item/:line_item_id', to: 'cart#remove_line_item', as: :cart_remove_line_item
469
479
  patch :set_quantity
470
480
  patch :apply_coupon_code
471
481
  delete 'remove_coupon_code/:coupon_code', to: 'cart#remove_coupon_code', as: :cart_remove_coupon_code
@@ -479,6 +489,7 @@ Spree::Core::Engine.add_routes do
479
489
  patch :next
480
490
  patch :advance
481
491
  patch :complete
492
+ post :create_payment
482
493
  end
483
494
 
484
495
  resources :customer_notifications, only: [:show]
@@ -492,9 +503,11 @@ Spree::Core::Engine.add_routes do
492
503
  end
493
504
 
494
505
  resources :user_account_linkages, only: %i[index create destroy]
506
+ resources :cart_payment_method_groups, only: %i[index]
495
507
  resource :s3_signed_urls
496
508
  resource :profile_images, only: %i[update destroy]
497
509
  resources :line_items, only: %i[index show]
510
+ resources :guest_card_classes
498
511
  end
499
512
 
500
513
  namespace :storefront do
@@ -574,6 +587,7 @@ Spree::Core::Engine.add_routes do
574
587
  resources :homepage_sections, only: [:index]
575
588
  resource :homepage_background, controller: :homepage_background, only: [:show]
576
589
  end
590
+ resources :active_homepage_events, only: [:index]
577
591
 
578
592
  resources :qr_urls, only: [:show]
579
593
  resources :guest_qrs, only: [:show]
@@ -0,0 +1,12 @@
1
+ class CreateTripConnections < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_trip_connections, if_not_exists: true do |t|
4
+ t.references :from_trip, null: false, foreign_key: { to_table: :spree_variants }, index: true,if_not_exists: true
5
+ t.references :to_trip, null: false, foreign_key: { to_table: :spree_variants }, index: true, if_not_exists: true
6
+ t.integer :connection_time_minutes, null: false, if_not_exists: true
7
+ t.text :description, null: true, if_not_exists: true
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ class AddHideVideoBannerToSpreeTaxon < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_taxons, :hide_video_banner, :boolean, default: false, if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddDescriptionToSpreeRoles < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_roles, :description, :text
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class AddVendorIdToSpreeRoles < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :spree_roles, :vendor_id, :integer, if_not_exists: true
4
+ add_index :spree_roles, :vendor_id
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ class RemoveUniqueConstraintFromNameInSpreeRoles < ActiveRecord::Migration[7.0]
2
+ def change
3
+ if index_exists?(:spree_roles, :name, unique: true)
4
+ remove_index :spree_roles, :name
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,47 @@
1
+ class InstallBlazer < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :blazer_queries do |t|
4
+ t.references :creator
5
+ t.string :name
6
+ t.text :description
7
+ t.text :statement
8
+ t.string :data_source
9
+ t.string :status
10
+ t.timestamps null: false
11
+ end
12
+
13
+ create_table :blazer_audits do |t|
14
+ t.references :user
15
+ t.references :query
16
+ t.text :statement
17
+ t.string :data_source
18
+ t.datetime :created_at
19
+ end
20
+
21
+ create_table :blazer_dashboards do |t|
22
+ t.references :creator
23
+ t.string :name
24
+ t.timestamps null: false
25
+ end
26
+
27
+ create_table :blazer_dashboard_queries do |t|
28
+ t.references :dashboard
29
+ t.references :query
30
+ t.integer :position
31
+ t.timestamps null: false
32
+ end
33
+
34
+ create_table :blazer_checks do |t|
35
+ t.references :creator
36
+ t.references :query
37
+ t.string :state
38
+ t.string :schedule
39
+ t.text :emails
40
+ t.text :slack_channels
41
+ t.string :check_type
42
+ t.text :message
43
+ t.datetime :last_run_at
44
+ t.timestamps null: false
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSpreeCmCommissionerTaxonBlazerQuery < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :cm_taxon_blazer_queries,if_not_exists: true do |t|
4
+ t.references :taxon, foreign_key: { to_table: :spree_taxons }, null: false, index: true
5
+ t.references :blazer_query, foreign_key: { to_table: :blazer_queries }, null: false, index: true
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ SELECT
2
+ *
3
+ FROM spree_taxons
4
+
5
+ INNER JOIN cm_homepage_section_relatables
6
+ ON spree_taxons.id = cm_homepage_section_relatables.relatable_id
7
+ AND cm_homepage_section_relatables.relatable_type = 'Spree::Taxon'
8
+
9
+ INNER JOIN cm_homepage_sections
10
+ ON cm_homepage_section_relatables.homepage_section_id = cm_homepage_sections.id
11
+
12
+ WHERE cm_homepage_sections.tenant_id IS NULL
13
+ AND cm_homepage_sections.active = TRUE
14
+ AND spree_taxons.kind = 2
@@ -12,10 +12,10 @@ module SpreeCmCommissioner
12
12
 
13
13
  def add_migrations
14
14
  gems = %i[
15
+ blazer
15
16
  spree_multi_vendor
16
17
  spree_cm_commissioner
17
18
  ]
18
-
19
19
  gems.each do |gem|
20
20
  run "bundle exec rake railties:install:migrations FROM=#{gem}"
21
21
  end
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '1.8.4'.freeze
2
+ VERSION = '1.8.6-beta1'.freeze
3
3
 
4
4
  module_function
5
5
 
@@ -3,6 +3,7 @@ require 'spree_api_v1'
3
3
  require 'spree_backend'
4
4
  require 'spree_auth_devise'
5
5
  require 'spree_multi_vendor'
6
+ require 'blazer'
6
7
  require 'spree_extension'
7
8
 
8
9
  require 'spree_cm_commissioner/engine'
@@ -28,7 +28,6 @@ Gem::Specification.new do |s|
28
28
  s.add_dependency 'spree_backend', spree_opts
29
29
  s.add_dependency 'spree_multi_vendor', '>= 2.4.1'
30
30
  s.add_dependency 'spree_extension'
31
-
32
31
  s.add_dependency 'activerecord-multi-tenant'
33
32
  s.add_dependency 'phonelib'
34
33
  s.add_dependency 'aws-sdk-ecs'
@@ -56,5 +55,6 @@ Gem::Specification.new do |s|
56
55
  s.add_dependency 'counter_culture', '~> 3.2'
57
56
  s.add_development_dependency 'pg'
58
57
  s.add_development_dependency 'spree_dev_tools'
58
+ s.add_dependency 'blazer', '~> 3.0.0'
59
59
  s.metadata['rubygems_mfa_required'] = 'true'
60
60
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_cm_commissioner
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.4
4
+ version: 1.8.6.pre.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-03-21 00:00:00.000000000 Z
11
+ date: 2025-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree
@@ -478,6 +478,20 @@ dependencies:
478
478
  - - ">="
479
479
  - !ruby/object:Gem::Version
480
480
  version: '0'
481
+ - !ruby/object:Gem::Dependency
482
+ name: blazer
483
+ requirement: !ruby/object:Gem::Requirement
484
+ requirements:
485
+ - - "~>"
486
+ - !ruby/object:Gem::Version
487
+ version: 3.0.0
488
+ type: :runtime
489
+ prerelease: false
490
+ version_requirements: !ruby/object:Gem::Requirement
491
+ requirements:
492
+ - - "~>"
493
+ - !ruby/object:Gem::Version
494
+ version: 3.0.0
481
495
  description: Add (optional) extension description here
482
496
  email: you@example.com
483
497
  executables: []
@@ -657,6 +671,7 @@ files:
657
671
  - app/assets/stylesheets/spree_cm_commissioner/telegram/telegram_bot.css.scss
658
672
  - app/assets/stylesheets/spree_cm_commissioner/vehicle_seat.css
659
673
  - app/controllers/.gitkeep
674
+ - app/controllers/blazer/base_controller_decorator.rb
660
675
  - app/controllers/concerns/spree/billing/order_parents_concern.rb
661
676
  - app/controllers/concerns/spree/billing/payment_creatable.rb
662
677
  - app/controllers/concerns/spree/billing/payment_fireable.rb
@@ -674,6 +689,7 @@ files:
674
689
  - app/controllers/spree/admin/classifications_controller.rb
675
690
  - app/controllers/spree/admin/customer_notifications_controller.rb
676
691
  - app/controllers/spree/admin/device_tokens_controller.rb
692
+ - app/controllers/spree/admin/event_blazer_queries_controller.rb
677
693
  - app/controllers/spree/admin/feature_images_controller.rb
678
694
  - app/controllers/spree/admin/google_wallets_controller.rb
679
695
  - app/controllers/spree/admin/guest_card_classes_controller.rb
@@ -761,6 +777,7 @@ files:
761
777
  - app/controllers/spree/api/v2/storefront/account_checker_controller.rb
762
778
  - app/controllers/spree/api/v2/storefront/account_deletions_controller.rb
763
779
  - app/controllers/spree/api/v2/storefront/account_recovers_controller.rb
780
+ - app/controllers/spree/api/v2/storefront/active_homepage_events_controller.rb
764
781
  - app/controllers/spree/api/v2/storefront/anonymous_line_items_controller.rb
765
782
  - app/controllers/spree/api/v2/storefront/anonymous_orders_controller.rb
766
783
  - app/controllers/spree/api/v2/storefront/cart_guests_controller.rb
@@ -812,6 +829,7 @@ files:
812
829
  - app/controllers/spree/api/v2/storefront/waiting_room_sessions_controller.rb
813
830
  - app/controllers/spree/api/v2/storefront/wished_items_controller.rb
814
831
  - app/controllers/spree/api/v2/storefront/wishlists_controller_decorator.rb
832
+ - app/controllers/spree/api/v2/tenant/account/orders_controller.rb
815
833
  - app/controllers/spree/api/v2/tenant/account_checker_controller.rb
816
834
  - app/controllers/spree/api/v2/tenant/account_controller.rb
817
835
  - app/controllers/spree/api/v2/tenant/account_deletions_controller.rb
@@ -819,6 +837,7 @@ files:
819
837
  - app/controllers/spree/api/v2/tenant/base_controller.rb
820
838
  - app/controllers/spree/api/v2/tenant/cart_controller.rb
821
839
  - app/controllers/spree/api/v2/tenant/cart_guests_controller.rb
840
+ - app/controllers/spree/api/v2/tenant/cart_payment_method_groups_controller.rb
822
841
  - app/controllers/spree/api/v2/tenant/checkout_controller.rb
823
842
  - app/controllers/spree/api/v2/tenant/customer_notifications_controller.rb
824
843
  - app/controllers/spree/api/v2/tenant/guests_controller.rb
@@ -1210,6 +1229,7 @@ files:
1210
1229
  - app/models/spree_cm_commissioner/store_decorator.rb
1211
1230
  - app/models/spree_cm_commissioner/subscription.rb
1212
1231
  - app/models/spree_cm_commissioner/taxon_app_banner.rb
1232
+ - app/models/spree_cm_commissioner/taxon_blazer_query.rb
1213
1233
  - app/models/spree_cm_commissioner/taxon_brand_logo.rb
1214
1234
  - app/models/spree_cm_commissioner/taxon_category_icon.rb
1215
1235
  - app/models/spree_cm_commissioner/taxon_decorator.rb
@@ -1221,6 +1241,7 @@ files:
1221
1241
  - app/models/spree_cm_commissioner/telegram_bot.rb
1222
1242
  - app/models/spree_cm_commissioner/tenant.rb
1223
1243
  - app/models/spree_cm_commissioner/trip.rb
1244
+ - app/models/spree_cm_commissioner/trip_connection.rb
1224
1245
  - app/models/spree_cm_commissioner/trip_stop.rb
1225
1246
  - app/models/spree_cm_commissioner/user_decorator.rb
1226
1247
  - app/models/spree_cm_commissioner/user_deletion_survey.rb
@@ -1349,6 +1370,7 @@ files:
1349
1370
  - app/overrides/spree/admin/taxons/_form/available_on.html.erb.deface
1350
1371
  - app/overrides/spree/admin/taxons/_form/background_color_and_foreground_color.html.erb.deface
1351
1372
  - app/overrides/spree/admin/taxons/_form/custom_redirect_url.html.erb.deface
1373
+ - app/overrides/spree/admin/taxons/_form/hide_video_banner.html.erb.deface
1352
1374
  - app/overrides/spree/admin/taxons/_form/kind_html.erb.deface
1353
1375
  - app/overrides/spree/admin/taxons/_form/purchasable_on_status.html.erb.deface
1354
1376
  - app/overrides/spree/admin/taxons/_form/show_badge_status.html.erb.deface
@@ -1421,6 +1443,7 @@ files:
1421
1443
  - app/serializers/spree/v2/organizer/ticket_serializer.rb
1422
1444
  - app/serializers/spree/v2/organizer/user_serializer.rb
1423
1445
  - app/serializers/spree/v2/storefront/accommodation_serializer.rb
1446
+ - app/serializers/spree/v2/storefront/active_homepage_event_serializer.rb
1424
1447
  - app/serializers/spree/v2/storefront/address_serializer_decorator.rb
1425
1448
  - app/serializers/spree/v2/storefront/cart_serializer_decorator.rb
1426
1449
  - app/serializers/spree/v2/storefront/customer_notification_serializer.rb
@@ -1451,8 +1474,10 @@ files:
1451
1474
  - app/serializers/spree/v2/tenant/address_serializer.rb
1452
1475
  - app/serializers/spree/v2/tenant/asset_serializer.rb
1453
1476
  - app/serializers/spree/v2/tenant/base_serializer.rb
1477
+ - app/serializers/spree/v2/tenant/booking_card_class_serializer.rb
1454
1478
  - app/serializers/spree/v2/tenant/customer_notification_serializer.rb
1455
1479
  - app/serializers/spree/v2/tenant/digital_link_serializer.rb
1480
+ - app/serializers/spree/v2/tenant/guest_card_class_serializer.rb
1456
1481
  - app/serializers/spree/v2/tenant/guest_serializer.rb
1457
1482
  - app/serializers/spree/v2/tenant/homepage_section_relatable_serializer.rb
1458
1483
  - app/serializers/spree/v2/tenant/homepage_section_serializer.rb
@@ -1462,6 +1487,8 @@ files:
1462
1487
  - app/serializers/spree/v2/tenant/option_type_serializer.rb
1463
1488
  - app/serializers/spree/v2/tenant/option_value_serializer.rb
1464
1489
  - app/serializers/spree/v2/tenant/order_serializer.rb
1490
+ - app/serializers/spree/v2/tenant/payment_method_group_serializer.rb
1491
+ - app/serializers/spree/v2/tenant/payment_method_serializer.rb
1465
1492
  - app/serializers/spree/v2/tenant/role_serializer.rb
1466
1493
  - app/serializers/spree/v2/tenant/s3_signed_url_serializer.rb
1467
1494
  - app/serializers/spree/v2/tenant/stock_item_serializer.rb
@@ -1572,6 +1599,11 @@ files:
1572
1599
  - app/services/spree_cm_commissioner/webhooks/subscribers/handle_request_decorator.rb
1573
1600
  - app/services/spree_cm_commissioner/webhooks/subscribers/make_request.rb
1574
1601
  - app/services/spree_cm_commissioner/webhooks/subscribers/queue_requests_decorator.rb
1602
+ - app/views/blazer/queries/_content.html.erb
1603
+ - app/views/blazer/queries/embed/_content.html.erb
1604
+ - app/views/blazer/queries/embed/_download_button.html.erb
1605
+ - app/views/blazer/queries/show.html.erb
1606
+ - app/views/layouts/blazer/application.html.erb
1575
1607
  - app/views/shared/_asset_field.html.erb
1576
1608
  - app/views/shared/_calendar.html.erb
1577
1609
  - app/views/shared/_kind_field.html.erb
@@ -2276,11 +2308,19 @@ files:
2276
2308
  - db/migrate/20250307073003_add_tenant_id_to_cm_customer_notifications.rb
2277
2309
  - db/migrate/20250307083809_remove_tenant_id_from_cm_notifications.rb
2278
2310
  - db/migrate/20250314013434_add_available_on_to_spree_taxons.rb
2311
+ - db/migrate/20250321041406_create_trip_connections.rb
2312
+ - db/migrate/20250327074327_add_hide_video_banner_to_spree_taxon.rb
2313
+ - db/migrate/20250328072717_add_description_to_spree_roles.rb
2314
+ - db/migrate/20250328072841_add_vendor_id_to_spree_roles.rb
2315
+ - db/migrate/20250328072947_remove_unique_constraint_from_name_in_spree_roles.rb
2316
+ - db/migrate/20250403040036_install_blazer.rb
2317
+ - db/migrate/20250403083001_create_spree_cm_commissioner_taxon_blazer_query.rb
2279
2318
  - docker-compose.yml
2280
2319
  - docs/option_types/attr_types.md
2281
2320
  - docs/private_key.pem
2282
2321
  - docs/public_key.pem
2283
2322
  - docs/spree_core/add_new_promotion.md
2323
+ - docs/sql/events/active_homepage_events.sql
2284
2324
  - docs/sql/subscriptions/remaining_subscriptions.sql
2285
2325
  - docs/webhook/sqs.rb
2286
2326
  - docs/webhook/sqs/params_job_complete.json
@@ -2413,9 +2453,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
2413
2453
  version: '2.7'
2414
2454
  required_rubygems_version: !ruby/object:Gem::Requirement
2415
2455
  requirements:
2416
- - - ">="
2456
+ - - ">"
2417
2457
  - !ruby/object:Gem::Version
2418
- version: '0'
2458
+ version: 1.3.1
2419
2459
  requirements:
2420
2460
  - none
2421
2461
  rubygems_version: 3.4.1