class SpreeReports::Reports::OrdersByPeriod

Attributes

currencies[RW]
currency[RW]
data[RW]
date_start[RW]
group_by[RW]
group_by_list[RW]
months[RW]
params[RW]
state[RW]
states[RW]
store[RW]
stores[RW]

Public Class Methods

new(params) click to toggle source
# File lib/spree_reports/reports/orders_by_period.rb, line 8
def initialize(params)
  @params = params
  setup_params
  get_data
  build_response
end

Public Instance Methods

build_response() click to toggle source
# File lib/spree_reports/reports/orders_by_period.rb, line 100
def build_response
  @data = @sales_count.map do |k, v|
    {
      date: k,
      date_formatted: SpreeReports::Helper.date_formatted(k, @group_by),
      count: v,
      total: @sales_total[k].to_f,
      item_total: @sales_item_total[k].to_f,
      avg_total: SpreeReports::Helper.round(SpreeReports::Helper.divide(@sales_total[k].to_f, v)),
      adjustment_total: @sales_adjustment_total[k].to_f,
      shipment_total: @sales_shipment_total[k].to_f,
      promo_total: @sales_promo_total[k].to_f,
      included_tax_total: @sales_included_tax_total[k].to_f,
      item_count_total: @sales_item_count_total[k].to_i,
      items_per_order: SpreeReports::Helper.round(SpreeReports::Helper.divide(@sales_item_count_total[k].to_f, v.to_f))
    }
  end
end
csv_filename() click to toggle source
# File lib/spree_reports/reports/orders_by_period.rb, line 145
def csv_filename
  "orders_per_period_#{@group_by}_#{@months}-months_#{@state}.csv"
end
get_data() click to toggle source
# File lib/spree_reports/reports/orders_by_period.rb, line 50
def get_data
  
  # select by state
  
  if @state == "complete_paid"
    date_column = :completed_at
    @sales = Spree::Order.complete.where(payment_state: 'paid')
  elsif @state == "complete"
    date_column = :completed_at
    @sales = Spree::Order.complete
  elsif @state == "incomplete"
    date_column = :created_at
    @sales = Spree::Order.incomplete
  elsif @state == "canceled"
    date_column = :canceled_at
    @sales = Spree::Order.where.not(canceled_at: nil)
  else
    date_column = :created_at
    @sales = Spree::Order.where(state: @state)
  end
    
  @sales = @sales.where("#{date_column.to_s} >= ?", @date_start) if @date_start
  @sales = @sales.where(currency: @currency) if @currencies.size > 1
  @sales = @sales.where(store_id: @store) if @stores.size > 2 && @store != "all"        
  @sales = without_excluded_orders(@sales)
  
  # group by

  if @group_by == :year
    @sales = @sales.group_by_year(date_column, time_zone: SpreeReports.time_zone)
  elsif @group_by == :month
    @sales = @sales.group_by_month(date_column, time_zone: SpreeReports.time_zone)
  elsif @group_by == :week
    # %W => week start: monday, %U => week start: sunday
    @sales = @sales.group_by_week(date_column, time_zone: SpreeReports.time_zone)
  else
    @sales = @sales.group_by_day(date_column, time_zone: SpreeReports.time_zone)
  end
  
  @sales_count = @sales.count
  @sales_total = @sales.sum(:total)
  @sales_item_total = @sales.sum(:item_total)
  @sales_adjustment_total = @sales.sum(:adjustment_total)
  @sales_shipment_total = @sales.sum(:shipment_total)
  @sales_promo_total = @sales.sum(:promo_total)
  @sales_included_tax_total = @sales.sum(:included_tax_total)
  @sales_item_count_total = @sales.sum(:item_count)
  
end
setup_params() click to toggle source
# File lib/spree_reports/reports/orders_by_period.rb, line 15
def setup_params
  @currencies = Spree::Order.select('currency').distinct.map { |c| c.currency }  
  @currency = @currencies.include?(params[:currency]) ? params[:currency] : @currencies.first
  
  @stores = Spree::Store.all.map { |store| [store.name, store.id] }
  @stores << ["all", "all"]
  @store = @stores.map{ |s| s[1].to_s }.include?(params[:store]) ? params[:store] : @stores.first[1]
    
  @group_by_list = [:day, :week, :month, :year]
  @group_by = @group_by_list.include?(params[:group_by].try(:to_sym)) ? params[:group_by].to_sym : :month
    
  # states
  @states = %w{complete_paid complete incomplete cart address delivery payment confirm canceled}
  @state = @states.include?(params[:state]) ? params[:state] : "complete_paid"
  
  # ******************************************************************************************************
  # MONTHS
    
  @months = SpreeReports.report_months.include?(params[:months]) ? params[:months] : SpreeReports.default_months.to_s
  @date_start = (@months != "all") ? (Time.now - (@months.to_i).months) : nil
    
  if @date_start
    if @group_by == :year
      @date_start = @date_start.beginning_of_year
    elsif @group_by == :month
      @date_start = @date_start.beginning_of_month
    elsif @group_by == :week
      @date_start = @date_start.beginning_of_week
    else
      @date_start = @date_start.beginning_of_day
    end
  end
          
end
to_csv() click to toggle source
# File lib/spree_reports/reports/orders_by_period.rb, line 119
def to_csv
    
  CSV.generate(headers: true, col_sep: ";") do |csv|
    csv << %w{date date_formatted count item_count_total items_per_order avg_total total item_total adjustment_total shipment_total promo_total included_tax_total }

    @data.each do |item|
      csv << [
        item[:date],
        item[:date_formatted],
        item[:count],
        item[:item_count_total],
        item[:items_per_order],
        item[:avg_total],
        item[:total],
        item[:item_total],
        item[:adjustment_total],
        item[:shipment_total],
        item[:promo_total],
        item[:included_tax_total]
      ]
    end

  end
    
end