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,44 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module Financial
|
5
|
+
describe Balance do
|
6
|
+
let(:balance) { Balance.new(100, '07/14/2011')}
|
7
|
+
describe '#value' do
|
8
|
+
it 'should get and set the value' do
|
9
|
+
balance.value.should equal 100
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#name' do
|
15
|
+
after(:each) do
|
16
|
+
Financial.locale = :en
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should return the the name in english' do
|
20
|
+
Balance.new(100, '07/14/2011').name.should == 'Balance'
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should return the name in portuguese' do
|
24
|
+
Financial.locale = :pt
|
25
|
+
Balance.new(100, '17/1/2011').name.should == "Saldo"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#date' do
|
30
|
+
after(:each) do
|
31
|
+
Financial.locale = :en
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should get and set the date' do
|
35
|
+
balance.date.should == Date.civil(2011, 7, 14)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should not need to set date when is a Date object' do
|
39
|
+
date = Date.civil(2011, 1, 1)
|
40
|
+
Balance.new(100, date).date.should == date
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Financial
|
4
|
+
describe Cost do
|
5
|
+
describe '#name' do
|
6
|
+
it 'should assign the name in a string capitalize and with space' do
|
7
|
+
Cost.new(:a_cost, 400).name.should == "A cost"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#method_name' do
|
12
|
+
it 'should assign the method name in string' do
|
13
|
+
Cost.new(:other_cost, 599).method_name.should equal :other_cost
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#date' do
|
18
|
+
it 'should return the date of today' do
|
19
|
+
Cost.new(:other_cost, 400).date.should == Date.today
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#value' do
|
24
|
+
it 'should assign the value passing an Array' do
|
25
|
+
Cost.new(:cost, [400]).value.should equal 400
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should assign the value when not passing an array' do
|
29
|
+
Cost.new(:super_cost, 1_000).value.should equal 1_000
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#format_value' do
|
34
|
+
it 'should format the value passing an - sign' do
|
35
|
+
Cost.new(:cost, [400]).format_value.should == "- 400,00"
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should pass the cents value' do
|
39
|
+
Cost.new(:super_cost, 1_000.99).format_value.should == "- 1000,99"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#+' do
|
44
|
+
it 'should sum all the values for cost' do
|
45
|
+
(Cost.new(:credit, 100) + Cost.new(:card, 400)).should be 500
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#in_date' do
|
50
|
+
let(:credit_card) { Cost.new(:credit_card, 199) }
|
51
|
+
context 'when is in portuguese' do
|
52
|
+
it 'should get and set the day/month/year format' do
|
53
|
+
Financial.locale = :pt
|
54
|
+
credit_card.na_data('20/12/2011').date.should == Date.civil(2011, 12, 20)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'dont pass any args or nil arguments' do
|
59
|
+
it 'should return the default date' do
|
60
|
+
Financial.locale = :en
|
61
|
+
credit_card.in_date.date.should == Date.today
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should return the today date if a date is nil' do
|
65
|
+
Financial.locale = :en
|
66
|
+
credit_card.in_date(nil).date.should == Date.today
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when is in english' do
|
71
|
+
it 'should get and set the month/day/year format' do
|
72
|
+
Financial.locale = :en
|
73
|
+
credit_card.in_date('12/20/2011').date.should == Date.civil(2011, 12, 20)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Financial
|
4
|
+
describe Costs do
|
5
|
+
let(:costs) { Costs.new }
|
6
|
+
describe '#method_missing' do
|
7
|
+
it 'should create a cost when passing an argument' do
|
8
|
+
costs.super_cost(100).should be_instance_of(Cost)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should raise error when pass without argument' do
|
12
|
+
expect {
|
13
|
+
costs.credit_card
|
14
|
+
}.to raise_error Financial::CostWithoutValue, "Cost: credit_card don't have a value. Pass a value!"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Financial
|
4
|
+
describe Deposit do
|
5
|
+
let(:deposit) { Deposit.new(1000, :a_account_name) }
|
6
|
+
|
7
|
+
describe '#name' do
|
8
|
+
after(:each) do
|
9
|
+
ensure_locale :en
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should return the the name in english' do
|
13
|
+
deposit.name.should == 'Deposit: anonymous'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should return the name in portuguese' do
|
17
|
+
Financial.locale = :pt
|
18
|
+
deposit.in_account(:super).name.should == "Deposito: super"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#value' do
|
23
|
+
it 'should return the value of deposit' do
|
24
|
+
deposit.value.should be 1000
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#date' do
|
29
|
+
it 'should return the current date for defaults' do
|
30
|
+
deposit.date.should == Date.today
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#account_name' do
|
35
|
+
it 'should return the account name' do
|
36
|
+
deposit.account_name.should equal :a_account_name
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#in_account' do
|
41
|
+
it 'should set the name of account' do
|
42
|
+
deposit.in_account(:bank_account).account_to_deposit.should be :bank_account
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should set anonymous account if dont pass a account to deposit' do
|
46
|
+
deposit.account_to_deposit.should be :anonymous
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#is_a_received_deposit?' do
|
51
|
+
let(:state_bank) { Account.new(:state_bank) }
|
52
|
+
let(:country_bank) { Account.new(:country_bank) }
|
53
|
+
let(:city_bank) { Account.new(:city_bank) }
|
54
|
+
|
55
|
+
it 'should return false if is a deposit for that same account' do
|
56
|
+
deposits = state_bank.deposits do
|
57
|
+
deposit(400).in_account(:country_bank)
|
58
|
+
end
|
59
|
+
event = deposits.first
|
60
|
+
event.is_a_received_deposit?(state_bank).should equal false
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should return false if is a received deposit but for other account' do
|
64
|
+
deposits = city_bank.deposits do
|
65
|
+
deposit(600).in_account(:country_bank)
|
66
|
+
end
|
67
|
+
deposits.first.is_a_received_deposit?(state_bank).should equal false
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should return true if is a return deposit to the account' do
|
71
|
+
deposits = city_bank.deposits do
|
72
|
+
deposit(600).in_account(:state_bank)
|
73
|
+
end
|
74
|
+
deposits.first.is_a_received_deposit?(state_bank).should be_true
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Financial
|
4
|
+
describe Deposits do
|
5
|
+
describe '#deposit' do
|
6
|
+
let(:deposits) { Deposits.new(:super_account) }
|
7
|
+
|
8
|
+
it 'should create a cost when passing an argument' do
|
9
|
+
deposits.deposit(100).should be_instance_of(Deposit)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should get the account name' do
|
13
|
+
deposits.deposit(200).account_name.should be :super_account
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should raise error when pass without argument' do
|
17
|
+
expect {
|
18
|
+
deposits.deposit
|
19
|
+
}.to raise_error ArgumentError
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
Financial.locale = :en
|
4
|
+
include Financial::PerCent
|
5
|
+
|
6
|
+
account :my_account do
|
7
|
+
total -2000
|
8
|
+
end
|
9
|
+
|
10
|
+
account :mega_bank_account, :as => 'Bank Account' do
|
11
|
+
total 1099
|
12
|
+
|
13
|
+
deposits do
|
14
|
+
deposit(2000).in_account(:my_account)
|
15
|
+
end
|
16
|
+
|
17
|
+
costs do
|
18
|
+
a_cost(400).in_date('7/30/2011')
|
19
|
+
other_cost(500).in_date('7/31/2011')
|
20
|
+
other_other_cost(100) # will use current date if dont pass a date option
|
21
|
+
parcels(2).of(500).every_day(6).beginning(:september)
|
22
|
+
end
|
23
|
+
|
24
|
+
revenues do # or billing do
|
25
|
+
a_revenue(300).tax(:decreases => 200).in_date('09/20/2011') # The profit here will be 100
|
26
|
+
other_revenue(500).in_date('07/15/2011').tax(6.per_cent).in_date('08/20/2011')
|
27
|
+
bill(2000).tax(12.per_cent)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'account :my_account' do
|
33
|
+
let(:bank_account) { Financial::Account.find(:name => :mega_bank_account) }
|
34
|
+
|
35
|
+
describe '#name' do
|
36
|
+
it 'should have :bank_account as a name' do
|
37
|
+
bank_account.name.should equal :mega_bank_account
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#total' do
|
42
|
+
it 'should have a total' do
|
43
|
+
bank_account.total.should equal 1099
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#costs' do
|
48
|
+
it 'should have many costs' do
|
49
|
+
bank_account.costs.should have(5).items
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#total_costs' do
|
54
|
+
it 'should calculate the total costs' do
|
55
|
+
bank_account.total_costs.should == 4470.0
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#revenues' do
|
60
|
+
it 'should have some revenues' do
|
61
|
+
bank_account.revenues.should have(3).items
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '#total_revenues' do
|
66
|
+
it 'should calculate the total revenues' do
|
67
|
+
bank_account.total_revenues.should equal 2800
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#taxes' do
|
72
|
+
it 'should have some taxes' do
|
73
|
+
bank_account.taxes.should have(3).items
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Financial
|
4
|
+
describe FinancialDate do
|
5
|
+
describe '#date' do
|
6
|
+
it 'should return today date when pass nil argument' do
|
7
|
+
FinancialDate.new(nil).date.should == Date.today
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'in portuguese date' do
|
11
|
+
let(:date) {
|
12
|
+
Financial.locale = :pt
|
13
|
+
FinancialDate.new('14/09/2011')
|
14
|
+
}
|
15
|
+
|
16
|
+
it 'should parse and return the day' do
|
17
|
+
date.day.should equal 14
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should parse and return the month' do
|
21
|
+
date.month.should equal 9
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should parse and return year' do
|
25
|
+
date.year.should equal 2011
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'in english date' do
|
30
|
+
let(:date) {
|
31
|
+
Financial.locale = :en
|
32
|
+
FinancialDate.new('08/19/2011')
|
33
|
+
}
|
34
|
+
|
35
|
+
it 'should parse and return the day' do
|
36
|
+
date.day.should equal 19
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should parse and return the month' do
|
40
|
+
date.month.should equal 8
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should parse and return year' do
|
44
|
+
date.year.should equal 2011
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Financial do
|
4
|
+
describe '.locale' do
|
5
|
+
it 'should return the default locale if dont have a locale' do
|
6
|
+
Financial.locale.should == Financial::Locale.new(:en)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should assign and get the locale name' do
|
10
|
+
Financial.locale = :pt
|
11
|
+
Financial.locale.should == Financial::Locale.new(:pt)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Financial
|
6
|
+
describe FinancialTable do
|
7
|
+
let(:account) { Account.new(:federal_bank) }
|
8
|
+
let(:print_table) { PrintTable.new(:federal_bank) }
|
9
|
+
let(:financial_table) { FinancialTable.new(account, print_table)}
|
10
|
+
|
11
|
+
before do
|
12
|
+
ensure_locale :en
|
13
|
+
print_table.from('3/20/2011').to('4/20/2011')
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#header' do
|
17
|
+
after :each do
|
18
|
+
ensure_locale :en
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should add a header the account name and the periods' do
|
22
|
+
financial_table.header.should == "Account name: Federal bank (from: 2011-03-20, to: 2011-04-20)"
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should add a header for portuguese dates' do
|
26
|
+
ensure_locale :pt
|
27
|
+
financial_table.header.should == "Nome da Conta: Federal bank (de: 20/03/2011, até: 20/04/2011)"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Financial
|
4
|
+
describe Locale do
|
5
|
+
describe '#initialize' do
|
6
|
+
it 'should raise error if pass a locale that dont exist' do
|
7
|
+
expect {
|
8
|
+
Locale.new(:dont_exist)
|
9
|
+
}.to raise_error LocaleDontAvailable
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#name' do
|
14
|
+
it 'should keep the name of the locale' do
|
15
|
+
Locale.new(:pt).name.should equal :pt
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#to_coin' do
|
20
|
+
it 'should return a dollar for english locale' do
|
21
|
+
Locale.new(:en).to_coin(10).should == "$ 10,00"
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should return a dollar for english locale with float' do
|
25
|
+
Locale.new(:en).to_coin(10.10).should == "$ 10,10"
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should return a reais for portuguese locale' do
|
29
|
+
Locale.new(:pt).to_coin(0.99).should == "R$ 0,99"
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should return a dollar for english locale with negative numbers' do
|
33
|
+
Locale.new(:en).to_coin(-100.10).should == "$ -100,10"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|