spree_cm_commissioner 2.14.9 → 2.14.11

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5426f6a834611d1c303d1305de10998cea1cd5b6ca72c23f512ddff53614b2a
4
- data.tar.gz: cb6688095f5daef9df50906c20d5adb5cba20dc4f2657a430b1d2ab00afaaaf6
3
+ metadata.gz: 404c51ec35ca9f40be93a12f9d7c9af99621231ec51b47b4300e34570e0ee2c6
4
+ data.tar.gz: 4cc03fe1be1e9dbae9b4e7eca107e1b882b34fb2d0bb0ff6372c6d55f24935a2
5
5
  SHA512:
6
- metadata.gz: e609a94743b1283a225d077dad5ba3f775ed599985d687f8b6c4408de286bc6f8b6e91e4024e675ec03ae06a67a013fa43cc6242cc50070a334bc2ac4731e7d0
7
- data.tar.gz: d007f4f9a802452c020d32f32f44c466e88469ea24386c87f8b45c834ced740d1faf55185d953901640fd1dd73f19af686667ef9f29e615b97642aadc8645020
6
+ metadata.gz: 2d8d4d96eeb4e6b3e659cdc3660cb0213fb3da8b39ea09f680b8eb116e028c2205ebabf74cab3fcc6b1146725f25d7035d212b22215522b7b8950bd84b9ab88d
7
+ data.tar.gz: fab1f613701eec7c9ce563bf668781a8356d9cabd088cc3f55cf59a70eb527d8cb29fd6b5658272f871831ba17641a1c0914b63c971f9d0e5dd920311d37649d
data/Gemfile.lock CHANGED
@@ -34,7 +34,7 @@ GIT
34
34
  PATH
35
35
  remote: .
36
36
  specs:
37
- spree_cm_commissioner (2.14.9)
37
+ spree_cm_commissioner (2.14.11)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
@@ -0,0 +1,24 @@
1
+ module SpreeCmCommissioner
2
+ # The taxon serializer renders `visible_products` as loaded, so the sales-channel filter lives here:
3
+ # preloading it scoped to the request's channel hides tenant-only products on BookMe+ and platform-only ones on a tenant app.
4
+ # Prepend it (not include) so it wraps a controller's own `resource`/`paginated_collection`.
5
+ module TaxonVisibleProductsPreloadable
6
+ private
7
+
8
+ def resource
9
+ @resource ||= super.tap { |taxon| preload_visible_products([taxon]) }
10
+ end
11
+
12
+ def paginated_collection
13
+ @paginated_collection ||= super.tap { |taxons| preload_visible_products(taxons.to_a) }
14
+ end
15
+
16
+ def preload_visible_products(taxons)
17
+ ActiveRecord::Associations::Preloader.new(
18
+ records: taxons,
19
+ associations: :visible_products,
20
+ scope: Spree::Product.sellable_on(Spree::Product.sales_channel_for(@tenant))
21
+ ).call
22
+ end
23
+ end
24
+ end
@@ -3,6 +3,8 @@ module Spree
3
3
  module V2
4
4
  module Storefront
5
5
  module TaxonsControllerDecorator
6
+ include SpreeCmCommissioner::TaxonVisibleProductsPreloadable
7
+
6
8
  def scope
7
9
  super.where(preview: false)
8
10
  end
@@ -3,6 +3,8 @@ module Spree
3
3
  module V2
4
4
  module Tenant
5
5
  class TaxonsController < BaseController
6
+ prepend SpreeCmCommissioner::TaxonVisibleProductsPreloadable
7
+
6
8
  private
7
9
 
8
10
  def collection_serializer
@@ -4,10 +4,7 @@ module Spree
4
4
  module TaxonSerializerDecorator
5
5
  def self.prepended(base)
6
6
  base.has_many :vendors, serializer: ::Spree::V2::Storefront::VendorSerializer
7
- # The app lists an event section's tickets from this relation, so products a tenant keeps off BookMe+ are dropped here.
8
- base.has_many :visible_products, serializer: ::Spree::V2::Storefront::ProductSerializer do |taxon|
9
- taxon.visible_products.sellable_on(:platform)
10
- end
7
+ base.has_many :visible_products, serializer: ::Spree::V2::Storefront::ProductSerializer
11
8
  base.has_many :places, serializer: ::Spree::V2::Storefront::PlaceSerializer
12
9
 
13
10
  base.has_one :vendor, serializer: ::Spree::V2::Storefront::VendorSerializer
