Class: Spree::Report
Class Method Summary
collapse
Instance Method Summary
collapse
Class Method Details
.report_type ⇒ Object
38
39
40
|
# File 'app/models/spree/report.rb', line 38
def self.report_type
name.demodulize.underscore
end
|
Instance Method Details
#attachment_file_name ⇒ Object
eg. “store-sales-total-report-20250201120000.csv”
110
111
112
|
# File 'app/models/spree/report.rb', line 110
def attachment_file_name
@attachment_file_name ||= "#{store.code}-#{type.demodulize.parameterize}-report-#{created_at.strftime('%Y%m%d%H%M%S')}.csv"
end
|
#event_serializer_class ⇒ Object
#generate ⇒ Object
75
76
77
78
79
|
# File 'app/models/spree/report.rb', line 75
def generate
generate_csv
handle_attachment
send_report_done_email
end
|
#generate_async ⇒ Object
71
72
73
|
# File 'app/models/spree/report.rb', line 71
def generate_async
Spree::Reports::GenerateJob.perform_later(id)
end
|
#generate_csv ⇒ Object
81
82
83
84
85
86
87
88
89
90
|
# File 'app/models/spree/report.rb', line 81
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
92
93
94
95
96
|
# File 'app/models/spree/report.rb', line 92
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
67
68
69
|
# File 'app/models/spree/report.rb', line 67
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
105
106
107
|
# File 'app/models/spree/report.rb', line 105
def line_item_class
"Spree::ReportLineItems::#{type.demodulize}".safe_constantize
end
|
Returns an array of report lines
52
53
54
55
56
57
|
# File 'app/models/spree/report.rb', line 52
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
45
46
47
|
# File 'app/models/spree/report.rb', line 45
def line_items_scope
raise NotImplementedError, "Subclass #{self.class.name} must implement #line_items_scope"
end
|
#no_report_data_partial_path ⇒ Object
63
64
65
|
# File 'app/models/spree/report.rb', line 63
def no_report_data_partial_path
'spree/admin/reports/no_report_data'
end
|
#send_report_done_email ⇒ Object
98
99
100
101
102
|
# File 'app/models/spree/report.rb', line 98
def send_report_done_email
return unless user.present?
Spree::ReportMailer.report_done(self).deliver_later
end
|
#to_partial_path ⇒ Object
59
60
61
|
# File 'app/models/spree/report.rb', line 59
def to_partial_path
'spree/admin/reports/report'
end
|