Skip to content

Instantly share code, notes, and snippets.

@mb-dev
Created August 27, 2011 14:23
Show Gist options
  • Save mb-dev/1175448 to your computer and use it in GitHub Desktop.
Save mb-dev/1175448 to your computer and use it in GitHub Desktop.
LineItem model
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