@@ -0,0 +1,57 @@
1
+ # A guest only stores what its line item collects (kyc_fields + dynamic fields), whatever a client
2
+ # submits. Clients may send every guest with prefilled values — the app seeds guest #1 with the
3
+ # buyer's contact info even for products that collect nothing — which would make guest #1 read as
4
+ # the buyer while the others stay blank. Unenabled attributes are dropped rather than rejected so a
5
+ # client that over-sends still checks out.
6
+ module SpreeCmCommissioner
7
+ module Checkout
8
+ class StripUncollectedGuestFields
9
+ ALWAYS_ALLOWED = %w[id guest_dynamic_fields_attributes].freeze
10
+
11
+ # Not in KYC_FIELD_ATTRIBUTES; each only means something alongside the field it pairs with.
12
+ PAIRED_ATTRIBUTES = {
13
+ guest_phone_number: %w[country_code],
14
+ guest_id_card: %w[upload_later]
15
+ }.freeze
16
+
17
+ def self.call(order:, params:)
18
+ new.call(order: order, params: params)
19
+ end
20
+
21
+ def call(order:, params:)
22
+ line_items_params = params[:order]&.[](:line_items_attributes)
23
+ return if line_items_params.blank?
24
+
25
+ each_entry(line_items_params) do |line_item_params|
26
+ guests_params = line_item_params[:guests_attributes]
27
+ next if guests_params.blank?
28
+
29
+ line_item = order.line_items.find { |item| item.id.to_s == line_item_params[:id].to_s }
30
+ next if line_item.nil?
31
+
32
+ allowed = allowed_attributes(line_item)
33
+ each_entry(guests_params) do |guest_params|
34
+ rejected = guest_params.keys.reject { |key| allowed.include?(key.to_s) }
35
+ rejected.each { |key| guest_params.delete(key) }
36
+ end
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def allowed_attributes(line_item)
43
+ kyc_fields = line_item.kyc.nil? ? [] : line_item.kyc_fields
44
+
45
+ ALWAYS_ALLOWED + kyc_fields.flat_map do |field|
46
+ Array(SpreeCmCommissioner::KycBitwise::KYC_FIELD_ATTRIBUTES[field]).map(&:to_s) + PAIRED_ATTRIBUTES.fetch(field, [])
47
+ end
48
+ end
49
+
50
+ # Nested attributes arrive either as an array or as an index-keyed hash ({ '0' => {...} }).
51
+ def each_entry(collection)
52
+ entries = collection.is_a?(Array) ? collection : collection.values
53
+ entries.each { |entry| yield(entry) if entry.respond_to?(:delete) && entry.respond_to?(:keys) }
54
+ end
55
+ end
56
+ end
57
+ end
@@ -5,6 +5,7 @@ module SpreeCmCommissioner
5
5
  # 1. Validate line items are in stock before updating address
6
6
  # 2. Skip automatic state transitions (lines 17-18 commented out)
7
7
  # State changes are handled by the advance action, not update
8
+ # 3. Drop guest attributes the line item doesn't collect (see StripUncollectedGuestFields)
8
9
  def call(order:, params:, permitted_attributes:, request_env:)
9
10
  return failure(order) unless order.ensure_line_items_are_in_stock
10
11
 
@@ -17,6 +18,8 @@ module SpreeCmCommissioner
17
18
  # order.state = 'address' if (ship_changed || bill_changed) && order.has_checkout_step?('address')
18
19
  # order.state = 'delivery' if selected_shipping_rate_present?(params) && order.has_checkout_step?('delivery')
19
20
 
21
+ SpreeCmCommissioner::Checkout::StripUncollectedGuestFields.call(order: order, params: params)
22
+
20
23
  if order.update_from_params(params, permitted_attributes, request_env)
21
24
  # Recalculate pricing models after order/guest updates to ensure adjustments reflect current rules
22
25
  SpreeCmCommissioner::PricingModels::Activate.call(order: order)
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '2.14.9'.freeze
2
+ VERSION = '2.14.11'.freeze
3
3
 
4
4
  module_function
5
5
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_cm_commissioner
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.14.9
4
+ version: 2.14.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
@@ -822,6 +822,7 @@ files:
822
822
  - app/controllers/concerns/spree_cm_commissioner/load_test_login_token_generation.rb
823
823
  - app/controllers/concerns/spree_cm_commissioner/operator/event_authorization.rb
824
824
  - app/controllers/concerns/spree_cm_commissioner/order_concern.rb
825
+ - app/controllers/concerns/spree_cm_commissioner/taxon_visible_products_preloadable.rb
825
826
  - app/controllers/concerns/spree_cm_commissioner/turnstile_protectable.rb
826
827
  - app/controllers/concerns/spree_cm_commissioner/waiting_room_authorization.rb
827
828
  - app/controllers/spree/admin/account_deletions_controller.rb
@@ -2346,6 +2347,7 @@ files:
2346
2347
  - app/services/spree_cm_commissioner/checkout/advance_to_payment.rb
2347
2348
  - app/services/spree_cm_commissioner/checkout/complete_decorator.rb
2348
2349
  - app/services/spree_cm_commissioner/checkout/remove_store_credit_decorator.rb
2350
+ - app/services/spree_cm_commissioner/checkout/strip_uncollected_guest_fields.rb
2349
2351
  - app/services/spree_cm_commissioner/checkout/update_decorator.rb
2350
2352
  - app/services/spree_cm_commissioner/completion_steps/mark_line_item_as_completed.rb
2351
2353
  - app/services/spree_cm_commissioner/completion_steps/regenerate_for_line_items.rb