Class: Spree::Report

Inherits:
Object
  • Object
show all
Includes:
SingleStoreResource, VendorConcern
Defined in:
app/models/spree/report.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.report_typeObject



28
29
30
# File 'app/models/spree/report.rb', line 28

def self.report_type
  name.demodulize.underscore
end

Instance Method Details

#attachment_file_nameObject

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

#generateObject



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_asyncObject



61
62
63
# File 'app/models/spree/report.rb', line 61

def generate_async
  Spree::Reports::GenerateJob.perform_later(id)
end

#generate_csvObject



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.csv_headers
    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_attachmentObject



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_nameObject



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_classObject

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

#line_items(options = {}) ⇒ Array<Spree::ReportLineItem>

Returns an array of report lines

Returns:



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_scopeActiveRecord::Relation

Returns a scope of records to be used for generating report lines

Returns:

  • (ActiveRecord::Relation)

Raises:

  • (NotImplementedError)


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_pathObject



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_emailObject



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_pathObject



49
50
51
# File 'app/models/spree/report.rb', line 49

def to_partial_path
  'spree/admin/reports/report'
end