From 82f75e344ff3347a9c04ea0a0be023b8841936ae Mon Sep 17 00:00:00 2001 From: Abdul Aziz Ali Date: Mon, 3 Jun 2024 10:29:30 +0800 Subject: [PATCH] Display additional tax total in order #11680 Add new text key admin.order.edit.additional_tax_included_in_price Add spec file for additional tax display. Add new trait for enterprise fee and calculator factory --- app/helpers/admin/orders_helper.rb | 16 ++++++++ config/locales/en.yml | 1 + spec/factories.rb | 5 +++ spec/factories/calculator_factory.rb | 4 ++ spec/helpers/admin/orders_helper_spec.rb | 51 ++++++++++++++++++++++++ 5 files changed, 77 insertions(+) diff --git a/app/helpers/admin/orders_helper.rb b/app/helpers/admin/orders_helper.rb index 4e82a41739..b410df9eca 100644 --- a/app/helpers/admin/orders_helper.rb +++ b/app/helpers/admin/orders_helper.rb @@ -11,9 +11,25 @@ module Admin def order_adjustments_for_display(order) order.adjustments + voucher_included_tax_representations(order) + + additional_tax_total_representation(order) + order.all_adjustments.payment_fee.eligible end + def additional_tax_total_representation(order) + adjustment = Spree::Adjustment.additional.tax.where( + order_id: order.id, adjustable_type: 'Spree::Adjustment' + ).sum(:amount) + + return [] unless adjustment != 0 + + [ + AdjustmentData.new( + I18n.t("admin.orders.edit.additional_tax_included_in_price"), + adjustment + ) + ] + end + def voucher_included_tax_representations(order) return [] unless VoucherAdjustmentsService.new(order).voucher_included_tax.negative? diff --git a/config/locales/en.yml b/config/locales/en.yml index 47b4b07814..f43146b0ae 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1061,6 +1061,7 @@ en: edit: order_sure_want_to: Are you sure you want to %{event} this order? voucher_tax_included_in_price: "%{label} (tax included in voucher)" + additional_tax_included_in_price: "Tax on fees" invoice_email_sent: 'Invoice email has been sent' order_email_resent: 'Order email has been resent' bulk_management: diff --git a/spec/factories.rb b/spec/factories.rb index 52c80704d5..90675a7cbb 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -94,6 +94,11 @@ FactoryBot.define do transient { amount { 1 } } calculator { build(:calculator_per_item, preferred_amount: amount) } end + + trait :flat_percent_per_item do + transient { amount { 1 } } + calculator { build(:calculator_flat_percent_per_item, preferred_flat_percent: amount) } + end end factory :adjustment_metadata, class: AdjustmentMetadata do diff --git a/spec/factories/calculator_factory.rb b/spec/factories/calculator_factory.rb index 91c571a8fe..fd861e21ff 100644 --- a/spec/factories/calculator_factory.rb +++ b/spec/factories/calculator_factory.rb @@ -14,6 +14,10 @@ FactoryBot.define do preferred_amount { generate(:calculator_amount) } end + factory :calculator_flat_percent_per_item, class: Calculator::FlatPercentPerItem do + preferred_flat_percent { generate(:calculator_amount) } + end + factory :weight_calculator, class: Calculator::Weight do after(:build) { |c| c.set_preference(:per_unit, 0.5) diff --git a/spec/helpers/admin/orders_helper_spec.rb b/spec/helpers/admin/orders_helper_spec.rb index 9199c7794e..c24f92c471 100644 --- a/spec/helpers/admin/orders_helper_spec.rb +++ b/spec/helpers/admin/orders_helper_spec.rb @@ -55,5 +55,56 @@ RSpec.describe Admin::OrdersHelper, type: :helper do expect(fake_adjustment.amount).to eq(-0.5) end end + + context "with additional tax total" do + let!(:shipping_method){ create(:free_shipping_method) } + let!(:enterprise){ + create(:distributor_enterprise_with_tax, name: 'Enterprise', charges_sales_tax: true, + shipping_methods: [shipping_method]) + } + let!(:country_zone){ create(:zone_with_member) } + let!(:tax_category){ create(:tax_category, name: 'tax_category') } + let!(:tax_rate){ + create(:tax_rate, zone: country_zone, tax_category:, name: 'Tax Rate', amount: 0.13, + included_in_price: false) + } + let!(:ship_address){ create(:ship_address) } + let!(:product) { + create(:simple_product, supplier: enterprise, price: 10, tax_category_id: tax_category.id) + } + let!(:variant){ + create(:variant, :with_order_cycle, product:, distributor: enterprise, order_cycle:, + tax_category:) + } + let!(:coordinator_fees){ + create(:enterprise_fee, :flat_percent_per_item, enterprise:, amount: 20, + name: 'Adminstration', + fee_type: 'sales', + tax_category:) + } + let!(:order_cycle){ + create(:simple_order_cycle, name: "oc1", suppliers: [enterprise], + distributors: [enterprise], + coordinator_fees: [coordinator_fees]) + } + let!(:order){ + create(:order_with_distributor, distributor: enterprise, order_cycle:, ship_address:) + } + let!(:line_item) { create(:line_item, variant:, quantity: 1, price: 10, order:) } + + before do + order_cycle.variants << [product.variants.first] + order_cycle.exchanges.outgoing.first.variants << product.variants.first + + order.recreate_all_fees! + Orders::WorkflowService.new(order).complete! + end + + it "includes additional tax on fees" do + adjustment = order_adjustments_for_display(order).first + expect(adjustment.label).to eq("Tax on fees") + expect(adjustment.amount).to eq(0.26) + end + end end end