mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-13 23:37:47 +00:00
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:
@@ -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
|
||||
@@ -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 },
|
||||
|
||||
7
spec/factories/report_rendering_options_factory.rb
Normal file
7
spec/factories/report_rendering_options_factory.rb
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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"]
|
||||
|
||||
Reference in New Issue
Block a user