diff --git a/app/assets/javascripts/orders.js.coffee b/app/assets/javascripts/orders.js.coffee index dd24a72..32d707f 100644 --- a/app/assets/javascripts/orders.js.coffee +++ b/app/assets/javascripts/orders.js.coffee @@ -22,7 +22,7 @@ disIfNec = (row) -> 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)) + $('#order_price').val((value / 100.0).toFixed(2)) increment = (button, n) -> row = $(button).closest('.form_row') diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 8c72e73..1df7505 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -34,7 +34,7 @@ class OrdersController < ApplicationController def destroy order = Order.find(params[:id]) if order.created_at > 5.minutes.ago - order.destroy + order.cancel flash[:success] = "Order has been removed." else flash[:error] = "This order has been placed too long ago, it can't be removed. Please contact a sysadmin." @@ -61,6 +61,6 @@ class OrdersController < ApplicationController private def order_params - params.require(:order).permit(order_items_attributes: [:count, product_attributes: [:id]]) + params.require(:order).permit(order_items_attributes: [:count, :price, product_attributes: [:id]]) end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 154d1ef..84336bf 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -3,9 +3,9 @@ class UsersController < ApplicationController def show @user = User.find_by_id(params[:id]) || current_user - @orders = @user.orders.includes(:products).order(:created_at).reverse_order.paginate(page: params[:page]) - @products = @user.products.select("products.*", "sum(order_items.count) as count").group(:product_id).order("count desc") - @categories = @user.products.select("products.category", "sum(order_items.count) as count").group(:category) + @orders = @user.orders.active.includes(:products).order(:created_at).reverse_order.paginate(page: params[:page]) + @products = @user.products.select("products.*", "sum(order_items.count) as count").where("orders.cancelled = ?", false).group(:product_id).order("count desc") + @categories = @user.products.select("products.category", "sum(order_items.count) as count").where("orders.cancelled = ?", false).group(:category) end def index diff --git a/app/form_builders/formatted_form_builder.rb b/app/form_builders/formatted_form_builder.rb index 956a645..3f52ff2 100644 --- a/app/form_builders/formatted_form_builder.rb +++ b/app/form_builders/formatted_form_builder.rb @@ -28,7 +28,12 @@ class FormattedFormBuilder < ActionView::Helpers::FormBuilder def price_field(name, options = {}) options[:min] ||= 0 - options[:value] ||= number_with_precision(object[name], precision: 2) + # if object.is_a?(ActiveRecord::Base) + # options[:value] ||= object[name] + if object.respond_to?(name) + options[:value] ||= object.send name + end + options[:value] = number_with_precision(options[:value], precision: 2) form_group_builder(name, options) do number_field_without_format(name, options) diff --git a/app/models/ability.rb b/app/models/ability.rb index 41b711a..d1515ca 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -11,6 +11,7 @@ class Ability elsif user[:id] can :read, :all can :update, User + can :dagschotel, User can :create, Order end end diff --git a/app/models/order.rb b/app/models/order.rb index 0968511..619c09b 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -12,14 +12,15 @@ class Order < ActiveRecord::Base include ActionView::Helpers::TextHelper - after_initialize { self.total_price = 0 } - after_create { self.user.increment!(:balance_cents, -price) } - before_destroy { self.user.increment!(:balance_cents, price) } + after_initialize { self.price = 0 } + after_create { self.user.decrement!(:balance_cents, price) } belongs_to :user, counter_cache: true has_many :order_items, dependent: :destroy has_many :products, through: :order_items + scope :active, -> { where(cancelled: false) } + attr_accessor :total_price validates :user, presence: true @@ -31,6 +32,17 @@ class Order < ActiveRecord::Base self.order_items.map{ |oi| oi.count * oi.product.price_cents }.sum end + def price=(_) + write_attribute(:price, price) + end + + def cancel + return if self.cancelled + user.increment!(:balance_cents, price) + User.decrement_counter(:orders_count, user.id) + update_attribute(:cancelled, true) + end + def to_sentence self.order_items.map { |oi| pluralize(oi.count, oi.product.name) diff --git a/app/views/order_items/_total_price.html.erb b/app/views/orders/_price.html.erb similarity index 72% rename from app/views/order_items/_total_price.html.erb rename to app/views/orders/_price.html.erb index 28dfbe2..67e1ff5 100644 --- a/app/views/order_items/_total_price.html.erb +++ b/app/views/orders/_price.html.erb @@ -2,7 +2,7 @@ <%= f.label :total_price %>
- <%= f.number_field :total_price, skip_label: true, step: :any, class: 'form-control big-form-field' %> + <%= f.number_field :price, skip_label: true, step: :any, class: 'form-control big-form-field' %> <%= f.submit "Order!", class: "btn btn-primary big-form-button" %> diff --git a/app/views/orders/new.html.erb b/app/views/orders/new.html.erb index c153339..a139965 100644 --- a/app/views/orders/new.html.erb +++ b/app/views/orders/new.html.erb @@ -10,6 +10,6 @@ <% end %>
- <%= render 'order_items/total_price', f: f %> + <%= render 'orders/price', f: f %> <% end %> diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index fae2039..d85f831 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -7,10 +7,10 @@
BALANCE: <%= euro(@user.balance) %>
- <% if @user.orders.any? %> + <% if @orders.any? %>

