Class: PartyRecordTimezone
Overview
Service object: record timezone.
Defined Under Namespace
Classes: Result
Instance Attribute Summary collapse
Attributes inherited from BaseService
#options
Class Method Summary
collapse
Instance Method Summary
collapse
Methods inherited from BaseService
#log_debug, #log_error, #log_info, #log_warning, #logger, #tagged_logger
Constructor Details
Returns a new instance of PartyRecordTimezone.
11
12
13
14
|
# File 'app/services/party_record_timezone.rb', line 11
def initialize(options = {})
@party = options[:party]
super
end
|
Instance Attribute Details
#messages ⇒ Object
Returns the value of attribute messages.
9
10
11
|
# File 'app/services/party_record_timezone.rb', line 9
def messages
@messages
end
|
#party ⇒ Object
Returns the value of attribute party.
9
10
11
|
# File 'app/services/party_record_timezone.rb', line 9
def party
@party
end
|
Class Method Details
.valid_timezone?(timezone) ⇒ Boolean
16
17
18
19
20
|
# File 'app/services/party_record_timezone.rb', line 16
def self.valid_timezone?(timezone)
return true if ActiveSupport::TimeZone[timezone.try(:name).to_s]
false
end
|
Instance Method Details
#log_message(message) ⇒ Object
22
23
24
25
|
# File 'app/services/party_record_timezone.rb', line 22
def log_message(message)
messages << message
logger.info "#{PartyRecordTimezone}:#{message}"
end
|
#lookup_by_address ⇒ Object
61
62
63
64
65
66
67
68
|
# File 'app/services/party_record_timezone.rb', line 61
def lookup_by_address
return unless (address = party.main_address)
return unless (tz = address.timezone)
return unless self.class.valid_timezone?(tz)
log_message "Timezone found by address match on address id #{address.id}"
tz
end
|
#lookup_by_ip_geo ⇒ Object
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
# File 'app/services/party_record_timezone.rb', line 79
def lookup_by_ip_geo
lat, lng = party.visits.order(started_at: :desc).where.not(latitude: nil).where.not(longitude: nil).pick(:latitude, :longitude)
return unless lat && lng
tz = begin
Timezone.lookup(lat, lng)
rescue StandardError
nil
end
return unless tz && self.class.valid_timezone?(tz)
log_message "Timezone found by reverse geolocating visit data" if tz
tz
end
|
#lookup_by_phone ⇒ Object
70
71
72
73
74
75
76
77
|
# File 'app/services/party_record_timezone.rb', line 70
def lookup_by_phone
return unless (contact_point = party.contact_points.dialable.find(&:timezone))
return unless (tz = contact_point.timezone)
return unless self.class.valid_timezone?(tz)
log_message "Timezone found by contact point match #{contact_point.id}"
tz
end
|
#process(party, save_directly: false) ⇒ Object
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
# File 'app/services/party_record_timezone.rb', line 40
def process(party, save_directly: false)
@party = party
@messages = []
tz = lookup_by_address
tz ||= lookup_by_phone
tz ||= lookup_by_ip_geo
timezone_name = nil
if tz
timezone_name = tz&.name
else
log_message 'Timezone could not be determined by any method'
end
party.update_column(:timezone_name, timezone_name) if save_directly && party.persisted?
party.timezone_name = timezone_name unless party.frozen?
Result.new(timezone_recorded: tz.present?,
messages: messages,
timezone: tz)
end
|
#process_party_and_associations(party) ⇒ Object
27
28
29
30
31
32
33
34
35
36
37
38
|
# File 'app/services/party_record_timezone.rb', line 27
def process_party_and_associations(party)
res = []
return unless party
res << PartyRecordTimezone.new.process(party, save_directly: true)
if party.respond_to?(:contacts)
party.contacts.each { |cnt| res << PartyRecordTimezone.new.process(cnt, save_directly: true) }
elsif party.is_a?(Contact) && party.customer
res << PartyRecordTimezone.new.process(party.customer, save_directly: true)
end
res
end
|