From 345c61fdc966239f8dcd91e83353173e1c758325 Mon Sep 17 00:00:00 2001 From: Mayank Dedhia Date: Wed, 19 Aug 2020 20:21:13 +0530 Subject: [PATCH 1/5] Fix access of Spree namespace in reports --- .../spree/admin/reports_controller_decorator.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 b9ee37cd..e046bd4b 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 @@ -38,7 +38,7 @@ def earnings_csv 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 @@ -48,7 +48,7 @@ def marketplace_reports 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,7 +57,7 @@ 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) From bb644431c24662c0c155ab41621c683289474b94 Mon Sep 17 00:00:00 2001 From: Mayank Dedhia Date: Wed, 19 Aug 2020 20:37:37 +0530 Subject: [PATCH 2/5] Fix Spree namespace at more locations --- .../spree/admin/products_controller_decorator.rb | 2 +- .../spree/admin/stock_items_controller_decorator.rb | 2 +- .../spree/admin/stock_locations_controller_decorator.rb | 2 +- .../models/solidus_marketplace/spree/order_decorator.rb | 2 +- .../models/solidus_marketplace/spree/shipment_decorator.rb | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) 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 02c7b7eb..e3c48a94 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/stock_items_controller_decorator.rb b/app/decorators/controllers/solidus_marketplace/spree/admin/stock_items_controller_decorator.rb index e0cf2c20..98719e5f 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 579d777f..2ad1b65e 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 0a217f30..494ce7c4 100644 --- a/app/decorators/models/solidus_marketplace/spree/order_decorator.rb +++ b/app/decorators/models/solidus_marketplace/spree/order_decorator.rb @@ -33,7 +33,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 3eef3850..e97dcb2c 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 From 62fdbb2e9fa92df53d6f34517ba94e4bd3ac1eff Mon Sep 17 00:00:00 2001 From: Mayank Dedhia Date: Thu, 20 Aug 2020 22:10:18 +0530 Subject: [PATCH 3/5] Fix group_by usage for array of hashes --- .../spree/admin/reports_controller_decorator.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 e046bd4b..a42fadc6 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 @@ -59,9 +59,9 @@ def grouped_supplier_earnings @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 From 591dd03dbd1f7631ef811c3b7146e89257ab1a89 Mon Sep 17 00:00:00 2001 From: Mayank Dedhia Date: Fri, 21 Aug 2020 09:33:46 +0530 Subject: [PATCH 4/5] Refactor supplier_total to supplier_total_commissions to make it more meaningful --- .../spree/order_decorator.rb | 6 ++--- .../admin/add_supplier_to_admin_orders.rb | 4 ++-- .../shared/_supplier_order_total.html.erb | 2 +- spec/models/spree/order_decorator_spec.rb | 22 ++++++++++--------- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/app/decorators/models/solidus_marketplace/spree/order_decorator.rb b/app/decorators/models/solidus_marketplace/spree/order_decorator.rb index 494ce7c4..dec78a3c 100644 --- a/app/decorators/models/solidus_marketplace/spree/order_decorator.rb +++ b/app/decorators/models/solidus_marketplace/spree/order_decorator.rb @@ -8,7 +8,7 @@ def self.prepended(base) base.has_many :suppliers, through: :stock_locations end - def supplier_total(user_or_supplier) + 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 +19,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 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 b0826165..98eb9494 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/shared/_supplier_order_total.html.erb b/app/views/spree/admin/shared/_supplier_order_total.html.erb index 96fa77cc..fa1c301e 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/spec/models/spree/order_decorator_spec.rb b/spec/models/spree/order_decorator_spec.rb index 738ffa0c..060b89aa 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 From f81edbf5bc72edd1756e1bdddc186520b7535267 Mon Sep 17 00:00:00 2001 From: Mayank Dedhia Date: Fri, 21 Aug 2020 11:51:38 +0530 Subject: [PATCH 5/5] Add another report for total sales by suppliers --- .../admin/reports_controller_decorator.rb | 56 +++++++++++++++++-- .../spree/order_decorator.rb | 16 ++++++ .../reports/supplier_total_sales.html.erb | 33 +++++++++++ config/locales/en.yml | 10 ++-- config/locales/es.yml | 2 + config/routes.rb | 8 ++- 6 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 app/views/spree/admin/reports/supplier_total_sales.html.erb 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 a42fadc6..8e79a956 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,6 +34,52 @@ 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 @@ -43,7 +89,7 @@ def add_marketplace_reports end def marketplace_reports - [:earnings] + [:earnings, :supplier_total_sales] end def get_supplier_earnings @@ -59,7 +105,7 @@ def grouped_supplier_earnings @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 { |s| s[:name] }.values grouped_earnings = grouped_suppliers_map.map do |gs| diff --git a/app/decorators/models/solidus_marketplace/spree/order_decorator.rb b/app/decorators/models/solidus_marketplace/spree/order_decorator.rb index dec78a3c..b7f6e100 100644 --- a/app/decorators/models/solidus_marketplace/spree/order_decorator.rb +++ b/app/decorators/models/solidus_marketplace/spree/order_decorator.rb @@ -8,6 +8,22 @@ def self.prepended(base) base.has_many :suppliers, through: :stock_locations end + 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) 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 00000000..8ef9ff33 --- /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/config/locales/en.yml b/config/locales/en.yml index 1f6f3d73..2aa65028 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 921206e3..0511cc49 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 6db4d2a2..405bd517 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