myfinance 0.7.0 → 1.0.0

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.
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