Class: Spree::Report
Class Method Summary
collapse
Instance Method Summary
collapse
Class Method Details
.report_type ⇒ Object
28
29
30
|
# File 'app/models/spree/report.rb', line 28
def self.report_type
name.demodulize.underscore
end
|
Instance Method Details
#attachment_file_name ⇒ Object
eg. “store-sales-total-report-20250201120000.csv”
100
101
102
|
# File 'app/models/spree/report.rb', line 100
def attachment_file_name
@attachment_file_name ||= "#{store.code}-#{type.demodulize.parameterize}-report-#{created_at.strftime('%Y%m%d%H%M%S')}.csv"
end
|
#generate ⇒ Object
65
66
67
68
69
|
# File 'app/models/spree/report.rb', line 65
def generate
generate_csv
handle_attachment
send_report_done_email
end
|
#generate_async ⇒ Object
61
62
63
|
# File 'app/models/spree/report.rb', line 61
def generate_async
Spree::Reports::GenerateJob.perform_later(id)
end
|
#generate_csv ⇒ Object
71
72
73
74
75
76
77
78
79
80
|
# File 'app/models/spree/report.rb', line 71
def generate_csv
::CSV.open(report_tmp_file_path, 'wb', encoding: 'UTF-8', col_sep: ',', row_sep: "\r\n") do |csv|
csv << line_item_class.
line_items_scope.find_in_batches do |batch|
batch.each do |record|
csv << line_item_class.new(record: record, report: self).to_csv
end
end
end
end
|
#handle_attachment ⇒ Object
82
83
84
85
86
|
# File 'app/models/spree/report.rb', line 82
def handle_attachment
file = ::File.open(report_tmp_file_path)
attachment.attach(io: file, filename: attachment_file_name)
::File.delete(report_tmp_file_path) if ::File.exist?(report_tmp_file_path)
end
|
#human_name ⇒ Object
57
58
59
|
# File 'app/models/spree/report.rb', line 57
def human_name
[Spree.t("report_names.#{type.demodulize.underscore}"), store.name, date_from.strftime('%Y-%m-%d'), date_to.strftime('%Y-%m-%d')].join(' - ')
end
|
#line_item_class ⇒ Object
eg. Spree::ReportLineItems::SalesTotal
95
96
97
|
# File 'app/models/spree/report.rb', line 95
def line_item_class
"Spree::ReportLineItems::#{type.demodulize}".safe_constantize
end
|
Returns an array of report lines
42
43
44
45
46
47
|
# File 'app/models/spree/report.rb', line 42
def line_items(options = {})
scope = line_items_scope
scope = scope.limit(options[:limit]) if options[:limit].present?
scope.map { |record| line_item_class.new(record: record, report: self) }
end
|
#line_items_scope ⇒ ActiveRecord::Relation
Returns a scope of records to be used for generating report lines
35
36
37
|
# File 'app/models/spree/report.rb', line 35
def line_items_scope
raise NotImplementedError, "Subclass #{self.class.name} must implement #line_items_scope"
end
|
#no_report_data_partial_path ⇒ Object
53
54
55
|
# File 'app/models/spree/report.rb', line 53
def no_report_data_partial_path
'spree/admin/reports/no_report_data'
end
|
#send_report_done_email ⇒ Object
88
89
90
91
92
|
# File 'app/models/spree/report.rb', line 88
def send_report_done_email
return unless user.present?
Spree::ReportMailer.report_done(self).deliver_later
end
|
#to_partial_path ⇒ Object
49
50
51
|
# File 'app/models/spree/report.rb', line 49
def to_partial_path
'spree/admin/reports/report'
end
|