Class: Party::RecordTimezone
Defined Under Namespace
Classes: Result
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Methods inherited from BaseService
#log_debug, #log_error, #log_info, #log_warning, #logger, #options, #tagged_logger
Constructor Details
Returns a new instance of RecordTimezone.
9
10
11
12
|
# File 'app/services/party/record_timezone.rb', line 9
def initialize(options={})
@party = options[:party]
super
end
|
Instance Attribute Details
#messages ⇒ Object
Returns the value of attribute messages.
7
8
9
|
# File 'app/services/party/record_timezone.rb', line 7
def messages
@messages
end
|
#party ⇒ Object
Returns the value of attribute party.
7
8
9
|
# File 'app/services/party/record_timezone.rb', line 7
def party
@party
end
|
Class Method Details
.valid_timezone?(timezone) ⇒ Boolean
14
15
16
17
|
# File 'app/services/party/record_timezone.rb', line 14
def self.valid_timezone?(timezone)
return true if ActiveSupport::TimeZone[timezone.try(:name).to_s]
return false
end
|
Instance Method Details
#log_message(message) ⇒ Object
19
20
21
22
|
# File 'app/services/party/record_timezone.rb', line 19
def log_message(message)
messages << message
logger.info "#{Party::RecordTimezone}:#{message}"
end
|
#lookup_by_address ⇒ Object
61
62
63
64
65
66
67
|
# 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
77
78
79
80
81
82
83
84
|
# File 'app/services/party/record_timezone.rb', line 77
def lookup_by_ip_geo
lat,lng = party.visits.order("started_at desc").where.not(latitude: nil, longitude: nil).pick(:latitude, :longitude)
return unless lat && lng
tz = Timezone.lookup(lat,lng) rescue nil
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
69
70
71
72
73
74
75
|
# File 'app/services/party/record_timezone.rb', line 69
def lookup_by_phone
return unless contact_point = party.contact_points.dialable.detect(&: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
36
37
38
39
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 36
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
if save_directly && party.persisted?
party.update_column(:timezone_name, timezone_name)
end
unless party.frozen?
party.timezone_name = timezone_name
end
Result.new(timezone_recorded: tz.present?,
messages: messages,
timezone: tz)
end
|
#process_party_and_associations(party) ⇒ Object
24
25
26
27
28
29
30
31
32
33
34
|
# File 'app/services/party/record_timezone.rb', line 24
def process_party_and_associations(party)
res = []
return unless party
res << Party::RecordTimezone.new.process(party, save_directly: true)
if party.respond_to?('contacts')
party.contacts.each{|cnt| res << Party::RecordTimezone.new.process(cnt, save_directly: true) }
elsif party.is_a?(Contact) && party.customer
res << Party::RecordTimezone.new.process(party.customer, save_directly: true)
end
res
end
|