freeagentrb 0.1.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 (49) hide show
  1. checksums.yaml +7 -0
  2. data/.env.example +1 -0
  3. data/Gemfile +9 -0
  4. data/Gemfile.lock +51 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +34 -0
  7. data/Rakefile +4 -0
  8. data/bin/console +22 -0
  9. data/bin/setup +8 -0
  10. data/freeagentrb.gemspec +34 -0
  11. data/lib/free_agent/client.rb +100 -0
  12. data/lib/free_agent/collection.rb +27 -0
  13. data/lib/free_agent/error.rb +4 -0
  14. data/lib/free_agent/object.rb +25 -0
  15. data/lib/free_agent/objects/attachment.rb +4 -0
  16. data/lib/free_agent/objects/bank_account.rb +4 -0
  17. data/lib/free_agent/objects/bank_transaction.rb +4 -0
  18. data/lib/free_agent/objects/bank_transaction_explanation.rb +4 -0
  19. data/lib/free_agent/objects/bill.rb +4 -0
  20. data/lib/free_agent/objects/company.rb +4 -0
  21. data/lib/free_agent/objects/contact.rb +4 -0
  22. data/lib/free_agent/objects/credit_note.rb +4 -0
  23. data/lib/free_agent/objects/estimate.rb +4 -0
  24. data/lib/free_agent/objects/estimate_item.rb +4 -0
  25. data/lib/free_agent/objects/invoice.rb +4 -0
  26. data/lib/free_agent/objects/project.rb +4 -0
  27. data/lib/free_agent/objects/task.rb +4 -0
  28. data/lib/free_agent/objects/timeslip.rb +4 -0
  29. data/lib/free_agent/objects/user.rb +4 -0
  30. data/lib/free_agent/resource.rb +60 -0
  31. data/lib/free_agent/resources/attachments.rb +15 -0
  32. data/lib/free_agent/resources/bank_accounts.rb +33 -0
  33. data/lib/free_agent/resources/bank_transaction_explanations.rb +29 -0
  34. data/lib/free_agent/resources/bank_transactions.rb +37 -0
  35. data/lib/free_agent/resources/bills.rb +42 -0
  36. data/lib/free_agent/resources/company.rb +10 -0
  37. data/lib/free_agent/resources/contacts.rb +32 -0
  38. data/lib/free_agent/resources/credit_notes.rb +74 -0
  39. data/lib/free_agent/resources/estimate_items.rb +22 -0
  40. data/lib/free_agent/resources/estimates.rb +79 -0
  41. data/lib/free_agent/resources/invoices.rb +89 -0
  42. data/lib/free_agent/resources/projects.rb +37 -0
  43. data/lib/free_agent/resources/tasks.rb +37 -0
  44. data/lib/free_agent/resources/timeslips.rb +47 -0
  45. data/lib/free_agent/resources/users.rb +42 -0
  46. data/lib/free_agent/version.rb +3 -0
  47. data/lib/free_agent.rb +48 -0
  48. data/lib/freeagentrb.rb +1 -0
  49. metadata +133 -0