Total products

- Total:
+ Total:

Specifics:
<%= render partial: "products/product_row", collection: @products, as: :product %> diff --git a/db/migrate/20150310075658_add_cancelled_boolean_to_orders.rb b/db/migrate/20150310075658_add_cancelled_boolean_to_orders.rb new file mode 100644 index 0000000..9f93241 --- /dev/null +++ b/db/migrate/20150310075658_add_cancelled_boolean_to_orders.rb @@ -0,0 +1,5 @@ +class AddCancelledBooleanToOrders < ActiveRecord::Migration + def change + add_column :orders, :cancelled, :boolean, default: false + end +end diff --git a/db/migrate/20150310080932_change_cost_to_price_in_orders.rb b/db/migrate/20150310080932_change_cost_to_price_in_orders.rb new file mode 100644 index 0000000..b7e5fc1 --- /dev/null +++ b/db/migrate/20150310080932_change_cost_to_price_in_orders.rb @@ -0,0 +1,5 @@ +class ChangeCostToPriceInOrders < ActiveRecord::Migration + def change + rename_column :orders, :cost, :price + end +end diff --git a/db/schema.rb b/db/schema.rb index 54e2982..98dc99b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150210062809) do +ActiveRecord::Schema.define(version: 20150310080932) do create_table "order_items", force: :cascade do |t| t.integer "order_id" @@ -21,9 +21,10 @@ ActiveRecord::Schema.define(version: 20150210062809) do create_table "orders", force: :cascade do |t| t.integer "user_id" - t.integer "cost" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.integer "price" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "cancelled", default: false end add_index "orders", ["user_id", "created_at"], name: "index_orders_on_user_id_and_created_at" diff --git a/db/seeds.rb b/db/seeds.rb index 30fdf1b..28fc1d4 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -6,76 +6,3 @@ # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) # Mayor.create(name: 'Emanuel', city: cities.first) -DEFAULT_PASSWORD = "password" - -products = [ - { - name: 'Fanta', - price: 0.6, - category: 'beverages', - stock: 25, - avatar: File.new('public/seeds/products/fanta.jpg', 'r') - }, - { - name: 'Club Mate', - price: 1.2, - category: 'beverages', - stock: 25, - avatar: File.new('public/seeds/products/club_mate.jpg', 'r') - }, - { - name: 'Kinder Bueno', - price: 0.6, - category: 'food', - stock: 15, - avatar: File.new('public/seeds/products/bueno.jpg', 'r') - } -] - -products.each do |attr| - Product.create name: attr[:name], price: attr[:price], category: attr[:category], stock: attr[:stock], avatar: attr[:avatar] -end - -users = [ - { - nickname: 'admin', - name: 'A.', - last_name: 'Admin', - avatar: File.new('public/seeds/users/admin.jpg', 'r'), - admin: true - }, - { - nickname: 'koelkast', - name: 'K.', - last_name: 'Koelkast', - avatar: File.new('public/seeds/users/admin.jpg', 'r'), - koelkast: true - }, - { - nickname: 'benji', - name: 'Benjamin', - last_name: 'Cousaert', - avatar: File.new('public/seeds/users/benji.jpg', 'r'), - dagschotel: Product.first - }, - { - nickname: 'don', - name: 'Lorin', - last_name: 'Werthen', - avatar: File.new('public/seeds/users/don.jpg', 'r') - }, - { - nickname: 'silox', - name: 'Tom', - last_name: 'Naessens', - avatar: File.new('public/seeds/users/silox.jpg', 'r') - } -] - -users.each do |attr| - User.create nickname: attr[:nickname], name: attr[:name], last_name: attr[:last_name], avatar: attr[:avatar], dagschotel: attr[:dagschotel], password: DEFAULT_PASSWORD, password_confirmation: DEFAULT_PASSWORD, admin: attr[:admin] || false, koelkast: attr[:koelkast] || false -end - -50.times do |i| - User.create nickname: "TestUser#{i}", name: "Test", last_name: "User", avatar: users[0][:avatar], password: DEFAULT_PASSWORD, password_confirmation: DEFAULT_PASSWORD -end diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake new file mode 100644 index 0000000..a62be4e --- /dev/null +++ b/lib/tasks/db.rake @@ -0,0 +1,79 @@ +namespace :db do + desc "Fill the database with some sample data." + task generatedata: :environment do + DEFAULT_PASSWORD = "password" + + products = [ + { + name: 'Fanta', + price: 0.6, + category: 'beverages', + stock: 25, + avatar: File.new('public/seeds/products/fanta.jpg', 'r') + }, + { + name: 'Club Mate', + price: 1.2, + category: 'beverages', + stock: 25, + avatar: File.new('public/seeds/products/club_mate.jpg', 'r') + }, + { + name: 'Kinder Bueno', + price: 0.6, + category: 'food', + stock: 15, + avatar: File.new('public/seeds/products/bueno.jpg', 'r') + } + ] + + products.each do |attr| + Product.create name: attr[:name], price: attr[:price], category: attr[:category], stock: attr[:stock], avatar: attr[:avatar] + end + + users = [ + { + nickname: 'admin', + name: 'A.', + last_name: 'Admin', + avatar: File.new('public/seeds/users/admin.jpg', 'r'), + admin: true + }, + { + nickname: 'koelkast', + name: 'K.', + last_name: 'Koelkast', + avatar: File.new('public/seeds/users/admin.jpg', 'r'), + koelkast: true + }, + { + nickname: 'benji', + name: 'Benjamin', + last_name: 'Cousaert', + avatar: File.new('public/seeds/users/benji.jpg', 'r'), + dagschotel: Product.first + }, + { + nickname: 'don', + name: 'Lorin', + last_name: 'Werthen', + avatar: File.new('public/seeds/users/don.jpg', 'r') + }, + { + nickname: 'silox', + name: 'Tom', + last_name: 'Naessens', + avatar: File.new('public/seeds/users/silox.jpg', 'r') + } + ] + + users.each do |attr| + User.create nickname: attr[:nickname], name: attr[:name], last_name: attr[:last_name], avatar: attr[:avatar], dagschotel: attr[:dagschotel], password: DEFAULT_PASSWORD, password_confirmation: DEFAULT_PASSWORD, admin: attr[:admin] || false, koelkast: attr[:koelkast] || false + end + + 50.times do |i| + User.create nickname: "TestUser#{i}", name: "Test", last_name: "User", avatar: users[0][:avatar], password: DEFAULT_PASSWORD, password_confirmation: DEFAULT_PASSWORD + end + end + +end