Merge pull request #12930 from chahmedejaz/task/12878-add-variant-name-in-od-report

Report Orders and Distributors should display variant
This commit is contained in:
Filipe
2024-11-20 12:23:36 -06:00
committed by GitHub
6 changed files with 146 additions and 31 deletions

View File

@@ -0,0 +1,46 @@
class UpdateItemNameToProductInOdReport < ActiveRecord::Migration[7.0]
class ReportRenderingOptions < ActiveRecord::Base
self.belongs_to_required_by_default = false
belongs_to :user, class_name: "Spree::User"
serialize :options, Hash, coder: YAML
end
# OD: Orders and Distributors
def up
# adding subtype filter just to be safe
options = ReportRenderingOptions.where(report_type: 'orders_and_distributors', report_subtype: nil)
options.find_each do |option|
begin
fields_to_show = option.options[:fields_to_show]
next if fields_to_show&.exclude?('item_name')
fields_to_show.delete('item_name')
fields_to_show << 'product'
option.save
rescue StandardError => e
puts "Failed to update rendering option with id: #{option.id}"
puts "Error: #{e.message}"
end
end
end
def down
options = ReportRenderingOptions.where(report_type: 'orders_and_distributors', report_subtype: nil)
options.find_each do |option|
begin
fields_to_show = option.options[:fields_to_show]
next if fields_to_show&.exclude?('product')
fields_to_show.delete('product')
fields_to_show << 'item_name'
option.update(options: option.options)
rescue StandardError => e
puts "Failed to revert rendering option with id: #{option.id}"
puts "Error: #{e.message}"
end
end
end
end

View File

@@ -14,8 +14,8 @@ module Reporting
customer_phone: proc { |line_item| line_item.order.bill_address.phone },
customer_city: proc { |line_item| line_item.order.bill_address.city },
sku: proc { |line_item| line_item.product.sku },
item_name: proc { |line_item| line_item.product.name },
variant: proc { |line_item| line_item.unit_to_display },
product: proc { |line_item| line_item.product.name },
variant: proc { |line_item| line_item.full_name },
quantity: proc { |line_item| line_item.quantity },
max_quantity: proc { |line_item| line_item.max_quantity },
cost: proc { |line_item| line_item.price * line_item.quantity },

View File

@@ -0,0 +1,7 @@
# frozen_string_literal: true
FactoryBot.define do
factory :orders_and_distributors_options, class: ReportRenderingOptions do
report_type { "orders_and_distributors" }
end
end

View File

@@ -11,7 +11,7 @@ RSpec.describe Reporting::Reports::OrdersAndDistributors::Base do
[
'Order date', 'Order Id',
'Customer Name', 'Customer Email', 'Customer Phone', 'Customer City',
'SKU', 'Item name', 'Variant', 'Quantity', 'Max Quantity', 'Cost', 'Shipping Cost',
'SKU', 'Product', 'Variant', 'Quantity', 'Max Quantity', 'Cost', 'Shipping Cost',
'Payment Method',
'Distributor', 'Distributor address', 'Distributor city', 'Distributor postcode',
'Shipping Method', 'Shipping instructions'
@@ -37,7 +37,7 @@ RSpec.describe Reporting::Reports::OrdersAndDistributors::Base do
}
let(:payment_method) { create(:payment_method, distributors: [distributor]) }
let(:payment) { create(:payment, payment_method:, order:) }
let(:line_item) { create(:line_item_with_shipment, product:, order:) }
let(:line_item) { create(:line_item_with_shipment, variant:, order:) }
subject { described_class.new user }
before do
@@ -46,33 +46,35 @@ RSpec.describe Reporting::Reports::OrdersAndDistributors::Base do
order.line_items << line_item
end
it 'should denormalise order and distributor details for display as csv' do
allow(subject).to receive(:unformatted_render?).and_return(true)
table = subject.table_rows
context "without variant name" do
it 'should denormalise order and distributor details for display as csv' do
allow(subject).to receive(:unformatted_render?).and_return(true)
table = subject.table_rows
expect(table.size).to eq 1
expect(table[0]).to eq([
order.reload.completed_at.strftime("%F %T"),
order.id,
bill_address.full_name,
order.email,
bill_address.phone,
bill_address.city,
line_item.product.sku,
line_item.product.name,
line_item.unit_to_display,
line_item.quantity,
line_item.max_quantity,
line_item.price * line_item.quantity,
line_item.distribution_fee,
payment_method.name,
distributor.name,
distributor.address.address1,
distributor.address.city,
distributor.address.zipcode,
shipping_method.name,
shipping_instructions
])
expect(table.size).to eq 1
expect(table[0]).to eq([
order.reload.completed_at.strftime("%F %T"),
order.id,
bill_address.full_name,
order.email,
bill_address.phone,
bill_address.city,
line_item.product.sku,
line_item.product.name,
"1g",
line_item.quantity,
line_item.max_quantity,
line_item.price * line_item.quantity,
line_item.distribution_fee,
payment_method.name,
distributor.name,
distributor.address.address1,
distributor.address.city,
distributor.address.zipcode,
shipping_method.name,
shipping_instructions
])
end
end
it "prints one row per line item" do
@@ -149,6 +151,17 @@ RSpec.describe Reporting::Reports::OrdersAndDistributors::Base do
"Spree::ShippingMethod Load",
]
end
context "with variant name present" do
before do
variant.update_columns(display_name: 'Variant Name');
end
let(:row) { subject.table_rows.first }
it "should display variant name with unit" do
expect(row).to include("Variant Name (1g)")
end
end
end
end
end

View File

@@ -0,0 +1,49 @@
# frozen_string_literal: true
require 'spec_helper'
require_relative '../../db/migrate/20241011071014_update_item_name_to_product_in_od_report'
RSpec.describe UpdateItemNameToProductInOdReport, type: :migration do
let!(:report_option_without_item_name_product) do
create(
:orders_and_distributors_options,
options: { fields_to_show: ['other_field'] }
)
end
describe '#up' do
let!(:report_option_with_item_name) do
create(
:orders_and_distributors_options,
options: { fields_to_show: ['item_name', 'other_field'] }
)
end
before { subject.up }
it 'updates fields_to_show from item_name to product only if options have item_name' do
report_option_with_item_name.reload
expect(fields_to_show(report_option_with_item_name)).to eq(['other_field', 'product'])
expect(fields_to_show(report_option_without_item_name_product)).to eq(['other_field'])
end
end
describe '#down' do
let!(:report_option_with_product) do
create(
:orders_and_distributors_options,
options: { fields_to_show: ['product', 'other_field'] }
)
end
before { subject.down }
it 'reverts fields_to_show from product to item_name only if options have product' do
report_option_with_product.reload
expect(fields_to_show(report_option_with_product)).to eq(['other_field', 'item_name'])
expect(fields_to_show(report_option_without_item_name_product)).to eq(['other_field'])
end
end
def fields_to_show(report_options)
report_options.options[:fields_to_show]
end
end

View File

@@ -27,7 +27,7 @@ RSpec.describe "Orders And Distributors" do
context "as an enterprise user" do
let(:header) {
["Order date", "Order Id", "Customer Name", "Customer Email", "Customer Phone",
"Customer City", "SKU", "Item name", "Variant", "Quantity", "Max Quantity",
"Customer City", "SKU", "Product", "Variant", "Quantity", "Max Quantity",
"Cost", "Shipping Cost", "Payment Method", "Distributor", "Distributor address",
"Distributor city", "Distributor postcode", "Shipping Method",
"Shipping instructions"]