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 %>
Total products
- Total:
- <%=@categories.map{|c| pluralize(c.count, c.category)}.join(", ")%>
+ Total:
- <%= @categories.map{|c| pluralize(c.count, c.category)}.join(", ")%>
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