From 0b808a4b1e231a2a39381e3d5b9fa9df9d9f9be5 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Tue, 14 Mar 2023 16:10:30 +1100 Subject: [PATCH] Add product quantity to DFC export --- .../dfc_provider/app/services/dfc_builder.rb | 3 +- .../services/quantitative_value_builder.rb | 29 ++++++++++++ .../quantitative_value_builder_spec.rb | 46 +++++++++++++++++++ .../services/supplied_product_builder_spec.rb | 26 +++++++++++ 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 engines/dfc_provider/app/services/quantitative_value_builder.rb create mode 100644 engines/dfc_provider/spec/services/quantitative_value_builder_spec.rb create mode 100644 engines/dfc_provider/spec/services/supplied_product_builder_spec.rb diff --git a/engines/dfc_provider/app/services/dfc_builder.rb b/engines/dfc_provider/app/services/dfc_builder.rb index ebdc466f5d..277cf6559e 100644 --- a/engines/dfc_provider/app/services/dfc_builder.rb +++ b/engines/dfc_provider/app/services/dfc_builder.rb @@ -22,7 +22,8 @@ class DfcBuilder ) DataFoodConsortium::Connector::SuppliedProduct.new( - id, name: variant.name, description: variant.description + id, name: variant.name, description: variant.description, + quantity: QuantitativeValueBuilder.quantity(variant), ) end diff --git a/engines/dfc_provider/app/services/quantitative_value_builder.rb b/engines/dfc_provider/app/services/quantitative_value_builder.rb new file mode 100644 index 0000000000..c88deef266 --- /dev/null +++ b/engines/dfc_provider/app/services/quantitative_value_builder.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +# Describes the quantity contained in a product, for example: +# +# - 1 piece of apple, usually meaning the whole fruit +# - 2 litres of milk, for example in a big bottle or pouch +# - 750 grams of bread, for example a loaf +# +# The DFC also supports specific units like loafs and cans but we don't have +# standardised data within OFN to map to these types. +class QuantitativeValueBuilder < DfcBuilder + def self.quantity(variant) + DataFoodConsortium::Connector::QuantitativeValue.new( + unit: unit(variant), + value: variant.unit_value, + ) + end + + def self.unit(variant) + case variant.product.variant_unit + when "volume" + DfcLoader.connector.MEASURES.UNIT.QUANTITYUNIT.LITRE + when "weight" + DfcLoader.connector.MEASURES.UNIT.QUANTITYUNIT.GRAM + else + DfcLoader.connector.MEASURES.UNIT.QUANTITYUNIT.PIECE + end + end +end diff --git a/engines/dfc_provider/spec/services/quantitative_value_builder_spec.rb b/engines/dfc_provider/spec/services/quantitative_value_builder_spec.rb new file mode 100644 index 0000000000..b7d003a0ed --- /dev/null +++ b/engines/dfc_provider/spec/services/quantitative_value_builder_spec.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require DfcProvider::Engine.root.join("spec/spec_helper") + +describe QuantitativeValueBuilder do + subject(:builder) { described_class } + let(:variant) { build(:variant, product: product) } + let(:product) { build(:product, name: "Apple") } + + describe ".quantity" do + it "recognises items" do + product.variant_unit = "item" + variant.unit_value = 1 + quantity = builder.quantity(variant) + + expect(quantity.value).to eq 1.0 + expect(quantity.unit.semanticId).to eq "dfc-m:Piece" + end + + it "recognises volume" do + product.variant_unit = "volume" + variant.unit_value = 2 + quantity = builder.quantity(variant) + + expect(quantity.value).to eq 2.0 + expect(quantity.unit.semanticId).to eq "dfc-m:Litre" + end + + it "recognises weight" do + product.variant_unit = "weight" + variant.unit_value = 1000 # 1kg + quantity = builder.quantity(variant) + + expect(quantity.value).to eq 1000.0 + expect(quantity.unit.semanticId).to eq "dfc-m:Gram" + end + + it "falls back to items" do + product.variant_unit = nil + quantity = builder.quantity(variant) + + expect(quantity.value).to eq 1.0 + expect(quantity.unit.semanticId).to eq "dfc-m:Piece" + end + end +end diff --git a/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb new file mode 100644 index 0000000000..20f9ab9bdf --- /dev/null +++ b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require DfcProvider::Engine.root.join("spec/spec_helper") + +describe DfcBuilder do + let(:variant) { + build(:variant, id: 5).tap { |v| v.product.supplier_id = 7 } + } + + describe ".supplied_product" do + it "assigns a semantic id" do + product = DfcBuilder.supplied_product(variant) + + expect(product.semanticId).to eq( + "http://test.host/api/dfc-v1.6/enterprises/7/supplied_products/5" + ) + end + + it "assigns a quantity" do + product = DfcBuilder.supplied_product(variant) + + expect(product.quantity.value).to eq 1.0 + expect(product.quantity.unit.semanticId).to eq "dfc-m:Gram" + end + end +end