Class: PartyRecordTimezone

Inherits:
BaseService show all
Defined in:
app/services/party_record_timezone.rb

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

#initialize(options = {}) ⇒ PartyRecordTimezone

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

#messagesObject (readonly)

Returns the value of attribute messages.



9
10
11
# File 'app/services/party_record_timezone.rb', line 9

def messages
  @messages
end

#partyObject (readonly)

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

Returns:

  • (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_addressObject



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_geoObject



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_phoneObject



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