Created
August 27, 2011 14:23
-
-
Save mb-dev/1175448 to your computer and use it in GitHub Desktop.
LineItem model
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class LineItem | |
include Mongoid::Document | |
include Mongoid::Timestamps | |
TYPE = %w[income expense] | |
INCOME = 0 | |
EXPENSE = 1 | |
TRANSFER_IN = 'Transfer In' | |
TRANSFER_OUT = 'Transfer Out' | |
field :type, :type => Integer, :default => 1 | |
field :amount, :type => BigDecimal, :default => 0 | |
field :event_date, :type => Date, :default => Time.now.to_date | |
field :category_name | |
field :payee_name | |
field :comment | |
field :balance, :type => BigDecimal | |
field :virtual, :type => Boolean | |
field :master, :type => Boolean | |
belongs_to :spanned, :class_name => 'SpannedLineItem' | |
scope :default_sort, desc(:event_date, :created_at) | |
scope :regular, where(:master.ne => true) | |
def type_name | |
TYPE[type].capitalize | |
end | |
def income? | |
type == INCOME | |
end | |
def expense? | |
type == EXPENSE | |
end | |
# 1 for income, -1 for expense | |
def multiplier | |
type == EXPENSE ? -1 : 1 | |
end | |
def event_date_string(str) | |
event_date = Date.parse(str) | |
end | |
def self.reset_balance | |
current_balance = 0 | |
default_sort.reverse.each do |item| | |
if(!item.virtual) | |
current_balance += item.amount * item.multiplier | |
end | |
if(item.balance != current_balance) | |
item.balance = current_balance | |
item.save | |
end | |
end | |
end | |
def clone_all | |
attribute_values = attributes.select {|a| !%w(id, _id, created_at).include? a} | |
attribute_values.delete('_id') | |
LineItem.new attribute_values | |
end | |
def clone_new | |
LineItem.new(:event_date => event_date) | |
end | |
# Spanning Support | |
def span(months) | |
spanned_line_item = SpannedLineItem.create(:master_line_item => self , :months => months) | |
self.master = true | |
self.spanned = spanned_line_item | |
save | |
monthly_amount = self.amount / months | |
(1..months).collect do |month_num| | |
virtual_line_item = clone_all | |
virtual_line_item.amount = monthly_amount | |
virtual_line_item.master = nil | |
virtual_line_item.virtual = true | |
virtual_line_item.event_date = event_date >> (month_num-1) | |
virtual_line_item.spanned = spanned_line_item | |
virtual_line_item.save | |
virtual_line_item | |
end | |
end | |
def is_spanned | |
spanned != nil | |
end | |
def spanned_months | |
spanned.months unless spanned.nil? | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment