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

.available_typesArray<Class>

Registered report subclasses, mirroring Spree::Export/Spree::Import so api_type_for can resolve an STI column value without constantizing it.

Returns:

  • (Array<Class>)


44
45
46
# File 'app/models/spree/report.rb', line 44

def self.available_types
  Spree.reports
end

.report_typeObject

Deprecated.

Use .api_type — identical derivation, consistent with the rest of the API's type fields.



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

def self.report_type
  api_type
end

Instance Method Details

#attachment_file_nameObject

eg. "store-sales-total-report-20250201120000.csv"



122
123
124
# File 'app/models/spree/report.rb', line 122

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_classObject



36
37
38
# File 'app/models/spree/report.rb', line 36

def event_serializer_class
  'Spree::Api::V3::ReportSerializer'.safe_constantize
end

#generateObject



87
88
89
90
91
# File 'app/models/spree/report.rb', line 87

def generate
  generate_csv
  handle_attachment
  send_report_done_email
end

#generate_asyncObject



83
84
85
# File 'app/models/spree/report.rb', line 83

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

#generate_csvObject



93
94
95
96
97
98
99
100
101
102
# File 'app/models/spree/report.rb', line 93

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



104
105
106
107
108
# File 'app/models/spree/report.rb', line 104

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



79
80
81
# File 'app/models/spree/report.rb', line 79

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



117
118
119
# File 'app/models/spree/report.rb', line 117

def line_item_class
  "Spree::ReportLineItems::#{type.demodulize}".safe_constantize
end

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

Returns an array of report lines

Returns:



64
65
66
67
68
69
# File 'app/models/spree/report.rb', line 64

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)


57
58
59
# File 'app/models/spree/report.rb', line 57

def line_items_scope
  raise NotImplementedError, "Subclass #{self.class.name} must implement #line_items_scope"
end

#no_report_data_partial_pathObject



75
76
77
# File 'app/models/spree/report.rb', line 75

def no_report_data_partial_path
  'spree/admin/reports/no_report_data'
end

#send_report_done_emailObject



110
111
112
113
114
# File 'app/models/spree/report.rb', line 110

def send_report_done_email
  return unless user.present?

  Spree::ReportMailer.report_done(self).deliver_later
end

#to_partial_pathObject



71
72
73
# File 'app/models/spree/report.rb', line 71

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