From d6d20a81a95e1810989b20f5e9ab9b1766542163 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 9 Mar 2018 13:08:36 +0200 Subject: [PATCH] Add registrar vat rate #623 --- app/models/registrar.rb | 33 +++------ app/models/type/vat_rate.rb | 19 +++++ app/views/admin/registrars/_billing.html.erb | 3 + .../admin/registrars/form/_billing.html.erb | 3 +- test/models/registrar/vat_test.rb | 73 +++++++++++++++++++ 5 files changed, 108 insertions(+), 23 deletions(-) create mode 100644 app/models/type/vat_rate.rb create mode 100644 test/models/registrar/vat_test.rb diff --git a/app/models/registrar.rb b/app/models/registrar.rb index 1d5c4eba3..87915e4ba 100644 --- a/app/models/registrar.rb +++ b/app/models/registrar.rb @@ -1,21 +1,3 @@ -class VATRateType < ActiveRecord::Type::Value - def type_cast_from_user(value) - if value.blank? - nil - else - super - end - end - - def type_cast_from_database(value) - BigDecimal.new(value) * 100 if value - end - - def type_cast_for_database(value) - BigDecimal.new(value) / 100 if value - end -end - class Registrar < ActiveRecord::Base include Versions # version/registrar_version.rb @@ -35,13 +17,16 @@ class Registrar < ActiveRecord::Base validates :name, :reg_no, :reference_no, :code, uniqueness: true validates :accounting_customer_code, presence: true validates :language, presence: true - validates :vat_rate, :vat_no, absence: true, if: :local_vat_payer? - validates :vat_rate, presence: true, if: 'foreign_vat_payer? && vat_no.blank?' + + validates :vat_rate, presence: true, if: :vat_rate_required? + validates :vat_rate, absence: true, if: :local_vat_payer? validates :vat_rate, absence: true, if: 'foreign_vat_payer? && vat_no?' - validates :vat_rate, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 99 }, allow_nil: true + validates :vat_rate, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 99.9 }, + allow_nil: true + validate :forbid_special_code - attribute :vat_rate, VATRateType.new + attribute :vat_rate, ::Type::VATRate.new after_initialize :set_defaults before_validation :generate_iso_11649_reference_no @@ -216,4 +201,8 @@ class Registrar < ActiveRecord::Base def foreign_vat_payer? !local_vat_payer? end + + def vat_rate_required? + foreign_vat_payer? && vat_no.blank? + end end diff --git a/app/models/type/vat_rate.rb b/app/models/type/vat_rate.rb new file mode 100644 index 000000000..466b076f8 --- /dev/null +++ b/app/models/type/vat_rate.rb @@ -0,0 +1,19 @@ +module Type + class VATRate < ActiveRecord::Type::Value + def type_cast_from_user(value) + if value.blank? + nil + else + super + end + end + + def type_cast_from_database(value) + BigDecimal(value) * 100 if value + end + + def type_cast_for_database(value) + BigDecimal(value) / 100.0 if value + end + end +end diff --git a/app/views/admin/registrars/_billing.html.erb b/app/views/admin/registrars/_billing.html.erb index f3960233e..7ba778d08 100644 --- a/app/views/admin/registrars/_billing.html.erb +++ b/app/views/admin/registrars/_billing.html.erb @@ -7,6 +7,9 @@
<%= Registrar.human_attribute_name :vat_no %>
<%= registrar.vat_no %>
+
<%= Registrar.human_attribute_name :vat_rate %>
+
<%= number_to_percentage registrar.vat_rate, precision: 1 %>
+
<%= Registrar.human_attribute_name :accounting_customer_code %>
<%= registrar.accounting_customer_code %>
diff --git a/app/views/admin/registrars/form/_billing.html.erb b/app/views/admin/registrars/form/_billing.html.erb index ff67232de..e644085cf 100644 --- a/app/views/admin/registrars/form/_billing.html.erb +++ b/app/views/admin/registrars/form/_billing.html.erb @@ -23,7 +23,8 @@
- <%= f.number_field :vat_rate, min: 0, max: 99, class: 'form-control' %> + <%= f.number_field :vat_rate, min: 0, max: 99, step: 0.1, + class: 'form-control' %>
%
diff --git a/test/models/registrar/vat_test.rb b/test/models/registrar/vat_test.rb new file mode 100644 index 000000000..cf36b6266 --- /dev/null +++ b/test/models/registrar/vat_test.rb @@ -0,0 +1,73 @@ +require 'test_helper' + +class RegistrarVATTest < ActiveSupport::TestCase + def setup + @registrar = registrars(:bestnames) + end + + def test_optional_vat_no + @registrar.vat_no = '' + assert @registrar.valid? + + @registrar.vat_no = 'any' + assert @registrar.valid? + end + + def test_requires_vat_rate_when_registrar_is_foreign_vat_payer_and_vat_no_is_absent + @registrar.vat_no = '' + + Registry.instance.stub(:legal_address_country, Country.new('GB')) do + @registrar.vat_rate = '' + assert @registrar.invalid? + assert @registrar.errors.added?(:vat_rate, :blank) + + @registrar.vat_rate = -1 + assert @registrar.invalid? + + @registrar.vat_rate = 1 + assert @registrar.valid? + + @registrar.vat_rate = 99.9 + assert @registrar.valid? + + @registrar.vat_rate = 100 + assert @registrar.invalid? + end + end + + def test_vat_is_not_applied_when_registrar_is_local_vat_payer + @registrar.vat_rate = 1 + assert @registrar.invalid? + + @registrar.vat_rate = nil + assert @registrar.valid? + end + + def test_vat_is_not_applied_when_registrar_is_foreign_vat_payer_and_vat_no_is_present + @registrar.vat_no = 'valid' + + Registry.instance.stub(:legal_address_country, Country.new('GB')) do + @registrar.vat_rate = 1 + assert @registrar.invalid? + + @registrar.vat_rate = nil + assert @registrar.valid? + end + end + + def test_serializes_and_deserializes_vat_rate + @registrar.vat_rate = '25.5' + + Registry.instance.stub(:legal_address_country, Country.new('GB')) do + @registrar.save! + end + + @registrar.reload + assert_equal 25.5, @registrar.vat_rate + end + + def test_treats_empty_vat_rate_as_absent + @registrar.vat_rate = '' + assert_nil @registrar.vat_rate + end +end