myfinance 0.7.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -2
  3. data/CHANGELOG.md +15 -0
  4. data/Gemfile.lock +1 -1
  5. data/README.md +304 -1
  6. data/lib/myfinance.rb +12 -0
  7. data/lib/myfinance/client.rb +16 -0
  8. data/lib/myfinance/entities/bank_statement.rb +16 -0
  9. data/lib/myfinance/entities/credit_card.rb +19 -0
  10. data/lib/myfinance/entities/credit_card_collection.rb +11 -0
  11. data/lib/myfinance/entities/credit_card_transaction.rb +26 -0
  12. data/lib/myfinance/entities/credit_card_transaction_collection.rb +11 -0
  13. data/lib/myfinance/entities/financial_account.rb +1 -1
  14. data/lib/myfinance/entities/payable_account_collection.rb +14 -0
  15. data/lib/myfinance/entities/receivable_account_collection.rb +14 -0
  16. data/lib/myfinance/entities/reconcile_collection.rb +30 -0
  17. data/lib/myfinance/resources/bank_statement.rb +20 -0
  18. data/lib/myfinance/resources/category.rb +16 -0
  19. data/lib/myfinance/resources/classification_center.rb +1 -1
  20. data/lib/myfinance/resources/credit_card.rb +47 -0
  21. data/lib/myfinance/resources/credit_card_transaction.rb +47 -0
  22. data/lib/myfinance/resources/financial_account.rb +48 -7
  23. data/lib/myfinance/resources/financial_transaction.rb +13 -2
  24. data/lib/myfinance/resources/person.rb +1 -1
  25. data/lib/myfinance/resources/reconcile.rb +20 -0
  26. data/lib/myfinance/version.rb +1 -1
  27. data/spec/lib/myfinance/client_spec.rb +21 -0
  28. data/spec/lib/myfinance/entities/credit_card_collection_spec.rb +23 -0
  29. data/spec/lib/myfinance/entities/credit_card_spec.rb +7 -0
  30. data/spec/lib/myfinance/entities/credit_card_transaction_collection_spec.rb +21 -0
  31. data/spec/lib/myfinance/entities/credit_card_transaction_spec.rb +8 -0
  32. data/spec/lib/myfinance/entities/reconcile_collection_spec.rb +20 -0
  33. data/spec/lib/myfinance/resources/bank_statement_spec.rb +53 -0
  34. data/spec/lib/myfinance/resources/category_spec.rb +24 -3
  35. data/spec/lib/myfinance/resources/classification_center_spec.rb +12 -5
  36. data/spec/lib/myfinance/resources/credit_card_spec.rb +142 -0
  37. data/spec/lib/myfinance/resources/credit_card_transaction_spec.rb +162 -0
  38. data/spec/lib/myfinance/resources/financial_transaction_spec.rb +27 -2
  39. data/spec/lib/myfinance/resources/payable_account_spec.rb +131 -15
  40. data/spec/lib/myfinance/resources/person_spec.rb +16 -4
  41. data/spec/lib/myfinance/resources/receivable_account_spec.rb +132 -15
  42. data/spec/lib/myfinance/resources/reconcile_spec.rb +33 -0
  43. data/spec/support/bank_statements/extrato.ofx +207 -0
  44. metadata +35 -2
@@ -4,24 +4,49 @@ describe Myfinance::Resources::FinancialTransaction, vcr: true do
4
4
  let(:da_id) { 14268 }
5
5
  let(:ent_id) { 3798 }
6
6
  let(:ft_id) { 1663920 }
7
+ let(:page) { 2 }
7
8
  let(:financial_transactions) { client.financial_transactions }
8
9
  let(:params) { { amount: 68.5, occurred_at: "2011-07-15", type: "Debit" } }
9
10
  let(:request_error) { Myfinance::RequestError }
10
11
 
11
12
  describe "#find_all" do
12
13
  context "when successful" do
13
- subject { client.financial_transactions.find_all(ent_id, da_id) }
14
14
  before :each do
15
15
  subject.build
16
16
  end
17
17
 
18
+ subject { client.financial_transactions.find_all(ent_id, da_id, page) }
19
+
18
20
  it "returns a 200 OK response code" do
