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: " <% if try_spree_current_user.supplier? %> - <%= order.supplier_total(try_spree_current_user).to_html %> + <%= order.supplier_total_commissions(try_spree_current_user).to_html %> <% else %> <%= order.display_total.to_html %> <% end %> ", - disabled: false + disabled: false, ) diff --git a/app/views/spree/admin/reports/supplier_total_sales.html.erb b/app/views/spree/admin/reports/supplier_total_sales.html.erb new file mode 100644 index 0000000..8ef9ff3 --- /dev/null +++ b/app/views/spree/admin/reports/supplier_total_sales.html.erb @@ -0,0 +1,33 @@ +<% admin_breadcrumb(link_to t('spree.reports'), spree.admin_reports_path) %> +<% admin_breadcrumb(t('spree.supplier_total_sales')) %> + +<% content_for :page_actions do %> +
  • + <%= link_to t('spree.export_supplier_csv'), spree.supplier_total_sales_admin_reports_url(format: 'csv'), class: 'btn btn-primary' %> +
  • +<% end %> + +<% content_for :table_filter_title do %> + <%= t('spree.date_range') %> +<% end %> + +<% content_for :table_filter do %> + <%= render partial: 'spree/admin/shared/report_order_criteria', locals: { action: :supplier_total_sales } %> +<% end %> + + + + + + + + + + <% @grouped_sales.each do |grouped_sale| %> + + + + + <% end %> + +
    <%= t('spree.supplier') %><%= t('spree.supplier_total_sales') %>
    <%= grouped_sale[:name] %><%= grouped_sale[:total_sales].to_html %>
    diff --git a/app/views/spree/admin/shared/_supplier_order_total.html.erb b/app/views/spree/admin/shared/_supplier_order_total.html.erb index 96fa77c..fa1c301 100644 --- a/app/views/spree/admin/shared/_supplier_order_total.html.erb +++ b/app/views/spree/admin/shared/_supplier_order_total.html.erb @@ -1,5 +1,5 @@ <% if try_spree_current_user.supplier? %> - <%= order.supplier_total(try_spree_current_user).to_html %> + <%= order.supplier_total_commissions(try_spree_current_user).to_html %> <% else %> <%= order.display_total.to_html %> <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 1f6f3d7..2aa6502 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -18,7 +18,7 @@ en: attributes: url: invalid: is invalid. Please be sure to include include 'http://' - not_responding: 'is invalid, not responding or redirecting to another location' + not_responding: "is invalid, not responding or redirecting to another location" spree: admin: user: @@ -83,7 +83,7 @@ en: inactive: Inactive individual: Individual manage: Manage - must_be_logged_in: 'Must Be Logged In' + must_be_logged_in: "Must Be Logged In" name: Name new_supplier: New Supplier or: or @@ -102,7 +102,7 @@ en: unauthorized: Unauthorized show_only_incomplete_orders: Show Only Incomplete Orders signup: Sign Up - signup_to_become_a_supplier: 'Sign Up To Become A Supplier' + signup_to_become_a_supplier: "Sign Up To Become A Supplier" supplier: Supplier supplier_details: Supplier Details supplier_earnings: Supplier Earnings @@ -113,7 +113,7 @@ en: hello: "Hello %{name}," logging_into_your_account: logging into your account. manage_your_account: You may now manage your profile and inventory by - subject: 'Thank you for signing up. Please verify your information.' + subject: "Thank you for signing up. Please verify your information." thank_you_again: "Thank you again for your business, %{name}" thank_you_for_signing_up: Thank you for signing up to be a supplier. supplier_paypal_email: PayPal Email @@ -124,6 +124,8 @@ en: invalid_password: Invalid password please sign in or sign up. success: Thank you for signing up! supplier_signup: Supplier Sign Up + supplier_total_sales: Supplier Total Sales + supplier_total_sales_description: Total sales for Suppliers over the specified time period suppliers: Suppliers user_admin: Admin User remove_payment_method: Remove payment method diff --git a/config/locales/es.yml b/config/locales/es.yml index 921206e..0511cc4 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -121,6 +121,8 @@ es: invalid_password: Contraseña no válida, por favor inicie sesión o regístrese success: Gracias por registrarse! supplier_signup: Registro de proveedor + supplier_total_sales: Ventas totales del proveedor + supplier_total_sales_description: Ventas totales para proveedores durante el período de tiempo especificado suppliers: Proveedores user_admin: Usuario administrador remove_payment_method: Remover método de pago diff --git a/config/routes.rb b/config/routes.rb index 6db4d2a..405bd51 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,8 +5,12 @@ resources :suppliers resources :reports, only: [:index] do collection do - get :earnings - post :earnings + get :earnings + post :earnings + end + collection do + get :supplier_total_sales + post :supplier_total_sales end end diff --git a/spec/models/spree/order_decorator_spec.rb b/spec/models/spree/order_decorator_spec.rb index 738ffa0..060b89a 100644 --- a/spec/models/spree/order_decorator_spec.rb +++ b/spec/models/spree/order_decorator_spec.rb @@ -51,25 +51,27 @@ end end - xdescribe '#supplier_total' do - let!(:order) { create(:completed_order_from_supplier_with_totals, - ship_address: create(:address)) } + xdescribe "#supplier_total_commissions" do + let!(:order) { + create(:completed_order_from_supplier_with_totals, + ship_address: create(:address)) + } let(:supplier) { order.suppliers.first } - let(:expected_supplier_total) { Spree::Money.new(15.00) } + let(:expected_supplier_total_commissions) { Spree::Money.new(15.00) } - context 'when passed a supplier' do - it 'returns the total commission earned for the order for a given supplier' do + context "when passed a supplier" do + it "returns the total commission earned for the order for a given supplier" do expect(order.total).to eq(150.0) expect(order.suppliers.count).to eq(1) - expect(order.supplier_total(supplier).to_s).to eq(expected_supplier_total.to_s) + expect(order.supplier_total_commissions(supplier).to_s).to eq(expected_supplier_total_commissions.to_s) end end - context 'when passed a user associated with a supplier' do - it 'returns the total commission earned for the order for a given supplier' do + context "when passed a user associated with a supplier" do + it "returns the total commission earned for the order for a given supplier" do expect(order.total).to eq(150.0) expect(order.suppliers.count).to eq(1) - expect(order.supplier_total(supplier)).to eq(expected_supplier_total) + expect(order.supplier_total_commissions(supplier)).to eq(expected_supplier_total_commissions) end end end