Skip to content

Commit

Permalink
Merge pull request #470 from trade-tariff/HOTT-1481-normalise-units
Browse files Browse the repository at this point in the history
HOTT-1481: Normalise user inputs with multipliers
  • Loading branch information
willfish committed Apr 21, 2022
2 parents ebe97eb + 0f2fb2a commit e4078ed
Show file tree
Hide file tree
Showing 15 changed files with 302 additions and 101 deletions.
3 changes: 2 additions & 1 deletion app/services/concerns/measure_unit_presentable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ def presented_unit
@presented_unit ||= {
answer: user_session.measure_amount[component.unit.downcase.to_s],
unit: applicable_unit['unit'],
multiplier: applicable_unit['multiplier'].presence || 1,
}
end

Expand All @@ -15,6 +16,6 @@ def applicable_unit
private

def applicable_units
ApplicableMeasureUnitMerger.new.call
@applicable_units ||= ApplicableMeasureUnitMerger.new.call
end
end
7 changes: 6 additions & 1 deletion app/services/expression_evaluators/compound_measure_unit.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def alcohol_quantity
end

def volume_quantity
presented_volume_unit[:answer].to_f
presented_volume_unit[:answer].to_f * presented_volume_unit[:multiplier].to_f
end

def alcohol_unit
Expand All @@ -56,7 +56,12 @@ def presented_volume_unit
@presented_volume_unit ||= {
answer: user_session.measure_amount[Api::BaseComponent::VOLUME_UNIT.downcase],
unit: volume_unit['unit'],
multiplier: volume_unit_multiplier,
}
end

def volume_unit_multiplier
volume_unit['multiplier'].presence || 1
end
end
end
6 changes: 5 additions & 1 deletion app/services/expression_evaluators/measure_unit.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,11 @@ def value
end

def total_quantity
presented_unit[:answer].to_f
presented_unit[:answer].to_f * multiplier
end

def multiplier
presented_unit[:multiplier].to_f
end
end
end
70 changes: 68 additions & 2 deletions spec/factories/api/commodity.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
FactoryBot.define do
sequence(:goods_nomenclature_sid)
sequence(:goods_nomenclature_sid, &:to_s)

factory :commodity, class: 'Api::Commodity' do
transient do
Expand Down Expand Up @@ -30,7 +30,7 @@
}
end

id { generate(:measure_sid) }
id { generate(:goods_nomenclature_sid) }
producline_suffix { '80' }
number_indents { 4 }
description { 'Cherry tomatoes' }
Expand Down Expand Up @@ -76,5 +76,71 @@
trait :without_measures do
import_measures { [] }
end

trait :with_compound_measure_units do
import_measures do
[
attributes_for(
:measure,
:third_country_tariff,
:with_compound_measure_components,
),
]
end

applicable_measure_units do
{
'ASV' => { 'unit' => 'percent', 'multiplier' => nil },
'HLT' => { 'unit' => 'litres', "multiplier": '0.01' },
}
end
end

trait :with_compound_measure_units_no_multiplier do
import_measures do
[
attributes_for(
:measure,
:third_country_tariff,
:with_compound_measure_components,
),
]
end

applicable_measure_units do
{
'ASV' => { 'unit' => 'percent' },
'HLT' => { 'unit' => 'x 100 litres' },
}
end
end

trait :with_measure_units_with_multiplier do
import_measures { [attributes_for(:measure, :third_country_tariff, :with_pounds_measure_unit_measure_component)] }

applicable_measure_units { { 'DTN' => { 'unit' => 'kilogrammes', 'multiplier' => '0.01' } } }
end

trait :with_retail_price_measure_units do
applicable_measure_units { { 'RET' => { 'unit' => '£', 'multiplier' => nil } } }
end

trait :with_euro_measure_unit_measure_component do
import_measures { [attributes_for(:measure, :third_country_tariff, :with_euro_measure_unit_measure_component)] }

applicable_measure_units { { 'DTN' => { 'unit' => 'x 100 kg', 'multiplier' => nil } } }
end

trait :with_pounds_measure_unit_measure_component do
import_measures { [attributes_for(:measure, :third_country_tariff, :with_pounds_measure_unit_measure_component)] }

applicable_measure_units { { 'DTN' => { 'unit' => 'x 100 kg', 'multiplier' => nil } } }
end

trait :with_condition_measure_units do
import_measures { [attributes_for(:measure, :third_country_tariff, :with_condition_measure_units)] }

applicable_measure_units { { 'DTN' => { 'unit' => 'x 100 kg', 'multiplier' => nil } } }
end
end
end
17 changes: 17 additions & 0 deletions spec/factories/api/duty_expression.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,22 @@
id { generate(:duty_expression_id) }
base { '144.10 GBP / 1000 kg/biodiesel' }
formatted_base { "<span>144.10</span> GBP / <abbr title='Tonne'>1000 kg/biodiesel</abbr>" }

trait :compound_measure_unit do
base { '0.50 GBP / % vol/hl + 2.60 GBP / hl' }
formatted_base do
"<span>0.50</span> GBP / <abbr title='%vol'>% vol/hl</abbr> + <span>2.60</span> GBP / <abbr title='Hectolitre'>hl</abbr>"
end
end

trait :euro_measure_unit do
base { '35.10 EUR / 100 kg' }
formatted_base { "<span>35.10</span> EUR / <abbr title='Hectokilogram'>100 kg</abbr>" }
end

trait :pounds_measure_unit do
base { '35.10 GBP / 100 kg' }
formatted_base { "<span>35.10</span> GBP / <abbr title='Hectokilogram'>100 kg</abbr>" }
end
end
end
47 changes: 46 additions & 1 deletion spec/factories/api/measure.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
FactoryBot.define do
sequence(:measure_sid)
sequence(:measure_sid, &:to_s)