19
21
  expect(subject.response.code).to eq(200)
20
22
  end
21
23
 
22
- it "return collection of FinancialTransactions" do
24
+ it "returns URL with next page" do
25
+ url = subject.response.request.base_url
26
+ expect(url).to include("?page=#{page}")
27
+ end
28
+
29
+ it "returns collection of FinancialTransactions" do
23
30
  expect(subject).to be_a(Myfinance::Entities::FinancialTransactionCollection)
24
31
  end
32
+
33
+ context "without pagination" do
34
+ subject { client.financial_transactions.find_all(ent_id, da_id) }
35
+
36
+ it "returns a 200 OK response code" do
37
+ expect(subject.response.code).to eq(200)
38
+ end
39
+
40
+ it "returns collection of FinancialTransactions" do
41
+ expect(subject).to be_a(Myfinance::Entities::FinancialTransactionCollection)
42
+ end
43
+
44
+ it "does not return URL for next page" do
45
+ url = subject.response.request.base_url
46
+ expect(url).not_to include("?page=#{page}")
47
+ end
48
+
49
+ end
25
50
  end
26
51
 
27
52
  context "when supplying invalid IDs" do
@@ -2,6 +2,82 @@ require "spec_helper"
2
2
 
3
3
  describe Myfinance::Resources::PayableAccount do
4
4
  let(:entity_id) { 3798 }
5
+ let(:pa_id) { 1235663 }
6
+ let(:page) { 2 }
7
+ let(:url) { subject.response.request.base_url }
8
+ let(:request_error) { Myfinance::RequestError }
9
+
10
+ describe "#find_all", vcr: true do
11
+ before :each do
12
+ subject.build
13
+ end
14
+ context "with pagination" do
15
+ subject { client.payable_accounts.find_all(entity_id, page) }
16
+
17
+ it "returns 200 OK response code" do
18
+ expect(subject.response.code).to eq(200)
19
+ end
20
+
21
+ it "returns a PayableAccount collection" do
22
+ expect(subject).to be_a(Myfinance::Entities::PayableAccountCollection)
23
+ end
24
+
25
+ it "returns a paginated URL" do
26
+ expect(url).to include("?page=#{page}")
27
+ end
28
+
29
+ context "with invalid page" do
30
+ subject { client.payable_accounts.find_all(entity_id, 42424242) }
31
+
32
+ it "returns empty collection" do
33
+ expect(subject.collection).to be_empty
34
+ end
35
+ end
36
+ end
37
+
38
+ context "without pagination" do
39
+ subject { client.payable_accounts.find_all(entity_id) }
40
+
41
+ it "returns 200 OK response code" do
42
+ expect(subject.response.code).to eq(200)
43
+ end
44
+
45
+ it "returns a PayableAccount collection" do
46
+ expect(subject).to be_a(Myfinance::Entities::PayableAccountCollection)
47
+ end
48
+
49
+ it "returns a paginated URL" do
50
+ expect(url).not_to include("?page=#{page}")
51
+ end
52
+
53
+ context "with invalid entity id" do
54
+ it "raises 404 not found error" do
55
+ expect { client.payable_accounts.find_all(nil) }.to raise_error(request_error) do |e|
56
+ expect(e.code).to eq(404)
57
+ expect(e.message).to eq("Not Found")
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ describe "#find", vcr: true do
65
+ subject { client.payable_accounts.find(entity_id, pa_id) }
66
+
67
+ it "returns a PayableAccount" do
68
+ expect(subject).to be_a(Myfinance::Entities::PayableAccount)
69
+ end
70
+
71
+ context "with invalid ID" do
72
+ subject { client.payable_accounts.find(nil, nil) }
73
+
74
+ it "raises 404 not found error" do
75
+ expect { subject }.to raise_error(request_error) do |e|
76
+ expect(e.code).to eq(404)
77
+ end
78
+ end
79
+ end
80
+ end
5
81
 
6
82
  describe "#create", vcr: true do
7
83
  let(:params) { { due_date: '2015-08-15', amount: 150.99 } }
@@ -61,26 +137,28 @@ describe Myfinance::Resources::PayableAccount do
61
137
  context "when any data is invalid" do
