Implemented stats for ordergroups on startpage. Annotated models.

This commit is contained in:
Benjamin Meichsner 2009-08-01 13:41:22 +02:00
parent 709425855e
commit d848831fea
65 changed files with 407 additions and 338 deletions

View file

@ -1,29 +1,29 @@
# == Schema Information
# Schema version: 20090120184410
#
# Table name: groups
#
# id :integer not null, primary key
# id :integer(4) not null, primary key
# type :string(255) default(""), not null
# name :string(255) default(""), not null
# description :string(255)
# account_balance :decimal(, ) default(0.0), not null
# account_balance :decimal(8, 2) default(0.0), not null
# account_updated :datetime
# created_on :datetime not null
# role_admin :boolean not null
# role_suppliers :boolean not null
# role_article_meta :boolean not null
# role_finance :boolean not null
# role_orders :boolean not null
# weekly_task :boolean
# weekday :integer
# role_admin :boolean(1) not null
# role_suppliers :boolean(1) not null
# role_article_meta :boolean(1) not null
# role_finance :boolean(1) not null
# role_orders :boolean(1) not null
# weekly_task :boolean(1)
# weekday :integer(4)
# task_name :string(255)
# task_description :string(255)
# task_required_users :integer default(1)
# task_required_users :integer(4) default(1)
# deleted_at :datetime
# contact_person :string(255)
# contact_phone :string(255)
# contact_address :string(255)
# stats :text
#
# Ordergroups can order, they are "children" of the class Group
@ -34,6 +34,7 @@
class Ordergroup < Group
acts_as_paranoid # Avoid deleting the ordergroup for consistency of order-results
extend ActiveSupport::Memoizable # Ability to cache method results. Use memoize :expensive_method
serialize :stats
has_many :financial_transactions, :order => "created_on DESC"
has_many :group_orders
@ -41,6 +42,8 @@ class Ordergroup < Group
validates_numericality_of :account_balance, :message => 'ist keine gültige Zahl'
after_create :update_stats!
def contact
"#{contact_phone} (#{contact_person})"
end
@ -76,6 +79,23 @@ class Ordergroup < Group
end
end
def update_stats!
time = 6.month.ago
jobs = users.collect { |u| u.tasks.done.all(:conditions => ["updated_on > ?", time]).size }.sum
orders_sum = group_orders.collect { |go| go.price if go.order.ends > time }.sum
update_attribute(:stats, {:jobs_size => jobs, :orders_sum => orders_sum})
end
def avg_jobs_per_euro
stats[:orders_sum] != 0 ? stats[:jobs_size].to_f / stats[:orders_sum].to_f : 0
end
# Global average
def self.avg_jobs_per_euro
stats = Ordergroup.all.collect(&:stats)
stats.collect {|s| s[:jobs_size].to_f }.sum / stats.collect {|s| s[:orders_sum].to_f }.sum
end
private
# If this order group's account balance is made negative by the given/last transaction,