OpenProject is the leading open source project management software.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openproject/app/models/entry.rb

81 lines
1.9 KiB

require_dependency "time_entry"
require_dependency "cost_entry"
module Entry
[TimeEntry, CostEntry].each { |e| e.send :include, self }
class Delegator < ActiveRecord::Base
self.abstract_class = true
class << self
def ===(obj)
TimeEntry === obj or CostEntry === obj
end
def calculate(type, *args)
a, b = TimeEntry.calculate(type, *args), CostEntry.calculate(type, *args)
case type
when :sum, :count then a + b
when :avg then (a + b) / 2
when :min then [a, b].min
when :max then [a, b].max
else raise NotImplementedError
end
end
%[find_by_sql count_by_sql count sum].each do |meth|
define_method(meth) { |*args| find_all(meth, *args) }
end
undef_method :create, :update, :delete, :destroy, :new, :update_counters,
:increment_counter, :decrement_counter
%w[update_all destroy_all delete_all].each do |meth|
define_method(meth) { |*args| send_all(meth, *args) }
end
private
def find_initial(options) find_one :find_initial, options end
def find_last(options) find_one :find_last, options end
def find_every(options) find_many :find_every, options end
def find_from_ids(args, options) find_many :find_from_ids, options end
def find_one(*args)
TimeEntry.send(*args) || CostEntry.send(*args)
end
def find_many(*args)
TimeEntry.send(*args) + CostEntry.send(*args)
end
def send_all(*args)
[TimeEntry.send(*args), CostEntry.send(*args)]
end
end
end
def units
super
rescue NoMethodError
hours
end
def cost_type
super
rescue NoMethodError
end
def activity
super
rescue NoMethodError
end
def activity_id
super
rescue NoMethodError
end
def self.method_missing(*a, &b)
Delegator.send(*a, &b)
end
end