62
138
  let(:params) { { due_date: '', amount: 150.99 } }
63
139
 
64
- it "raises Myfinance::RequestError" do
65
- expect { subject }.to raise_error(Myfinance::RequestError)
140
+ it "raises request_error" do
141
+ expect { subject }.to raise_error(request_error)
66
142
  end
67
143
 
68
144
  it "adds information on request error object" do
69
- expect(Myfinance::RequestError).to receive(:new).with(code: 422, message: "", body: { "competency_month" => ["não pode ser vazio"], "due_date" => ["não é uma data válida"] }).and_call_original
70
- expect { subject }.to raise_error(Myfinance::RequestError)
145
+ body = { "competency_month" => ["não pode ser vazio"], "due_date" => ["não é uma data válida"] }
146
+ expect(request_error).to receive(:new).with(code: 422, message: "", body: body).and_call_original
147
+ expect { subject }.to raise_error(request_error)
71
148
  end
72
149
  end
73
150
 
74
151
  context "when entity does not exist" do
75
152
  subject { client.payable_accounts.create(555, params) }
76
153
 
77
- it "raises Myfinance::RequestError" do
78
- expect { subject }.to raise_error(Myfinance::RequestError)
154
+ it "raises request_error" do
155
+ expect { subject }.to raise_error(request_error)
79
156
  end
80
157
 
81
158
  it "adds information on request error object" do
82
- expect(Myfinance::RequestError).to receive(:new).with(code: 403, message: "Forbidden", body: {"error" => "Você não tem permissão para acessar este recurso." }).and_call_original
83
- expect { subject }.to raise_error(Myfinance::RequestError)
159
+ body = {"error" => "Você não tem permissão para acessar este recurso." }
160
+ expect(request_error).to receive(:new).with(code: 403, message: "Forbidden", body: body).and_call_original
161
+ expect { subject }.to raise_error(request_error)
84
162
  end
85
163
  end
86
164
  end
@@ -106,7 +184,7 @@ describe Myfinance::Resources::PayableAccount do
106
184
  let(:params) { { total_amount: nil, occurred_at: '2015-08-05', amount: 150.99 } }
107
185
 
108
186
  it "raises request error" do
109
- expect { subject }.to raise_error(Myfinance::RequestError)
187
+ expect { subject }.to raise_error(request_error)
110
188
  end
111
189
  end
112
190
  end
@@ -127,7 +205,7 @@ describe Myfinance::Resources::PayableAccount do
127
205
  end
128
206
 
129
207
  describe "#update", vcr: true do
130
- subject { client.payable_accounts.update(1235050, entity_id, { amount: 100.00 }) }
208
+ subject { client.payable_accounts.update(entity_id, 1235050, { amount: 100.00 }) }
131
209
 
132
210
  context "when payable account exists" do
133
211
  it "returns true" do
@@ -136,16 +214,16 @@ describe Myfinance::Resources::PayableAccount do
136
214
  end
137
215
 
138
216
  context "when payable account does not exist" do
139
- subject { client.payable_accounts.update(9999999, entity_id, { amount: 100.00 }) }
217
+ subject { client.payable_accounts.update(entity_id, 9999999, { amount: 100.00 }) }
140
218
 
141
219
  it "raises request error" do
142
- expect { subject }.to raise_error(Myfinance::RequestError)
220
+ expect { subject }.to raise_error(request_error)
143
221
  end
144
222
  end
145
223
  end
146
224
 
147
225
  describe "#destroy", vcr: true do
148
- subject { client.payable_accounts.destroy(1215631, entity_id) }
226
+ subject { client.payable_accounts.destroy(entity_id, 1215631) }
149
227
 
150
228
  context "when payable account exists" do
151
229
  it "returns true" do
@@ -154,10 +232,48 @@ describe Myfinance::Resources::PayableAccount do
154
232
  end
155
233
 
156
234
  context "when payable account does not exist" do
157
- subject { client.payable_accounts.destroy(1215631099, entity_id) }
235
+ subject { client.payable_accounts.destroy(entity_id, 1215631099) }
158
236
 
159
237
  it "raises request error" do
