clio_client 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +169 -0
  5. data/Rakefile +9 -0
  6. data/clio_client.gemspec +27 -0
  7. data/lib/clio_client/api/activity.rb +23 -0
  8. data/lib/clio_client/api/activity_description.rb +17 -0
  9. data/lib/clio_client/api/base.rb +18 -0
  10. data/lib/clio_client/api/bill.rb +23 -0
  11. data/lib/clio_client/api/calendar.rb +19 -0
  12. data/lib/clio_client/api/calendar_entry.rb +20 -0
  13. data/lib/clio_client/api/communication.rb +25 -0
  14. data/lib/clio_client/api/contact.rb +23 -0
  15. data/lib/clio_client/api/crudable.rb +25 -0
  16. data/lib/clio_client/api/custom_field.rb +19 -0
  17. data/lib/clio_client/api/custom_field_set.rb +19 -0
  18. data/lib/clio_client/api/document.rb +20 -0
  19. data/lib/clio_client/api/document_version.rb +29 -0
  20. data/lib/clio_client/api/findable.rb +16 -0
  21. data/lib/clio_client/api/group.rb +22 -0
  22. data/lib/clio_client/api/listable.rb +44 -0
  23. data/lib/clio_client/api/matter.rb +22 -0
  24. data/lib/clio_client/api/note.rb +22 -0
  25. data/lib/clio_client/api/practice_area.rb +22 -0
  26. data/lib/clio_client/api/relationship.rb +22 -0
  27. data/lib/clio_client/api/task.rb +22 -0
  28. data/lib/clio_client/api/timeline_event.rb +19 -0
  29. data/lib/clio_client/api/timer.rb +31 -0
  30. data/lib/clio_client/api/user.rb +31 -0
  31. data/lib/clio_client/authorization.rb +41 -0
  32. data/lib/clio_client/http.rb +92 -0
  33. data/lib/clio_client/models/account.rb +16 -0
  34. data/lib/clio_client/models/activity.rb +31 -0
  35. data/lib/clio_client/models/activity_description.rb +21 -0
  36. data/lib/clio_client/models/bill.rb +45 -0
  37. data/lib/clio_client/models/calendar.rb +19 -0
  38. data/lib/clio_client/models/calendar_entry.rb +32 -0
  39. data/lib/clio_client/models/communication.rb +34 -0
  40. data/lib/clio_client/models/company.rb +7 -0
  41. data/lib/clio_client/models/contact.rb +38 -0
  42. data/lib/clio_client/models/custom_field.rb +21 -0
  43. data/lib/clio_client/models/custom_field_set.rb +21 -0
  44. data/lib/clio_client/models/document.rb +33 -0
  45. data/lib/clio_client/models/document_version.rb +26 -0
  46. data/lib/clio_client/models/email_communication.rb +8 -0
  47. data/lib/clio_client/models/expense_entry.rb +9 -0
  48. data/lib/clio_client/models/group.rb +18 -0
  49. data/lib/clio_client/models/matter.rb +45 -0
  50. data/lib/clio_client/models/note.rb +23 -0
  51. data/lib/clio_client/models/person.rb +9 -0
  52. data/lib/clio_client/models/phone_communication.rb +8 -0
  53. data/lib/clio_client/models/practice_area.rb +18 -0
  54. data/lib/clio_client/models/relationship.rb +19 -0
  55. data/lib/clio_client/models/task.rb +29 -0
  56. data/lib/clio_client/models/time_entry.rb +9 -0
  57. data/lib/clio_client/models/timeline_event.rb +25 -0
  58. data/lib/clio_client/models/timer.rb +28 -0
  59. data/lib/clio_client/models/user.rb +28 -0
  60. data/lib/clio_client/resource.rb +183 -0
  61. data/lib/clio_client/session.rb +56 -0
  62. data/lib/clio_client/support/address.rb +16 -0
  63. data/lib/clio_client/support/custom_field_checkbox_value.rb +7 -0
  64. data/lib/clio_client/support/custom_field_contact_value.rb +10 -0
  65. data/lib/clio_client/support/custom_field_currency_value.rb +7 -0
  66. data/lib/clio_client/support/custom_field_date_value.rb +7 -0
  67. data/lib/clio_client/support/custom_field_email_value.rb +7 -0
  68. data/lib/clio_client/support/custom_field_matter_value.rb +9 -0
  69. data/lib/clio_client/support/custom_field_numeric_value.rb +7 -0
  70. data/lib/clio_client/support/custom_field_picklist_option.rb +13 -0
  71. data/lib/clio_client/support/custom_field_picklist_value.rb +9 -0
  72. data/lib/clio_client/support/custom_field_text_area_value.rb +7 -0
  73. data/lib/clio_client/support/custom_field_text_line_value.rb +7 -0
  74. data/lib/clio_client/support/custom_field_time_value.rb +7 -0
  75. data/lib/clio_client/support/custom_field_url_value.rb +7 -0
  76. data/lib/clio_client/support/custom_field_value.rb +13 -0
  77. data/lib/clio_client/support/email_address.rb +12 -0
  78. data/lib/clio_client/support/instant_messenger.rb +12 -0
  79. data/lib/clio_client/support/phone_number.rb +13 -0
  80. data/lib/clio_client/support/rate.rb +16 -0
  81. data/lib/clio_client/support/reminder.rb +11 -0
  82. data/lib/clio_client/support/web_site.rb +12 -0
  83. data/lib/clio_client/version.rb +3 -0
  84. data/lib/clio_client.rb +107 -0
  85. data/spec/api/crudable_spec.rb +54 -0
  86. data/spec/api/findable_spec.rb +25 -0
  87. data/spec/api/listable_spec.rb +27 -0
  88. data/spec/features/activities_spec.rb +35 -0
  89. data/spec/models/account_spec.rb +12 -0
  90. data/spec/models/activity_description_spec.rb +47 -0
  91. data/spec/models/activity_spec.rb +29 -0
  92. data/spec/models/bill_spec.rb +63 -0
  93. data/spec/models/calendar_entry_spec.rb +62 -0
  94. data/spec/models/calendar_spec.rb +20 -0
  95. data/spec/models/communication_spec.rb +39 -0
  96. data/spec/models/company_spec.rb +5 -0
  97. data/spec/models/contact_spec.rb +5 -0
  98. data/spec/models/custom_field_set_spec.rb +5 -0
  99. data/spec/models/custom_field_spec.rb +5 -0
  100. data/spec/models/document_spec.rb +5 -0
  101. data/spec/models/document_version_spec.rb +6 -0
  102. data/spec/models/email_communication_spec.rb +6 -0
  103. data/spec/models/expense_entry_spec.rb +5 -0
  104. data/spec/models/group_spec.rb +5 -0
  105. data/spec/models/matter_spec.rb +5 -0
  106. data/spec/models/note_spec.rb +5 -0
  107. data/spec/models/person_spec.rb +5 -0
  108. data/spec/models/phone_communication_spec.rb +5 -0
  109. data/spec/models/practice_area_spec.rb +5 -0
  110. data/spec/models/relationship_spec.rb +5 -0
  111. data/spec/models/resource_spec.rb +116 -0
  112. data/spec/models/task_spec.rb +5 -0
  113. data/spec/models/time_entry_spec.rb +41 -0
  114. data/spec/models/timeline_event_spec.rb +6 -0
  115. data/spec/models/timer_spec.rb +6 -0
  116. data/spec/models/user_spec.rb +5 -0
  117. data/spec/spec_helper.rb +25 -0
  118. data/spec/support/associated_resource.rb +6 -0
  119. data/spec/support/dummy_endpoint.rb +11 -0
  120. data/spec/support/inherited_resource.rb +2 -0
  121. data/spec/support/resource_examples.rb +82 -0
  122. data/spec/support/test_resource.rb +11 -0
  123. metadata +286 -0
