検証:check_product_stock
def check_product_stock
@thisproduct = product.id
@productbeingchecked = Product.find_by_id(@thisproduct)
@stocknumber = @productbeingchecked.stock_number
if producto.en_stock == 0
raise "El Producto no tiene stock suficiente para completar la venta"
#errors.add :venta, "Producto con pedos de stock"
return false
end
true
end
end
モデル (販売) の作成時に検証できるようにする必要があります。関連付け (製品) の場合、stock_number という product.column でゼロに達していません。
全体を書き直す必要があると思いますが、validate :check_product_stock を使用して、製品がゼロに達していないかどうかをチェックするメソッドをゼロから構築し、フラッシュ通知をスローして同じ場所に留まる必要があります (販売/新規)
class Venta < ActiveRecord::Base
hobo_model # Don't put anything above this
belongs_to :cliente, :accessible => true
belongs_to :producto, :accessible => true
belongs_to :marca, :accessible => true
belongs_to :vendedor
belongs_to :instalador
has_many :devolucions
fields do
numero_de_serie :string
precio_de_venta :integer
precio_de_instalacion :integer, :default => "0"
forma_de_pago enum_string(:contado, :tarjeta)
status enum_string(:activa, :cancelada)
timestamps
end
validates_presence_of :cliente, :precio_de_venta, :vendedor, :precio_de_instalacion
validate_on_create :check_product_stock
after_save :descontar_precio_de_instalacion_si_el_instalador_es_a_destajo
#def stock_error
#flash[:notice] = "Producto con pedos de stock"
# redirect_to :controller => :venta, :action => :stock_error
#errors.add_to_base("Producto con pedos de stock")
# end
def check_product_stock
if producto.en_stock == 0
raise "El Producto no tiene stock suficiente para completar la venta"
#errors.add :venta, "Producto con pedos de stock"
return false
end
true
end
#def check_product_stock
# if producto.en_stock == 0
# errors.add :producto, "El Producto no tiene stock suficiente para completar la venta"
# return false
# end
# true # guards against returning nil which is interpreted as false.
#end
def descontar_precio_de_instalacion_si_el_instalador_es_a_destajo
@este_instalador_id = instalador.id
@instalador = Instalador.find_by_id(@este_instalador_id)
if @instalador.a_destajo?
@last_venta = Venta.find(:last)
@vid = @last_venta.id
@precio_de_instalacion_original = precio_de_instalacion
@mitad_de_instalacion = @precio_de_instalacion_original/2
#Venta.update(@vid, :precio_de_instalacion => @mitad_de_instalacion)
ActiveRecord::Base.connection.execute "UPDATE ventas SET precio_de_instalacion = #{@mitad_de_instalacion} WHERE id = #{@vid};"
end
end
#after_save :reduce_product_stock_number
# def reduce_product_stock_number
# Producto.decrement_counter(:en_stock, producto.id)
# end
# --- Permissions --- #
def create_permitted?
true
end
def update_permitted?
false
end
def destroy_permitted?
false
end
def view_permitted?(field)
true
end
end
これは、producto から en_stock 列を減らす私のオブザーバーです。
class VentaObserver < ActiveRecord::Observer
def after_save(venta)
@venta_as_array = venta
if venta.producto_id?
@pid = @venta_as_array[:producto_id]
Producto.decrement_counter(:en_stock, @pid)
end
if venta.cart_id
@cid = @venta_as_array[:cart_id]
@cart = Cart.find_by_id(@cid)
for item in @cart.cart_items do
# @pid = @cart.cart_items.producto.id
Producto.decrement_counter(:en_stock, item.producto.id)
end
#si el instalador es a destajo se debe descontar la mitad del rpecio de instalacion
end
end
end