factory :measure, class: 'Api::Measure' do
transient do
Expand Down Expand Up @@ -142,5 +142,50 @@
]
end
end

trait :with_compound_measure_components do
duty_expression do
attributes_for(:duty_expression, :compound_measure_unit)
end

measure_components do
[
attributes_for(:measure_component, :compound_measure_unit),
attributes_for(:measure_component, :compound_measure_unit),
]
end
end

trait :with_euro_measure_unit_measure_component do
duty_expression do
attributes_for(:duty_expression, :euro_measure_unit)
end

measure_components do
[
attributes_for(:measure_component, :with_measure_units, :euros),
]
end
end

trait :with_pounds_measure_unit_measure_component do
duty_expression do
attributes_for(:duty_expression, :pounds_measure_unit)
end

measure_components do
[
attributes_for(:measure_component, :with_measure_units, :pounds),
]
end
end

trait :with_condition_measure_units do
measure_conditions do
[
attributes_for(:measure_condition, :with_measure_units),
]
end
end
end
end
1 change: 1 addition & 0 deletions spec/factories/api/measure_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
end

trait :compound_measure_unit do
duty_amount { 0.5 }
measurement_unit_code { 'ASV' }
measurement_unit_qualifier_code { 'X' }
end
Expand Down
14 changes: 12 additions & 2 deletions spec/factories/api/measure_condition.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
FactoryBot.define do
sequence(:measure_condition_sid)
sequence(:measure_condition_sid, &:to_s)

factory :measure_condition, class: 'Api::MeasureCondition' do
id { generate(:measure_condition_sid) }
Expand All @@ -18,10 +18,20 @@
requirement {}
measure_condition_components { [] }

trait :with_trigger_measure_units do
trait :with_measure_units do
condition_duty_amount { 35.1 }
condition_measurement_unit_code { 'DTN' }
duty_expression { "<span>35.10</span> GBP / <abbr title='Hectokilogram'>100 kg</abbr>" }

measure_condition_components do
[
attributes_for(
:measure_condition_component,
:with_measure_units,
measure_condition_sid: id,
),
]
end
end

trait :stopping_negative do
Expand Down
6 changes: 5 additions & 1 deletion spec/factories/api/measure_condition_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
sequence(:measure_condition_component_sid)

factory :measure_condition_component, class: 'Api::MeasureConditionComponent' do
id { generate(:measure_condition_component_sid) }
transient do
measure_condition_sid {}
end

id { "#{measure_condition_sid}-#{generate(:measure_condition_component_sid)}" }
duty_expression_id {}
duty_amount {}
monetary_unit_code {}
Expand Down
63 changes: 34 additions & 29 deletions spec/services/expression_evaluators/compound_measure_unit_spec.rb
Original file line number Diff line number Diff line change
@@ -1,46 +1,51 @@
RSpec.describe ExpressionEvaluators::CompoundMeasureUnit, :user_session do
subject(:evaluator) { described_class.new(measure, measure.component) }

let(:measure) do
build(
:measure,
:third_country_tariff,
measure_components:,
duty_expression: {
'formatted_base' => "<span>0.50</span> GBP / <abbr title='%vol'>% vol/hl</abbr> + <span>2.60</span> GBP / <abbr title='Hectolitre'>hl</abbr>",
},
)
end

let(:measure_components) do
[
include_context 'with a fake commodity'

{
'duty_amount' => 0.5,
'monetary_unit_code' => 'GBP',
'measurement_unit_code' => 'ASV',
'measurement_unit_qualifier_code' => 'X',
},
]
end
let(:measure) { commodity.import_measures.first }
let(:measure_component) { measure.measure_components.first }

let(:user_session) do
build(
:user_session,
:with_commodity_information,
:with_customs_value,
:with_compound_measure_amount,
commodity_code: '2208403900',
)
end

let(:expected_evaluation) do
{
calculation: '<span>0.50</span> GBP / <abbr title="%vol">% vol/hl</abbr> + <span>2.60</span> GBP / <abbr title="Hectolitre">hl</abbr>',
formatted_value: '£900.00',
value: 900.0,
}
context 'when there is an applicable multiplier on the volume unit' do
let(:commodity) { build(:commodity, :with_compound_measure_units) }

let(:expected_evaluation) do
{
calculation: '<span>0.50</span> GBP / <abbr title="%vol">% vol/hl</abbr> + <span>2.60</span> GBP / <abbr title="Hectolitre">hl</abbr>',
formatted_value: '£9.00', # Result of converting volume input in litres to hectolitres
value: 9.0,
}
end

it 'returns the evaluation with the multiplier applied' do
expect(evaluator.call).to eq(expected_evaluation)
end

it_behaves_like 'an evaluation that uses the measure unit merger'
end

it { expect(evaluator.call).to eq(expected_evaluation) }
context 'when there are no applicable multipliers' do
let(:commodity) { build(:commodity, :with_compound_measure_units_no_multiplier) }

let(:expected_evaluation) do
{
calculation: '<span>0.50</span> GBP / <abbr title="%vol">% vol/hl</abbr> + <span>2.60</span> GBP / <abbr title="Hectolitre">hl</abbr>',
formatted_value: '£900.00', # Result of no conversion to litres
value: 900.0,
}
end

it { expect(evaluator.call).to eq(expected_evaluation) }

it_behaves_like 'an evaluation that uses the measure unit merger'
end
end
Loading

0 comments on commit e4078ed

Please sign in to comment.