financial 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.infinity_test +16 -0
- data/.rspec +3 -0
- data/.rvmrc +1 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +74 -0
- data/README.markdown +157 -0
- data/Rakefile +1 -0
- data/duck_tales.gif +0 -0
- data/example.png +0 -0
- data/examples/two_accounts.rb +32 -0
- data/features/portuguese_dsl.feature +93 -0
- data/features/print_financial_table.feature +318 -0
- data/features/support/env.rb +1 -0
- data/financial.gemspec +22 -0
- data/lib/financial.rb +39 -0
- data/lib/financial/account.rb +129 -0
- data/lib/financial/account_manager.rb +26 -0
- data/lib/financial/balance.rb +11 -0
- data/lib/financial/balance_calculation.rb +35 -0
- data/lib/financial/cost.rb +34 -0
- data/lib/financial/costs.rb +30 -0
- data/lib/financial/deposit.rb +30 -0
- data/lib/financial/deposits.rb +15 -0
- data/lib/financial/dsl.rb +16 -0
- data/lib/financial/financial_date.rb +18 -0
- data/lib/financial/financial_table.rb +109 -0
- data/lib/financial/locale.rb +153 -0
- data/lib/financial/locales/en.yml +34 -0
- data/lib/financial/locales/pt.yml +67 -0
- data/lib/financial/parcels.rb +87 -0
- data/lib/financial/per_cent.rb +12 -0
- data/lib/financial/print_table.rb +34 -0
- data/lib/financial/revenue.rb +40 -0
- data/lib/financial/revenues.rb +16 -0
- data/lib/financial/rspec_matchers.rb +32 -0
- data/lib/financial/tax.rb +4 -0
- data/lib/financial/version.rb +3 -0
- data/spec/financial/account_manager_spec.rb +38 -0
- data/spec/financial/account_spec.rb +399 -0
- data/spec/financial/balance_spec.rb +44 -0
- data/spec/financial/cost_spec.rb +78 -0
- data/spec/financial/costs_spec.rb +18 -0
- data/spec/financial/deposit_spec.rb +78 -0
- data/spec/financial/deposits_spec.rb +23 -0
- data/spec/financial/english_spec.rb +76 -0
- data/spec/financial/financial_date_spec.rb +50 -0
- data/spec/financial/financial_spec.rb +14 -0
- data/spec/financial/financial_table_spec.rb +31 -0
- data/spec/financial/locale_spec.rb +37 -0
- data/spec/financial/parcels_spec.rb +179 -0
- data/spec/financial/per_cent_spec.rb +24 -0
- data/spec/financial/portuguese_spec.rb +117 -0
- data/spec/financial/print_table_spec.rb +76 -0
- data/spec/financial/revenue_spec.rb +89 -0
- data/spec/financial/revenues_spec.rb +18 -0
- data/spec/financial/tax_spec.rb +42 -0
- data/spec/spec_helper.rb +25 -0
- metadata +139 -0
@@ -0,0 +1,179 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module Financial
|
5
|
+
describe Parcels do
|
6
|
+
describe '#number' do
|
7
|
+
it 'should set and get the number of the parcels' do
|
8
|
+
Parcels.new(6).number.should be 6
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#name' do
|
13
|
+
it 'should set and get the name of the parcels in english' do
|
14
|
+
Financial.locale = :en
|
15
|
+
Parcels.new(3).name.should == "Parcel"
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should set and get the name of the parcels in portuguese' do
|
19
|
+
Financial.locale = :pt
|
20
|
+
Parcels.new(3).name.should == "Parcela"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'default instances' do
|
25
|
+
it 'should return zero as default value of the parcels' do
|
26
|
+
Parcels.new(1).value_of_the_parcels.should be 0
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should return the first day as default day of the parcels' do
|
30
|
+
Parcels.new(2).day_of_the_parcels.should be 1
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should return the current month of the beginning month' do
|
34
|
+
Date.should_receive(:today).and_return(Date.civil(2011, 7, 3))
|
35
|
+
Parcels.new(3).beginning_month.should equal 7
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#of' do
|
40
|
+
it 'should set the value of the parcels' do
|
41
|
+
Parcels.new(5).of(500).value_of_the_parcels.should equal 500
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#every_day' do
|
46
|
+
it 'should set the day of the parcels' do
|
47
|
+
Parcels.new(3).every_day(14).day_of_the_parcels.should equal 14
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#beginning' do
|
52
|
+
it 'should set the beginning month' do
|
53
|
+
Financial.locale = :en
|
54
|
+
Parcels.new(2).beginning(:september).beginning_month.should equal 9
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should be possible to set a portuguese month name' do
|
58
|
+
Financial.locale = :pt
|
59
|
+
Parcels.new(4).beginning(:janeiro).beginning_month.should equal 1
|
60
|
+
Financial.locale = :en
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should return the current month if dont pass a beginning month' do
|
64
|
+
Date.should_receive(:today).and_return(Date.civil(2011, 6, 1))
|
65
|
+
Parcels.new(4).beginning_month.should equal 6
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should raise if dont have the month specified' do
|
69
|
+
expect {
|
70
|
+
Parcels.new(2).beginning(:dont_exist)
|
71
|
+
}.to raise_error Financial::MonthDontExist
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#choose_month_for' do
|
76
|
+
context 'for parcels with less then twelve numbers' do
|
77
|
+
let(:parcels) { Parcels.new(9) }
|
78
|
+
before do
|
79
|
+
mock_date(20, 1, 2011)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should choose the exactly months' do
|
83
|
+
parcels.choose_month_for(0).should be 1
|
84
|
+
parcels.choose_month_for(7).should be 8
|
85
|
+
parcels.choose_month_for(8).should be 9
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'for parcels with greater then twelve numbers' do
|
90
|
+
let(:parcels) { Parcels.new(13) }
|
91
|
+
|
92
|
+
before do
|
93
|
+
mock_date(20, 6, 2011)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should choose the exactly months' do
|
97
|
+
parcels.choose_month_for(0).should be 6
|
98
|
+
parcels.choose_month_for(6).should be 12
|
99
|
+
parcels.choose_month_for(7).should be 1
|
100
|
+
parcels.choose_month_for(9).should be 3
|
101
|
+
parcels.choose_month_for(12).should be 6
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe '#choose_year_for' do
|
107
|
+
it 'should choose the current year' do
|
108
|
+
mock_date(4, 7, 2011)
|
109
|
+
Parcels.new(2).choose_year_for(:parcel_number => 3).should be 2011
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'should choose the next year for parcel that pass this current year' do
|
113
|
+
mock_date(20, 6, 2011)
|
114
|
+
Parcels.new(8).choose_year_for(:parcel_number => 7).should be 2012
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'should choose this next years from now too' do
|
118
|
+
mock_date(20, 8, 2011)
|
119
|
+
parcels = Parcels.new(30)
|
120
|
+
parcels.choose_year_for(:parcel_number => 5).should be 2012
|
121
|
+
parcels.choose_year_for(:parcel_number => 13).should be 2012
|
122
|
+
parcels.choose_year_for(:parcel_number => 17).should be 2013
|
123
|
+
parcels.choose_year_for(:parcel_number => 18).should be 2013
|
124
|
+
parcels.choose_year_for(:parcel_number => 29).should be 2014
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe '#+' do
|
129
|
+
it 'should sum a parcel with a cost' do
|
130
|
+
(Parcels.new(2).of(500) + Cost.new(:credit_card, 300)).should be 1300
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe '#to_cost' do
|
135
|
+
let(:parcels) { Parcels.new(4).of(200) }
|
136
|
+
let(:costs) { parcels.to_cost }
|
137
|
+
before(:each) do
|
138
|
+
costs.should_not be_empty
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'should converting to many costs' do
|
142
|
+
parcels.to_cost.should have(4).items
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'should converting to cost with the correct value' do
|
146
|
+
costs.all? {|cost| cost.value == 200 }.should be_true
|
147
|
+
end
|
148
|
+
|
149
|
+
context "with many dates" do
|
150
|
+
let(:parcels) { Parcels.new(12).of(200).every_day(4).beginning(:july) }
|
151
|
+
|
152
|
+
before(:each) do
|
153
|
+
Date.should_receive(:today).at_least(:once).and_return(Date.civil(2011, 7, 2))
|
154
|
+
Financial.locale = :en
|
155
|
+
@costs = parcels.to_cost
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should return the date for the first parcel" do
|
159
|
+
@costs[0].date.should == Date.civil(2011, 7, 4)
|
160
|
+
end
|
161
|
+
|
162
|
+
it "should return the date for the second parcel" do
|
163
|
+
Financial.locale = :en
|
164
|
+
@costs[1].date.should == Date.civil(2011, 8, 4)
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should return the date for the third parcel" do
|
168
|
+
Financial.locale = :en
|
169
|
+
@costs[2].date.should == Date.civil(2011, 9, 4)
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should return the date for the fourth parcel" do
|
173
|
+
Financial.locale = :en
|
174
|
+
@costs[3].date.should == Date.civil(2011, 10, 4)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Financial
|
4
|
+
describe PerCent do
|
5
|
+
include Financial::PerCent
|
6
|
+
|
7
|
+
describe '#per_cent' do
|
8
|
+
it 'should return the porcentage of Fixnum value' do
|
9
|
+
6.per_cent.should == 0.06
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should return the porcentage of Float Value' do
|
13
|
+
64.4.per_cent.should == 0.644
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should return the porcentage in portuguese too' do
|
17
|
+
original_locale = Financial.locale
|
18
|
+
Financial.locale = :pt
|
19
|
+
99.por_cento.should == 0.99
|
20
|
+
Financial.locale = original_locale.name
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
Financial.locale = :pt
|
4
|
+
include Financial::PerCent
|
5
|
+
|
6
|
+
conta :uma_conta_de_banco do
|
7
|
+
total -500
|
8
|
+
end
|
9
|
+
|
10
|
+
conta :banco_com_dinheiro do
|
11
|
+
total 4000
|
12
|
+
|
13
|
+
depositos do
|
14
|
+
deposite(500).na_conta(:uma_conta_de_banco).na_data('27/07/2011')
|
15
|
+
end
|
16
|
+
|
17
|
+
custos do
|
18
|
+
proxima_fatura(1000).na_data('26/07/2011')
|
19
|
+
parcelas(6).de(316).todo_dia(19)
|
20
|
+
parcelas(12).de(67).todo_dia(05).comecando_no_mes_de(:setembro)
|
21
|
+
end
|
22
|
+
|
23
|
+
faturamento do
|
24
|
+
nota_fiscal(2500).na_data('02/07/2011').imposto(6.por_cento).na_data('17/07/2011')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'account :banco_com_dinheiro' do
|
29
|
+
let(:banco_com_dinheiro) { Financial::Account.find(:name => :banco_com_dinheiro) }
|
30
|
+
let(:uma_conta_de_banco) { Financial::Account.find(:name => :uma_conta_de_banco)}
|
31
|
+
|
32
|
+
before do
|
33
|
+
stub_date(1, 7, 2011)
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#name' do
|
37
|
+
it 'should have :banco_com_dinheiro as a name' do
|
38
|
+
banco_com_dinheiro.name.should equal :banco_com_dinheiro
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#total' do
|
43
|
+
it 'should have a total' do
|
44
|
+
banco_com_dinheiro.total.should equal 4000
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should store negative totals too' do
|
48
|
+
uma_conta_de_banco.total.should be -500
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#costs' do
|
53
|
+
it 'should have many costs counting taxes' do
|
54
|
+
banco_com_dinheiro.costs.should have(19).items
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'all costs should be instance of Costs' do
|
58
|
+
banco_com_dinheiro.costs.all? { |cost|
|
59
|
+
cost.instance_of?(Financial::Cost)
|
60
|
+
}.should be_true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '#total_costs' do
|
65
|
+
it 'should calculate the total costs' do
|
66
|
+
banco_com_dinheiro.total_costs.should == 4350 # costs + deposits + taxes
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#revenues' do
|
71
|
+
it 'should have some revenues' do
|
72
|
+
banco_com_dinheiro.revenues.should have(1).item
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe '#deposits' do
|
77
|
+
it 'should have some deposits' do
|
78
|
+
banco_com_dinheiro.deposits.should have(1).item
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#total_revenues' do
|
83
|
+
it 'should calculate the total revenues' do
|
84
|
+
banco_com_dinheiro.total_revenues.should equal 2500
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe '#taxes' do
|
89
|
+
it 'should have some taxes' do
|
90
|
+
banco_com_dinheiro.taxes.should have(1).item
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe '#calculate_balances' do
|
95
|
+
before do
|
96
|
+
banco_com_dinheiro.calculate_balances
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should include balance in the date 02/07/2011' do
|
100
|
+
Financial.locale = :pt
|
101
|
+
Financial.locale.name.should be :pt
|
102
|
+
banco_com_dinheiro.balances.should include_balance(6500).in_date('02/07/2011')
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should include one balance for :uma_conta_de_banco' do
|
106
|
+
uma_conta_de_banco.balances.should have(1).items
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'should include the recevied deposit from :banco_com_dinheiro' do
|
110
|
+
uma_conta_de_banco.balances.should include_balance(0).in_date('27/07/2011')
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should have many balances' do
|
114
|
+
banco_com_dinheiro.balances.should have(22).items
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Financial
|
4
|
+
describe PrintTable do
|
5
|
+
let(:print_table) { PrintTable.new(:my_account) }
|
6
|
+
let(:print_all) { PrintTable.new(:all) }
|
7
|
+
|
8
|
+
describe '#account_name' do
|
9
|
+
it 'should return the name of the account to run' do
|
10
|
+
print_table.account_name.should equal :my_account
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should return all accounts to run' do
|
14
|
+
print_all.account_name.should equal :all
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#account' do
|
19
|
+
let(:my_bank_account) { Financial.account_manager.new_account(:my_bank_account) }
|
20
|
+
|
21
|
+
it 'should return an array of accounts instances' do
|
22
|
+
my_bank_account
|
23
|
+
PrintTable.new(:my_bank_account).account.should == [my_bank_account]
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should return all accounts when pass :all option' do
|
27
|
+
my_bank_account
|
28
|
+
print_all.account.should equal AccountManager.instance.accounts
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#initial_date' do
|
33
|
+
it 'should return the current date for defaults' do
|
34
|
+
print_table.initial_date.should == Date.today
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#final_date' do
|
39
|
+
it 'should return the current date for defaults' do
|
40
|
+
print_table.final_date.should == Date.today
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#from' do
|
45
|
+
|
46
|
+
it 'should be possible to use portuguese dates' do
|
47
|
+
Financial.locale = :pt
|
48
|
+
print_table.from('20/12/2011')
|
49
|
+
print_table.initial_date.should == Date.civil(2011, 12, 20)
|
50
|
+
Financial.locale = :en
|
51
|
+
Financial.locale
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should assign the @from accessor' do
|
55
|
+
print_table.from('02/02/2002')
|
56
|
+
print_table.initial_date.should == Date.civil(2002, 2, 2)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#to' do
|
61
|
+
|
62
|
+
it 'should be possible to use portuguese dates' do
|
63
|
+
Financial.locale = :pt
|
64
|
+
print_table.to('20/12/2011')
|
65
|
+
print_table.final_date.should == Date.civil(2011, 12, 20)
|
66
|
+
Financial.locale = :en
|
67
|
+
Financial.locale
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should assign the @from accessor' do
|
71
|
+
print_table.to('02/02/2002')
|
72
|
+
print_table.final_date.should == Date.civil(2002, 2, 2)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Financial
|
4
|
+
describe Revenue do
|
5
|
+
let(:revenue) { Revenue.new(:salary, 500) }
|
6
|
+
|
7
|
+
describe '#name' do
|
8
|
+
it 'should return the name capitalized' do
|
9
|
+
revenue.name.should == "Salary"
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should return the name capitalized with spaces' do
|
13
|
+
Revenue.new(:my_precious_salary, 400).name.should == "My precious salary"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#method_name' do
|
18
|
+
it 'should set the method name' do
|
19
|
+
revenue.method_name.should equal :salary
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#value' do
|
24
|
+
it 'should return the value' do
|
25
|
+
revenue.value.should be 500
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#format_value' do
|
30
|
+
it 'should format the value passing an - sign' do
|
31
|
+
Revenue.new(:cost, 400).format_value.should == "+ 400,00"
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should pass the cents value' do
|
35
|
+
Revenue.new(:super_cost, 1_000.99).format_value.should == "+ 1000,99"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#date' do
|
40
|
+
it 'should return the today date' do
|
41
|
+
revenue.date.should == Date.today
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#in_date' do
|
46
|
+
it 'should return the date in english format' do
|
47
|
+
Financial.locale = :en
|
48
|
+
revenue.in_date('6/19/2011').date.should == Date.civil(2011, 6, 19)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should return the date in portuguese format' do
|
52
|
+
Financial.locale = :pt
|
53
|
+
revenue.in_date('20/06/2011').date.should == Date.civil(2011, 6, 20)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#tax' do
|
58
|
+
it 'should return a tax' do
|
59
|
+
revenue.tax(0.06).should be_instance_of(Financial::Tax)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should set the method name' do
|
63
|
+
revenue.tax(1.08).method_name.should == :salary
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should set the name' do
|
67
|
+
revenue.tax(1.08).name.should == "Salary"
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should set calculate the value multiplying the revenue value by the tax' do
|
71
|
+
revenue.tax(0.12).value.should == 60.0 # 500 * 0.12
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should calculate the value decreasing the tax' do
|
75
|
+
revenue.tax(:decreases => 10).value.should == 10
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should persist the value if dont have args' do
|
79
|
+
revenue.tax(1)
|
80
|
+
revenue.tax.value.should be 500
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should set the instance variable name' do
|
84
|
+
revenue.tax(0.10)
|
85
|
+
revenue.instance_variable_get(:@tax).should be_instance_of(Financial::Tax)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|