Class: ClarkKent::ReportEmail

Inherits:
ActiveRecord::Base
  • Object
show all
Includes:
Cloneable
Defined in:
app/models/clark_kent/report_email.rb

Constant Summary collapse

SEND_TIMES =
{
  'Mondays' => 'Monday',
  'Tuesdays' => 'Tuesday',
  'Wednesdays' => 'Wednesday',
  'Thursdays' => 'Thursday',
  'Fridays' => 'Friday',
  'Saturdays' => 'Saturday',
  'Sundays' => 'Sunday',
  '1st of the month' => 'beginning_of_month',
  'End of the month' => 'end_of_month'
}

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Cloneable

#cloneable_attributes, #reset_timestamps

Class Method Details

.send_emails_for_todayObject



22
23
24
25
26
27
28
29
30
31
32
# File 'app/models/clark_kent/report_email.rb', line 22

def self.send_emails_for_today
  today = Date.ih_today
  todays_filters = []
  ['beginning_of_month','end_of_month'].each do |month_bookend|
    todays_filters.push month_bookend if today.send(month_bookend) == today
  end
  todays_filters.push  Date::DAYNAMES[today.wday]
  self.where(when_to_send: todays_filters).each do |report_email|
    report_email.send_emails
  end
end

Instance Method Details

#available_email_filtersObject



90
91
92
# File 'app/models/clark_kent/report_email.rb', line 90

def available_email_filters
  self.resource_class.report_definition_options.reject{|name, label| (self.viable_report_filters.pluck(:filter_name) + self.report.viable_report_filters.pluck(:filter_name)).include? name}
end

#available_filter_optionsObject



98
99
100
# File 'app/models/clark_kent/report_email.rb', line 98

def available_filter_options
  self.available_filters.map{|id| [self.filter_options_for(id).label,id]}
end

#available_filtersObject



94
95
96
# File 'app/models/clark_kent/report_email.rb', line 94

def available_filters
  self.available_email_filters
end

#collection_for(filter_name) ⇒ Object



82
83
84
# File 'app/models/clark_kent/report_email.rb', line 82

def collection_for(filter_name)
  self.report.collection_for(filter_name)
end

#emailsObject



110
111
112
# File 'app/models/clark_kent/report_email.rb', line 110

def emails
  self.users.map(&:email)
end

#filter_kind(filter_name) ⇒ Object



66
67
68
# File 'app/models/clark_kent/report_email.rb', line 66

def filter_kind(filter_name)
  self.report.filter_kind(filter_name)
end

#filter_options_for(filter_name) ⇒ Object



78
79
80
# File 'app/models/clark_kent/report_email.rb', line 78

def filter_options_for(filter_name)
  self.report.filter_options_for(filter_name)
end

#get_filter_class(params) ⇒ Object



86
87
88
# File 'app/models/clark_kent/report_email.rb', line 86

def get_filter_class(params)
  self.report.get_filter_class(params)
end

#get_query(params, count = false) ⇒ Object



102
103
104
# File 'app/models/clark_kent/report_email.rb', line 102

def get_query(params, count = false)
  self.report.resource_class.report(params,self, count)
end

#period_prettyObject



106
107
108
# File 'app/models/clark_kent/report_email.rb', line 106

def period_pretty
  self.report_date_filters.map{|filter| [filter.filter_name,filter.date_display].join(' ')}.join('<br>').html_safe
end

#report_filter_paramsObject



61
62
63
64
# File 'app/models/clark_kent/report_email.rb', line 61

def report_filter_params
  Hash[*self.viable_report_filters.map{|filter| filter.filter_match_params}.flatten].
    merge(order: self.report.sorter).merge(self.report.report_filter_params)
end

#resource_classObject



74
75
76
# File 'app/models/clark_kent/report_email.rb', line 74

def resource_class
  self.report.resource_class
end

#send_email(user_id) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'app/models/clark_kent/report_email.rb', line 40

def send_email(user_id)
  user = ClarkKent.user_class.find(user_id)
  params = {report_result_name: "report-#{self.id}-user-#{user_id}-#{Time.now.to_formatted_s(:number)}", report_class: 'ClarkKent::ReportEmail'}
  SharingScopeKind.custom.each do |sharing_scope_kind|
    unless report.report_filters.map(&:filter_name).include? sharing_scope_kind.basic_association_id_collection_name.to_s
      associations = sharing_scope_kind.associated_containers_for(user)
      if associations.respond_to? :map
        params[sharing_scope_kind.basic_association_id_collection_name] = associations.map(&:id)
      else
        params[sharing_scope_kind.basic_association_id_collection_name] = associations.id
      end
    end
  end
  report_download_url = ClarkKent::Report.send_report_to_s3(self.id, params)
  mail = ClarkKent::ReportMailer.report_run(self.report_id, user_id, report_download_url)
  mail.deliver_now
rescue ClarkKent::ReportFilterError => e
  mail = ClarkKent::ReportMailer.report_error(self.report_id, user_id, e.message)
  mail.deliver_now
end

#send_emailsObject



34
35
36
37
38
# File 'app/models/clark_kent/report_email.rb', line 34

def send_emails
  self.user_report_emails.each do |user_report_email|
    ConeyIsland.submit(ClarkKent::ReportEmail, :send_email, instance_id: self.id, args: [user_report_email.user_id], timeout: 300, work_queue: ClarkKent.work_queue)
  end
end

#viable_report_filtersObject



70
71
72
# File 'app/models/clark_kent/report_email.rb', line 70

def viable_report_filters
  @viable_report_filters ||= report_filters.to_a.select{|rf| filter_options_for(rf.filter_name).present? }
end