Class: Party::RecordTimezone

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

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

#initialize(options = {}) ⇒ RecordTimezone

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

#messagesObject (readonly)

Returns the value of attribute messages.



7
8
9
# File 'app/services/party/record_timezone.rb', line 7

def messages
  @messages
end

#partyObject (readonly)

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

Returns:

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



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_geoObject



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_phoneObject



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