Merge decorator with class brought from spree_core

This commit is contained in:
Luis Ramos
2020-07-01 17:05:48 +01:00
parent d505fc2131
commit 3e14c9777e
2 changed files with 42 additions and 63 deletions

View File

@@ -2,23 +2,51 @@ module Spree
module Stock
class AvailabilityValidator < ActiveModel::Validator
def validate(line_item)
if shipment = line_item.target_shipment
units = shipment.inventory_units_for(line_item.variant)
return if units.count > line_item.quantity
quantity = line_item.quantity - units.count
else
quantity = line_item.quantity
end
# OFN specific check for in-memory :skip_stock_check attribute
return if line_item.skip_stock_check
quantifier = Stock::Quantifier.new(line_item.variant_id)
quantity_to_validate = line_item.quantity - quantity_in_shipment(line_item)
return if quantity_to_validate < 1
unless quantifier.can_supply? quantity
variant = line_item.variant
display_name = %Q{#{variant.name}}
display_name += %Q{ (#{variant.options_text})} unless variant.options_text.blank?
validate_quantity(line_item, quantity_to_validate)
end
line_item.errors[:quantity] << Spree.t(:out_of_stock, :scope => :order_populator, :item => display_name.inspect)
end
private
# This is an adapted version of a fix to the inventory_units not being considered here.
# See #3090 for details.
# This can be removed after upgrading to Spree 2.4.
def quantity_in_shipment(line_item)
shipment = line_item_shipment(line_item)
return 0 unless shipment
units = shipment.inventory_units_for(line_item.variant)
units.count
end
def line_item_shipment(line_item)
return line_item.target_shipment if line_item.target_shipment
return line_item.order.shipments.first if line_item.order.andand.shipments.any?
end
# Overrides Spree v2.0.4 validate method version to:
# - scope variants to hub and thus acivate variant overrides
# - use calculated quantity instead of the line_item.quantity
# - rely on Variant.can_supply? instead of Stock::Quantified.can_supply?
# so that it works correctly for variant overrides
def validate_quantity(line_item, quantity)
line_item.scoper.scope(line_item.variant)
add_out_of_stock_error(line_item) unless line_item.variant.can_supply? quantity
end
def add_out_of_stock_error(line_item)
variant = line_item.variant
display_name = variant.name.to_s
display_name += %{(#{variant.options_text})} if variant.options_text.present?
line_item.errors[:quantity] << Spree.t(:out_of_stock,
scope: :order_populator,
item: display_name.inspect)
end
end
end

View File

@@ -1,49 +0,0 @@
Spree::Stock::AvailabilityValidator.class_eval do
def validate(line_item)
# OFN specific check for in-memory :skip_stock_check attribute
return if line_item.skip_stock_check
quantity_to_validate = line_item.quantity - quantity_in_shipment(line_item)
return if quantity_to_validate < 1
validate_quantity(line_item, quantity_to_validate)
end
private
# This is an adapted version of a fix to the inventory_units not being considered here.
# See #3090 for details.
# This can be removed after upgrading to Spree 2.4.
def quantity_in_shipment(line_item)
shipment = line_item_shipment(line_item)
return 0 unless shipment
units = shipment.inventory_units_for(line_item.variant)
units.count
end
def line_item_shipment(line_item)
return line_item.target_shipment if line_item.target_shipment
return line_item.order.shipments.first if line_item.order.andand.shipments.any?
end
# Overrides Spree v2.0.4 validate method version to:
# - scope variants to hub and thus acivate variant overrides
# - use calculated quantity instead of the line_item.quantity
# - rely on Variant.can_supply? instead of Stock::Quantified.can_supply?
# so that it works correctly for variant overrides
def validate_quantity(line_item, quantity)
line_item.scoper.scope(line_item.variant)
add_out_of_stock_error(line_item) unless line_item.variant.can_supply? quantity
end
def add_out_of_stock_error(line_item)
variant = line_item.variant
display_name = variant.name.to_s
display_name += %{(#{variant.options_text})} if variant.options_text.present?
line_item.errors[:quantity] << Spree.t(:out_of_stock,
scope: :order_populator,
item: display_name.inspect)
end
end