diff --git a/app/decorators/controllers/solidus_marketplace/spree/admin/products_controller_decorator.rb b/app/decorators/controllers/solidus_marketplace/spree/admin/products_controller_decorator.rb index 02c7b7e..e3c48a9 100644 --- a/app/decorators/controllers/solidus_marketplace/spree/admin/products_controller_decorator.rb +++ b/app/decorators/controllers/solidus_marketplace/spree/admin/products_controller_decorator.rb @@ -64,7 +64,7 @@ def current_supplier_ids end def get_suppliers - @suppliers = Spree::Supplier.order(:name) + @suppliers = ::Spree::Supplier.order(:name) end # Scopes the collection to what the user should have access to, based on the user's role diff --git a/app/decorators/controllers/solidus_marketplace/spree/admin/reports_controller_decorator.rb b/app/decorators/controllers/solidus_marketplace/spree/admin/reports_controller_decorator.rb index b9ee37c..8e79a95 100644 --- a/app/decorators/controllers/solidus_marketplace/spree/admin/reports_controller_decorator.rb +++ b/app/decorators/controllers/solidus_marketplace/spree/admin/reports_controller_decorator.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require 'csv' +require "csv" module SolidusMarketplace module Spree @@ -20,8 +20,8 @@ def earnings end def earnings_csv - header1 = ['Supplier Earnings'] - header2 = ['Supplier', 'Earnings', 'Paypal Email'] + header1 = ["Supplier Earnings"] + header2 = ["Supplier", "Earnings", "Paypal Email"] CSV.generate do |csv| csv << header1 @@ -34,21 +34,67 @@ def earnings_csv end end + def supplier_total_sales + params[:q] = search_params + + @search = ::Spree::Order.complete.not_canceled.ransack(params[:q]) + @orders = @search.result + + @totals = {} + supplier_sales_total_map = @orders.map(&:supplier_total_sales_map) + grouped_suppliers_map = supplier_sales_total_map.flatten.group_by { |s| s[:name] }.values + @grouped_sales = grouped_suppliers_map.map do |gs| + h = {} + h[:name] = nil + h[:total_sales] = [] + gs.each do |s| + h[:name] = s[:name] if h[:name].nil? + h[:total_sales] << s[:total_sales] + end + h + end + + @grouped_sales.each do |gs| + gs[:total_sales] = gs[:total_sales].inject(::Spree::Money.new(0)) do |e, c| + c + e + end + end + + respond_to do |format| + format.html + format.csv { send_data(supplier_total_sales_csv) } + end + end + + def supplier_total_sales_csv + header1 = ["Supplier Total Sales"] + header2 = ["Supplier", "Total Sales"] + + CSV.generate do |csv| + csv << header1 + csv << header2 + @grouped_sales.each do |se| + csv << ["#{se[:name]}", + "#{se[:total_sales].to_html}"] + end + end + end + private def add_marketplace_reports marketplace_reports.each do |report| - Spree::Admin::ReportsController.add_available_report!(report) + ::Spree::Admin::ReportsController.add_available_report!(report) end end def marketplace_reports - [:earnings] + [:earnings, :supplier_total_sales] end def get_supplier_earnings grouped_supplier_earnings.each do |se| - se[:earnings] = se[:earnings].inject(Spree::Money.new(0)) do |e, c| + se[:earnings] = se[:earnings].inject(::Spree::Money.new(0)) do |e, c| c + e end end @@ -57,11 +103,11 @@ def get_supplier_earnings def grouped_supplier_earnings params[:q] = search_params - @search = Spree::Order.complete.not_canceled.ransack(params[:q]) + @search = ::Spree::Order.complete.not_canceled.ransack(params[:q]) @orders = @search.result supplier_earnings_map = @orders.map(&:supplier_earnings_map) - grouped_suppliers_map = supplier_earnings_map.flatten.group_by(&:name).values + grouped_suppliers_map = supplier_earnings_map.flatten.group_by { |s| s[:name] }.values grouped_earnings = grouped_suppliers_map.map do |gs| h = {} h[:name] = nil diff --git a/app/decorators/controllers/solidus_marketplace/spree/admin/stock_items_controller_decorator.rb b/app/decorators/controllers/solidus_marketplace/spree/admin/stock_items_controller_decorator.rb index e0cf2c2..98719e5 100644 --- a/app/decorators/controllers/solidus_marketplace/spree/admin/stock_items_controller_decorator.rb +++ b/app/decorators/controllers/solidus_marketplace/spree/admin/stock_items_controller_decorator.rb @@ -10,7 +10,7 @@ def self.prepended(base) def load_supplier_stock_location if try_spree_current_user.supplier - @stock_locations = Spree::StockLocation.by_supplier(try_spree_current_user.supplier).accessible_by(current_ability, :read) + @stock_locations = ::Spree::StockLocation.by_supplier(try_spree_current_user.supplier).accessible_by(current_ability, :read) @stock_item_stock_locations = params[:stock_location_id].present? ? @stock_locations.where(id: params[:stock_location_id]) : @stock_locations end end diff --git a/app/decorators/controllers/solidus_marketplace/spree/admin/stock_locations_controller_decorator.rb b/app/decorators/controllers/solidus_marketplace/spree/admin/stock_locations_controller_decorator.rb index 579d777..2ad1b65 100644 --- a/app/decorators/controllers/solidus_marketplace/spree/admin/stock_locations_controller_decorator.rb +++ b/app/decorators/controllers/solidus_marketplace/spree/admin/stock_locations_controller_decorator.rb @@ -9,7 +9,7 @@ def self.prepended(base) end def index - @stock_locations = Spree::StockLocation.accessible_by(current_ability, :read) + @stock_locations = ::Spree::StockLocation.accessible_by(current_ability, :read) .order('name ASC') .ransack(params[:q]) .result diff --git a/app/decorators/models/solidus_marketplace/spree/order_decorator.rb b/app/decorators/models/solidus_marketplace/spree/order_decorator.rb index 0a217f3..b7f6e10 100644 --- a/app/decorators/models/solidus_marketplace/spree/order_decorator.rb +++ b/app/decorators/models/solidus_marketplace/spree/order_decorator.rb @@ -8,7 +8,23 @@ def self.prepended(base) base.has_many :suppliers, through: :stock_locations end - def supplier_total(user_or_supplier) + def supplier_total_sales(user_or_supplier) + supplier = user_or_supplier.is_a?(::Spree::Supplier) ? user_or_supplier : user_or_supplier.supplier + shipments = self.shipments.by_supplier(supplier) + total = shipments.map(&:display_final_price_with_items) + ::Spree::Money.new(total.sum) + end + + def supplier_total_sales_map + suppliers.map do |s| + { + name: s.name, + total_sales: self.supplier_total_sales(s), + } + end + end + + def supplier_total_commissions(user_or_supplier) supplier = user_or_supplier.is_a?(::Spree::Supplier) ? user_or_supplier : user_or_supplier.supplier shipments = self.shipments.by_supplier(supplier) commissions = shipments.map(&:supplier_commission_total) @@ -19,8 +35,8 @@ def supplier_earnings_map suppliers.map do |s| { name: s.name, - earnings: self.supplier_total(s), - paypal_email: s.paypal_email + earnings: self.supplier_total_commissions(s), + paypal_email: s.paypal_email, } end end @@ -33,7 +49,7 @@ def finalize_with_supplier! shipments.each do |shipment| if SolidusMarketplace::Config.send_supplier_email && shipment.supplier.present? begin - Spree::MarketplaceOrderMailer.supplier_order(shipment.id).deliver! + ::Spree::MarketplaceOrderMailer.supplier_order(shipment.id).deliver! rescue => ex #Errno::ECONNREFUSED => ex puts ex.message puts ex.backtrace.join("\n") diff --git a/app/decorators/models/solidus_marketplace/spree/shipment_decorator.rb b/app/decorators/models/solidus_marketplace/spree/shipment_decorator.rb index 3eef385..e97dcb2 100644 --- a/app/decorators/models/solidus_marketplace/spree/shipment_decorator.rb +++ b/app/decorators/models/solidus_marketplace/spree/shipment_decorator.rb @@ -12,7 +12,7 @@ def self.prepended(base) end def display_final_price_with_items - Spree::Money.new final_price_with_items + ::Spree::Money.new final_price_with_items end def final_price_with_items diff --git a/app/overrides/spree/admin/add_supplier_to_admin_orders.rb b/app/overrides/spree/admin/add_supplier_to_admin_orders.rb index b082616..98eb949 100644 --- a/app/overrides/spree/admin/add_supplier_to_admin_orders.rb +++ b/app/overrides/spree/admin/add_supplier_to_admin_orders.rb @@ -4,11 +4,11 @@ insert_before: '[data-hook="admin_orders_index_row_actions"]', text: "
| <%= t('spree.supplier') %> | +<%= t('spree.supplier_total_sales') %> | +
|---|---|
| <%= grouped_sale[:name] %> | +<%= grouped_sale[:total_sales].to_html %> | +