From edb1051de7624b3df33ed5bc27057ba267fa6ce3 Mon Sep 17 00:00:00 2001 From: Mayur Shah Date: Thu, 27 Feb 2025 18:41:53 +0530 Subject: [PATCH 1/3] Add tax_reverse_charge_mode to Spree::TaxCategory and update related specs Introduce the `tax_reverse_charge_mode` enum to the `Spree::TaxCategory` model, with values `disabled`, `loose`, and `strict`. The change includes a migration to add the `tax_reverse_charge_mode` column to the `spree_tax_categories` table, with a default value of `0` (disabled). Additionally, the English locale file has been updated to include translations for the new enum values. The `tax_reverse_charge_mode` enum allows for more granular control over tax applicability based on the reverse charge status of an address. This enhancement improves the flexibility and accuracy of tax calculations by enabling different tax handling modes. --- core/app/models/spree/tax_category.rb | 6 ++++ core/config/locales/en.yml | 5 ++++ ...rse_charge_mode_to_spree_tax_categories.rb | 8 +++++ core/spec/models/spree/tax_category_spec.rb | 30 +++++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 core/db/migrate/20250226052907_add_tax_reverse_charge_mode_to_spree_tax_categories.rb diff --git a/core/app/models/spree/tax_category.rb b/core/app/models/spree/tax_category.rb index 3b047cf8f46..790f24b5413 100644 --- a/core/app/models/spree/tax_category.rb +++ b/core/app/models/spree/tax_category.rb @@ -10,6 +10,12 @@ class TaxCategory < Spree::Base self.tax_rate_tax_categories = [] end + enum :tax_reverse_charge_mode, { + disabled: 0, + loose: 1, + strict: 2 + }, prefix: true + validates :name, presence: true validates_uniqueness_of :name, case_sensitive: true, unless: :deleted_at diff --git a/core/config/locales/en.yml b/core/config/locales/en.yml index b73928cd973..e7015d179c5 100644 --- a/core/config/locales/en.yml +++ b/core/config/locales/en.yml @@ -392,6 +392,7 @@ en: is_default: Default name: Name tax_code: Tax Code + tax_reverse_charge_mode: Tax Reverse Charge Mode spree/tax_rate: amount: Rate expires_at: Expiration Date @@ -2273,6 +2274,10 @@ en: tax_rate_amount_explanation: When using the "Default Tax" calculator, the amount is treated as a decimal amount to aid in calculations. (i.e. If the tax rate is 5% then enter 0.05) If using the "Flat Fee" calculator, the amount is used for the static fee. tax_rate_level: Tax Rate Level tax_rates: Tax Rates + tax_reverse_charge_modes: + disabled: Disabled + loose: Loose + strict: Strict taxon: Taxon taxon_attachment_removal_error: There was an error removing the attachment taxon_edit: Edit Taxon diff --git a/core/db/migrate/20250226052907_add_tax_reverse_charge_mode_to_spree_tax_categories.rb b/core/db/migrate/20250226052907_add_tax_reverse_charge_mode_to_spree_tax_categories.rb new file mode 100644 index 00000000000..41de8c9b515 --- /dev/null +++ b/core/db/migrate/20250226052907_add_tax_reverse_charge_mode_to_spree_tax_categories.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class AddTaxReverseChargeModeToSpreeTaxCategories < ActiveRecord::Migration[7.0] + def change + add_column :spree_tax_categories, :tax_reverse_charge_mode, :integer, default: 0, null: false, + comment: "Enum values: 0 = disabled, 1 = loose, 2 = strict" + end +end diff --git a/core/spec/models/spree/tax_category_spec.rb b/core/spec/models/spree/tax_category_spec.rb index 60fc2c12d3c..247ffec82dc 100644 --- a/core/spec/models/spree/tax_category_spec.rb +++ b/core/spec/models/spree/tax_category_spec.rb @@ -47,4 +47,34 @@ end end end + + describe 'enum tax_reverse_charge_mode' do + it 'defines the expected enum values' do + expect(Spree::TaxCategory.tax_reverse_charge_modes).to eq({ + 'disabled' => 0, + 'loose' => 1, + 'strict' => 2 + }) + end + + it 'allows valid values' do + tax_category = build(:tax_category) + # Updates the tax_reverse_charge_mode to "strict" + expect(tax_category).to be_valid + tax_category.tax_reverse_charge_mode_strict! + + # Updates the tax_reverse_charge_mode to "loose" + expect(tax_category).to be_valid + tax_category.tax_reverse_charge_mode_loose! + expect(tax_category).to be_valid + + # Updates the tax_reverse_charge_mode to "disabled" + tax_category.tax_reverse_charge_mode_disabled! + expect(tax_category).to be_valid + end + + it 'raises an error for invalid values' do + expect { Spree::TaxCategory.new(tax_reverse_charge_mode: :invalid_status) }.to raise_error(ArgumentError) + end + end end From 8c07c92c4f04718472eebfc18ec79b286bdcf133 Mon Sep 17 00:00:00 2001 From: Mayur Shah Date: Thu, 27 Feb 2025 18:47:53 +0530 Subject: [PATCH 2/3] Update admin interface to support tax_reverse_charge_mode Includes updates to the admin interface to allow users to select the `tax_reverse_charge_mode` when creating or editing tax categories. The permitted parameters in the `TaxCategoriesController` have been updated to include `tax_reverse_charge_mode`. The admin views and components have been updated to display the `tax_reverse_charge_mode` in the tax categories index and form views. This ensures that users can easily manage and view the reverse charge mode for each tax category. --- .../tax_categories/edit/component.html.erb | 7 +++++++ .../tax_categories/index/component.rb | 15 ++++++++++++++- .../tax_categories/new/component.html.erb | 7 +++++++ .../solidus_admin/tax_categories_controller.rb | 2 +- .../spree/admin/tax_categories/_form.html.erb | 12 ++++++++++++ .../spree/admin/tax_categories/index.html.erb | 13 +++++++++++-- 6 files changed, 52 insertions(+), 4 deletions(-) diff --git a/admin/app/components/solidus_admin/tax_categories/edit/component.html.erb b/admin/app/components/solidus_admin/tax_categories/edit/component.html.erb index d5b8b25115b..8ee387a71f8 100644 --- a/admin/app/components/solidus_admin/tax_categories/edit/component.html.erb +++ b/admin/app/components/solidus_admin/tax_categories/edit/component.html.erb @@ -5,6 +5,13 @@ <%= render component("ui/forms/field").text_field(f, :name) %> <%= render component("ui/forms/field").text_field(f, :tax_code) %> <%= render component("ui/forms/field").text_field(f, :description) %> + <% if Spree::Backend::Config.show_reverse_charge_fields %> + <%= render component("ui/forms/field").select( + f, + :tax_reverse_charge_mode, + Spree::TaxCategory.tax_reverse_charge_modes.keys.map { |key| [I18n.t("spree.tax_reverse_charge_modes.#{key}"), key] } + ) %> + <% end %>