Add product quantity to DFC export

This commit is contained in:
Maikel Linke
2023-03-14 16:10:30 +11:00
parent 1e23cf1c92
commit 0b808a4b1e
4 changed files with 103 additions and 1 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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