160
- expect { subject }.to raise_error(Myfinance::RequestError)
238
+ expect { subject }.to raise_error(request_error)
239
+ end
240
+ end
241
+ end
242
+
243
+ describe "#destroy_recurrence", vcr: true do
244
+ let(:params) { { due_date: "2015-08-15", amount: 150.99, create_as_recurrent: "annual" } }
245
+ let(:new_pa) { client.payable_accounts.create(entity_id, params) }
246
+
247
+ before :each do
248
+ client.payable_accounts.destroy_recurrence(entity_id, new_pa.id)
249
+ end
250
+
251
+ it "does not find recurrent payable accounts" do
252
+ expect { client.payable_accounts.find(entity_id, new_pa.id) }.to raise_error(request_error) do |e|
253
+ expect(e.code).to eq(404)
254
+ expect(e.message).to eq("Not Found")
255
+ end
256
+
257
+ expect { client.payable_accounts.find(entity_id, new_pa.id + 1) }.to raise_error(request_error) do |e|
258
+ expect(e.code).to eq(404)
259
+ expect(e.message).to eq("Not Found")
260
+ end
261
+ end
262
+ end
263
+
264
+ describe "#destroy_many", vcr: true do
265
+ let(:params) { { due_date: "2015-08-15", amount: 150.99 } }
266
+ let(:new_pa) { client.payable_accounts.create(entity_id, params) }
267
+ let(:new_pa2) { client.payable_accounts.create(entity_id, params) }
268
+
269
+ before :each do
270
+ client.payable_accounts.destroy_many(entity_id, [new_pa.id, new_pa2.id])
271
+ end
272
+
273
+ it "does not find created PayableAccount" do
274
+ expect { client.payable_accounts.find(entity_id, new_pa.id) }.to raise_error(request_error) do |e|
275
+ expect(e.code).to eq(404)
276
+ expect(e.message).to eq("Not Found")
161
277
  end
162
278
  end
163
279
  end
@@ -29,12 +29,24 @@ describe Myfinance::Resources::Person, vcr: true do
29
29
 
30
30
  describe "#find_by" do
31
31
  context "with success" do
32
- let(:params) do
33
- { name_equals: "Myfreecomm", person_type_in: "JuridicalPerson" }
32
+ it "find people by attributte name_equals" do
33
+ result = client.people.find_by(
34
+ { name_equals: "Myfreecomm", person_type_in: "JuridicalPerson" }
35
+ )
36
+ expect(result).to be_a(Myfinance::Entities::PersonCollection)
37
+ expect(result.collection.first.name).to eq("Myfreecomm")
38
+ end
39
+
40
+ it "find people by attributte name_equals with special characters" do
41
+ result = client.people.find_by({ name_equals: "João das neves"})
42
+ expect(result).to be_a(Myfinance::Entities::PersonCollection)
43
+ expect(result.collection.first.name).to eq("João das neves")
34
44
  end
35
45
 
36
- it "find people by attributte" do
37
- result = client.people.find_by(params)
46
+ it "find people by attributte federation_subscription_number_equals" do
47
+ result = client.people.find_by(
48
+ { federation_subscription_number_equals: "42.308.611/0001-41" }
49
+ )
38
50
  expect(result).to be_a(Myfinance::Entities::PersonCollection)
39
51
  expect(result.collection.first.name).to eq("Myfreecomm")
40
52
  end
@@ -2,6 +2,83 @@ require "spec_helper"
2
2
 
3
3
  describe Myfinance::Resources::ReceivableAccount do
4
4
  let(:entity_id) { 3798 }
