finrb 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.dockerignore +2 -0
- data/.gitattributes +83 -0
- data/.gitignore +114 -0
- data/.rubocop.yml +19 -0
- data/.ruby-version +1 -0
- data/.semver +5 -0
- data/.travis.yml +7 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +74 -0
- data/COPYING +674 -0
- data/COPYING.LESSER +165 -0
- data/Dockerfile +35 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +116 -0
- data/README.md +99 -0
- data/Rakefile +33 -0
- data/docs/.gitkeep +0 -0
- data/docs/api.md +1104 -0
- data/finrb.gemspec +98 -0
- data/lib/finrb/amortization.rb +199 -0
- data/lib/finrb/cashflows.rb +171 -0
- data/lib/finrb/config.rb +11 -0
- data/lib/finrb/decimal.rb +23 -0
- data/lib/finrb/rates.rb +167 -0
- data/lib/finrb/transaction.rb +124 -0
- data/lib/finrb/utils.rb +1171 -0
- data/lib/finrb.rb +23 -0
- metadata +306 -0
@@ -0,0 +1,124 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'decimal'
|
4
|
+
|
5
|
+
module Finrb
|
6
|
+
# the Transaction class provides a general interface for working with individual cash flows.
|
7
|
+
# @api public
|
8
|
+
class Transaction
|
9
|
+
# @return [DecNum] the cash value of the transaction
|
10
|
+
# @api public
|
11
|
+
attr_reader :amount
|
12
|
+
# @return [Integer] the period number of the transaction
|
13
|
+
# @note this attribute is mainly used in the case of mortgage amortization with no dates
|
14
|
+
# @api public
|
15
|
+
attr_accessor :period
|
16
|
+
# @return [Date] the date of the transaction
|
17
|
+
# @api public
|
18
|
+
attr_accessor :date
|
19
|
+
|
20
|
+
# create a new Transaction
|
21
|
+
# @return [Transaction]
|
22
|
+
# @param [Numeric] amount the cash value of the transaction
|
23
|
+
# @param [optional, Hash] opts sets optional attributes
|
24
|
+
# @option opts [String] :period the period number of the transaction
|
25
|
+
# @example a simple transaction
|
26
|
+
# t = Transaction.new(400)
|
27
|
+
# @example a transaction with a period number
|
28
|
+
# t = Transaction.new(400, :period => 3)
|
29
|
+
# @api public
|
30
|
+
def initialize(amount, opts = {})
|
31
|
+
@amount = amount
|
32
|
+
@original = amount
|
33
|
+
|
34
|
+
# Set optional attributes..
|
35
|
+
opts.each do |key, value|
|
36
|
+
send("#{key}=", value)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Set the cash value of the transaction
|
41
|
+
# @return None
|
42
|
+
# @param [Numeric] value the cash value
|
43
|
+
# @example
|
44
|
+
# t = Transaction.new(500)
|
45
|
+
# t.amount = 750
|
46
|
+
# t.amount #=> 750
|
47
|
+
# @api public
|
48
|
+
def amount=(value)
|
49
|
+
@amount = Flt::DecNum.new(value.to_s) || 0
|
50
|
+
end
|
51
|
+
|
52
|
+
# @return [DecNum] the difference between the original transaction
|
53
|
+
# amount and the current amount
|
54
|
+
# @example
|
55
|
+
# t = Transaction.new(500)
|
56
|
+
# t.amount = 750
|
57
|
+
# t.difference #=> DecNum('250')
|
58
|
+
# @api public
|
59
|
+
def difference
|
60
|
+
@amount - @original
|
61
|
+
end
|
62
|
+
|
63
|
+
# @return [Boolean] whether or not the Transaction is an Interest transaction
|
64
|
+
# @example
|
65
|
+
# pmt = Payment.new(500)
|
66
|
+
# int = Interest.new(500)
|
67
|
+
# pmt.interest? #=> False
|
68
|
+
# int.interest? #=> True
|
69
|
+
# @api public
|
70
|
+
def interest?
|
71
|
+
instance_of?(Interest)
|
72
|
+
end
|
73
|
+
|
74
|
+
# @api public
|
75
|
+
def inspect
|
76
|
+
"Transaction(#{@amount.round(2)}, date: #{@date})"
|
77
|
+
end
|
78
|
+
|
79
|
+
# Modify a Transaction's amount by passing a block
|
80
|
+
# @return none
|
81
|
+
# @note self is passed as the argument to the block. This makes any public attribute available.
|
82
|
+
# @example add $100 to a monthly payment
|
83
|
+
# pmt = Payment.new(-500)
|
84
|
+
# pmt.modify { |t| t.amount-100 }
|
85
|
+
# pmt.amount #=> -600
|
86
|
+
# @api public
|
87
|
+
def modify
|
88
|
+
@amount = yield(self)
|
89
|
+
end
|
90
|
+
|
91
|
+
# (see #amount)
|
92
|
+
# @deprecated Provided for backwards compatibility
|
93
|
+
def payment
|
94
|
+
@amount
|
95
|
+
end
|
96
|
+
|
97
|
+
# @return [Boolean] whether or not the Transaction is a Payment transaction
|
98
|
+
# @example
|
99
|
+
# pmt = Payment.new(500)
|
100
|
+
# int = Interest.new(500)
|
101
|
+
# pmt.payment? #=> True
|
102
|
+
# int.payment? #=> False
|
103
|
+
# @api public
|
104
|
+
def payment?
|
105
|
+
instance_of?(Payment)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# Represent an interest charge as a Transaction
|
110
|
+
# @see Transaction
|
111
|
+
class Interest < Transaction
|
112
|
+
def inspect
|
113
|
+
"Interest(#{@amount})"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# Represent a loan payment as a Transaction
|
118
|
+
# @see Transaction
|
119
|
+
class Payment < Transaction
|
120
|
+
def inspect
|
121
|
+
"Payment(#{@amount})"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|