diff --git a/app/assets/stylesheets/orders.css.scss b/app/assets/stylesheets/orders.css.scss index a173404..7c4a3c0 100644 --- a/app/assets/stylesheets/orders.css.scss +++ b/app/assets/stylesheets/orders.css.scss @@ -26,11 +26,13 @@ } button.product { width: 100%; + height: 100px; p { overflow: hidden; text-overflow: ellipsis; } img { + max-height: 70%; max-width: 100%; margin-left: auto; margin-right: auto; diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index c863a32..6589a89 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -26,7 +26,7 @@ class OrdersController < ApplicationController end def overview - @users = User.members.publik.order(:name) + @users = User.members.publik.order(frecency: :desc) @last = Order.order(:created_at).reverse_order.includes(:user).limit(10).map(&:user) end diff --git a/app/models/order.rb b/app/models/order.rb index b8379b8..a5276c9 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -21,6 +21,9 @@ class Order < ActiveRecord::Base before_save { |o| o.order_items = o.order_items.reject{ |oi| oi.count == 0 } } after_create :create_api_job, unless: -> { user.guest? } + after_create :update_user_frecency + after_destroy :update_user_frecency + validates :user, presence: true validates_associated :order_items validate :product_presence @@ -66,4 +69,8 @@ class Order < ActiveRecord::Base def product_presence errors.add(:base, "You have to order at least one product.") if order_items.map(&:count).sum.zero? end + + def update_user_frecency + self.user.calculate_frecency + end end diff --git a/app/models/user.rb b/app/models/user.rb index af1ab09..3045c69 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -41,6 +41,15 @@ class User < ActiveRecord::Base end end + def calculate_frecency + num_orders = Rails.application.config.frecency_num_orders + last_datetimes = self.orders.order(created_at: :desc) + .limit(num_orders) + .pluck(:created_at) + self.frecency = last_datetimes.map(&:to_time).map(&:to_i).sum / num_orders + self.save + end + def balance @balance || begin headers = { diff --git a/app/views/orders/_products_modal.html.haml b/app/views/orders/_products_modal.html.haml index 140f390..6df19a7 100644 --- a/app/views/orders/_products_modal.html.haml +++ b/app/views/orders/_products_modal.html.haml @@ -13,7 +13,7 @@ .col-md-2{ data: { name: product.name } } %button.btn.btn-default.product{ data: { product: product.id, dismiss: :modal } } %p= product.name - = image_tag product.avatar(:dagschotel), class: "center" + = image_tag product.avatar(:dagschotel), class: "center img-responsive" .modal-footer %button.btn.btn-default{ data: { dismiss: :modal } } Close diff --git a/app/views/orders/new.html.haml b/app/views/orders/new.html.haml index e47a076..6771d96 100644 --- a/app/views/orders/new.html.haml +++ b/app/views/orders/new.html.haml @@ -5,9 +5,9 @@ = form_tag nil, id: "from_barcode_form", data: { url: URI.join(root_url, "barcodes").to_s } do %input.center-block{ type: :number, name: :id, autofocus: true } = "- OR -" - %button.btn.btn-default.center-block{ data: { toggle: :modal, target: "#products_modal" } } - Select Product Without Barcode - %br + %p + %button.btn.btn-default.center-block{ data: { toggle: :modal, target: "#products_modal" } } + Select Product Without Barcode .col-md-4.col-md-offset-1 = form_for [@user, @order] do |f| = render 'errors', object: @order diff --git a/app/views/products/link.html.haml b/app/views/products/link.html.haml index 2129714..21c138e 100644 --- a/app/views/products/link.html.haml +++ b/app/views/products/link.html.haml @@ -1,12 +1,14 @@ .row .col-md-7 - %h4.pull-right Select a product to link the barcode to an existing product ... - #product_buttons.row - - Product.all.each do |product| - .col-md-3 - = button_to product_barcodes_path(product), class: "btn btn-default product", data: { product: product.id, dismiss: :modal }, params: { "barcode[code]" => params[:barcode] } do - %p= product.name - = image_tag product.avatar(:dagschotel), class: "center" + %h4.center Select a product to link the barcode to an existing product ... + %p + #product_buttons.row + - Product.all.each do |product| + %tr + .col-md-3 + = button_to product_barcodes_path(product), class: "btn btn-default product", data: { product: product.id, dismiss: :modal }, params: { "barcode[code]" => params[:barcode] } do + %p= product.name + = image_tag product.avatar(:dagschotel), class: "center img-responsive" .col-md-5 %h4 or create a new one = render 'products/form' diff --git a/app/views/welcome/index.html.haml b/app/views/welcome/index.html.haml index 8537b15..09a6b75 100644 --- a/app/views/welcome/index.html.haml +++ b/app/views/welcome/index.html.haml @@ -1,4 +1,5 @@ = content_for :title, "Login" -If this is the first time you log in, an account will be created for you. +%p + If this is the first time you log in, an account will be created for you. %div = link_to "Sign in with Zeus WPI account.", omniauth_authorize_path("user", "zeuswpi"), class: "btn btn-large btn-primary" diff --git a/config/application.rb b/config/application.rb index 440e031..ab81a82 100644 --- a/config/application.rb +++ b/config/application.rb @@ -22,5 +22,6 @@ module Tab002 config.active_record.raise_in_transactional_callbacks = true config.active_job.queue_adapter = :delayed_job config.call_api_after = 5.minutes + config.frecency_num_orders = 10 end end diff --git a/db/migrate/20160216133104_add_frecency_to_users.rb b/db/migrate/20160216133104_add_frecency_to_users.rb new file mode 100644 index 0000000..66e377d --- /dev/null +++ b/db/migrate/20160216133104_add_frecency_to_users.rb @@ -0,0 +1,5 @@ +class AddFrecencyToUsers < ActiveRecord::Migration + def change + add_column :users, :frecency, :integer, default: 0, null: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 9b20310..e3d3c0e 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: 20160202133903) do +ActiveRecord::Schema.define(version: 20160216133104) do create_table "barcodes", force: :cascade do |t| t.integer "product_id" @@ -85,6 +85,7 @@ ActiveRecord::Schema.define(version: 20160202133903) do t.boolean "koelkast", default: false t.string "name" t.boolean "private", default: false + t.integer "frecency", default: 0, null: false end add_index "users", ["koelkast"], name: "index_users_on_koelkast" diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 7aab751..f21a132 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -133,4 +133,23 @@ describe User do expect(User.publik).to eq([@user, user]) end end + + describe 'frecency' do + it 'should be recalculated on creating an order' do + expect(@user.frecency).to eq 0 + create :order, user: @user + expect(@user.frecency).to_not eq 0 + end + + it 'should be valid' do + dates = [Date.today.to_time, Date.yesterday.to_time] + dates.each do |date| + create :order, user: @user, created_at: date + end + @user.reload + num_orders = Rails.application.config.frecency_num_orders + frecency = dates.last(num_orders).map(&:to_i).sum/num_orders + expect(@user.frecency).to eq(frecency) + end + end end