5
+ let(:ra_id) { 1320786 }
6
+ let(:page) { 2 }
7
+ let(:url) { subject.response.request.base_url }
8
+ let(:request_error) { Myfinance::RequestError }
9
+
10
+ describe "#find_all", vcr: true do
11
+ before :each do
12
+ subject.build
13
+ end
14
+
15
+ context "with pagination" do
16
+ subject { client.receivable_accounts.find_all(entity_id, page) }
17
+
18
+ it "returns 200 OK response code" do
19
+ expect(subject.response.code).to eq(200)
20
+ end
21
+
22
+ it "returns a ReceivableAccount collection" do
23
+ expect(subject).to be_a(Myfinance::Entities::ReceivableAccountCollection)
24
+ end
25
+
26
+ it "returns a paginated URL" do
27
+ expect(url).to include("?page=#{page}")
28
+ end
29
+
30
+ context "with invalid page" do
31
+ subject { client.receivable_accounts.find_all(entity_id, 42424242) }
32
+
33
+ it "returns empty collection" do
34
+ expect(subject.collection).to be_empty
35
+ end
36
+ end
37
+ end
38
+
39
+ context "without pagination" do
40
+ subject { client.receivable_accounts.find_all(entity_id) }
41
+
42
+ it "returns 200 OK response code" do
43
+ expect(subject.response.code).to eq(200)
44
+ end
45
+
46
+ it "returns a ReceivableAccount collection" do
47
+ expect(subject).to be_a(Myfinance::Entities::ReceivableAccountCollection)
48
+ end
49
+
50
+ it "returns a paginated URL" do
51
+ expect(url).not_to include("?page=#{page}")
52
+ end
53
+
54
+ context "with invalid entity id" do
55
+ it "raises 404 not found error" do
56
+ expect { client.receivable_accounts.find_all(nil) }.to raise_error(request_error) do |e|
57
+ expect(e.code).to eq(404)
58
+ expect(e.message).to eq("Not Found")
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ describe "#find", vcr: true do
66
+ subject { client.receivable_accounts.find(entity_id, ra_id) }
67
+
68
+ it "returns a ReceivableAccount" do
69
+ expect(subject).to be_a(Myfinance::Entities::ReceivableAccount)
70
+ end
71
+
72
+ context "with invalid ID" do
73
+ subject { client.receivable_accounts.find(nil, nil) }
74
+
75
+ it "raises 404 not found error" do
76
+ expect { subject }.to raise_error(request_error) do |e|
77
+ expect(e.code).to eq(404)
78
+ end
79
+ end
80
+ end
81
+ end
5
82
 
6
83
  describe "#create", vcr: true do
7
84
  let(:params) { { due_date: '2015-08-15', amount: 150.99 } }
@@ -61,26 +138,28 @@ describe Myfinance::Resources::ReceivableAccount do
61
138
  context "when any data is invalid" do
62
139
  let(:params) { { due_date: '', amount: 150.99 } }
63
140
 
64
- it "raises Myfinance::RequestError" do
65
- expect { subject }.to raise_error(Myfinance::RequestError)
141
+ it "raises request_error" do
142
+ expect { subject }.to raise_error(request_error)
66
143
  end
67
144
 
68
145
  it "adds information on request error object" do
69
- expect(Myfinance::RequestError).to receive(:new).with(code: 422, message: "", body: { "competency_month" => ["não pode ser vazio"], "due_date" => ["não é uma data válida"] }).and_call_original
70
- expect { subject }.to raise_error(Myfinance::RequestError)
146
+ body = { "competency_month" => ["não pode ser vazio"], "due_date" => ["não é uma data válida"] }
147
+ expect(request_error).to receive(:new).with(code: 422, message: "", body: body).and_call_original
148
+ expect { subject }.to raise_error(request_error)
71
149
  end
72
150
  end
73
151
 
74
152
  context "when entity does not exist" do
75
153
  subject { client.receivable_accounts.create(555, params) }
76
154
 
77
- it "raises Myfinance::RequestError" do
78
- expect { subject }.to raise_error(Myfinance::RequestError)
155
+ it "raises request_error" do
156
+ expect { subject }.to raise_error(request_error)
79
157
  end
80
158
 
81
159
  it "adds information on request error object" do
82
- expect(Myfinance::RequestError).to receive(:new).with(code: 403, message: "Forbidden", body: { "error" => "Você não tem permissão para acessar este recurso." }).and_call_original
83
- expect { subject }.to raise_error(Myfinance::RequestError)
160
+ body = { "error" => "Você não tem permissão para acessar este recurso." }
161
+ expect(request_error).to receive(:new).with(code: 403, message: "Forbidden", body: body).and_call_original
162
+ expect { subject }.to raise_error(request_error)
84
163
  end
85
164
  end
86
165
  end