@@ -0,0 +1,22 @@
1
+ module ClioClient
2
+ module Api
3
+ class PracticeArea < Base
4
+
5
+ include ClioClient::Api::Listable
6
+ include ClioClient::Api::Findable
7
+ include ClioClient::Api::Crudable
8
+
9
+
10
+ private
11
+
12
+ def data_klass(*args)
13
+ ClioClient::PracticeArea
14
+ end
15
+
16
+ def end_point_url; 'practice_areas'; end
17
+ def plural_resource; 'practice_areas'; end
18
+ def singular_resource; 'practice_area'; end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ module ClioClient
2
+ module Api
3
+ class Relationship < Base
4
+
5
+ include ClioClient::Api::Listable
6
+ include ClioClient::Api::Findable
7
+ include ClioClient::Api::Crudable
8
+
9
+
10
+ private
11
+
12
+ def data_klass(*args)
13
+ ClioClient::Relationship
14
+ end
15
+
16
+ def end_point_url; 'relationships'; end
17
+ def plural_resource; 'relationships'; end
18
+ def singular_resource; 'relationship'; end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ module ClioClient
2
+ module Api
3
+ class Task < Base
4
+
5
+ include ClioClient::Api::Listable
6
+ include ClioClient::Api::Findable
7
+ include ClioClient::Api::Crudable
8
+
9
+
10
+ private
11
+
12
+ def data_klass(*args)
13
+ ClioClient::Task
14
+ end
15
+
16
+ def end_point_url; 'tasks'; end
17
+ def plural_resource; 'tasks'; end
18
+ def singular_resource; 'task'; end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ module ClioClient
2
+ module Api
3
+ class TimelineEvent < Base
4
+
5
+ include ClioClient::Api::Listable
6
+
7
+ private
8
+
9
+ def data_klass(*args)
10
+ ClioClient::TimelineEvent
11
+ end
12
+
13
+ def end_point_url; 'timeline_events'; end
14
+ def plural_resource; 'timeline_events'; end
15
+ def singular_resource; 'timeline_event'; end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,31 @@
1
+ module ClioClient
2
+ module Api
3
+ class Timer < Base
4
+
5
+ def find
6
+ response = session.get("#{end_point_url}")
7
+ data_item(response[singular_resource])
8
+ end
9
+
10
+ def start(params = {})
11
+ response = session.post(end_point_url, {singular_resource => params}.to_json)
12
+ data_item(response[singular_resource])
13
+ end
14
+
15
+ def stop
16
+ session.delete("#{end_point_url}", false)
17
+ end
18
+
19
+ private
20
+
21
+ def data_klass(*args)
22
+ ClioClient::Timer
23
+ end
24
+
25
+ def end_point_url; 'timer'; end
26
+ def plural_resource; 'timer'; end
27
+ def singular_resource; 'timer'; end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ module ClioClient
2
+ module Api
3
+ class User < Base
4
+
5
+ include ClioClient::Api::Listable
6
+ include ClioClient::Api::Findable
7
+
8
+ def avatar(id)
9
+ session.get("#{end_point_url}/#{id}/avatar")
10
+ end
11
+
12
+ def who_am_i
13
+ resp = session.get("#{end_point_url}/who_am_i")
14
+ [ClioClient::Account.new(resp["account"], session),
15
+ ClioClient::User.new(resp["user"], session)]
16
+ end
17
+
18
+
19
+ private
20
+
21
+ def data_klass(*args)
22
+ ClioClient::User
23
+ end
24
+
25
+ def end_point_url; 'users'; end
26
+ def plural_resource; 'users'; end
27
+ def singular_resource; 'user'; end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,41 @@
1
+ module ClioClient
2
+
3
+ module Authorization
4
+
5
+
6
+ def authorize_url(redirect_uri, state = nil)
7
+ params = { response_type: :code,
8
+ client_id: self.client_id,
9
+ redirect_uri: redirect_uri
10
+ }
11
+ params[:state] = state if state
12
+ base_uri("/oauth/authorize", params).to_s
13
+ end
14
+
15
+ def authorize_with_code(redirect_uri, code)
16
+ params = { code: code,
17
+ grant_type: "authorization_code",
18
+ client_id: self.client_id,
19
+ client_secret: self.client_secret,
20
+ redirect_uri: redirect_uri
21
+ }
22
+ uri = base_uri("/oauth/token")
23
+ req = Net::HTTP::Post.new(uri.request_uri)
24
+ req.set_form_data params
25
+ credentials = make_request(req, uri)
26
+ self.access_token = credentials["access_token"]
27
+ credentials
28
+ end
29
+
30
+ def authorized?
31
+ begin
32
+ get("/users/who_am_i")
33
+ true
34
+ rescue ClioClient::Unauthorized
35
+ false
36
+ end
37
+ end
38
+
39
+
40
+ end
41
+ end
@@ -0,0 +1,92 @@
1
+ module ClioClient
2
+
3
+ class Unauthorized < Exception; end
4
+ class ResourceNotFound < Exception; end
5
+ class BadRequest < Exception; end
6
+
7
+ module Http
8
+
9
+ def base_uri(path, params = {})
10
+ uri = URI.parse("https://app.goclio.com")
11
+ uri.path = path
12
+ uri.query = URI.encode_www_form(params) if params.any?
13
+ uri
14
+ end
15
+
16
+ def get(path, params ={}, parse=true)
17
+ uri = base_uri("#{api_prefix}/#{path}", params)
18
+ req = Net::HTTP::Get.new(uri.to_s)
19
+ make_api_request(req, uri, parse)
20
+ end
21
+
22
+ def put(path, body = "", parse=true)
23
+ uri = base_uri("#{api_prefix}/#{path}")
24
+ req = Net::HTTP::Put.new(uri.request_uri)
25
+ req.body = body
26
+ req.add_field("Content-Type", "application/json")
27
+ make_api_request(req, uri, parse)
28
+ end
29
+
30
+ def multipart_post(path, params, parse = true)
31
+ uri = base_uri("#{api_prefix}/#{path}")
32
+ req = Net::HTTP::Post::Multipart.new(uri.request_uri, params)
33
+ make_api_request(req, uri, parse)
34
+ end
35
+
36
+ def post(path, body ="", parse = true)
37
+ uri = base_uri("#{api_prefix}/#{path}")
38
+ req = Net::HTTP::Post.new(uri.request_uri)
39
+ req.body = body
40
+ req.add_field("Content-Type", "application/json")
41
+ make_api_request(req, uri, parse)
42
+ end
43
+
44
+ def delete(path, parse=true)
45
+ uri = base_uri("#{api_prefix}/#{path}")
46
+ req = Net::HTTP::Delete.new(uri.request_uri)
47
+ make_api_request(req, uri, parse)
48
+ end
49
+
50
+ def make_api_request(req, uri, parse = true)
51
+ return nil if self.access_token.nil? || self.access_token.empty?
52
+ req.add_field("Authorization", "Bearer #{self.access_token}")
53
+ make_request(req, uri, parse)
54
+ end
55
+
56
+ def make_request(req, uri, parse = true)
57
+ req.add_field("Accept", "text/json")
58
+ n = Net::HTTP.new(uri.host, uri.port)
59
+ n.use_ssl = true
60
+ res = n.start do |http|
61
+ http.request(req)
62
+ end
63
+ parse_response(res, parse)
64
+ end
65
+
66
+ def parse_response(res, parse)
67
+ if res.body !~ /^\s*$/ && !res.body.nil?
68
+ body = parse ? JSON.parse(res.body) : res.body
69
+ end
70
+
71
+ case res
72
+ when Net::HTTPNotFound
73
+ raise ClioClient::ResourceNotFound.new(body["message"])
74
+ when Net::HTTPSuccess
75
+ body
76
+ when Net::HTTPUnauthorized
77
+ raise ClioClient::Unauthorized.new(body["message"])
78
+ when Net::HTTPBadRequest
79
+ raise ClioClient::BadRequest.new(body["message"])
80
+ when Net::HTTPSeeOther
81
+ res["Location"]
82
+ else
83
+ raise "Unknown #{res.class} response. #{body["message"]}"
84
+ end
85
+ end
86
+
87
+ private
88
+ def api_prefix; "/api/v2"; end
89
+
90
+ end
91
+
92
+ end
@@ -0,0 +1,16 @@
1
+ module ClioClient
2
+
3
+ class Account < Resource
4
+
5
+ set_attributes(id: {type: :int, readonly: true},
6
+ created_at: {type: :datetime, readonly: true},
7
+ updated_at: {type: :datetime, readonly: true},
8
+ maildrop_address: {type: :string},
9
+ name: {type: :string, readonly: true}
10
+ )
11
+
12
+ has_association :owner, ClioClient::User
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,31 @@
1
+ module ClioClient
2
+
3
+ class Activity < Resource
4
+
5
+ set_attributes(id: {type: :int, readonly: true},
6
+ created_at: {type: :datetime, readonly: true},
7
+ updated_at: {type: :datetime, readonly: true},
8
+ type: {type: :string, required: true},
9
+ date: {type: :date },
10
+ quantity: {type: :decimal, required: true},
11
+ price: {type: :decimal, required: true},
12
+ total: {type: :string, readonly: true},
13
+ note: {type: :string },
14
+ billed: {type: :boolean, readonly: true}
15
+ )
16
+
17
+
18
+
19
+ has_association :user, ClioClient::User
20
+ has_association :matter, ClioClient::Matter
21
+ has_association :activity_description, ClioClient::ActivityDescription
22
+ has_association :communication, ClioClient::Communication
23
+
24
+ private
25
+ def api
26
+ session.activities
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,21 @@
1
+ module ClioClient
2
+
3
+ class ActivityDescription < Resource
4
+
5
+ set_attributes(id: {type: :int, readonly: true},
6
+ name: {type: :string},
7
+ created_at: {type: :datetime, readonly: true},
8
+ updated_at: {type: :datetime, readonly: true},
9
+ activity_rate_default: {type: :rate}
10
+ )
11
+
12
+ has_many_association :rates, ClioClient::Rate
13
+
14
+ private
15
+ def api
16
+ session.activity_descriptions
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,45 @@
1
+ module ClioClient
2
+ class Bill < Resource
3
+
4
+ set_attributes(
5
+ id: {type: :int, readonly: true},
6
+ type: {type: :string, readonly: true},
7
+ original_bill_id: {type: :int, readonly: true},
8
+ created_at: {type: :datetime, readonly: true},
9
+ updated_at: {type: :datetime, readonly: true},
10
+ pdf_url: {type: :string, readonly: true},
11
+ number: {type: :string },
12
+ subject: {type: :string },
13
+ currency: {type: :string },
14
+ purchase_order: {type: :string },
15
+ memo: {type: :string },
16
+ start_at: {type: :datetime },
17
+ end_at: {type: :datetime },
18
+ issued_at: {type: :date },
19
+ due_at: {type: :date },
20
+ tax_rate: {type: :decimal },
21
+ secondary_tax_rate: {type: :decimal },
22
+ discount: {type: :decimal },
23
+ discount_type: {type: :string },
24
+ discount_note: {type: :note },
25
+ balance: {type: :decimal },
26
+ total: {type: :decimal },
27
+ status: {type: :string, readonly: true },
28
+ )
29
+
30
+ has_association :client, ClioClient::Contact
31
+ has_many_association :matters, ClioClient::Matter
32
+
33
+ def pdf
34
+ unless self.id.nil?
35
+ api.download(self.id)
36
+ end
37
+ end
38
+
39
+ private
40
+ def api
41
+ session.bills
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,19 @@
1
+ module ClioClient
2
+ class Calendar < Resource
3
+
4
+ set_attributes(
5
+ id: {type: :int, readonly: true},
6
+ type: {type: :string, readonly: true},
7
+ created_at: {type: :datetime, readonly: true},
8
+ updated_at: {type: :datetime, readonly: true},
9
+ name: {type: :string },
10
+ color: {type: :string },
11
+ permission: {type: :string, readonly: true}
12
+ )
13
+
14
+ private
15
+ def api
16
+ session.calendars
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ module ClioClient
2
+ class CalendarEntry < Resource
3
+
4
+ set_attributes(
5
+ id: {type: :int, readonly: true},
6
+ created_at: {type: :datetime, readonly: true},
7
+ updated_at: {type: :datetime, readonly: true},
8
+ start_date_time: {type: :datetime },
9
+ end_date_time: {type: :datetime },
10
+ start_date: {type: :date, readonly: true},
11
+ end_date: {type: :date },
12
+ summary: {type: :string },
13
+ description: {type: :string },
14
+ location: {type: :string },
15
+ permission: {type: :string, readonly: true},
16
+ recurrence_rule: {type: :string },
17
+ parent_calendar_entry_id: {type: :int },
18
+ original_event_start_date: {type: :datetime },
19
+ )
20
+
21
+ has_association :matter, ClioClient::Matter
22
+ has_association :calendar, ClioClient::Calendar
23
+ has_many_association :attending_calendars, ClioClient::Calendar
24
+ has_many_association :reminders, ClioClient::Reminder
25
+
26
+ private
27
+ def api
28
+ session.calendar_entries
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,34 @@
1
+ module ClioClient
2
+
3
+ class Communication < Resource
4
+
5
+ set_attributes(id: {type: :int, readonly: true},
6
+ type: {type: :string, readonly: true},
7
+ created_at: {type: :datetime, readonly: true},
8
+ updated_at: {type: :datetime, readonly: true},
9
+ subject: {type: :string},
10
+ body: {type: :string},
11
+ date: {type: :date},
12
+ )
13
+
14
+ alias_method :name, :subject
15
+ alias_method :name=, :subject=
16
+
17
+ has_association :matter, ClioClient::Matter
18
+ has_many_association(:senders, ClioClient::Resource,
19
+ :polymorphic => true,
20
+ :accepted_types => %w(Contact User))
21
+
22
+ has_many_association(:receivers, ClioClient::Resource,
23
+ :polymorphic => true,
24
+ :accepted_types => %w(Contact User))
25
+
26
+ private
27
+ def api
28
+ session.communications
29
+ end
30
+
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,7 @@
1
+ module ClioClient
2
+ class Company < Contact
3
+
4
+ def type; 'Company'; end;
5
+
6
+ end
7
+ end
@@ -0,0 +1,38 @@
1
+ module ClioClient
2
+ class Contact < Resource
3
+
4
+ set_attributes(id: {type: :int, readonly: true},
5
+ type: {type: :string, readonly: true},
6
+ created_at: {type: :datetime, readonly: true},
7
+ updated_at: {type: :datetime, readonly: true},
8
+ name: {type: :string },
9
+ prefix: {type: :string },
10
+ first_name: {type: :string },
11
+ last_name: {type: :string },
12
+ title: {type: :string }
13
+ )
14
+
15
+ has_many_association :phone_numbers, ClioClient::PhoneNumber
16
+ has_many_association :email_addresses, ClioClient::EmailAddress
17
+ has_many_association :addresses, ClioClient::Address
18
+ has_many_association :web_sites, ClioClient::WebSite
19
+ has_many_association :instant_messengers, ClioClient::InstantMessenger
20
+ has_many_association(:custom_field_values, ClioClient::CustomFieldValue,
21
+ :polymorphic => true,
22
+ :accepted_types => %w(CustomFieldCheckboxValue CustomFieldContactValue
23
+ CustomFieldCurrencyValue CustomFieldDateValue CustomFieldTimeValue
24
+ CustomFieldEmailValue CustomFieldMatterValue CustomFieldNumericValue
25
+ CustomFieldPicklistValue CustomFieldTextAreaValue
26
+ CustomFieldTextLineValue CustomFieldUrlValue))
27
+ has_many_association :activity_rates, ClioClient::Rate
28
+
29
+
30
+ private
31
+ def api
32
+ session.contacts
33
+ end
34
+
35
+
36
+
37
+ end
38
+ end
@@ -0,0 +1,21 @@
1
+ module ClioClient
2
+ class CustomField < Resource
3
+
4
+ set_attributes(id: {type: :int, readonly: true},
5
+ created_at: {type: :datetime, readonly: true},
6
+ updated_at: {type: :datetime, readonly: true},
7
+ name: {type: :string},
8
+ parent_type: {type: :string},
9
+ field_type: {type: :string},
10
+ displayed: {type: :boolean},
11
+ )
12
+
13
+ has_many_association :custom_field_picklist_options, ClioClient::CustomFieldPicklistOption
14
+
15
+ private
16
+ def api
17
+ session.custom_fields
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module ClioClient
2
+ class CustomFieldSet < Resource
3
+
4
+ set_attributes(id: {type: :int, readonly: true},
5
+ created_at: {type: :datetime, readonly: true},
6
+ updated_at: {type: :datetime, readonly: true},
7
+ name: {type: :string},
8
+ parent_type: {type: :string},
9
+ displayed: {type: :boolean},
10
+ )
11
+
12
+ has_many_association :members, ClioClient::CustomField
13
+
14
+
15
+ private
16
+ def api
17
+ session.custom_field_sets
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,33 @@
1
+ module ClioClient
2
+ class Document < Resource
3
+
4
+ set_attributes(id: {type: :int, readonly: true},
5
+ created_at: {type: :datetime, readonly: true},
6
+ updated_at: {type: :datetime, readonly: true},
7
+ description: {type: :string, readonly: true},
8
+ category: {type: :string, readonly: true},
9
+ content_type: {type: :string, readonly: true},
10
+ filename: {type: :string, readonly: true},
11
+ size: {type: :int, readonly: true},
12
+ last_modified: {type: :datetime},
13
+ )
14
+
15
+ has_association :matter, ClioClient::Matter
16
+ has_association :user, ClioClient::User
17
+ has_many_association :document_versions, ClioClient::DocumentVersion
18
+
19
+ def document_versions=(arr)
20
+ many = arr.collect do |attributes|
21
+ merged_attrs = attributes.merge("document_id" => id)
22
+ ClioClient::DocumentVersion.new(merged_attrs, session)
23
+ end
24
+ write_attribute("document_versions", many)
25
+ end
26
+
27
+ private
28
+ def api
29
+ session.documents
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ module ClioClient
2
+ class DocumentVersion < Resource
3
+
4
+ set_attributes(id: {type: :int, readonly: true},
5
+ document_id: {type: :int, readonly: true},
6
+ version: {type: :int, readonly: true},
7
+ created_at: {type: :datetime, readonly: true},
8
+ updated_at: {type: :datetime, readonly: true},
9
+ size: {type: :int, readonly: true},
10
+ content_type: {type: :string, readonly: true},
11
+ last_modified: {type: :datetime},
12
+ filename: {type: :string}
13
+ )
14
+
15
+ def download
16
+ api.download(id)
17
+ end
18
+
19
+
20
+ private
21
+ def api
22
+ session.document_versions(document_id)
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,8 @@
1
+ module ClioClient
2
+
3
+ class EmailCommunication < Communication
4
+
5
+ def type; 'EmailCommunication'; end
6
+
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module ClioClient
2
+
3
+ class ExpenseEntry < Activity
4
+
5
+ def type; 'ExpenseEntry'; end
6
+
7
+ end
8
+
9
+ end