@@ -0,0 +1,42 @@
1
+ module FreeAgent
2
+ class BillsResource < Resource
3
+
4
+ def list(**params)
5
+ response = get_request("bills", params: params)
6
+ Collection.from_response(response, type: Bill, key: "bills")
7
+ end
8
+
9
+ def list_for_contact(contact:, **params)
10
+ response = get_request("bills?contact=#{contact}", params: params)
11
+ Collection.from_response(response, type: Bill, key: "bills")
12
+ end
13
+
14
+ def list_for_project(project:, **params)
15
+ response = get_request("bills?project=#{project}", params: params)
16
+ Collection.from_response(response, type: Bill, key: "bills")
17
+ end
18
+
19
+ def retrieve(id:)
20
+ response = get_request("bills/#{id}")
21
+ Bill.new(response.body["bill"])
22
+ end
23
+
24
+ def create(contact:, dated_on:, due_on:, reference:, bill_items:, **params)
25
+ attributes = {contact: contact, dated_on: dated_on, due_on: due_on, reference: reference, bill_items: bill_items}
26
+
27
+ response = post_request("bills", body: {bill: attributes.merge(params)})
28
+ Bill.new(response.body["bill"]) if response.success?
29
+ end
30
+
31
+ def update(id:, **params)
32
+ response = put_request("bills/#{id}", body: {bill: params})
33
+ Bill.new(response.body["bill"]) if response.success?
34
+ end
35
+
36
+ def delete(id:)
37
+ response = delete_request("bills/#{id}")
38
+ response.success?
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,10 @@
1
+ module FreeAgent
2
+ class CompanyResource < Resource
3
+
4
+ def retrieve
5
+ response = get_request("company")
6
+ Company.new(response.body["company"])
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,32 @@
1
+ module FreeAgent
2
+ class ContactsResource < Resource
3
+
4
+ def list(**params)
5
+ response = get_request("contacts", params: params)
6
+ Collection.from_response(response, type: Contact, key: "contacts")
7
+ end
8
+
9
+ def retrieve(id:)
10
+ response = get_request("contacts/#{id}")
11
+ Contact.new(response.body["contact"])
12
+ end
13
+
14
+ def create(**params)
15
+ raise "first_name and last_name or organisation_name is required" unless !params[:first_name].nil? || !params[:organisation_name].nil?
16
+
17
+ response = post_request("contacts", body: params)
18
+ Contact.new(response.body["contact"]) if response.success?
19
+ end
20
+
21
+ def update(id:, **params)
22
+ response = put_request("contacts/#{id}", body: params)
23
+ Contact.new(response.body["contact"]) if response.success?
24
+ end
25
+
26
+ def delete(id:)
27
+ response = delete_request("contacts/#{id}")
28
+ response.success?
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,74 @@
1
+ module FreeAgent
2
+ class CreditNotesResource < Resource
3
+
4
+ def list(**params)
5
+ response = get_request("credit_notes", params: params)
6
+ Collection.from_response(response, type: CreditNote, key: "credit_notes")
7
+ end
8
+
9
+ def list_for_contact(contact:, **params)
10
+ response = get_request("credit_notes?contact=#{contact}", params: params)
11
+ Collection.from_response(response, type: CreditNote, key: "credit_notes")
12
+ end
13
+
14
+ def list_for_project(project:, **params)
15
+ response = get_request("credit_notes?project=#{project}", params: params)
16
+ Collection.from_response(response, type: CreditNote, key: "credit_notes")
17
+ end
18
+
19
+ def retrieve(id:)
20
+ response = get_request("credit_notes/#{id}")
21
+ CreditNote.new(response.body["credit_note"])
22
+ end
23
+
24
+ # Returns a Base64-encoded PDF
25
+ def retrieve_pdf(id:)
26
+ response = get_request("credit_notes/#{id}/pdf")
27
+ response.body["pdf"]["content"] if response.success?
28
+ end
29
+
30
+ def create(contact:, dated_on:, payment_terms_in_days: 0, **params)
31
+ attributes = {contact: contact, dated_on: dated_on, payment_terms_in_days: payment_terms_in_days}
32
+
33
+ response = post_request("credit_notes", body: {credit_note: attributes.merge(params)})
34
+ CreditNote.new(response.body["credit_note"]) if response.success?
35
+ end
36
+
37
+ # def duplicate(id:)
38
+ # response = post_request("invoices/#{id}/duplicate", body: {})
39
+ # Invoice.new(response.body["invoice"]) if response.success?
40
+ # end
41
+
42
+ def update(id:, **params)
43
+ response = put_request("credit_notes/#{id}", body: {credit_note: params})
44
+ CreditNote.new(response.body["credit_note"]) if response.success?
45
+ end
46
+
47
+ def delete(id:)
48
+ response = delete_request("credit_notes/#{id}")
49
+ response.success?
50
+ end
51
+
52
+ def email(id:, to:, **params)
53
+ attributes = {to: to}
54
+ response = post_request("credit_notes/#{id}/send_email", body: {credit_note: {email: attributes.merge(params)}})
55
+ response.success?
56
+ end
57
+
58
+ def mark_as_sent(id:)
59
+ response = put_request("credit_notes/#{id}/transitions/mark_as_sent", body: {})
60
+ response.success?
61
+ end
62
+
63
+ def mark_as_draft(id:)
64
+ response = put_request("credit_notes/#{id}/transitions/mark_as_draft", body: {})
65
+ response.success?
66
+ end
67
+
68
+ def mark_as_cancelled(id:)
69
+ response = put_request("credit_notes/#{id}/transitions/mark_as_cancelled", body: {})
70
+ response.success?
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,22 @@
1
+ module FreeAgent
2
+ class EstimateItemsResource < Resource
3
+
4
+ def create(estimate:, **params)
5
+ attributes = {estimate: estimate}
6
+
7
+ response = post_request("estimate_items", body: attributes.merge(params))
8
+ EstimateItem.new(response.body["estimate_item"]) if response.success?
9
+ end
10
+
11
+ def update(id:, **params)
12
+ response = put_request("estimate_items/#{id}", body: params)
13
+ EstimateItem.new(response.body["estimate_item"]) if response.success?
14
+ end
15
+
16
+ def delete(id:)
17
+ response = delete_request("estimate_items/#{id}")
18
+ response.success?
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,79 @@
1
+ module FreeAgent
2
+ class EstimatesResource < Resource
3
+
4
+ def list(**params)
5
+ response = get_request("estimates", params: params)
6
+ Collection.from_response(response, type: Estimate, key: "estimates")
7
+ end
8
+
9
+ def list_for_contact(contact:, **params)
10
+ response = get_request("estimates?contact=#{contact}", params: params)
11
+ Collection.from_response(response, type: Estimate, key: "estimates")
12
+ end
13
+
14
+ def list_for_project(project:, **params)
15
+ response = get_request("estimates?project=#{project}", params: params)
16
+ Collection.from_response(response, type: Estimate, key: "estimates")
17
+ end
18
+
19
+ def list_for_invoice(invoice:, **params)
20
+ response = get_request("estimates?invoice=#{invoice}", params: params)
21
+ Collection.from_response(response, type: Estimate, key: "estimates")
22
+ end
23
+
24
+ def retrieve(id:)
25
+ response = get_request("estimates/#{id}")
26
+ Estimate.new(response.body["estimate"])
27
+ end
28
+
29
+ # Returns a Base64-encoded PDF
30
+ def retrieve_pdf(id:)
31
+ response = get_request("estimates/#{id}/pdf")
32
+ response.body["pdf"]["content"] if response.success?
33
+ end
34
+
35
+ def create(contact:, dated_on:, currency:, reference:, status: "Draft", estimate_type: "Estimate", **params)
36
+ attributes = {contact: contact, dated_on: dated_on, status: status, estimate_type: estimate_type, currency: currency, reference: reference}
37
+
38
+ response = post_request("estimates", body: {estimate: attributes.merge(params)})
39
+ Estimate.new(response.body["estimate"]) if response.success?
40
+ end
41
+
42
+ def update(id:, **params)
43
+ response = put_request("estimates/#{id}", body: params)
44
+ Estimate.new(response.body["estimate"]) if response.success?
45
+ end
46
+
47
+ def delete(id:)
48
+ response = delete_request("estimates/#{id}")
49
+ response.success?
50
+ end
51
+
52
+ def email(id:, to:, **params)
53
+ attributes = {to: to}
54
+ response = post_request("estimates/#{id}/send_email", body: {estimate: {email: attributes.merge(params)}})
55
+ response.success?
56
+ end
57
+
58
+ def mark_as_sent(id:)
59
+ response = put_request("estimaates/#{id}/transitions/mark_as_sent", body: {})
60
+ response.success?
61
+ end
62
+
63
+ def mark_as_draft(id:)
64
+ response = put_request("estimaates/#{id}/transitions/mark_as_draft", body: {})
65
+ response.success?
66
+ end
67
+
68
+ def mark_as_approved(id:)
69
+ response = put_request("estimates/#{id}/transitions/mark_as_approved", body: {})
70
+ response.success?
71
+ end
72
+
73
+ def mark_as_rejected(id:)
74
+ response = put_request("estimates/#{id}/transitions/mark_as_rejected", body: {})
75
+ response.success?
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,89 @@
1
+ module FreeAgent
2
+ class InvoicesResource < Resource
3
+
4
+ def list(**params)
5
+ response = get_request("invoices", params: params)
6
+ Collection.from_response(response, type: Invoice, key: "invoices")
7
+ end
8
+
9
+ def list_for_contact(contact:, **params)
10
+ response = get_request("invoices?contact=#{contact}", params: params)
11
+ Collection.from_response(response, type: Invoice, key: "invoices")
12
+ end
13
+
14
+ def list_for_project(project:, **params)
15
+ response = get_request("invoices?project=#{project}", params: params)
16
+ Collection.from_response(response, type: Invoice, key: "invoices")
17
+ end
18
+
19
+ def retrieve(id:)
20
+ response = get_request("invoices/#{id}")
21
+ Invoice.new(response.body["invoice"])
22
+ end
23
+
24
+ # Returns a Base64-encoded PDF
25
+ def retrieve_pdf(id:)
26
+ response = get_request("invoices/#{id}/pdf")
27
+ response.body["pdf"]["content"] if response.success?
28
+ end
29
+
30
+ def create(contact:, dated_on:, payment_terms_in_days: 0, **params)
31
+ attributes = {contact: contact, dated_on: dated_on, payment_terms_in_days: payment_terms_in_days}
32
+
33
+ response = post_request("invoices", body: {invoice: attributes.merge(params)})
34
+ Invoice.new(response.body["invoice"]) if response.success?
35
+ end
36
+
37
+ def duplicate(id:)
38
+ response = post_request("invoices/#{id}/duplicate", body: {})
39
+ Invoice.new(response.body["invoice"]) if response.success?
40
+ end
41
+
42
+ def update(id:, **params)
43
+ response = put_request("invoices/#{id}", body: {invoice: params})
44
+ Invoice.new(response.body["invoice"]) if response.success?
45
+ end
46
+
47
+ def delete(id:)
48
+ response = delete_request("invoices/#{id}")
49
+ response.success?
50
+ end
51
+
52
+ def email(id:, to:, **params)
53
+ attributes = {to: to}
54
+ response = post_request("invoices/#{id}/send_email", body: {invoice: {email: attributes.merge(params)}})
55
+ response.success?
56
+ end
57
+
58
+ def mark_as_sent(id:)
59
+ response = put_request("invoices/#{id}/transitions/mark_as_sent", body: {})
60
+ response.success?
61
+ end
62
+
63
+ def mark_as_scheduled(id:)
64
+ response = put_request("invoices/#{id}/transitions/mark_as_scheduled", body: {})
65
+ response.success?
66
+ end
67
+
68
+ def mark_as_draft(id:)
69
+ response = put_request("invoices/#{id}/transitions/mark_as_draft", body: {})
70
+ response.success?
71
+ end
72
+
73
+ def mark_as_cancelled(id:)
74
+ response = put_request("invoices/#{id}/transitions/mark_as_cancelled", body: {})
75
+ response.success?
76
+ end
77
+
78
+ def convert_to_credit_note(id:)
79
+ response = put_request("invoices/#{id}/transitions/convert_to_credit_note", body: {})
80
+ response.success?
81
+ end
82
+
83
+ def direct_debit(id:)
84
+ response = post_request("invoices/#{id}/direct_debit", body: {})
85
+ response.success?
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,37 @@
1
+ module FreeAgent
2
+ class ProjectsResource < Resource
3
+
4
+ def list(**params)
5
+ response = get_request("projects", params: params)
6
+ Collection.from_response(response, type: Project, key: "projects")
7
+ end
8
+
9
+ def list_for_contact(contact:, **params)
10
+ response = get_request("projects?contact=#{contact}", params: params)
11
+ Collection.from_response(response, type: Project, key: "projects")
12
+ end
13
+
14
+ def retrieve(id:)
15
+ response = get_request("projects/#{id}")
16
+ Project.new(response.body["project"])
17
+ end
18
+
19
+ def create(contact:, name:, status:, currency:, budget_units:, **params)
20
+ attributes = {contact: contact, name: name, status: status, currency: currency, budget_units: budget_units}
21
+
22
+ response = post_request("projects", body: attributes.merge(params))
23
+ Project.new(response.body["project"]) if response.success?
24
+ end
25
+
26
+ def update(id:, **params)
27
+ response = put_request("projects/#{id}", body: params)
28
+ Project.new(response.body["project"]) if response.success?
29
+ end
30
+
31
+ def delete(id:)
32
+ response = delete_request("projects/#{id}")
33
+ response.success?
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ module FreeAgent
2
+ class TasksResource < Resource
3
+
4
+ def list(**params)
5
+ response = get_request("tasks", params: params)
6
+ Collection.from_response(response, type: Task, key: "tasks")
7
+ end
8
+
9
+ def list_for_project(project:, **params)
10
+ response = get_request("tasks?project=#{project}", params: params)
11
+ Collection.from_response(response, type: Task, key: "tasks")
12
+ end
13
+
14
+ def retrieve(id:)
15
+ response = get_request("tasks/#{id}")
16
+ Task.new(response.body["task"])
17
+ end
18
+
19
+ def create(project:, name:, **params)
20
+ attributes = {project: project, name: name}
21
+
22
+ response = post_request("tasks", body: attributes.merge(params))
23
+ Task.new(response.body["task"]) if response.success?
24
+ end
25
+
26
+ def update(id:, **params)
27
+ response = put_request("tasks/#{id}", body: params)
28
+ Task.new(response.body["task"]) if response.success?
29
+ end
30
+
31
+ def delete(id:)
32
+ response = delete_request("tasks/#{id}")
33
+ response.success?
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,47 @@
1
+ module FreeAgent
2
+ class TimeslipsResource < Resource
3
+
4
+ def list(**params)
5
+ response = get_request("timeslips", params: params)
6
+ Collection.from_response(response, type: Timeslip, key: "timeslips")
7
+ end
8
+
9
+ def list_for_user(user:, **params)
10
+ response = get_request("timeslips?user=#{user}", params: params)
11
+ Collection.from_response(response, type: Timeslip, key: "timeslips")
12
+ end
13
+
14
+ def list_for_task(task:, **params)
15
+ response = get_request("timeslips?task=#{task}", params: params)
16
+ Collection.from_response(response, type: Timeslip, key: "timeslips")
17
+ end
18
+
19
+ def list_for_project(project:, **params)
20
+ response = get_request("timeslips?project=#{project}", params: params)
21
+ Collection.from_response(response, type: Timeslip, key: "timeslips")
22
+ end
23
+
24
+ def retrieve(id:)
25
+ response = get_request("timeslips/#{id}")
26
+ Timeslip.new(response.body["timeslip"])
27
+ end
28
+
29
+ def create(task:, user:, project:, dated_on:, hours:, **params)
30
+ attributes = {task: task, user: user, project: project, dated_on: dated_on, hours: hours}
31
+
32
+ response = post_request("timeslips", body: attributes.merge(params))
33
+ Timeslip.new(response.body["timeslip"]) if response.success?
34
+ end
35
+
36
+ def update(id:, **params)
37
+ response = put_request("timeslips/#{id}", body: params)
38
+ Timeslip.new(response.body["timeslip"]) if response.success?
39
+ end
40
+
41
+ def delete(id:)
42
+ response = delete_request("timeslips/#{id}")
43
+ response.success?
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,42 @@
1
+ module FreeAgent
2
+ class UsersResource < Resource
3
+
4
+ def me
5
+ response = get_request("users/me")
6
+ User.new(response.body["user"])
7
+ end
8
+
9
+ def list(**params)
10
+ response = get_request("users", params: params)
11
+ Collection.from_response(response, type: User, key: "users")
12
+ end
13
+
14
+ def retrieve(id:)
15
+ response = get_request("users/#{id}")
16
+ User.new(response.body["user"])
17
+ end
18
+
19
+ def create(email:, first_name:, last_name:, role:, opening_mileage: 0, **params)
20
+ attributes = {email: email, first_name: first_name, last_name: last_name, role: role, opening_mileage: opening_mileage}
21
+
22
+ response = post_request("users", body: attributes.merge(params))
23
+ User.new(response.body["user"]) if response.success?
24
+ end
25
+
26
+ def update(id:, **params)
27
+ response = put_request("users/#{id}", body: params)
28
+ User.new(response.body["user"]) if response.success?
29
+ end
30
+
31
+ def update_me(**params)
32
+ response = put_request("users/me", body: {user: params})
33
+ User.new(response.body["user"]) if response.success?
34
+ end
35
+
36
+ def delete(id:)
37
+ response = delete_request("users/#{id}")
38
+ response.success?
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,3 @@
1
+ module FreeAgent
2
+ VERSION = "0.1.0"
3
+ end
data/lib/free_agent.rb ADDED
@@ -0,0 +1,48 @@
1
+ require "faraday"
2
+ require "faraday_middleware"
3
+ require "faraday/multipart"
4
+ require "json"
5
+
6
+ require_relative "free_agent/version"
7
+
8
+ module FreeAgent
9
+
10
+ autoload :Client, "free_agent/client"
11
+ autoload :Collection, "free_agent/collection"
12
+ autoload :Error, "free_agent/error"
13
+ autoload :Resource, "free_agent/resource"
14
+ autoload :Object, "free_agent/object"
15
+
16
+ autoload :CompanyResource, "free_agent/resources/company"
17
+ autoload :ContactsResource, "free_agent/resources/contacts"
18
+ autoload :BankAccountsResource, "free_agent/resources/bank_accounts"
19
+ autoload :BankTransactionsResource, "free_agent/resources/bank_transactions"
20
+ autoload :BankTransactionExplanationsResource, "free_agent/resources/bank_transaction_explanations"
21
+ autoload :ProjectsResource, "free_agent/resources/projects"
22
+ autoload :TasksResource, "free_agent/resources/tasks"
23
+ autoload :TimeslipsResource, "free_agent/resources/timeslips"
24
+ autoload :UsersResource, "free_agent/resources/users"
25
+ autoload :AttachmentsResource, "free_agent/resources/attachments"
26
+ autoload :InvoicesResource, "free_agent/resources/invoices"
27
+ autoload :EstimatesResource, "free_agent/resources/estimates"
28
+ autoload :EstimateItemsResource, "free_agent/resources/estimate_items"
29
+ autoload :CreditNotesResource, "free_agent/resources/credit_notes"
30
+ autoload :BillsResource, "free_agent/resources/bills"
31
+
32
+ autoload :Company, "free_agent/objects/company"
33
+ autoload :Contact, "free_agent/objects/contact"
34
+ autoload :BankAccount, "free_agent/objects/bank_account"
35
+ autoload :BankTransaction, "free_agent/objects/bank_transaction"
36
+ autoload :BankTransactionExplanation, "free_agent/objects/bank_transaction_explanation"
37
+ autoload :Project, "free_agent/objects/project"
38
+ autoload :Task, "free_agent/objects/task"
39
+ autoload :Timeslip, "free_agent/objects/timeslip"
40
+ autoload :User, "free_agent/objects/user"
41
+ autoload :Attachment, "free_agent/objects/attachment"
42
+ autoload :Invoice, "free_agent/objects/invoice"
43
+ autoload :Estimate, "free_agent/objects/estimate"
44
+ autoload :EstimateItem, "free_agent/objects/estimate_item"
45
+ autoload :CreditNote, "free_agent/objects/credit_note"
46
+ autoload :Bill, "free_agent/objects/bill"
47
+
48
+ end
@@ -0,0 +1 @@
1
+ require "free_agent"