diff --git a/app/assets/javascripts/orders.js.coffee b/app/assets/javascripts/orders.js.coffee index 51219d5..dd24a72 100644 --- a/app/assets/javascripts/orders.js.coffee +++ b/app/assets/javascripts/orders.js.coffee @@ -10,13 +10,20 @@ ready = -> $('.form_row').each((index, row) -> disIfNec(row) + $(row).on('input', recalculate) ) + recalculate() + disIfNec = (row) -> counter = parseInt($(row).find('.row_counter').val()) $(row).find('.btn-dec').prop('disabled', counter == 0); $(row).find('.btn-inc').prop('disabled', counter == parseInt($(row).find('.stock').val())) +recalculate = () -> + value = ($(row).find('.row_counter').val() * $(row).find('.price').val() for row in $('.form_row')).reduce (a, b) -> a+b + $('#order_total_price').val((value / 100.0).toFixed(2)) + increment = (button, n) -> row = $(button).closest('.form_row') @@ -27,10 +34,7 @@ increment = (button, n) -> # Disable buttons if necessary disIfNec(row) - # Update the price - oldVal = parseFloat($('#order_total_price').val()) * 100 - newVal = (oldVal + parseInt($(row).find('.price').val()) * n)/100 - $('#order_total_price').val(newVal.toFixed(2)) + recalculate() $(document).ready(ready) $(document).on('page:load', ready) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index e954635..0b4abc7 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,27 +1,28 @@ class OrdersController < ApplicationController + include ActionView::Helpers::NumberHelper + load_and_authorize_resource def new @user = User.find(params[:user_id]) - @order = @user.orders.build - @products = Product.all - @order_items = @order.order_items + redirect_to root_path, flash: { error: "Koelkast can't order things." } if @user.koelkast? - @products.each do |p| - @order_items.build(product: p) - end + @order = @user.orders.build + @order.g_order_items(Product.all) end def create @user = User.find(params[:user_id]) + redirect_to root_path, flash: { error: "Koelkast can't order things." } if @user.koelkast? + @order = @user.orders.build(order_params) - @products = Product.all - @order_items = @order.order_items if @order.save flash[:success] = "#{@order.to_sentence} ordered. Enjoy it!" redirect_to root_path else + @order.g_order_items(Product.all, order_params) + @order.total_price = number_with_precision((@order.price / 100.0), precision: 2) render 'new' end end @@ -34,7 +35,7 @@ class OrdersController < ApplicationController else flash[:error] = "This order has been placed too long ago, it can't be removed. Please contact a sysadmin." end - redirect_to koelkast_root_path + redirect_to root_path end def overview @@ -57,6 +58,6 @@ class OrdersController < ApplicationController private def order_params - params.require(:order).permit(order_items_attributes: [:count, product_attributes: [:id, :price_cents, :stock]]) + params.require(:order).permit(order_items_attributes: [:count, product_attributes: [:id]]) end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index ac9b2d1..19f1f26 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,7 +1,8 @@ class UsersController < ApplicationController + load_and_authorize_resource + def show @user = User.find_by_id(params[:id]) || current_user - authorize! :read, @user @orders = @user.orders.includes(:products).paginate(page: params[:page]) @products = @user.products.select("products.*", "sum(order_items.count) as count").group(:product_id) @categories = @user.products.select("products.category", "sum(order_items.count) as count").group(:category) @@ -9,12 +10,10 @@ class UsersController < ApplicationController def index @users = User.members - authorize! :read, @users end def destroy @user = User.find(params[:id]) - authorize! :destroy, @users @user.destroy flash[:success] = "Succesfully removed user" redirect_to action: :index diff --git a/app/models/order.rb b/app/models/order.rb index c8199a2..6c05b40 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -36,4 +36,15 @@ class Order < ActiveRecord::Base |oi| pluralize(oi.count, oi.product.name) }.to_sentence end + + def g_order_items(products, params = {}) + products.each do |p| + if (oi = self.order_items.select { |t| t.product == p }).size > 0 + puts oi.inspect + oi.first.count = [oi.first.product.stock, oi.first.count].min + else + self.order_items.build(product: p) + end + end + end end diff --git a/app/models/user.rb b/app/models/user.rb index fc1c0a5..98af485 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -38,6 +38,8 @@ class User < ActiveRecord::Base belongs_to :dagschotel, class_name: 'Product' validates :nickname, presence: true, uniqueness: true + validates :name, presence: true + validates :last_name, presence: true validates_attachment :avatar, content_type: { content_type: ["image/jpeg", "image/gif", "image/png"] } # validates_attachment :avatar, presence: true diff --git a/app/validators/in_stock_validator.rb b/app/validators/in_stock_validator.rb index 8063195..ee7f3e3 100644 --- a/app/validators/in_stock_validator.rb +++ b/app/validators/in_stock_validator.rb @@ -1,7 +1,9 @@ class InStockValidator < ActiveModel::Validator def validate(record) + p_short = [] record.order_items.each do |oi| - record.errors[oi.product.name] = "is not in stock anymore" if oi.count > oi.product.stock + p_short.append oi.product.name if oi.count > oi.product.stock end + record.errors.add(:base, "There is not enough stock for your order of the following products: #{p_short.join(', ')}") if p_short.size > 0 end end diff --git a/app/views/application/_flash.html.erb b/app/views/application/_flash.html.erb index 6ff50c6..18a7538 100644 --- a/app/views/application/_flash.html.erb +++ b/app/views/application/_flash.html.erb @@ -23,4 +23,10 @@ Warning! <%= flash[:warning] %> <% end %> + <% if flash[:alert] %> +
+ + Error! <%= flash[:alert] %> +
+ <% end %> diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 2542006..e156b18 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -11,60 +11,62 @@ - + + + + + <% end %> diff --git a/app/views/users/_user.html.erb b/app/views/users/_user.html.erb index 2fc8bda..ccb4054 100644 --- a/app/views/users/_user.html.erb +++ b/app/views/users/_user.html.erb @@ -1,6 +1,6 @@
-

<%= user.full_name %>

+

<%= link_to user.full_name, user %>

<%= image_tag(user.avatar , class: "img-circle avatar") %>

Name: <%= user.name %>

@@ -8,11 +8,13 @@

Nickname: <%= user.nickname %>

Balance: <%= euro(user.balance) %>

- + <% end %>
diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index ba4eef3..24b6427 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -3,7 +3,7 @@

<%= @user.full_name %> - <%= @user.nickname %> - <%= link_to "edit" , edit_user_registration_path %> + <%= link_to "edit", edit_user_registration_path if current_user == @user %>

Balance: <%= euro(@user.balance) %>

diff --git a/db/seeds.rb b/db/seeds.rb index d894c6b..a8c4c4a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -46,6 +46,8 @@ users = [ }, { nickname: 'koelkast', + name: 'K.', + last_name: 'Koelkast', # avatar: File.new('public/seeds/users/admin.jpg', 'r'), koelkast: true },