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,59 @@
|
|
1
|
+
require 'real_page/document_parser/leases'
|
2
|
+
require 'real_page/request_section/parameter'
|
3
|
+
|
4
|
+
require_relative 'base'
|
5
|
+
|
6
|
+
module RealPage
|
7
|
+
module Request
|
8
|
+
# Retrieve current resident leases for a given traffic source that begin
|
9
|
+
# within the specified date range.
|
10
|
+
#
|
11
|
+
# Required intializer parameters:
|
12
|
+
#
|
13
|
+
# @param pmc_id [String] the unique identifier for the property management
|
14
|
+
# company in RealPage
|
15
|
+
# @param site_id [String] the unique identifier for the property in RealPage
|
16
|
+
# @param traffic_source_id [String] the identifier for the
|
17
|
+
# marketing/traffic source used to query leases
|
18
|
+
# @param start_date [Date] the start of the date range for the query
|
19
|
+
# @param end_date [Date] the end of the date range for the query
|
20
|
+
class GetLeasesByTrafficSource < Base
|
21
|
+
private
|
22
|
+
|
23
|
+
attr_reader :traffic_source_id, :start_date, :end_date, :request_params
|
24
|
+
|
25
|
+
def after_initialize(params)
|
26
|
+
%i[traffic_source_id start_date end_date].each do |required_param|
|
27
|
+
unless params[required_param]
|
28
|
+
raise ArgumentError, "Params must include :#{required_param}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
@traffic_source_id = params[:traffic_source_id]
|
32
|
+
@start_date = params[:start_date]
|
33
|
+
@end_date = params[:end_date]
|
34
|
+
@request_params = params
|
35
|
+
end
|
36
|
+
|
37
|
+
def parser
|
38
|
+
DocumentParser::Leases.new(
|
39
|
+
request_params: request_params,
|
40
|
+
request_name: request_name
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
def request_name
|
45
|
+
self.class.name.split('::').last
|
46
|
+
end
|
47
|
+
|
48
|
+
def sections
|
49
|
+
[
|
50
|
+
RequestSection::Parameter.new(
|
51
|
+
traffic_source_id: traffic_source_id,
|
52
|
+
start_date: start_date,
|
53
|
+
end_date: end_date
|
54
|
+
)
|
55
|
+
]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'real_page/document_parser/picklist'
|
2
|
+
|
3
|
+
require_relative 'base'
|
4
|
+
|
5
|
+
module RealPage
|
6
|
+
module Request
|
7
|
+
# Retrieve marketing sources information for a specific property. Marketing
|
8
|
+
# sources are also referred to as traffic sources throughout RealPage.
|
9
|
+
#
|
10
|
+
# Required intializer parameters:
|
11
|
+
#
|
12
|
+
# @param pmc_id [String] the unique identifier for the property management
|
13
|
+
# company in RealPage
|
14
|
+
# @param site_id [String] the unique identifier for the property in RealPage
|
15
|
+
class GetMarketingSourcesByProperty < Base
|
16
|
+
private
|
17
|
+
|
18
|
+
def parser
|
19
|
+
DocumentParser::Picklist.new(soap_action)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'real_page/document_parser/rent_matrices'
|
2
|
+
require 'real_page/request_section/get_rent_matrix'
|
3
|
+
|
4
|
+
require_relative 'base'
|
5
|
+
|
6
|
+
module RealPage
|
7
|
+
module Request
|
8
|
+
# Retrieve pricing data for units in a property.
|
9
|
+
#
|
10
|
+
# Required intializer parameters:
|
11
|
+
#
|
12
|
+
# @param least_term [Integer] Proposed lease term duration, in months
|
13
|
+
# @param need_by_date [Date] Proposed date when prospect would move in to
|
14
|
+
# any apartment
|
15
|
+
# @param pmc_id [String] the unique identifier for the property management
|
16
|
+
# company in RealPage
|
17
|
+
# @param site_id [String] the unique identifier for the property in RealPage
|
18
|
+
# @param unit_ids [Array<Integer|String>] Array of integer Unit ID numbers
|
19
|
+
# as acquired from GetUnitsByProperty
|
20
|
+
# @param viewing_quote_only [true|false] Identifies whether the user is
|
21
|
+
# viewing or creating new quote
|
22
|
+
class GetRentMatrix < Base
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_reader :lease_term, :need_by_date, :unit_ids, :viewing_quote_only
|
26
|
+
|
27
|
+
def after_initialize(params)
|
28
|
+
%i[
|
29
|
+
lease_term
|
30
|
+
need_by_date
|
31
|
+
unit_ids
|
32
|
+
viewing_quote_only
|
33
|
+
].each do |required_param|
|
34
|
+
unless params[required_param]
|
35
|
+
raise ArgumentError, "Params must include :#{required_param}"
|
36
|
+
end
|
37
|
+
instance_variable_set("@#{required_param}", params[required_param])
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def sections
|
42
|
+
[
|
43
|
+
RequestSection::GetRentMatrix.new(
|
44
|
+
lease_term: lease_term,
|
45
|
+
need_by_date: need_by_date,
|
46
|
+
unit_ids: unit_ids,
|
47
|
+
viewing_quote_only: viewing_quote_only
|
48
|
+
)
|
49
|
+
]
|
50
|
+
end
|
51
|
+
|
52
|
+
def parser
|
53
|
+
DocumentParser::RentMatrices.new
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'real_page/document_parser/unit_object'
|
2
|
+
require 'real_page/request_section/list_criteria'
|
3
|
+
|
4
|
+
require_relative 'base'
|
5
|
+
|
6
|
+
module RealPage
|
7
|
+
module Request
|
8
|
+
# Retrieve marketing sources information for a specific property. Marketing
|
9
|
+
# sources are also referred to as traffic sources throughout RealPage.
|
10
|
+
#
|
11
|
+
# Required intializer parameters:
|
12
|
+
#
|
13
|
+
# @param pmc_id [String] the unique identifier for the property management
|
14
|
+
# company in RealPage
|
15
|
+
# @param site_id [String] the unique identifier for the property in RealPage
|
16
|
+
#
|
17
|
+
# Optional initializer parameters:
|
18
|
+
#
|
19
|
+
# @param list_criteria [Array<RealPage::Parameter::ListCriterion>] the query
|
20
|
+
# criteria
|
21
|
+
class GetUnitsByProperty < Base
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :list_criteria
|
25
|
+
|
26
|
+
def after_initialize(params)
|
27
|
+
@list_criteria = params[:list_criteria] || []
|
28
|
+
end
|
29
|
+
|
30
|
+
def sections
|
31
|
+
[RequestSection::ListCriteria.new(list_criteria: list_criteria)]
|
32
|
+
end
|
33
|
+
|
34
|
+
def parser
|
35
|
+
DocumentParser::UnitObject.new
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'real_page/document_parser/guest_cards'
|
2
|
+
require 'real_page/request_section/prospect_search_criterion'
|
3
|
+
|
4
|
+
require_relative 'base'
|
5
|
+
|
6
|
+
module RealPage
|
7
|
+
module Request
|
8
|
+
# Retrieve information about a known Prospect
|
9
|
+
#
|
10
|
+
# Required initializer parameters:
|
11
|
+
#
|
12
|
+
# @param pmc_id [String] the unique identifier for the property management
|
13
|
+
# company in RealPage
|
14
|
+
# @param site_id [String] the unique identifier for the property in RealPage
|
15
|
+
# @guest_card_id [String] the unique identifier for the guest_card in
|
16
|
+
# RealPage
|
17
|
+
class ProspectSearch < Base
|
18
|
+
private
|
19
|
+
|
20
|
+
attr_reader :guest_card_id, :request_params
|
21
|
+
|
22
|
+
def after_initialize(params)
|
23
|
+
@guest_card_id = params[:guest_card_id]
|
24
|
+
unless guest_card_id
|
25
|
+
raise ArgumentError, 'Params must include :guest_card_id'
|
26
|
+
end
|
27
|
+
@request_params = params
|
28
|
+
end
|
29
|
+
|
30
|
+
def parser
|
31
|
+
DocumentParser::GuestCards.new(
|
32
|
+
request_params: request_params,
|
33
|
+
request_name: request_name
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def request_name
|
38
|
+
self.class.name.split('::').last
|
39
|
+
end
|
40
|
+
|
41
|
+
def sections
|
42
|
+
[
|
43
|
+
RequestSection::ProspectSearchCriterion.new(
|
44
|
+
guest_card_id: guest_card_id
|
45
|
+
)
|
46
|
+
]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'real_page/request_section'
|
2
|
+
|
3
|
+
module RealPage
|
4
|
+
module RequestSection
|
5
|
+
# Generate the auth section of a RealPage request
|
6
|
+
class Auth
|
7
|
+
SYSTEM = 'OneSite'.freeze
|
8
|
+
private_constant :SYSTEM
|
9
|
+
|
10
|
+
def initialize(pmc_id:, site_id:)
|
11
|
+
@pmc_id = pmc_id
|
12
|
+
@site_id = site_id
|
13
|
+
end
|
14
|
+
|
15
|
+
def generate(xml_builder)
|
16
|
+
xml_builder.auth do
|
17
|
+
xml_builder.pmcid pmc_id
|
18
|
+
xml_builder.siteid site_id
|
19
|
+
xml_builder.username RealPage.config.username
|
20
|
+
xml_builder.password RealPage.config.password
|
21
|
+
xml_builder.licensekey RealPage.config.license_key
|
22
|
+
xml_builder.system SYSTEM
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
attr_reader :pmc_id, :site_id
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'real_page/request_section'
|
2
|
+
|
3
|
+
module RealPage
|
4
|
+
module RequestSection
|
5
|
+
# Generate the list criteria section of a RealPage request
|
6
|
+
class GetRentMatrix
|
7
|
+
def initialize(lease_term:, need_by_date:, unit_ids:, viewing_quote_only:)
|
8
|
+
@lease_term = lease_term
|
9
|
+
@need_by_date = need_by_date
|
10
|
+
@unit_ids = unit_ids
|
11
|
+
@viewing_quote_only = viewing_quote_only
|
12
|
+
end
|
13
|
+
|
14
|
+
def generate(xml_builder)
|
15
|
+
xml_builder.getrentmatrix do
|
16
|
+
xml_builder.NeededByDate need_by_date
|
17
|
+
xml_builder.LeaseTerm lease_term
|
18
|
+
xml_builder.unitids do
|
19
|
+
unit_ids.each do |unit_id|
|
20
|
+
xml_builder.int unit_id
|
21
|
+
end
|
22
|
+
end
|
23
|
+
xml_builder.viewingQuoteOnly viewing_quote_only ? 1 : 0
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :lease_term, :need_by_date, :unit_ids, :viewing_quote_only
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'real_page/request_section'
|
2
|
+
|
3
|
+
module RealPage
|
4
|
+
module RequestSection
|
5
|
+
# Generate the list criteria section of a RealPage request
|
6
|
+
class ListCriteria
|
7
|
+
def initialize(list_criteria:)
|
8
|
+
@list_criteria = list_criteria
|
9
|
+
end
|
10
|
+
|
11
|
+
def generate(xml_builder)
|
12
|
+
xml_builder.listCriteria do
|
13
|
+
list_criteria.each do |criterion|
|
14
|
+
xml_builder.ListCriterion do
|
15
|
+
xml_builder.name criterion.name
|
16
|
+
xml_builder.singlevalue criterion.single_value
|
17
|
+
xml_builder.minvalue criterion.min_value if criterion.min_value
|
18
|
+
xml_builder.maxvalue criterion.max_value if criterion.max_value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :list_criteria
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'real_page/request_section'
|
2
|
+
|
3
|
+
module RealPage
|
4
|
+
module RequestSection
|
5
|
+
# Generate the parameter section of a RealPage request
|
6
|
+
class Parameter
|
7
|
+
def initialize(start_date:, end_date:, traffic_source_id:)
|
8
|
+
@start_date = start_date
|
9
|
+
@end_date = end_date
|
10
|
+
@traffic_source_id = traffic_source_id
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate(xml_builder)
|
14
|
+
xml_builder.parameter do
|
15
|
+
xml_builder.startdate format_date(start_date)
|
16
|
+
xml_builder.enddate format_date(end_date)
|
17
|
+
# As documented, this node name is a typo
|
18
|
+
xml_builder.trafficesourceid traffic_source_id
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :start_date, :end_date, :traffic_source_id
|
25
|
+
|
26
|
+
def format_date(date)
|
27
|
+
date.strftime('%Y-%m-%d')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'real_page/request_section'
|
2
|
+
|
3
|
+
module RealPage
|
4
|
+
module RequestSection
|
5
|
+
# Generate the prospectSearchCriterion section of a RealPage request
|
6
|
+
class ProspectSearchCriterion
|
7
|
+
def initialize(guest_card_id:)
|
8
|
+
@guest_card_id = guest_card_id
|
9
|
+
end
|
10
|
+
|
11
|
+
def generate(xml_builder)
|
12
|
+
xml_builder.prospectSearchCriterion do
|
13
|
+
xml_builder.ProspectSearchCriterion do
|
14
|
+
xml_builder.guestcardid guest_card_id
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_reader :guest_card_id
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'real_page/utils'
|
2
|
+
|
3
|
+
module RealPage
|
4
|
+
module Utils
|
5
|
+
# Fetch an array from a hash that was generated by parsing XML using
|
6
|
+
# MultiXml. If you provide a model to instantiate, an instance will be
|
7
|
+
# initialized with each data element.
|
8
|
+
class ArrayFetcher
|
9
|
+
def initialize(hash:, key:, model: nil)
|
10
|
+
@hash = hash
|
11
|
+
@key = key
|
12
|
+
@model = model
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Array] take the MultiXml hash and return a proper array
|
16
|
+
def fetch
|
17
|
+
return [] if empty?
|
18
|
+
value = hash[key]
|
19
|
+
value = [value] unless value.is_a?(Array)
|
20
|
+
return value unless model
|
21
|
+
value.map { |v| model.new(v) }
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :hash, :key, :model
|
27
|
+
|
28
|
+
def empty?
|
29
|
+
return true if hash.nil?
|
30
|
+
return true if hash.is_a?(String) && hash.strip! == ''
|
31
|
+
hash.empty?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'real_page/utils'
|
2
|
+
|
3
|
+
module RealPage
|
4
|
+
module Utils
|
5
|
+
class ConfigurationValidator
|
6
|
+
REQUIRED_KEYS = %i[username password license_key web_service_url].freeze
|
7
|
+
private_constant :REQUIRED_KEYS
|
8
|
+
|
9
|
+
def validate!
|
10
|
+
missing_keys = REQUIRED_KEYS.select do |key|
|
11
|
+
RealPage.config.send(key).nil?
|
12
|
+
end
|
13
|
+
unless missing_keys.empty?
|
14
|
+
raise Error::InvalidConfiguration,
|
15
|
+
"Missing configuration for #{missing_keys.join(', ')}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|