dotloop_api 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.rubocop.yml +34 -0
- data/.travis.yml +8 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +77 -0
- data/Rakefile +6 -0
- data/bin/console +7 -0
- data/bin/setup +8 -0
- data/certs/shanedavies.pem +21 -0
- data/dotloop_api.gemspec +43 -0
- data/lib/dotloop_api/auth.rb +120 -0
- data/lib/dotloop_api/client.rb +89 -0
- data/lib/dotloop_api/end_points/account.rb +19 -0
- data/lib/dotloop_api/end_points/activity.rb +22 -0
- data/lib/dotloop_api/end_points/base.rb +37 -0
- data/lib/dotloop_api/end_points/batch.rb +34 -0
- data/lib/dotloop_api/end_points/contact.rb +9 -0
- data/lib/dotloop_api/end_points/detail.rb +28 -0
- data/lib/dotloop_api/end_points/document.rb +25 -0
- data/lib/dotloop_api/end_points/folder.rb +32 -0
- data/lib/dotloop_api/end_points/loop.rb +17 -0
- data/lib/dotloop_api/end_points/loop_template.rb +19 -0
- data/lib/dotloop_api/end_points/model_builder.rb +65 -0
- data/lib/dotloop_api/end_points/param_helper.rb +60 -0
- data/lib/dotloop_api/end_points/participant.rb +22 -0
- data/lib/dotloop_api/end_points/profile.rb +10 -0
- data/lib/dotloop_api/end_points/task.rb +23 -0
- data/lib/dotloop_api/end_points/task_list.rb +21 -0
- data/lib/dotloop_api/exceptions.rb +25 -0
- data/lib/dotloop_api/models/config.rb +18 -0
- data/lib/dotloop_api/models/contact.rb +38 -0
- data/lib/dotloop_api/models/profile/loop/activity.rb +13 -0
- data/lib/dotloop_api/models/profile/loop/detail.rb +129 -0
- data/lib/dotloop_api/models/profile/loop/folder/document.rb +27 -0
- data/lib/dotloop_api/models/profile/loop/folder.rb +25 -0
- data/lib/dotloop_api/models/profile/loop/participant.rb +9 -0
- data/lib/dotloop_api/models/profile/loop/tasklist/task.rb +16 -0
- data/lib/dotloop_api/models/profile/loop/tasklist.rb +22 -0
- data/lib/dotloop_api/models/profile/loop.rb +58 -0
- data/lib/dotloop_api/models/profile/loop_template.rb +16 -0
- data/lib/dotloop_api/models/profile.rb +63 -0
- data/lib/dotloop_api/version.rb +3 -0
- data/lib/dotloop_api.rb +47 -0
- data.tar.gz.sig +0 -0
- metadata +309 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module EndPoints
|
3
|
+
class Detail < DotloopApi::EndPoints::Base
|
4
|
+
attr_accessor :profile_id
|
5
|
+
attr_accessor :loop_id
|
6
|
+
undef_method :all
|
7
|
+
undef_method :create
|
8
|
+
undef_method :delete
|
9
|
+
def initialize(client:, profile_id: nil, loop_id: nil)
|
10
|
+
@profile_id = profile_id
|
11
|
+
@loop_id = loop_id
|
12
|
+
super(client: client, path: path, type: DotloopApi::Models::Profile::Loop::Detail)
|
13
|
+
end
|
14
|
+
|
15
|
+
def find
|
16
|
+
build_model(@client.get(path)[:data])
|
17
|
+
end
|
18
|
+
|
19
|
+
def path
|
20
|
+
"/profile/#{@profile_id}/loop/#{@loop_id}/detail"
|
21
|
+
end
|
22
|
+
|
23
|
+
def build_model(attrs)
|
24
|
+
super(fix_hash(attrs))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module EndPoints
|
3
|
+
class Document < DotloopApi::EndPoints::Base
|
4
|
+
attr_accessor :profile_id
|
5
|
+
attr_accessor :loop_id
|
6
|
+
attr_accessor :folder_id
|
7
|
+
undef_method :create
|
8
|
+
undef_method :delete
|
9
|
+
def initialize(client:, profile_id: nil, loop_id: nil, folder_id: nil)
|
10
|
+
@profile_id = profile_id
|
11
|
+
@loop_id = loop_id
|
12
|
+
@folder_id = folder_id
|
13
|
+
super(client: client, path: path, type: DotloopApi::Models::Profile::Loop::Folder::Document)
|
14
|
+
end
|
15
|
+
|
16
|
+
def path
|
17
|
+
"/profile/#{@profile_id}/loop/#{@loop_id}/folder/#{@folder_id}/document"
|
18
|
+
end
|
19
|
+
|
20
|
+
def download(id:)
|
21
|
+
@client.download(single_path(id))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module EndPoints
|
3
|
+
class Folder < DotloopApi::EndPoints::Base
|
4
|
+
attr_accessor :profile_id
|
5
|
+
attr_accessor :loop_id
|
6
|
+
undef_method :delete
|
7
|
+
|
8
|
+
def initialize(client:, profile_id: nil, loop_id: nil)
|
9
|
+
@profile_id = profile_id
|
10
|
+
@loop_id = loop_id
|
11
|
+
super(client: client, path: path, type: DotloopApi::Models::Profile::Loop::Folder)
|
12
|
+
end
|
13
|
+
|
14
|
+
def all(options = {})
|
15
|
+
options_to_params(options)
|
16
|
+
@client.get(path, @params)[:data].map { |attrs| build_model(attrs) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def path
|
20
|
+
"/profile/#{@profile_id}/loop/#{@loop_id}/folder"
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def options_to_params(options)
|
26
|
+
@params = {
|
27
|
+
include_documents: options.key?(:include_documents) ? options[:include_documents] : true
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module EndPoints
|
3
|
+
class Loop < DotloopApi::EndPoints::Batch
|
4
|
+
attr_accessor :profile_id
|
5
|
+
undef_method :delete
|
6
|
+
|
7
|
+
def initialize(client:, profile_id: nil)
|
8
|
+
@profile_id = profile_id
|
9
|
+
super(client: client, path: path, type: DotloopApi::Models::Profile::Loop)
|
10
|
+
end
|
11
|
+
|
12
|
+
def path
|
13
|
+
"/profile/#{@profile_id}/loop"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module EndPoints
|
3
|
+
class LoopTemplate < DotloopApi::EndPoints::Base
|
4
|
+
attr_accessor :profile_id
|
5
|
+
undef_method :save
|
6
|
+
undef_method :create
|
7
|
+
undef_method :delete
|
8
|
+
|
9
|
+
def initialize(client:, profile_id: nil)
|
10
|
+
@profile_id = profile_id
|
11
|
+
super(client: client, path: path, type: DotloopApi::Models::Profile::LoopTemplate)
|
12
|
+
end
|
13
|
+
|
14
|
+
def path
|
15
|
+
"/profile/#{@profile_id}/loop-template"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module EndPoints
|
3
|
+
module ModelBuilder
|
4
|
+
def build_model(attrs)
|
5
|
+
model = @type.new(fix_nested_attributes(attrs))
|
6
|
+
model.client = @client if model.respond_to?(:client)
|
7
|
+
model.profile_id = @profile_id if model.respond_to?(:profile_id)
|
8
|
+
model.loop_id = @loop_id if model.respond_to?(:loop_id)
|
9
|
+
model.folder_id = @folder_id if model.respond_to?(:folder_id)
|
10
|
+
model
|
11
|
+
end
|
12
|
+
|
13
|
+
def build_documents(attrs)
|
14
|
+
attrs['documents'].map do |doc_attrs|
|
15
|
+
doc = DotloopApi::Models::Profile::Loop::Folder::Document.new(doc_attrs)
|
16
|
+
doc.client = @client
|
17
|
+
doc.profile_id = @profile_id
|
18
|
+
doc.loop_id = @loop_id
|
19
|
+
doc.folder_id = attrs['id']
|
20
|
+
doc
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def build_details(attrs)
|
25
|
+
data = fix_hash(attrs)
|
26
|
+
data.keys.each_with_object({}) do |key, memo|
|
27
|
+
memo[key] = detail_model(key).new(data[key])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def fix_nested_attributes(attrs)
|
34
|
+
attrs['details'] = build_details(attrs['details']) if attrs.key?('details')
|
35
|
+
attrs['documents'] = build_documents(attrs) if attrs.key?('documents')
|
36
|
+
attrs
|
37
|
+
end
|
38
|
+
|
39
|
+
def fix_hash(hash)
|
40
|
+
hash.each_with_object({}) do |(key, value), memo|
|
41
|
+
new_key = fix_key(key)
|
42
|
+
memo[new_key] = value.is_a?(Hash) ? fix_hash(value) : value
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def fix_key(index)
|
47
|
+
index
|
48
|
+
.to_s
|
49
|
+
.delete("'")
|
50
|
+
.gsub('#', 'Number')
|
51
|
+
.gsub('%', 'Percent')
|
52
|
+
.gsub('$', 'Dollar')
|
53
|
+
.downcase
|
54
|
+
.gsub(/[^a-z]/, '_')
|
55
|
+
.squeeze('_')
|
56
|
+
.gsub(/^_*/, '')
|
57
|
+
.to_sym
|
58
|
+
end
|
59
|
+
|
60
|
+
def detail_model(key)
|
61
|
+
"DotloopApi::Models::Profile::Loop::Detail::#{key.to_s.camelize}".constantize
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module EndPoints
|
3
|
+
class ParamHelper
|
4
|
+
include Virtus.model
|
5
|
+
attribute :batch_number, Integer, default: 1
|
6
|
+
attribute :batch_size, Integer, default: 100
|
7
|
+
attribute :filter
|
8
|
+
attribute :include_details, Boolean, default: false
|
9
|
+
attribute :sort_key
|
10
|
+
attribute :sort_direction, String, default: 'asc'
|
11
|
+
|
12
|
+
MAX_BATCH_SIZE = 100
|
13
|
+
FILTER_OPTIONS = %w[
|
14
|
+
updated_min created_min transaction_type transaction_status
|
15
|
+
].freeze
|
16
|
+
|
17
|
+
def params
|
18
|
+
{
|
19
|
+
batch_number: @batch_number.to_i,
|
20
|
+
batch_size: size,
|
21
|
+
filter: filter_hash,
|
22
|
+
include_details: @include_details,
|
23
|
+
sort: sort
|
24
|
+
}.delete_if { |_, v| should_delete(v) }
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def size
|
30
|
+
[@batch_size.to_i, MAX_BATCH_SIZE].min
|
31
|
+
end
|
32
|
+
|
33
|
+
def sort
|
34
|
+
return unless sort_key_valid?
|
35
|
+
"#{@sort_key}:#{direction}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def direction
|
39
|
+
@sort_direction == 'asc' ? :asc : :desc
|
40
|
+
end
|
41
|
+
|
42
|
+
def sort_key_valid?
|
43
|
+
%w[
|
44
|
+
address closing_date created default expiration_date
|
45
|
+
listing_date purchase_price review_submission_date updated
|
46
|
+
].include? @sort_key
|
47
|
+
end
|
48
|
+
|
49
|
+
def should_delete(value)
|
50
|
+
value.nil? ||
|
51
|
+
(value.is_a?(Integer) && value.zero?) ||
|
52
|
+
((value.is_a?(String) || value.is_a?(Hash)) && value.empty?)
|
53
|
+
end
|
54
|
+
|
55
|
+
def filter_hash
|
56
|
+
(@filter.to_s.split('&').map { |var| var.split('=') }).to_h.slice(*FILTER_OPTIONS)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module EndPoints
|
3
|
+
class Participant < DotloopApi::EndPoints::Base
|
4
|
+
attr_accessor :profile_id
|
5
|
+
attr_accessor :loop_id
|
6
|
+
|
7
|
+
def initialize(client:, profile_id: nil, loop_id: nil)
|
8
|
+
@profile_id = profile_id
|
9
|
+
@loop_id = loop_id
|
10
|
+
super(client: client, path: path, type: DotloopApi::Models::Profile::Loop::Participant)
|
11
|
+
end
|
12
|
+
|
13
|
+
def path
|
14
|
+
"/profile/#{@profile_id}/loop/#{@loop_id}/participant"
|
15
|
+
end
|
16
|
+
|
17
|
+
def build_model(attrs)
|
18
|
+
super(fix_hash(attrs))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module EndPoints
|
3
|
+
class Task < DotloopApi::EndPoints::Base
|
4
|
+
attr_accessor :profile_id
|
5
|
+
attr_accessor :loop_id
|
6
|
+
attr_accessor :task_list_id
|
7
|
+
undef_method :save
|
8
|
+
undef_method :create
|
9
|
+
undef_method :delete
|
10
|
+
|
11
|
+
def initialize(client:, profile_id: nil, loop_id: nil, task_list_id: nil)
|
12
|
+
@profile_id = profile_id
|
13
|
+
@loop_id = loop_id
|
14
|
+
@task_list_id = task_list_id
|
15
|
+
super(client: client, path: path, type: DotloopApi::Models::Profile::Loop::TaskList::Task)
|
16
|
+
end
|
17
|
+
|
18
|
+
def path
|
19
|
+
"/profile/#{@profile_id}/loop/#{@loop_id}/tasklist/#{@task_list_id}/task"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module EndPoints
|
3
|
+
class TaskList < DotloopApi::EndPoints::Base
|
4
|
+
attr_accessor :profile_id
|
5
|
+
attr_accessor :loop_id
|
6
|
+
undef_method :save
|
7
|
+
undef_method :create
|
8
|
+
undef_method :delete
|
9
|
+
|
10
|
+
def initialize(client:, profile_id: nil, loop_id: nil)
|
11
|
+
@profile_id = profile_id
|
12
|
+
@loop_id = loop_id
|
13
|
+
super(client: client, path: path, type: DotloopApi::Models::Profile::Loop::TaskList)
|
14
|
+
end
|
15
|
+
|
16
|
+
def path
|
17
|
+
"/profile/#{@profile_id}/loop/#{@loop_id}/tasklist"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
class BadRequest < StandardError; end
|
3
|
+
class Forbidden < StandardError; end
|
4
|
+
class MissingRefreshToken < StandardError; end
|
5
|
+
class MissingRevokeToken < StandardError; end
|
6
|
+
class NotFound < StandardError; end
|
7
|
+
class NotImplemented < StandardError; end
|
8
|
+
class TooManyRequests < StandardError; end
|
9
|
+
class Unauthorized < StandardError; end
|
10
|
+
class UnmatchState < StandardError; end
|
11
|
+
class UnprocessableEntity < StandardError; end
|
12
|
+
class CodeMap
|
13
|
+
def self.call(code)
|
14
|
+
return if code == 200
|
15
|
+
{
|
16
|
+
400 => DotloopApi::BadRequest,
|
17
|
+
401 => DotloopApi::Unauthorized,
|
18
|
+
403 => DotloopApi::Forbidden,
|
19
|
+
404 => DotloopApi::NotFound,
|
20
|
+
422 => DotloopApi::UnprocessableEntity,
|
21
|
+
429 => DotloopApi::TooManyRequests
|
22
|
+
}.fetch(code, StandardError)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module Models
|
3
|
+
class Config
|
4
|
+
include Virtus.model
|
5
|
+
attribute :access_token
|
6
|
+
attribute :application, String, default: 'dotloop'
|
7
|
+
attribute :client_id, String, required: true
|
8
|
+
attribute :client_secret, String, required: true
|
9
|
+
attribute :expires_in
|
10
|
+
attribute :redirect_on_deny, Boolean, default: true
|
11
|
+
attribute :redirect_uri, String
|
12
|
+
attribute :refresh_token
|
13
|
+
attribute :scope, String
|
14
|
+
attribute :state, String
|
15
|
+
attribute :token_type, String
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module Models
|
3
|
+
class Contact
|
4
|
+
ROLE_TYPES = %w[
|
5
|
+
ADMIN APPRAISER BUYER BUYER_ATTORNEY BUYING_AGENT BUYING_BROKER
|
6
|
+
ESCROW_TITLE_REP HOME_IMPROVEMENT_SPECIALIST HOME_INSPECTOR
|
7
|
+
HOME_SECURITY_PROVIDER HOME_WARRANTY_REP INSPECTOR INSURANCE_REP
|
8
|
+
LANDLORD LISTING_AGENT LISTING_BROKER LOAN_OFFICER LOAN_PROCESSOR
|
9
|
+
MANAGING_BROKER MOVING_STORAGE OTHER PROPERTY_MANAGER SELLER
|
10
|
+
SELLER_ATTORNEY TENANT TENANT_AGENT TRANSACTION_COORDINATOR
|
11
|
+
UTILITIES_PROVIDER
|
12
|
+
].freeze
|
13
|
+
include Virtus.model
|
14
|
+
attribute :address
|
15
|
+
attribute :cell_phone
|
16
|
+
attribute :city
|
17
|
+
attribute :company_name
|
18
|
+
attribute :country
|
19
|
+
attribute :email
|
20
|
+
attribute :fax
|
21
|
+
attribute :first_name
|
22
|
+
attribute :home
|
23
|
+
attribute :id, Integer
|
24
|
+
attribute :last_name
|
25
|
+
attribute :license_number
|
26
|
+
attribute :office
|
27
|
+
attribute :phone
|
28
|
+
attribute :role
|
29
|
+
attribute :state
|
30
|
+
attribute :state_prov
|
31
|
+
attribute :street_name
|
32
|
+
attribute :street_number
|
33
|
+
attribute :updated, Time
|
34
|
+
attribute :zip_code
|
35
|
+
attribute :zip_postal_code
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module Models
|
3
|
+
class Profile
|
4
|
+
class Loop
|
5
|
+
class Detail
|
6
|
+
include Virtus.model
|
7
|
+
attribute :contract_dates, DotloopApi::Models::Profile::Loop::Detail::ContractDates
|
8
|
+
attribute :contract_info, DotloopApi::Models::Profile::Loop::Detail::ContractInfo
|
9
|
+
attribute :financials, DotloopApi::Models::Profile::Loop::Detail::Financials
|
10
|
+
attribute :geographic_description, DotloopApi::Models::Profile::Loop::Detail::GeographicDescription
|
11
|
+
attribute :listing_information, DotloopApi::Models::Profile::Loop::Detail::ListingInformation
|
12
|
+
attribute :offer_dates, DotloopApi::Models::Profile::Loop::Detail::OfferDates
|
13
|
+
attribute :property_address, DotloopApi::Models::Profile::Loop::Detail::PropertyAddress
|
14
|
+
attribute :property, DotloopApi::Models::Profile::Loop::Detail::Property
|
15
|
+
attribute :referral, DotloopApi::Models::Profile::Loop::Detail::Referral
|
16
|
+
attr_accessor :client
|
17
|
+
attr_accessor :profile_id
|
18
|
+
attr_accessor :loop_id
|
19
|
+
|
20
|
+
def save
|
21
|
+
DotloopApi::EndPoints::Detail.new(
|
22
|
+
client: client, profile_id: profile_id, loop_id: loop_id
|
23
|
+
).save(self)
|
24
|
+
end
|
25
|
+
|
26
|
+
class ContractDates
|
27
|
+
include Virtus.model
|
28
|
+
attribute :contract_agreement_date
|
29
|
+
attribute :closing_date
|
30
|
+
end
|
31
|
+
|
32
|
+
class ContractInfo
|
33
|
+
include Virtus.model
|
34
|
+
attribute :transaction_number
|
35
|
+
attribute :start_date
|
36
|
+
attribute :end_date
|
37
|
+
end
|
38
|
+
|
39
|
+
class Financials
|
40
|
+
include Virtus.model
|
41
|
+
attribute :earnest_money_amount
|
42
|
+
attribute :earnest_money_held_by
|
43
|
+
attribute :purchase_sale_price
|
44
|
+
attribute :sale_commission_rate
|
45
|
+
attribute :sale_commission_split_dollar_buy_side
|
46
|
+
attribute :sale_commission_split_dollar_sell_side
|
47
|
+
attribute :sale_commission_split_percent_buy_side
|
48
|
+
attribute :sale_commission_split_percent_sell_side
|
49
|
+
attribute :sale_commission_total
|
50
|
+
end
|
51
|
+
|
52
|
+
class GeographicDescription
|
53
|
+
include Virtus.model
|
54
|
+
attribute :addition
|
55
|
+
attribute :block
|
56
|
+
attribute :deed_book
|
57
|
+
attribute :deed_page
|
58
|
+
attribute :lot
|
59
|
+
attribute :map_grid
|
60
|
+
attribute :mls_area
|
61
|
+
attribute :legal_description
|
62
|
+
attribute :section
|
63
|
+
attribute :subdivision
|
64
|
+
end
|
65
|
+
|
66
|
+
class ListingInformation
|
67
|
+
include Virtus.model
|
68
|
+
attribute :current_price
|
69
|
+
attribute :description_of_other_liens
|
70
|
+
attribute :expiration_date
|
71
|
+
attribute :first_mortgage_balance
|
72
|
+
attribute :homeowner_association
|
73
|
+
attribute :homeowner_association_dues
|
74
|
+
attribute :listing_date
|
75
|
+
attribute :original_price
|
76
|
+
attribute :other_liens
|
77
|
+
attribute :property_excludes
|
78
|
+
attribute :property_includes
|
79
|
+
attribute :remarks
|
80
|
+
attribute :second_mortgage_balance
|
81
|
+
attribute :total_encumbrances
|
82
|
+
end
|
83
|
+
|
84
|
+
class Participant < DotloopApi::Models::Contact; end
|
85
|
+
|
86
|
+
class OfferDates
|
87
|
+
include Virtus.model
|
88
|
+
attribute :offer_date
|
89
|
+
attribute :inspection_date
|
90
|
+
attribute :occupancy_date
|
91
|
+
attribute :offer_expiration_date
|
92
|
+
end
|
93
|
+
|
94
|
+
class Property
|
95
|
+
include Virtus.model
|
96
|
+
attribute :bathrooms
|
97
|
+
attribute :bedrooms
|
98
|
+
attribute :lot_size
|
99
|
+
attribute :school_d
|
100
|
+
attribute :square_footage
|
101
|
+
attribute :type
|
102
|
+
attribute :year_built
|
103
|
+
end
|
104
|
+
|
105
|
+
class PropertyAddress
|
106
|
+
include Virtus.model
|
107
|
+
attribute :city
|
108
|
+
attribute :country
|
109
|
+
attribute :county
|
110
|
+
attribute :mls_number
|
111
|
+
attribute :parcel_tax_id
|
112
|
+
attribute :postal_code
|
113
|
+
attribute :property_address_country
|
114
|
+
attribute :state_or_province
|
115
|
+
attribute :street_name
|
116
|
+
attribute :street_number
|
117
|
+
attribute :unit_number
|
118
|
+
end
|
119
|
+
|
120
|
+
class Referral
|
121
|
+
include Virtus.model
|
122
|
+
attribute :referral_source
|
123
|
+
attribute :referral_percentage
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module Models
|
3
|
+
class Profile
|
4
|
+
class Loop
|
5
|
+
class Folder
|
6
|
+
class Document
|
7
|
+
include Virtus.model
|
8
|
+
attribute :created, Time
|
9
|
+
attribute :id, Integer
|
10
|
+
attribute :name
|
11
|
+
attribute :updated, Time
|
12
|
+
attr_accessor :client
|
13
|
+
attr_accessor :profile_id
|
14
|
+
attr_accessor :loop_id
|
15
|
+
attr_accessor :folder_id
|
16
|
+
|
17
|
+
def download
|
18
|
+
DotloopApi::EndPoints::Document.new(
|
19
|
+
client: client, profile_id: profile_id, loop_id: loop_id, folder_id: folder_id
|
20
|
+
).download(id: @id)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module Models
|
3
|
+
class Profile
|
4
|
+
class Loop
|
5
|
+
class Folder
|
6
|
+
include Virtus.model
|
7
|
+
attribute :name
|
8
|
+
attribute :id, Integer
|
9
|
+
attribute :created, Time
|
10
|
+
attribute :updated, Time
|
11
|
+
attribute :documents, Array[DotloopApi::Models::Profile::Loop::Folder::Document]
|
12
|
+
attr_accessor :client
|
13
|
+
attr_accessor :profile_id
|
14
|
+
attr_accessor :loop_id
|
15
|
+
|
16
|
+
def document_list
|
17
|
+
@docuements = DotloopApi::EndPoints::Document.new(
|
18
|
+
client: client, profile_id: profile_id, loop_id: loop_id, folder_id: id
|
19
|
+
).all
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module DotloopApi
|
2
|
+
module Models
|
3
|
+
class Profile
|
4
|
+
class Loop
|
5
|
+
class TaskList
|
6
|
+
include Virtus.model
|
7
|
+
attribute :id, Integer
|
8
|
+
attribute :name
|
9
|
+
attr_accessor :client
|
10
|
+
attr_accessor :loop_id
|
11
|
+
attr_accessor :profile_id
|
12
|
+
|
13
|
+
def tasks
|
14
|
+
DotloopApi::EndPoints::Task.new(
|
15
|
+
client: client, profile_id: profile_id, loop_id: loop_id, task_list_id: id
|
16
|
+
).all
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|