diff --git a/app/assets/javascripts/orders.js.coffee b/app/assets/javascripts/orders.js.coffee index 9eab234..82460bb 100644 --- a/app/assets/javascripts/orders.js.coffee +++ b/app/assets/javascripts/orders.js.coffee @@ -9,14 +9,18 @@ ready = -> increment($(this), -1) $('.btn-dec').prop("disabled", true) + $('.btn-inc').each((index, button) -> + $(button).prop("disabled", $(button).closest('.form_row').find('.stock').val() == '0') + ) increment = (button, n) -> # Fix the counter counter = $(button).closest('.form_row').find('.row_counter') counter.val(parseInt(counter.val()) + n) - # Enable or disable the dec button - counter.parent().find('.btn-dec').prop("disabled", counter.val() == '0'); + # Enable or disable the buttons + counter.parent().find('.btn-dec').prop('disabled', counter.val() == '0'); + counter.parent().find('.btn-inc').prop('disabled', counter.val() == counter.parent().find('.stock').val()); # Update the price oldVal = parseFloat($('#order_total_price').val()) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6dc5891..e1b823c 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -5,8 +5,7 @@ class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? rescue_from CanCan::AccessDenied do |exception| - flash[:error] = exception.message - redirect_to root_path + redirect_to root_path, flash: { error: exception.message } end def after_sign_in_path_for(resource) @@ -14,7 +13,7 @@ class ApplicationController < ActionController::Base end def after_sign_up_path_for(resource) - new_user_session_path + root_path end protected @@ -24,9 +23,9 @@ class ApplicationController < ActionController::Base :nickname, :name, :last_name, :password, :password_confirmation, :current_password, :avatar ) } + devise_parameter_sanitizer.for(:account_update) { |u| u.permit( :password, :password_confirmation, :current_password, :avatar ) } end - end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 49a3d62..9f7f4ea 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -19,8 +19,9 @@ class OrdersController < ApplicationController @order = @user.orders.build(order_params) @products = Product.all @order_products = @order.order_products + if @order.save - flash[:success] = order_to_sentence(@order) + " ordered. Enjoy it!" + flash[:success] = "#{@order.to_sentence} ordered. Enjoy it!" redirect_to root_path else render 'new' @@ -33,13 +34,13 @@ class OrdersController < ApplicationController end def quickpay - @user = User.find(params[:user_id]) - order = @user.orders.build - order.products << @user.dagschotel + user = User.find(params[:user_id]) + order = user.orders.build + order.products << user.dagschotel if order.save flash[:success] = "Quick pay succeeded" else - flash[:error] = "Quick pay went wrong ... Sorry!" + flash[:error] = order.errors.full_messages.first end redirect_to root_path end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 1503814..8f7223c 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -36,13 +36,13 @@ class ProductsController < ApplicationController def destroy Product.find(params[:id]).destroy flash[:success] = "Succesfully removed product" - redirect_to products_path + redirect_to action: :index end private def product_params - params.require(:product).permit(:name, :price, :avatar, :category) + params.require(:product).permit(:name, :price, :avatar, :category, :stock) end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 65bde11..6dd3098 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,5 +1,5 @@ class UsersController < ApplicationController - load_and_authorize_resource only: [:destroy] + load_and_authorize_resource def show @user = User.find_by_id(params[:id]) || current_user @@ -15,7 +15,7 @@ class UsersController < ApplicationController def destroy User.find(params[:id]).destroy flash[:success] = "Succesfully removed user" - redirect_to users_path + redirect_to action: :index end def dagschotel diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 251c11f..30a084a 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -13,11 +13,6 @@ module ApplicationHelper "€#{number_with_precision f, precision: 2}" end - #tijdelijk voor layout - def koelkast(status) - @koelkast ||= status - end - # Form helpers def form_errors(object) render partial: "form_errors", locals: {object: object} diff --git a/app/helpers/orders_helper.rb b/app/helpers/orders_helper.rb index 96d4633..443227f 100644 --- a/app/helpers/orders_helper.rb +++ b/app/helpers/orders_helper.rb @@ -1,9 +1,2 @@ module OrdersHelper - include ActionView::Helpers::TextHelper - - def order_to_sentence(order) - order.order_products.map { - |op| pluralize(op.count, op.product.name) - }.to_sentence - end end diff --git a/app/models/order.rb b/app/models/order.rb index aed4b45..11d129f 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -10,8 +10,10 @@ # class Order < ActiveRecord::Base + include ActionView::Helpers::TextHelper + after_initialize { self.total_price = 0 } - after_create :pay_price + after_create { self.user.pay(price) } belongs_to :user, counter_cache: true has_many :order_products @@ -20,21 +22,17 @@ class Order < ActiveRecord::Base attr_accessor :total_price validates :user, presence: true - validates :order_products, presence: true + validates :order_products, presence: true, in_stock: true accepts_nested_attributes_for :order_products, reject_if: proc { |op| op[:count].to_i <= 0 } def price - price = 0 - order_products.each do |op| - price += op.count * op.product.read_attribute(:price) - end - price + self.order_products.map{ |op| op.count * op.product.price }.sum end - private - - def pay_price - user.pay(price) - end + def to_sentence + self.order_products.map { + |op| pluralize(op.count, op.product.name) + }.to_sentence + end end diff --git a/app/models/order_product.rb b/app/models/order_product.rb index 0ac8ac4..a50d958 100644 --- a/app/models/order_product.rb +++ b/app/models/order_product.rb @@ -9,6 +9,8 @@ # class OrderProduct < ActiveRecord::Base + after_create :remove_from_stock + belongs_to :order belongs_to :product @@ -16,4 +18,11 @@ class OrderProduct < ActiveRecord::Base validates :count, numericality: { greater_than_or_equal_to: 0 } accepts_nested_attributes_for :product + + private + + def remove_from_stock + product.stock -= self.count + product.save + end end diff --git a/app/models/product.rb b/app/models/product.rb index 131189a..9dd33d6 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -12,6 +12,7 @@ # avatar_file_size :integer # avatar_updated_at :datetime # category :integer default(0) +# stock :integer default(0) # class Product < ActiveRecord::Base @@ -22,6 +23,7 @@ class Product < ActiveRecord::Base validates :name, presence: true validates :price, numericality: { only_integer: true, greater_than_or_equal_to: 0 } + validates :stock, numericality: { only_integer: true, greater_than_or_equal_to: 0 } validates_attachment :avatar, presence: true, content_type: { content_type: ["image/jpeg", "image/gif", "image/png"] } def price diff --git a/app/models/user.rb b/app/models/user.rb index 729dd2f..5270616 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -23,12 +23,13 @@ # avatar_file_size :integer # avatar_updated_at :datetime # orders_count :integer default(0) +# koelkast :boolean default(FALSE) # class User < ActiveRecord::Base - devise :database_authenticatable, :registerable, - :rememberable, :trackable - has_attached_file :avatar, styles: { medium: "100x100>" }, default_style: :medium, default_url: "http://babeholder.pixoil.com/img/70/70" + devise :database_authenticatable, :registerable, :rememberable, :trackable + has_attached_file :avatar, styles: { medium: "100x100>" }, default_style: :medium, + default_url: "http://babeholder.pixoil.com/img/70/70" has_many :orders, -> { includes :products } has_many :products, through: :orders diff --git a/app/validators/in_stock_validator.rb b/app/validators/in_stock_validator.rb new file mode 100644 index 0000000..8705fc0 --- /dev/null +++ b/app/validators/in_stock_validator.rb @@ -0,0 +1,7 @@ +class InStockValidator < ActiveModel::Validator + def validate(record) + record.order_products.each do |op| + record.errors[op.product.name] = "is not in stock anymore" if op.count > op.product.stock + end + end +end diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb index 724991f..e73609c 100644 --- a/app/views/devise/registrations/edit.html.erb +++ b/app/views/devise/registrations/edit.html.erb @@ -1,4 +1,5 @@