@@ -106,7 +185,7 @@ describe Myfinance::Resources::ReceivableAccount do
106
185
  let(:params) { { total_amount: nil, occurred_at: '2015-08-05', amount: 150.99 } }
107
186
 
108
187
  it "raises request error" do
109
- expect { subject }.to raise_error(Myfinance::RequestError)
188
+ expect { subject }.to raise_error(request_error)
110
189
  end
111
190
  end
112
191
  end
@@ -127,7 +206,7 @@ describe Myfinance::Resources::ReceivableAccount do
127
206
  end
128
207
 
129
208
  describe "#update", vcr: true do
130
- subject { client.receivable_accounts.update(1235051, entity_id, { amount: 100.00 }) }
209
+ subject { client.receivable_accounts.update(entity_id, 1235051, amount: 100.00) }
131
210
 
132
211
  context "when payable account exists" do
133
212
  it "returns true" do
@@ -136,16 +215,16 @@ describe Myfinance::Resources::ReceivableAccount do
136
215
  end
137
216
 
138
217
  context "when payable account does not exist" do
139
- subject { client.receivable_accounts.update(9999999, entity_id, { amount: 100.00 }) }
218
+ subject { client.receivable_accounts.update(entity_id, 9999999, amount: 100.00) }
140
219
 
141
220
  it "raises request error" do
142
- expect { subject }.to raise_error(Myfinance::RequestError)
221
+ expect { subject }.to raise_error(request_error)
143
222
  end
144
223
  end
145
224
  end
146
225
 
147
226
  describe "#destroy", vcr: true do
148
- subject { client.receivable_accounts.destroy(1215634, entity_id) }
227
+ subject { client.receivable_accounts.destroy(entity_id, 1215634) }
149
228
 
150
229
  context "when receivable account exists" do
151
230
  it "returns true" do
@@ -154,10 +233,48 @@ describe Myfinance::Resources::ReceivableAccount do
154
233
  end
155
234
 
156
235
  context "when receivable account does not exist" do
157
- subject { client.receivable_accounts.destroy(1215631099, entity_id) }
236
+ subject { client.receivable_accounts.destroy(entity_id, 1215631099) }
158
237
 
159
238
  it "raises request error" do
160
- expect { subject }.to raise_error(Myfinance::RequestError)
239
+ expect { subject }.to raise_error(request_error)
240
+ end
241
+ end
242
+ end
243
+
244
+ describe "#destroy_recurrence", vcr: true do
245
+ let(:params) { { due_date: "2015-08-15", amount: 150.99, create_as_recurrent: "annual" } }
246
+ let(:new_ra) { client.receivable_accounts.create(entity_id, params) }
247
+
248
+ before :each do
249
+ client.receivable_accounts.destroy_recurrence(entity_id, new_ra.id)
250
+ end
251
+
252
+ it "does not find recurrent receivable accounts" do
253
+ expect { client.receivable_accounts.find(entity_id, new_ra.id) }.to raise_error(request_error) do |e|
254
+ expect(e.code).to eq(404)
255
+ expect(e.message).to eq("Not Found")
256
+ end
257
+
258
+ expect { client.receivable_accounts.find(entity_id, new_ra.id + 1) }.to raise_error(request_error) do |e|
259
+ expect(e.code).to eq(404)
260
+ expect(e.message).to eq("Not Found")
261
+ end
262
+ end
263
+ end
264
+
265
+ describe "#destroy_many", vcr: true do
266
+ let(:params) { { due_date: "2015-08-15", amount: 150.99 } }
267
+ let(:new_ra) { client.receivable_accounts.create(entity_id, params) }
268
+ let(:new_ra2) { client.receivable_accounts.create(entity_id, params) }
269
+
270
+ before :each do
271
+ client.receivable_accounts.destroy_many(entity_id, [new_ra.id, new_ra2.id])
272
+ end
273
+
274
+ it "does not find created ReceivableAccount" do
275
+ expect { client.receivable_accounts.find(entity_id, new_ra.id) }.to raise_error(request_error) do |e|
276
+ expect(e.code).to eq(404)
277
+ expect(e.message).to eq("Not Found")
161
278
  end
162
279
  end
163
280
  end