real_page 2.3.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.
- checksums.yaml +7 -0
- data/.ci +139 -0
- data/.gitignore +3 -0
- data/.rakeTasks +7 -0
- data/.rspec +3 -0
- data/CHANGELOG.txt +12 -0
- data/CODEOWNERS +1 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +588 -0
- data/Rakefile +7 -0
- data/bin/console +15 -0
- data/bin/setup +7 -0
- data/config/multi_xml.rb +4 -0
- data/lib/real_page.rb +54 -0
- data/lib/real_page/attribute_parser.rb +48 -0
- data/lib/real_page/attribute_parser/base.rb +21 -0
- data/lib/real_page/attribute_parser/boolean.rb +25 -0
- data/lib/real_page/attribute_parser/date.rb +28 -0
- data/lib/real_page/attribute_parser/date_time.rb +23 -0
- data/lib/real_page/attribute_parser/decimal.rb +15 -0
- data/lib/real_page/attribute_parser/integer.rb +15 -0
- data/lib/real_page/attribute_parser/object.rb +13 -0
- data/lib/real_page/attribute_parser/string.rb +13 -0
- data/lib/real_page/document_parser.rb +6 -0
- data/lib/real_page/document_parser/base.rb +51 -0
- data/lib/real_page/document_parser/floor_plan_object.rb +30 -0
- data/lib/real_page/document_parser/guest_cards.rb +102 -0
- data/lib/real_page/document_parser/guest_cards/amenities.rb +34 -0
- data/lib/real_page/document_parser/guest_cards/prospects.rb +45 -0
- data/lib/real_page/document_parser/leases.rb +37 -0
- data/lib/real_page/document_parser/picklist.rb +38 -0
- data/lib/real_page/document_parser/rent_matrices.rb +39 -0
- data/lib/real_page/document_parser/rent_matrices/options.rb +31 -0
- data/lib/real_page/document_parser/rent_matrices/rows.rb +30 -0
- data/lib/real_page/document_parser/unit_object.rb +30 -0
- data/lib/real_page/error/bad_request.rb +18 -0
- data/lib/real_page/error/base.rb +9 -0
- data/lib/real_page/error/invalid_configuration.rb +9 -0
- data/lib/real_page/error/invalid_response.rb +9 -0
- data/lib/real_page/error/request_fault.rb +19 -0
- data/lib/real_page/error/request_fault/details.rb +17 -0
- data/lib/real_page/model/activity.rb +39 -0
- data/lib/real_page/model/address.rb +17 -0
- data/lib/real_page/model/amenity.rb +14 -0
- data/lib/real_page/model/appointment.rb +23 -0
- data/lib/real_page/model/base.rb +63 -0
- data/lib/real_page/model/base/attribute.rb +56 -0
- data/lib/real_page/model/base/attribute_store.rb +37 -0
- data/lib/real_page/model/floor_plan.rb +33 -0
- data/lib/real_page/model/follow_up.rb +34 -0
- data/lib/real_page/model/guest_card.rb +49 -0
- data/lib/real_page/model/lease.rb +36 -0
- data/lib/real_page/model/lease_action.rb +32 -0
- data/lib/real_page/model/phone_number.rb +13 -0
- data/lib/real_page/model/picklist_item.rb +10 -0
- data/lib/real_page/model/preferences.rb +25 -0
- data/lib/real_page/model/prospect.rb +35 -0
- data/lib/real_page/model/quote.rb +56 -0
- data/lib/real_page/model/rent_matrix.rb +16 -0
- data/lib/real_page/model/rent_matrix/concessions.rb +15 -0
- data/lib/real_page/model/rent_matrix/option.rb +19 -0
- data/lib/real_page/model/rent_matrix/row.rb +18 -0
- data/lib/real_page/model/screening.rb +22 -0
- data/lib/real_page/model/unit.rb +61 -0
- data/lib/real_page/model/unit_shown.rb +48 -0
- data/lib/real_page/parameter/list_criterion.rb +14 -0
- data/lib/real_page/request/base.rb +89 -0
- data/lib/real_page/request/get_floor_plan_list.rb +45 -0
- data/lib/real_page/request/get_leases_by_traffic_source.rb +59 -0
- data/lib/real_page/request/get_marketing_sources_by_property.rb +23 -0
- data/lib/real_page/request/get_rent_matrix.rb +57 -0
- data/lib/real_page/request/get_units_by_property.rb +39 -0
- data/lib/real_page/request/prospect_search.rb +50 -0
- data/lib/real_page/request_section.rb +6 -0
- data/lib/real_page/request_section/auth.rb +31 -0
- data/lib/real_page/request_section/get_rent_matrix.rb +32 -0
- data/lib/real_page/request_section/list_criteria.rb +29 -0
- data/lib/real_page/request_section/parameter.rb +31 -0
- data/lib/real_page/request_section/prospect_search_criterion.rb +24 -0
- data/lib/real_page/utils.rb +6 -0
- data/lib/real_page/utils/array_fetcher.rb +35 -0
- data/lib/real_page/utils/configuration_validator.rb +20 -0
- data/lib/real_page/utils/request_fetcher.rb +30 -0
- data/lib/real_page/utils/request_generator.rb +52 -0
- data/lib/real_page/utils/snowflake_event_tracker.rb +107 -0
- data/lib/real_page/validator.rb +6 -0
- data/lib/real_page/validator/move_in_report.rb +65 -0
- data/lib/real_page/validator/prospects_data.rb +93 -0
- data/lib/real_page/validator/request_errors.rb +97 -0
- data/lib/real_page/validator/request_fault.rb +97 -0
- data/lib/real_page/version.rb +3 -0
- data/real_page.gemspec +32 -0
- metadata +291 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'real_page/utils/array_fetcher'
|
2
|
+
|
3
|
+
require_relative '../guest_cards'
|
4
|
+
|
5
|
+
module RealPage
|
6
|
+
module DocumentParser
|
7
|
+
class GuestCards
|
8
|
+
# Parse the Amenities from a GuestCards response. RealPage spells
|
9
|
+
# everything "amentities", so we also correct for that.
|
10
|
+
class Amenities < Base
|
11
|
+
# @param amenities_hash [Array<Hash<String, Object>>] an 'Amentities'
|
12
|
+
# entry of the XML response parsed into a Hash
|
13
|
+
# @return [Array<RealPage::Model::Amenity>] the amenities contained
|
14
|
+
# in this amenities_hash
|
15
|
+
# @raise [RealPage::Error::Base] if the response is invalid
|
16
|
+
def parse(amenities_hash)
|
17
|
+
amenities(amenities_hash).map do |amenity|
|
18
|
+
attrs = amenity.dup
|
19
|
+
# RealPage spells AmenityID wrong
|
20
|
+
attrs['AmenityID'] = attrs.delete('AmentityID')
|
21
|
+
Model::Amenity.new(attrs)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def amenities(amenities_hash)
|
28
|
+
#R RealPage spells the Amenity tag wrong
|
29
|
+
Utils::ArrayFetcher.new(hash: amenities_hash, key: 'Amentity').fetch
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'real_page/utils/array_fetcher'
|
2
|
+
|
3
|
+
require_relative '../guest_cards'
|
4
|
+
|
5
|
+
module RealPage
|
6
|
+
module DocumentParser
|
7
|
+
class GuestCards
|
8
|
+
# Parse the Prospects from a GuestCards response
|
9
|
+
class Prospects < Base
|
10
|
+
# @param prospects_hash [Array<Hash<String, Object>>] a 'Prospects'
|
11
|
+
# entry of the XML response parsed into a Hash
|
12
|
+
# @return [Array<RealPage::Model::Prospect>] the prospects contained
|
13
|
+
# in this prospects_hash
|
14
|
+
# @raise [RealPage::Error::Base] if the response is invalid
|
15
|
+
def parse(prospects_hash)
|
16
|
+
prospects(prospects_hash).map do |prospect|
|
17
|
+
attrs = prospect.merge(
|
18
|
+
'PhoneNumbers' => phone_numbers(prospect['Numbers'])
|
19
|
+
)
|
20
|
+
if prospect['Address']
|
21
|
+
attrs['Address'] = Model::Address.new(prospect['Address'])
|
22
|
+
end
|
23
|
+
# RealPage is inconsistent about Number vs PhoneNumber
|
24
|
+
attrs.delete('Numbers')
|
25
|
+
Model::Prospect.new(attrs)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def phone_numbers(phone_numbers_hash)
|
32
|
+
Utils::ArrayFetcher.new(
|
33
|
+
hash: phone_numbers_hash,
|
34
|
+
key: 'PhoneNumber',
|
35
|
+
model: Model::PhoneNumber
|
36
|
+
).fetch
|
37
|
+
end
|
38
|
+
|
39
|
+
def prospects(prospects_hash)
|
40
|
+
Utils::ArrayFetcher.new(hash: prospects_hash, key: 'Prospect').fetch
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'real_page/utils/array_fetcher'
|
2
|
+
require 'real_page/validator/request_errors'
|
3
|
+
require 'real_page/validator/move_in_report'
|
4
|
+
|
5
|
+
require_relative 'base'
|
6
|
+
|
7
|
+
module RealPage
|
8
|
+
module DocumentParser
|
9
|
+
# Parse the GetLeasesByTrafficSource response
|
10
|
+
class Leases < Base
|
11
|
+
private
|
12
|
+
|
13
|
+
# @param body [Hash<String, Object>] the body of the XML response parsed
|
14
|
+
# into a Hash
|
15
|
+
# @return [Array<RealPage::Model::Lease>] the leases contained in the
|
16
|
+
# response
|
17
|
+
# @raise [RealPage::Error::Base] if the response is invalid
|
18
|
+
def parse_body(body)
|
19
|
+
Utils::ArrayFetcher.new(
|
20
|
+
hash: leases(body),
|
21
|
+
key: 'lease',
|
22
|
+
model: Model::Lease
|
23
|
+
).fetch
|
24
|
+
end
|
25
|
+
|
26
|
+
def leases(body)
|
27
|
+
response = body['getleasesbytrafficsourceResponse']
|
28
|
+
result = response['getleasesbytrafficsourceResult']
|
29
|
+
result['getleasesbytrafficsourceresponse']['leases']
|
30
|
+
end
|
31
|
+
|
32
|
+
def validator_classes
|
33
|
+
[Validator::RequestErrors, Validator::MoveInReport]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'real_page/utils/array_fetcher'
|
2
|
+
|
3
|
+
require_relative 'base'
|
4
|
+
|
5
|
+
module RealPage
|
6
|
+
module DocumentParser
|
7
|
+
# Parse a Picklist response
|
8
|
+
class Picklist < Base
|
9
|
+
# @param soap_action [String] the action requested
|
10
|
+
def initialize(soap_action)
|
11
|
+
@soap_action = soap_action
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
attr_reader :soap_action
|
17
|
+
|
18
|
+
# @param body [Hash<String, Object>] the body of the XML response parsed
|
19
|
+
# into a Hash
|
20
|
+
# @return [Array<RealPage::Model::PicklistItem>] the pick list items
|
21
|
+
# parsed from the response
|
22
|
+
# @raise [RealPage::Error::Base] if the response is invalid
|
23
|
+
def parse_body(body)
|
24
|
+
Utils::ArrayFetcher.new(
|
25
|
+
hash: items(body),
|
26
|
+
key: 'PicklistItem',
|
27
|
+
model: Model::PicklistItem
|
28
|
+
).fetch
|
29
|
+
end
|
30
|
+
|
31
|
+
def items(body)
|
32
|
+
response_key = "#{soap_action.downcase}Response"
|
33
|
+
result_key = "#{soap_action.downcase}Result"
|
34
|
+
body[response_key][result_key][soap_action]['Contents']
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'real_page/utils/array_fetcher'
|
2
|
+
|
3
|
+
require_relative 'base'
|
4
|
+
|
5
|
+
module RealPage
|
6
|
+
module DocumentParser
|
7
|
+
# Parse the GetRentMatrix response
|
8
|
+
class RentMatrices < Base
|
9
|
+
private
|
10
|
+
|
11
|
+
# @param body [Hash<String, Object>] the body of the XML response parsed
|
12
|
+
# into a Hash
|
13
|
+
# @return [Array<RealPage::Model::RentMatrix>] the rent matrices contained
|
14
|
+
# in the response
|
15
|
+
# @raise [RealPage::Error::Base] if the response is invalid
|
16
|
+
def parse_body(body)
|
17
|
+
row_parser = Rows.new
|
18
|
+
matrices(body).map do |matrix|
|
19
|
+
rows = row_parser.parse(matrix['Rows'])
|
20
|
+
attrs = matrix.merge('Rows' => rows)
|
21
|
+
Model::RentMatrix.new(attrs)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def matrices(body)
|
26
|
+
result = body['getrentmatrixResponse']['getrentmatrixResult']
|
27
|
+
matrices = result['GetRentMatrix']['RentMatrices']
|
28
|
+
Utils::ArrayFetcher.new(hash: matrices, key: 'RentMatrix').fetch
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# This file has a circular dependency with rent_matrices/row. This file uses
|
35
|
+
# the other to help parse the inner rows of the XML and that file's class
|
36
|
+
# definition is nested within this class.
|
37
|
+
#
|
38
|
+
# Having the require at the bottom of the file keeps the class loader happy
|
39
|
+
require_relative 'rent_matrices/rows'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative '../rent_matrices'
|
2
|
+
|
3
|
+
module RealPage
|
4
|
+
module DocumentParser
|
5
|
+
class RentMatrices
|
6
|
+
# Parse the options from a GetRentMatrix response
|
7
|
+
class Options < Base
|
8
|
+
# @param options_array [Array<Hash>] a 'Options' entry of the XML
|
9
|
+
# response parsed into an array
|
10
|
+
# @return [Array<RealPage::Model::RentMatrix::Option>] the options
|
11
|
+
# contained in this row
|
12
|
+
# @raise [RealPage::Error::Base] if the response is invalid
|
13
|
+
def parse(options_array)
|
14
|
+
options_array.map do |option_hash|
|
15
|
+
options = option_hash['Option']
|
16
|
+
options = [options] unless options.is_a?(Array)
|
17
|
+
options.map do |option|
|
18
|
+
concessions =
|
19
|
+
Model::RentMatrix::Concessions.new(option['Concessions'])
|
20
|
+
attrs = option.merge(
|
21
|
+
'Concessions' => concessions,
|
22
|
+
'LeaseStartDate' => option_hash['LeaseStartDate']
|
23
|
+
)
|
24
|
+
Model::RentMatrix::Option.new(attrs)
|
25
|
+
end
|
26
|
+
end.flatten
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'real_page/utils/array_fetcher'
|
2
|
+
|
3
|
+
require_relative '../rent_matrices'
|
4
|
+
require_relative 'options'
|
5
|
+
|
6
|
+
module RealPage
|
7
|
+
module DocumentParser
|
8
|
+
class RentMatrices
|
9
|
+
# Parse the rows from a GetRentMatrix response
|
10
|
+
class Rows < Base
|
11
|
+
# @param rows_hash [Hash<String, Object>] a 'Rows' entry of the XML
|
12
|
+
# response parsed into a Hash
|
13
|
+
# @return [Array<RealPage::Model::RentMatrix::Row>] the rows contained
|
14
|
+
# in this rows_hash
|
15
|
+
# @raise [RealPage::Error::Base] if the response is invalid
|
16
|
+
def parse(rows_hash)
|
17
|
+
rows = Utils::ArrayFetcher.new(hash: rows_hash, key: 'Row').fetch
|
18
|
+
options_parser = Options.new
|
19
|
+
rows.map do |row|
|
20
|
+
options_hash =
|
21
|
+
Utils::ArrayFetcher.new(hash: row, key: 'Options').fetch
|
22
|
+
options = options_parser.parse(options_hash)
|
23
|
+
attrs = row.merge('Options' => options)
|
24
|
+
Model::RentMatrix::Row.new(attrs)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'real_page/utils/array_fetcher'
|
2
|
+
|
3
|
+
require_relative 'base'
|
4
|
+
|
5
|
+
module RealPage
|
6
|
+
module DocumentParser
|
7
|
+
# Parse the GetUnitsByProperty response
|
8
|
+
class UnitObject < Base
|
9
|
+
private
|
10
|
+
|
11
|
+
# @param body [Hash<String, Object>] the body of the XML response parsed
|
12
|
+
# into a Hash
|
13
|
+
# @return [Array<RealPage::Model::Unit>] the units contained in the
|
14
|
+
# response
|
15
|
+
# @raise [RealPage::Error::Base] if the response is invalid
|
16
|
+
def parse_body(body)
|
17
|
+
Utils::ArrayFetcher.new(
|
18
|
+
hash: units(body),
|
19
|
+
key: 'UnitObject',
|
20
|
+
model: Model::Unit
|
21
|
+
).fetch
|
22
|
+
end
|
23
|
+
|
24
|
+
def units(body)
|
25
|
+
result = body['getunitsbypropertyResponse']['getunitsbypropertyResult']
|
26
|
+
result['GetUnitsByProperty']
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module RealPage
|
4
|
+
module Error
|
5
|
+
# Raised when a RealPage request has an error node in the contents. This is
|
6
|
+
# generally the case when one of the parameters in a section other than the
|
7
|
+
# auth section is invalid.
|
8
|
+
class BadRequest < Base
|
9
|
+
attr_reader :errors
|
10
|
+
|
11
|
+
# @param errors [Object] object must respond to message
|
12
|
+
def initialize(errors)
|
13
|
+
super(errors.map(&:message).join('; '))
|
14
|
+
@errors = errors
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
require_relative 'request_fault/details'
|
3
|
+
|
4
|
+
module RealPage
|
5
|
+
module Error
|
6
|
+
# Raised when a RealPage request has a fault node, which general appears
|
7
|
+
# when there is an issue with the auth section in the request (e.g.
|
8
|
+
# invalid password)
|
9
|
+
class RequestFault < Base
|
10
|
+
attr_reader :fault_code, :details
|
11
|
+
|
12
|
+
def initialize(message, fault_code, details = nil)
|
13
|
+
super(message)
|
14
|
+
@fault_code = fault_code
|
15
|
+
@details = details
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative '../base'
|
2
|
+
|
3
|
+
module RealPage
|
4
|
+
module Error
|
5
|
+
class RequestFault < Base
|
6
|
+
class Details
|
7
|
+
attr_reader :custom_message, :exception_message, :log_id
|
8
|
+
|
9
|
+
def initialize(custom_message:, exception_message:, log_id:)
|
10
|
+
@custom_message = custom_message
|
11
|
+
@exception_message = exception_message
|
12
|
+
@log_id = log_id
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module RealPage
|
4
|
+
module Model
|
5
|
+
# Object to encapsulate an Activity from a RealPage response.
|
6
|
+
class Activity < Base
|
7
|
+
boolean_attrs *%i[
|
8
|
+
system
|
9
|
+
]
|
10
|
+
|
11
|
+
date_attrs *%i[
|
12
|
+
create_date
|
13
|
+
]
|
14
|
+
|
15
|
+
integer_attrs *%i[
|
16
|
+
agent_id
|
17
|
+
max_create_date_time
|
18
|
+
]
|
19
|
+
|
20
|
+
string_attrs *%i[
|
21
|
+
agent_name
|
22
|
+
date
|
23
|
+
edit_type_name
|
24
|
+
guest_card_journal_edit_type_id
|
25
|
+
guest_card_journal_type_id
|
26
|
+
id
|
27
|
+
logged_by_name
|
28
|
+
loss_reason_cd
|
29
|
+
name
|
30
|
+
notes
|
31
|
+
result
|
32
|
+
result_cd
|
33
|
+
status
|
34
|
+
status_change_reason
|
35
|
+
time
|
36
|
+
]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|